<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Graff</title><generator>teletype.in</generator><description><![CDATA[Личный блог]]></description><image><url>https://img1.teletype.in/files/45/94/45941df1-b14e-4c3a-8947-f4dcc5fa5b20.png</url><title>Graff</title><link>https://graff45.ru/</link></image><link>https://graff45.ru/?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=factoblog</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/factoblog?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/factoblog?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Tue, 21 Apr 2026 11:23:23 GMT</pubDate><lastBuildDate>Tue, 21 Apr 2026 11:23:23 GMT</lastBuildDate><item><guid isPermaLink="true">https://graff45.ru/DHCP_Phone_Reloader</guid><link>https://graff45.ru/DHCP_Phone_Reloader?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=factoblog</link><comments>https://graff45.ru/DHCP_Phone_Reloader?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=factoblog#comments</comments><dc:creator>factoblog</dc:creator><title>Скрипт перезагрузки IP-телефонов Yealink</title><pubDate>Fri, 11 Apr 2025 20:42:52 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/93/bd/93bdb4c3-380d-4073-977a-943d5d741da5.png"></media:content><description><![CDATA[Доступно два способа перезагрузки: перезагрузка одного телефона по указанному IP-адресу, перезагрузка всех телефонов, зарегистрированных в файле DHCP-аренды.]]></description><content:encoded><![CDATA[
  <p id="qoaX">Доступно два способа перезагрузки:<br />- Перезагрузка одного телефона по указанному IP-адресу.<br />- Перезагрузка всех телефонов, зарегистрированных в файле DHCP-аренды (dhcpd.leases).</p>
  <p id="whEG"><strong>Как работает скрипт</strong><br />Скрипт использует учётные данные для доступа к веб-интерфейсу телефонов и отправляет команду на перезагрузку через HTTP. Для перезагрузки всех телефонов скрипт парсит файл dhcpd.leases, находит все IP-адреса, которые были арендованы, и пытается перезагрузить каждый из них.</p>
  <p id="fNj1"><strong>Для чего нужен скрипт</strong><br />Скрипт может быть полезен в ситуациях, когда необходимо массово перезагрузить IP-телефоны, например, после обновления настроек сети или для устранения неполадок. Это позволяет сэкономить время и упростить процесс перезагрузки большого количества устройств.</p>
  <p id="RGJN"><strong>Важно!</strong><br />Предварительно через файл provisioning необходимо передать параметры:</p>
  <pre id="YXFY" data-lang="bash">features.action_uri.enable = 1
features.show_action_uri_option = 0
features.action_uri_limit_ip = 192.168.0.*</pre>
  <p id="YXFY">Данные настройки предназначены для активации и управления функцией удалённого управления IP-телефоном Yealink, включая возможность его перезагрузки по сети.</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="iGZS" class="m_original">
      <img src="https://img2.teletype.in/files/59/da/59dabc63-b699-4b8b-b3bd-cd24c177321b.png" width="1992" />
    </figure>
    <p id="JkHd"><strong>GitHub Gist:</strong> DHCP_Phone_Reloader.sh</p>
    <p id="3TVZ"><a href="https://gist.github.com/telnex/910fbbcbed0e25eca15bafed6f44212c" target="_blank">https://gist.github.com/telnex/910fbbcbed0e25eca15bafed6f44212c</a></p>
  </section>

]]></content:encoded></item><item><guid isPermaLink="true">https://graff45.ru/test-rtp</guid><link>https://graff45.ru/test-rtp?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=factoblog</link><comments>https://graff45.ru/test-rtp?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=factoblog#comments</comments><dc:creator>factoblog</dc:creator><title>Тестирование RTP потока</title><pubDate>Mon, 31 Mar 2025 17:11:09 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/ab/ce/abce70c8-3d1e-45f7-892a-587e811ac1a5.png"></media:content><category>VoIP</category><description><![CDATA[Основные методы тестирования RTP потока]]></description><content:encoded><![CDATA[
  <p id="9r7C">Для тестирования RTP потока можно использовать следующий набор инструментов и методов:</p>
  <p id="6gcC">1. Анализ RTP-потока:</p>
  <pre id="cEG9" data-lang="bash">rtpdump -i eth0 -F ascii &gt; output.txt  # захват пакетов в ASCII формате
rtpdump -F hex -n -t &lt;timestamp&gt; -u &lt;ip&gt; &lt; input.pcap &gt; output.txt  # анализ записанного потока</pre>
  <p id="Pybq">2. Проверка статистики:</p>
  <pre id="mjLf" data-lang="bash">rtpdump -r input.pcap -s 0 -t &lt;timestamp&gt; -T s  # статистика потока</pre>
  <p id="0wwq">Основные параметры для проверки:</p>
  <ul id="sGEF">
    <li id="ApKt">Счетчики пакетов</li>
    <li id="tcsF">Тайминг и задержки</li>
    <li id="i7Ph">Нагрузка на сеть</li>
    <li id="wfDX">Качество передачи данных</li>
  </ul>
  <p id="Jm2Z">3. Воспроизведение записанного потока для тестирования:</p>
  <pre id="fVrt" data-lang="bash">rtpplay input.rtp  # простое воспроизведение
rtpplay -s 10 input.rtp  # с смещением на 10 секунд
rtpplay -T 50 input.rtp  # с ограничением скорости 50%</pre>
  <p id="nC1b">4. Отправка тестовых пакетов:</p>
  <pre id="R4GY" data-lang="bash">rtpsend -a &lt;ip&gt; -p &lt;port&gt; -F &lt;format&gt; -f &lt;file&gt;  # базовая отправка
rtpsend -a &lt;ip&gt; -p &lt;port&gt; -F &lt;format&gt; -f &lt;file&gt; -t &lt;rtcp&gt;  # с RTCP</pre>
  <p id="g5e5">Рекомендации по тестированию:</p>
  <ol id="PMSy">
    <li id="et9W">Записать небольшой участок RTP-потока</li>
    <li id="tB85">Проанализировать базовые параметры</li>
    <li id="jtDu">Воспроизвести записанный поток</li>
    <li id="t7bA">Проверить качество воспроизведения</li>
    <li id="nrda">При необходимости отправить тестовый поток</li>
  </ol>
  <p id="1n5i">При анализе следует обращать внимание на:</p>
  <ul id="IWJq">
    <li id="eDdy">Стабильность потока</li>
    <li id="8Lh8">Наличие потерь пакетов</li>
    <li id="yIa9">Задержки и вариацию задержки</li>
    <li id="sKUU">Качество передаваемых данных</li>
  </ul>

]]></content:encoded></item><item><guid isPermaLink="true">https://graff45.ru/sip-info</guid><link>https://graff45.ru/sip-info?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=factoblog</link><comments>https://graff45.ru/sip-info?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=factoblog#comments</comments><dc:creator>factoblog</dc:creator><title>Протокол SIP</title><pubDate>Wed, 08 Jan 2025 09:48:54 GMT</pubDate><category>VoIP</category><description><![CDATA[Session Initiation Protocol - это протокол, используемый для установления, изменения и завершения мультимедийных сеансов, таких как VoIP-звонки, видеоконференции и обмен сообщениями.]]></description><content:encoded><![CDATA[
  <p id="9fX7">SIP (Session Initiation Protocol) - это протокол, используемый для установления, изменения и завершения мультимедийных сеансов, таких как VoIP-звонки, видеоконференции и обмен сообщениями. В SIP определено несколько типов сообщений, которые делятся на <strong>запросы</strong> и <strong>ответы</strong>.</p>
  <hr />
  <h2 id="moOp"><strong>1. Запросы SIP</strong></h2>
  <p id="WqTT">Запросы (или методы) используются для выполнения различных действий, таких как начало, изменение или завершение сеансов.</p>
  <h3 id="R296">Основные методы SIP:</h3>
  <ol id="s5kB">
    <li id="uXGM"><code>INVITE</code> - Инициализация сеанса. Используется для начала вызова или установления соединения.<br /> Пример: приглашение абонента на голосовой или видеозвонок.</li>
    <li id="i8dF"><code>ACK</code> - Подтверждение успешного получения ответа на <code>INVITE</code>.<br /> Пример: завершение трехсторонней handshake-процедуры для установки соединения.</li>
    <li id="BDmU"><code>BYE</code> - Завершение сеанса. Используется для окончания вызова.<br /> Пример: завершение звонка.</li>
    <li id="AuLb"><code>CANCEL</code> - Отмена незавершенного запроса <code>INVITE</code>. Используется для прекращения вызова до его принятия.<br /> Пример: отмена вызова до того, как он был принят абонентом.</li>
    <li id="gK0L"><code>OPTIONS</code> - Запрос информации о возможностях конечного устройства или сервера (например, поддерживаемые кодеки).<br /> Пример: определение возможностей устройства перед вызовом.</li>
    <li id="2qYL"><code>REGISTER</code> - Регистрация устройства пользователя на SIP-сервере.<br /> Пример: устройство сообщает серверу о своем IP-адресе и порте для приема вызовов.</li>
    <li id="Xa77"><code>INFO</code> - Передача дополнительной информации во время активного сеанса, не изменяя его состояние.<br /> Пример: передача DTMF-тонов или сигналов.</li>
    <li id="MzT0"><code>PRACK</code> (Provisional Acknowledgment) - Подтверждение временного (1xx) ответа. Это опциональный метод.<br /> Пример: надежная доставка 1xx сообщений.</li>
    <li id="e88q"><code>SUBSCRIBE</code> - Запрос подписки на изменения состояния ресурса.<br /> Пример: подписка на уведомления о статусе пользователя (онлайн/офлайн).</li>
    <li id="Iq4q"><code>NOTIFY</code> - Уведомление об изменении состояния ресурса, на который подписан пользователь.<br /> Пример: уведомление об изменении статуса собеседника.</li>
    <li id="RRQX"><code>PUBLISH</code> - Публикация информации о состоянии ресурса.<br /> Пример: устройство сообщает свой текущий статус (доступен/недоступен).</li>
    <li id="MCFg"><code>REFER</code> - Направление получателя для выполнения действия, например, перенаправления вызова.<br /> Пример: переадресация звонка на другой номер.</li>
    <li id="oyzs"><code>MESSAGE</code> - Отправка текстовых сообщений между участниками.<br /> Пример: обмен короткими текстовыми сообщениями через SIP.</li>
    <li id="JhbH"><code>UPDATE</code> - Изменение параметров сеанса во время его активного состояния.<br /> Пример: изменение кодека во время звонка.</li>
    <li id="XEro"><code>PING</code> - Проверка доступности устройства или сервера.<br /> Пример: проверка активности удаленного SIP-устройства.</li>
  </ol>
  <hr />
  <h2 id="4eQF"><strong>2. Ответы SIP</strong></h2>
  <p id="8wOA">Ответы в SIP делятся на 6 классов (по коду состояния, аналогично HTTP). Каждый ответ содержит код и текстовое описание.</p>
  <h3 id="Ab3N">Классы ответов:</h3>
  <ol id="wXxt">
    <li id="pQPn"><strong>1xx: Informational (Информационные)</strong><br /> Уведомляют об обработке запроса.</li>
    <ul id="ro2y">
      <li id="JTAn"><code>100 Trying</code> — запрос обрабатывается.</li>
      <li id="vIGl"><code>180 Ringing</code> — вызываемое устройство звонит.</li>
      <li id="syxW"><code>183 Session Progress</code> — передача прогресса установления соединения (например, плейбэк звука ожидания).</li>
    </ul>
    <li id="jPwH"><strong>2xx: Success (Успех)</strong><br /> Запрос выполнен успешно.</li>
    <ul id="uvO9">
      <li id="5OSt"><code>200 OK</code> — успешное завершение запроса (например, вызов принят).</li>
    </ul>
    <li id="Pf9j"><strong>3xx: Redirection (Перенаправление)</strong><br /> Требуется дальнейшее действие.</li>
    <ul id="GaLv">
      <li id="fRmw"><code>301 Moved Permanently</code> — конечный узел переехал на другой адрес.</li>
      <li id="JciF"><code>302 Moved Temporarily</code> — временный новый адрес.</li>
    </ul>
    <li id="5WZ7"><strong>4xx: Client Error (Ошибка клиента)</strong><br /> Проблема с запросом со стороны клиента.</li>
    <ul id="rSwi">
      <li id="jWp7"><code>400 Bad Request</code> — некорректный запрос.</li>
      <li id="sebC"><code>401 Unauthorized</code> — требуется аутентификация.</li>
      <li id="llTJ"><code>403 Forbidden</code> — доступ запрещен.</li>
      <li id="te5X"><code>404 Not Found</code> — пользователь не найден.</li>
      <li id="qXUH"><code>408 Request Timeout</code> — запрос истек.</li>
    </ul>
    <li id="8nZY"><strong>5xx: Server Error (Ошибка сервера)</strong><br /> Проблема на стороне сервера.</li>
    <ul id="c6up">
      <li id="SoIZ"><code>500 Server Internal Error</code> — внутренняя ошибка сервера.</li>
      <li id="lL1v"><code>503 Service Unavailable</code> — сервис недоступен.</li>
    </ul>
    <li id="PH5f"><strong>6xx: Global Failure (Глобальная ошибка)</strong><br /> Запрос отклонен глобально.</li>
    <ul id="IA3O">
      <li id="6GWl"><code>600 Busy Everywhere</code> — все устройства абонента заняты.</li>
      <li id="h8RE"><code>603 Decline</code> — вызов отклонен.</li>
      <li id="ZFTm"><code>604 Does Not Exist Anywhere</code> — пользователь не существует.</li>
    </ul>
  </ol>
  <hr />
  <h2 id="Wl20"><strong>Пример SIP-сообщения</strong></h2>
  <h3 id="oQC2">Запрос <code>INVITE</code>:</h3>
  <pre id="fPQe">INVITE sip:user@example.com SIP/2.0
Via: SIP/2.0/UDP 192.168.1.2:5060
From: &quot;Caller&quot; &lt;sip:caller@domain.com&gt;;tag=12345
To: &lt;sip:user@example.com&gt;
Call-ID: 1122334455@domain.com
CSeq: 1 INVITE
Contact: &lt;sip:caller@192.168.1.2&gt;
Content-Type: application/sdp
Content-Length: 129

v=0
o=- 1122334455 1122334455 IN IP4 192.168.1.2
s=Session SDP
c=IN IP4 192.168.1.2
t=0 0
m=audio 49170 RTP/AVP 0 101
a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000
</pre>
  <h3 id="mdzM">Ответ <code>200 OK</code>:</h3>
  <pre id="vH5y">SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.1.2:5060
From: &quot;Caller&quot; &lt;sip:caller@domain.com&gt;;tag=12345
To: &lt;sip:user@example.com&gt;;tag=67890
Call-ID: 1122334455@domain.com
CSeq: 1 INVITE
Contact: &lt;sip:user@192.168.1.3&gt;
Content-Type: application/sdp
Content-Length: 129

v=0
o=- 1122334455 1122334455 IN IP4 192.168.1.3
s=Session SDP
c=IN IP4 192.168.1.3
t=0 0
m=audio 49170 RTP/AVP 0 101
a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000
</pre>
  <hr />
  <p id="JfUW">Этот список покрывает основные типы сообщений и примеры их использования в SIP.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://graff45.ru/tcpdump-cli</guid><link>https://graff45.ru/tcpdump-cli?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=factoblog</link><comments>https://graff45.ru/tcpdump-cli?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=factoblog#comments</comments><dc:creator>factoblog</dc:creator><title>Команды tcpdump</title><pubDate>Fri, 03 Jan 2025 16:38:19 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/7a/bb/7abb02aa-2c95-49ab-9599-6ea44cad34f1.png"></media:content><category>Linux</category><description><![CDATA[Cписок команд и параметров для tcpdump, одной из самых популярных утилит для захвата и анализа сетевого трафика.]]></description><content:encoded><![CDATA[
  <p id="eOiu">Cписок команд и параметров для <strong><code>tcpdump</code></strong>, одной из самых популярных утилит для захвата и анализа сетевого трафика.</p>
  <hr />
  <h3 id="mTec"><strong>1. Основной синтаксис</strong></h3>
  <pre id="Gr6v">tcpdump [опции] [выражение фильтра]
</pre>
  <hr />
  <h3 id="7rfl"><strong>2. Основные опции</strong></h3>
  <ul id="KTp1">
    <li id="j7Ge"><code>-i &lt;интерфейс&gt;</code> Указывает интерфейс для захвата (например, <code>eth0</code>, <code>wlan0</code>).</li>
    <li id="MGqv"><code>-D</code> Показывает список всех доступных интерфейсов.   </li>
    <li id="49O0"><code>-n</code> Не преобразует IP-адреса и порты в имена (ускоряет анализ).  </li>
    <li id="wsvJ"><code>-nn</code> Не преобразует IP-адреса, имена портов и протоколов.</li>
    <li id="8ET2"><code>-c &lt;число&gt;</code> Захватывает только указанное количество пакетов.   </li>
    <li id="qMWR"><code>-s &lt;размер&gt;</code> Устанавливает размер захвата пакета (по умолчанию 262144).   </li>
    <li id="eMko"><code>-w &lt;файл&gt;</code> Сохраняет захваченные пакеты в файл для последующего анализа (формат pcap).   </li>
    <li id="V1p6"><code>-r &lt;файл&gt;</code> Читает захваченные пакеты из файла pcap.  </li>
    <li id="0VJN"> <code>-v</code>, <code>-vv</code>, <code>-vvv</code> Увеличивает детализацию выводимой информации.   </li>
    <li id="QzGL"><code>-X</code> Показывает содержимое пакетов в ASCII и HEX.   </li>
    <li id="OKH9"><code>-XX</code> Показывает содержимое заголовков и данных пакета в HEX и ASCII.   </li>
    <li id="GO5J"><code>-A</code> Показывает содержимое пакетов в ASCII (удобно для HTTP/SMTP).   </li>
    <li id="6AUH"><code>-C &lt;размер&gt;</code> Делит захват на файлы размером не более указанного значения (в мегабайтах).   </li>
    <li id="r0XS"><code>-G &lt;интервал&gt;</code> Делит захват на файлы с интервалом времени (в секундах).   </li>
    <li id="WQ5f"><code>-z &lt;команда&gt;</code> Указывает команду для выполнения после сохранения файла (например, компрессия).   </li>
    <li id="3e3t"><code>-E &lt;ключ&gt;</code> Расшифровка трафика с использованием заданного ключа (например, для IPsec).   </li>
    <li id="AO7Y"><code>-N</code> Не отображает доменные имена хостов.   </li>
    <li id="wjlb"><code>-K</code> Отключает проверку целостности.</li>
  </ul>
  <hr />
  <h3 id="2en5"><strong>3. Фильтрация пакетов</strong></h3>
  <p id="Olrl">Фильтры позволяют захватывать только нужный трафик:</p>
  <ul id="wavh">
    <li id="zQnP"><strong>Хосты</strong> <code>host 192.168.1.1</code> - Захват трафика для определенного хоста.   </li>
    <li id="iv90"><strong>Источник</strong> <code>src 192.168.1.1</code> - Трафик, исходящий от хоста.   </li>
    <li id="sQYS"><strong>Назначение</strong> <code>dst 192.168.1.1</code> - Трафик, направленный на хост.   </li>
    <li id="M62s"><strong>Сеть</strong> <code>net 192.168.1.0/24</code> - Трафик для указанной сети.   </li>
    <li id="xSWy"><strong>Порты</strong> <code>port 80</code> или <code>portrange 20-80</code>  - Захват трафика для порта или диапазона.   </li>
    <li id="E9Yi"><strong>Протоколы</strong> <code>tcp</code>, <code>udp</code>, <code>icmp</code>, <code>arp</code>, <code>ip</code>, <code>ipv6</code>, и др. - Фильтрация по протоколу.   </li>
    <li id="MYIm"><strong>Сложные условия</strong> <code>src 192.168.1.1 and dst port 80</code> - Комбинация условий с <code>and</code>, <code>or</code>, <code>not</code>.</li>
  </ul>
  <hr />
  <h3 id="wPA3"><strong>4. Примеры команд</strong></h3>
  <h4 id="tXcv"><strong>Захват всего трафика на интерфейсе <code>eth0</code>:</strong></h4>
  <pre id="lMB0">tcpdump -i eth0
</pre>
  <h4 id="51Kc"><strong>Фильтр HTTP-трафика:</strong></h4>
  <pre id="b51C">tcpdump -i eth0 port 80
</pre>
  <h4 id="pKJy"><strong>Захват и запись в файл:</strong></h4>
  <pre id="jU3g">tcpdump -i eth0 -w capture.pcap
</pre>
  <h4 id="yKOa"><strong>Чтение файла pcap:</strong></h4>
  <pre id="d8FI">tcpdump -r capture.pcap
</pre>
  <h4 id="arRD"><strong>Захват ICMP-пакетов:</strong></h4>
  <pre id="ccDe">tcpdump -i eth0 icmp
</pre>
  <h4 id="dz7S"><strong>Фильтрация трафика из подсети:</strong></h4>
  <pre id="8pFO">tcpdump net 192.168.1.0/24
</pre>
  <h4 id="mrsj"><strong>Вывод в деталях (TCP/UDP):</strong></h4>
  <pre id="qrQd">tcpdump -vv tcp
</pre>
  <h4 id="qJmx"><strong>Показ содержимого пакетов:</strong></h4>
  <pre id="FLjR">tcpdump -X port 80
</pre>

]]></content:encoded></item><item><guid isPermaLink="true">https://graff45.ru/qcow2-server</guid><link>https://graff45.ru/qcow2-server?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=factoblog</link><comments>https://graff45.ru/qcow2-server?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=factoblog#comments</comments><dc:creator>factoblog</dc:creator><title>Развертывание .qcow2 на сервере</title><pubDate>Mon, 25 Nov 2024 16:21:22 GMT</pubDate><category>Linux</category><description><![CDATA[Образ диска в формате .qcow2 можно развернуть на другом сервере, если на этом сервере установлено программное обеспечение, поддерживающее этот формат, например, QEMU/KVM. Вот основные шаги для развертывания QCOW2-образа на другом сервере:]]></description><content:encoded><![CDATA[
  <p id="UWaJ">Образ диска в формате .qcow2 можно развернуть на другом сервере, если на этом сервере установлено программное обеспечение, поддерживающее этот формат, например, QEMU/KVM. Вот основные шаги для развертывания QCOW2-образа на другом сервере:</p>
  <h3 id="WSnf">1. Копирование QCOW2-образа:</h3>
  <p id="6uYt">Сначала вам нужно скопировать файл .qcow2 на целевой сервер. Это можно сделать с помощью SCP, rsync или любого другого метода передачи файлов. Например:</p>
  <pre id="4RA5" data-lang="bash">scp путь/к/образу.qcow2 пользователь@целевой_сервер:путь/к/папке/     </pre>
  <h3 id="hB68">2. Установка необходимых компонентов:</h3>
  <p id="tc7W">Убедитесь, что на целевом сервере установлены QEMU и KVM (если вы планируете использовать виртуализацию). Это можно сделать с помощью пакетного менеджера. Например, для Ubuntu:</p>
  <pre id="7LMn" data-lang="bash">sudo apt update
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils    </pre>
  <h3 id="UU7S">3. Создание виртуальной машины:</h3>
  <p id="aUdT">После того как QCOW2-образ будет скопирован, вы можете создать виртуальную машину, указав этот образ в качестве диска. Это можно сделать через командную строку или с помощью графических интерфейсов, таких как virt-manager.</p>
  <p id="tsHV">Пример команды для создания виртуальной машины с использованием virt-install:</p>
  <pre id="55q6" data-lang="bash">virt-install 
     --name имя_виртуальной_машины 
     --ram 2048 
     --disk path=путь/к/образу.qcow2,format=qcow2 
     --vcpus 2 
     --os-type linux 
     --os-variant ubuntu20.04 
     --network network=default 
     --graphics none 
     --console pty,target_type=serial 
     --location &#x27;http://archive.ubuntu.com/ubuntu/dists/focal/main/installer-amd64/&#x27; 
     --extra-args &#x27;console=ttyS0,115200n8 serial&#x27;
   </pre>
  <h3 id="18qp">4. Запуск виртуальной машины:</h3>
  <p id="pYqh"> После создания виртуальной машины вы можете запустить её с помощью команды virsh:</p>
  <pre id="x1Kg" data-lang="bash">virsh start имя_виртуальной_машины</pre>
  <h3 id="sqvE">Дополнительные советы</h3>
  <ul id="ZV46">
    <li id="Mj3T">Настройка сети: Убедитесь, что ваша виртуальная машина настроена на использование сети, чтобы иметь доступ к интернету или другим ресурсам.</li>
    <li id="62OM">Проверка совместимости: Убедитесь, что версия QEMU/KVM на новом сервере совместима с версией, на которой был создан QCOW2-образ.</li>
    <li id="n7Cm">Снимки и резервные копии: Если у вас есть снимки виртуальной машины, убедитесь, что они также перенесены и доступны на новом сервере.</li>
    <li id="Bd4D">Следуя этим шагам, вы сможете успешно развернуть QCOW2-образ на другом сервере. Если у вас есть дополнительные вопросы или требуется помощь с конкретными шагами, дайте знать!</li>
  </ul>

]]></content:encoded></item><item><guid isPermaLink="true">https://graff45.ru/qemu-kvm-linux</guid><link>https://graff45.ru/qemu-kvm-linux?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=factoblog</link><comments>https://graff45.ru/qemu-kvm-linux?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=factoblog#comments</comments><dc:creator>factoblog</dc:creator><title>Создать образ ОС через QEMU</title><pubDate>Mon, 25 Nov 2024 16:14:20 GMT</pubDate><category>Linux</category><description><![CDATA[Создание образа работающей операционной системы через QEMU в CentOS 6 KVM можно выполнить с помощью утилиты qemu-img и других инструментов. Ниже приведены шаги для создания образа существующей виртуальной машины.]]></description><content:encoded><![CDATA[
  <p id="TnHM">Создание образа работающей операционной системы через QEMU в CentOS 6 KVM можно выполнить с помощью утилиты qemu-img и других инструментов. Ниже приведены шаги для создания образа существующей виртуальной машины.</p>
  <h2 id="6X8j">Шаги по созданию образа работающей ОС</h2>
  <p id="MpHZ">1. Убедитесь, что у вас установлены необходимые пакеты и службы KVM работают:</p>
  <pre id="u0vh" data-lang="bash">sudo yum install qemu-kvm libvirt virt-install
sudo service libvirtd start
sudo chkconfig libvirtd on</pre>
  <p id="rkJl">2. Запустите вашу виртуальную машину, если она уже запущена, вы можете перейти к следующему шагу. Если нет, запустите её с помощью virsh или virt-manager.</p>
  <p id="1bqj">3. Создайте образ диска. Используйте команду qemu-img для создания образа диска. Например, чтобы создать образ в формате QCOW2 (рекомендуемый формат), выполните:</p>
  <pre id="q2M6" data-lang="bash">qemu-img create -f qcow2 /var/lib/libvirt/images/my_image.qcow2 20G   </pre>
  <p id="aNlr">Это создаст новый образ размером 20 ГБ.</p>
  <p id="X9ez">4. Если вы хотите сделать <u>снимок текущего состояния</u> вашей работающей ОС, вы можете использовать <strong>virt-clone</strong>, чтобы создать клон виртуальной машины, или воспользоваться функцией создания снимков (snapshot) в libvirt.</p>
  <p id="wiGn">Для создания снимка с использованием virsh, выполните:</p>
  <pre id="0iMW" data-lang="bash">virsh snapshot-create-as --domain &lt;имя_вашей_ВМ&gt; --name &lt;имя_снимка&gt; --description &quot;Описание снимка&quot;  </pre>
  <p id="KJSi">5. Чтобы создать образ работающей ОС, используйте команду <code>dd</code> для копирования данных с диска вашей виртуальной машины. Например, если ваша виртуальная машина называется myvm, выполните:</p>
  <pre id="M74s" data-lang="bash">dd if=/dev/vda of=/var/lib/libvirt/images/my_vm_backup.img bs=4M  </pre>
  <p id="oHVt">Замените /dev/vda на соответствующий диск вашей виртуальной машины.</p>
  <p id="InHv">6. Если вы хотите конвертировать созданный образ в другой формат, используйте qemu-img:</p>
  <pre id="aEut" data-lang="bash">qemu-img convert -f raw -O qcow2 /var/lib/libvirt/images/my_vm_backup.img /var/lib/libvirt/images/my_vm_backup_converted.qcow2   </pre>
  <p id="q19m">7. После завершения процесса проверьте созданный образ:</p>
  <pre id="p8Qh" data-lang="bash">qemu-img info /var/lib/libvirt/images/my_vm_backup.qcow2   </pre>
  <p id="0lzO">Теперь у вас есть образ работающей ОС, созданный с помощью QEMU в CentOS 6 KVM. Вы можете использовать этот образ для восстановления или создания новых виртуальных машин.<br /></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://graff45.ru/tests-flask</guid><link>https://graff45.ru/tests-flask?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=factoblog</link><comments>https://graff45.ru/tests-flask?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=factoblog#comments</comments><dc:creator>factoblog</dc:creator><title>Использование pytest в Flask</title><pubDate>Sun, 12 May 2024 18:27:58 GMT</pubDate><category>Python</category><description><![CDATA[Краткое представление о том, как использовать pytest в фремворке Flask.]]></description><content:encoded><![CDATA[
  <p id="xUqx">Краткое представление о том, как использовать pytest в фреймворке Flask.</p>
  <h2 id="IIhR">Структура проекта</h2>
  <pre id="2ezY">/WebApp
├── flask/
│   ├── __init__.py
│   ├── app.py
│   ├── templates/
│   ├── routes/
│   │    └── hello.py
│   └── static/
│       
└── tests/
    ├── conftest.py
    └── test_hello.py</pre>
  <h2 id="Cw06">Tests</h2>
  <h3 id="Ufz0">conftest.py</h3>
  <pre id="Cupl" data-lang="python">import sys
import os

#SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
#sys.path.append(os.path.dirname(SCRIPT_DIR))

import pytest
from flask import create_app

@pytest.fixture()
def app():
    app = create_app()
    app.config.update({
        &quot;TESTING&quot;: True,
    })
    # other setup can go here
    yield app
    # clean up / reset resources here

@pytest.fixture()
def client(app):
    return app.test_client()

@pytest.fixture()
def runner(app):
    return app.test_cli_runner()</pre>
  <h3 id="EOdA">test_hello.py</h3>
  <pre id="znC7" data-lang="python">def test_hello(client):
    response = client.get(&#x27;/&#x27;)
    assert response.status_code == 200, f&#x27;Код ответа сервера: {response.status_code}&#x27;</pre>
  <h2 id="xO9G">Flask</h2>
  <p id="r5lK">Использовать шаблон построения &quot;<em>application factory&quot; </em>(<a href="https://flask.palletsprojects.com/en/3.0.x/blueprints/" target="_blank">Blueprint</a>).</p>
  <h3 id="deT6">__init__.py</h3>
  <p id="EPFh">В корневом каталоге Flask.</p>
  <pre id="2jgD" data-lang="python">from flask import Flask

def create_app():
    app = Flask(__name__)

    from WebApp.routes.hello import mainPage
    app.register_blueprint(mainPage)

    return app</pre>
  <h3 id="AP4Q">app.py</h3>
  <pre id="QLHV" data-lang="python">from flask import Flask
from route.hello import mainPage

app = Flask(__name__)
app.register_blueprint(mainPage)
if __name__ == &quot;__main__&quot;:
    app.run()</pre>
  <h3 id="9Ib2">/routes/hello.py</h3>
  <pre id="wnKC" data-lang="python">from flask import Blueprint

mainPage = Blueprint(&#x27;mainPages&#x27;, __name__)

@mainPage.route(&#x27;/&#x27;)
def hello():
    return &quot;Hello, World!&quot;</pre>
  <h2 id="KYOF">Pytest</h2>
  <p id="UC0L">Запуск из каталога <code>WebApp</code> командой <code>pytest</code></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://graff45.ru/socket-server</guid><link>https://graff45.ru/socket-server?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=factoblog</link><comments>https://graff45.ru/socket-server?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=factoblog#comments</comments><dc:creator>factoblog</dc:creator><title>Socket-сервер для GPS маяка</title><pubDate>Mon, 11 Mar 2024 15:39:05 GMT</pubDate><category>Python</category><description><![CDATA[Простая реализация сокет-сервера на Python для перехвата данных от GPS маяка SinoTrack с последующей отправкой на сервер мониторинга.]]></description><content:encoded><![CDATA[
  <p id="H4OX">Простая реализация сокет-сервера на Python для перехвата данных от GPS маяка SinoTrack с последующей отправкой на сервер мониторинга Ruhavik, а также записью координат во временную базу данных Influx с последующей визуализацией данных в Grafana.</p>
  <p id="NI7m">Такая схема используется для того, чтобы в Grafana выставить уведомление на различные события, например, низкий заряд батареи или когда маяк начал движение.</p>
  <h3 id="8lGJ">Сервер на Python</h3>
  <p id="F3PB">Запускать через Supervisor.</p>
  <blockquote id="h7k5" data-align="center">Supervisor - это простой менеджер процессов с открытым исходным кодом, написанный на Python, с помощью которого можно запускать нужное количество копий процесса и следить за их состоянием.</blockquote>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <figure id="lItZ" class="m_original">
      <img src="https://img3.teletype.in/files/ea/a3/eaa3af4a-e7e6-4e82-ae3d-994a8345ea6e.png" width="1662" />
    </figure>
    <p id="LJxB"><strong>GitHub Gist:</strong> Socket-сервер на Python и Influx</p>
    <p id="4mRf"><a href="https://gist.github.com/telnex/8aa003055062b4c5f142321fe6da31d6" target="_blank">https://gist.github.com/telnex/8aa003055062b4c5f142321fe6da31d6</a></p>
  </section>
  <h3 id="G8Ov">Клиент</h3>
  <p id="9zrW">В нашем случае клиент нужен только для отладки, т.к. на практике в роли клиента будет наш SinoTrack маяк.</p>
  <pre id="XXpg" data-lang="python">import socket

HOST = &#x27;localhost&#x27;
PORT = 30200        
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    s.sendall(b&#x27;*HQ,7028702252,V1,182350,A,4740.7697,N,04950.0711,E,0.00,0,250324,fbfffbff,250,02,3039,23394,55#&#x27;)
    data = s.recv(1024)
print(&#x27;Received&#x27;, repr(data))</pre>
  <h3 id="FYNu"><strong>Настройка маяка через СМС</strong></h3>
  <p id="uvkB">Стандартные команды для настройки SinoTrack.</p>
  <pre id="LtOt">Команда: 804paswd IP PORT. 
Пример: 8040000 45.112.204.217 8090 
Ответ: SET OK</pre>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h3 id="aER3"><strong>Настройка базы данных Influx</strong></h3>
    <p id="UyID"><strong><u>не актуально</u></strong></p>
    <p id="Gnk4">На данном этапе InfluxDB версии <strong>1.х</strong> уже должна быть установлена.</p>
    <pre id="G3lV" data-lang="sql">CREATE DATABASE GPS
USE DATABASE GPS
SHOW RETENTION POLICIES
CREATE RETENTION POLICY &quot;Month&quot; ON &quot;GPS&quot; DURATION 720h REPLICATION 1;
ALTER RETENTION POLICY &quot;Month&quot; ON &quot;GPS&quot; DEFAULT</pre>
    <figure id="rnOj" class="m_column">
      <img src="https://img1.teletype.in/files/82/ed/82ed6524-d736-4fc1-adb7-daff4b98f68a.png" width="1130" />
      <figcaption>Пример визуализации данных через Grafana</figcaption>
    </figure>
    <figure id="6wcC" class="m_column">
      <img src="https://img4.teletype.in/files/b0/72/b0720b1e-aee9-48f3-a8a7-c37b7f596ace.png" width="958" />
      <figcaption>Пример запроса для плагина Map</figcaption>
    </figure>
    <figure id="7PMz" class="m_column">
      <img src="https://img4.teletype.in/files/3d/4b/3d4b93ce-dcf3-4e38-8e28-bba6fc1795b6.png" width="926" />
      <figcaption>Параметры плагина Map для отображения координат</figcaption>
    </figure>
    <p id="7Y3E"><strong>Уведомление о начале движения</strong></p>
    <p id="mbIM">Плагин: Time series</p>
    <pre id="128y">Evaluate every 1m For 2m</pre>
    <pre id="KS3H" data-lang="sql">WHEN last() OF query (A, 5m, now) IS ABOVE 1</pre>
  </section>
  <p id="lDQ6"><strong>Проблемы</strong></p>
  <p id="VQHd">Периодически возникали проблемы с недоступностью скрипта: не отвечал на запросы. Ошибок не было, порт также прослушивался. Искусственно воспроизвести ошибку не получалось. По этой причине код был переписан на <strong><a href="https://twisted.org/" target="_blank">Twisted</a></strong>. На данном фреймворке описанная проблема не наблюдалась.</p>
  <p id="2TMV"><strong>Документация</strong></p>
  <ol id="YmWM">
    <li id="ciDC"><a href="https://docs.python.org/3/library/socketserver.html#socketserver-tcpserver-example" target="_blank">docs.python.org/3/library/socketserver.html</a></li>
    <li id="ypmD"><a href="https://flespi.com/protocols" target="_blank">https://flespi.com/protocols</a></li>
    <li id="rxMm"><a href="https://help.influxcloud.net/getting_started_cli/" target="_blank">https://help.influxcloud.net/getting_started_cli/</a></li>
    <li id="3t6B"><a href="https://docs.twisted.org/en/stable/core/examples/index.html" target="_blank">https://docs.twisted.org/en/stable/core/examples/index.html</a></li>
  </ol>

]]></content:encoded></item><item><guid isPermaLink="true">https://graff45.ru/home-a-ubuntu</guid><link>https://graff45.ru/home-a-ubuntu?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=factoblog</link><comments>https://graff45.ru/home-a-ubuntu?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=factoblog#comments</comments><dc:creator>factoblog</dc:creator><title>Установка Home Assistant на Ubuntu сервер</title><pubDate>Mon, 26 Feb 2024 18:05:11 GMT</pubDate><description><![CDATA[Вся предоставленная ниже информация взята на сайте проекта и основана на установке Home Assistant для Raspberry Pi.]]></description><content:encoded><![CDATA[
  <h3 id="_ha_install">Установка Home Assistant</h3>
  <p id="4MXu">Вся предоставленная ниже информация взята на сайте проекта и основана на установке Home Assistant для Raspberry Pi.</p>
  <p id="2rxa">Подключаемся к системе, на которой у нас будет крутиться Home Assistant по SSH и обновляем систему до актуального состояния.</p>
  <pre id="Nc0u" data-lang="bash">sudo apt-get update
sudo apt-get upgrade -y</pre>
  <p id="gVpA">После обновления системы устанавливаем необходимые компоненты и зависимости.</p>
  <pre id="3NTz" data-lang="bash">sudo apt-get install python3 python3-dev python3-venv python3-pip libffi-dev libssl-dev autoconf build-essential</pre>
  <p id="8Lht">Создаем нового системного пользователя с домашней папкой для запуска и работы ядра Home Assistant, назовем его <code>homeassistant</code>. Добавим его в группу <code>dialout</code> для взаимодействия с устройствами Z-Wave и ZigBee.</p>
  <pre id="QKjT" data-lang="bash">sudo useradd -rm homeassistant -G dialout</pre>
  <p id="ZCaX">Далее создаем папку для ядра Home Assistant и устанавливаем пользователя <code>homeassistant</code> для неё владельцем.</p>
  <pre id="YGfZ" data-lang="bash">cd /srv
sudo mkdir homeassistant
sudo chown homeassistant:homeassistant /srv/homeassistant</pre>
  <p id="rxZz">Теперь создаем виртуальное окружение для ядра Home Assistant, делаем это для учетной записи <code>homeassistant</code>.</p>
  <pre id="pBhD" data-lang="bash">sudo -u homeassistant -H -s
cd /srv/homeassistant
python3 -m venv .
source bin/activate</pre>
  <p id="nl4Z">После активации виртуальной среды выполняем установку необходимого пакета Python.</p>
  <pre id="NZXm" data-lang="bash">python3 -m pip install wheel</pre>
  <p id="rNcH">По завершении установки пакета Python приступаем к установке Home Assistant.</p>
  <pre id="irnN" data-lang="bash">pip3 install homeassistant</pre>
  <p id="sDpz">Запускаем наш Home Assistant в первый раз. При первом запуске в домашнем каталоге пользователя <code>homeassistant</code> (/home/homeassistant) будет создана папка <code>.homeassistant</code>, в которой будут находится конфигурационные файлы системы.</p>
  <pre id="XlFa" data-lang="bash">hass</pre>
  <p id="4b3A">Первый запуск может занимать 5-10 минут, после чего проверяем доступность установленной системы через браузер.</p>
  <p id="mj9J"><code>http://<strong>ha_ip_address</strong>:8123</code></p>
  <p id="02ih">Прерываем работу запущенной системы.</p>
  <p id="bJzj"><code>Ctrl+C</code></p>
  <p id="F4Y0">Выходим из учетной записи пользователя <code>homeassistant</code>.</p>
  <p id="f0mp">Создаем файл для запуска сервиса при старте системы.</p>
  <pre id="kEeS" data-lang="bash">sudo nano /etc/systemd/system/homeassistant@homeassistant.service</pre>
  <p id="H0bU">Заполняем его.</p>
  <pre id="dlvd">[Unit]
Description=Home Assistant
After=network-online.target

[Service]
Type=simple
User=%i
WorkingDirectory=/home/%i/.homeassistant
ExecStart=/srv/homeassistant/bin/hass -c &quot;/home/%i/.homeassistant&quot;
RestartForceExitStatus=100

[Install]
WantedBy=multi-user.target</pre>
  <p id="AkUv">Запускаем сервис.</p>
  <pre id="T98J" data-lang="bash">$ sudo systemctl --system daemon-reload
$ sudo systemctl enable homeassistant@homeassistant.service
$ sudo systemctl start homeassistant@homeassistant.service
</pre>
  <p id="fPiP">Проверяем работу сервиса.</p>
  <pre id="BoUX" data-lang="bash">sudo systemctl status homeassistant@homeassistant.service</pre>
  <p id="tCuN">Через Web браузер проверяем работу Home Assistant.</p>
  <p id="6UZT"><code>http://<strong>ha_ip_address</strong>:8123</code></p>
  <h3 id="_ha_update">Обновление Home Assistant</h3>
  <p id="UpRc">Для обновления до последней версии необходимо выполнить следующие три команды.</p>
  <pre id="SQ85" data-lang="bash">sudo -u homeassistant -H -s
source /srv/homeassistant/bin/activate
pip3 install --upgrade homeassistant</pre>
  <p id="8ABr">После обновления выполняем перезапуск службы <code>homeassistant@homeassistant.service</code></p>
  <pre id="Tl8g" data-lang="bash">sudo systemctl restart homeassistant@homeassistant.service</pre>
  <p id="w614">Обратите внимание, что первый запуск после обновления может занять некоторое время.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://graff45.ru/linux-file</guid><link>https://graff45.ru/linux-file?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=factoblog</link><comments>https://graff45.ru/linux-file?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=factoblog#comments</comments><dc:creator>factoblog</dc:creator><title>Передача файлов между Linux машинами</title><pubDate>Sun, 18 Feb 2024 22:11:34 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/f8/bb/f8bb20b2-a433-4a7d-966b-6cd23c8704a4.png"></media:content><category>Linux</category><description><![CDATA[Недавно встретился простой, но очень занятный вопрос: как можно перенести файл с одного компьютера на другой? Оказалось, что вариантов на любой вкус и цвет. Оформлю списком, который может когда-то пополниться новыми извращениями.]]></description><content:encoded><![CDATA[
  <p id="n59M">Лично у меня прижились следующие способы передачи. </p>
  <p id="phGJ">Если надо перекинуть один файл между серверами, я использую scp:</p>
  <pre id="EhQE" data-lang="bash">scp -P 22777 user@10.1.4.4:/mnt/data/BackUp/onlyoffice.tar.gz /backup</pre>
  <p id="Og0G">Сразу привёл пример с нестандартным портом, там как тут используется заглавная -P. Я долго не мог запомнить это, используя маленькую -p, как в ssh.</p>
  <p id="lQXp">Если файлов много, использую rsync:</p>
  <pre id="jRBf" data-lang="bash">rsync -avz -e &quot;ssh -p 1234 -i /root/.ssh/id_rsa&quot; user@10.1.4.22:/data/mail /data</pre>
  <p id="Q1GE">Тоже такой универсальный пример, где сразу и порт, и ключ указан, если аутентификация не по паролю.</p>
  <p id="Dkii">А вот если надо скопировать что-то разово на мой рабочий ноут или какой-то виндовый комп, то я запускаю веб сервер на python и просто скачиваю. Для текстовых логов актуально, чтобы сразу забрать все, что нужны:</p>
  <pre id="ssem" data-lang="bash">cd /var/log
python3 -m http.server 8080</pre>
  <p id="zhPQ">А вот простой трюк, когда надо перекинуть файл с одного сервера на другой, но при этом подключение между серверами не настроено, но я со своего ноута или jump сервера могу подключиться к обоим. Тогда можно сделать вот так:</p>
  <pre id="Szbc" data-lang="bash">ssh user01@10.1.4.4 &#x27;cat /home/user01/file.tar.gz&#x27; | ssh user02@10.1.5.10 &#x27;cat &gt; /home/user02/file.tar.gz&#x27;</pre>

]]></content:encoded></item></channel></rss>