<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Graff</title><subtitle>Личный блог</subtitle><author><name>Graff</name></author><id>https://teletype.in/atom/factoblog</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/factoblog?offset=0"></link><link rel="alternate" type="text/html" href="https://graff45.ru/?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=factoblog"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/factoblog?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-04-21T11:25:37.177Z</updated><entry><id>factoblog:DHCP_Phone_Reloader</id><link rel="alternate" type="text/html" href="https://graff45.ru/DHCP_Phone_Reloader?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=factoblog"></link><title>Скрипт перезагрузки IP-телефонов Yealink</title><published>2025-04-11T20:42:52.528Z</published><updated>2025-04-11T20:42:52.528Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/93/bd/93bdb4c3-380d-4073-977a-943d5d741da5.png"></media:thumbnail><summary type="html">Доступно два способа перезагрузки: перезагрузка одного телефона по указанному IP-адресу, перезагрузка всех телефонов, зарегистрированных в файле DHCP-аренды.</summary><content type="html">
  &lt;p id=&quot;qoaX&quot;&gt;Доступно два способа перезагрузки:&lt;br /&gt;- Перезагрузка одного телефона по указанному IP-адресу.&lt;br /&gt;- Перезагрузка всех телефонов, зарегистрированных в файле DHCP-аренды (dhcpd.leases).&lt;/p&gt;
  &lt;p id=&quot;whEG&quot;&gt;&lt;strong&gt;Как работает скрипт&lt;/strong&gt;&lt;br /&gt;Скрипт использует учётные данные для доступа к веб-интерфейсу телефонов и отправляет команду на перезагрузку через HTTP. Для перезагрузки всех телефонов скрипт парсит файл dhcpd.leases, находит все IP-адреса, которые были арендованы, и пытается перезагрузить каждый из них.&lt;/p&gt;
  &lt;p id=&quot;fNj1&quot;&gt;&lt;strong&gt;Для чего нужен скрипт&lt;/strong&gt;&lt;br /&gt;Скрипт может быть полезен в ситуациях, когда необходимо массово перезагрузить IP-телефоны, например, после обновления настроек сети или для устранения неполадок. Это позволяет сэкономить время и упростить процесс перезагрузки большого количества устройств.&lt;/p&gt;
  &lt;p id=&quot;RGJN&quot;&gt;&lt;strong&gt;Важно!&lt;/strong&gt;&lt;br /&gt;Предварительно через файл provisioning необходимо передать параметры:&lt;/p&gt;
  &lt;pre id=&quot;YXFY&quot; data-lang=&quot;bash&quot;&gt;features.action_uri.enable = 1
features.show_action_uri_option = 0
features.action_uri_limit_ip = 192.168.0.*&lt;/pre&gt;
  &lt;p id=&quot;YXFY&quot;&gt;Данные настройки предназначены для активации и управления функцией удалённого управления IP-телефоном Yealink, включая возможность его перезагрузки по сети.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;figure id=&quot;iGZS&quot; class=&quot;m_original&quot;&gt;
      &lt;img src=&quot;https://img2.teletype.in/files/59/da/59dabc63-b699-4b8b-b3bd-cd24c177321b.png&quot; width=&quot;1992&quot; /&gt;
    &lt;/figure&gt;
    &lt;p id=&quot;JkHd&quot;&gt;&lt;strong&gt;GitHub Gist:&lt;/strong&gt; DHCP_Phone_Reloader.sh&lt;/p&gt;
    &lt;p id=&quot;3TVZ&quot;&gt;&lt;a href=&quot;https://gist.github.com/telnex/910fbbcbed0e25eca15bafed6f44212c&quot; target=&quot;_blank&quot;&gt;https://gist.github.com/telnex/910fbbcbed0e25eca15bafed6f44212c&lt;/a&gt;&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>factoblog:test-rtp</id><link rel="alternate" type="text/html" href="https://graff45.ru/test-rtp?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=factoblog"></link><title>Тестирование RTP потока</title><published>2025-03-31T17:11:09.254Z</published><updated>2025-05-19T18:16:17.112Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/ab/ce/abce70c8-3d1e-45f7-892a-587e811ac1a5.png"></media:thumbnail><category term="vo-ip" label="VoIP"></category><summary type="html">Основные методы тестирования RTP потока</summary><content type="html">
  &lt;p id=&quot;9r7C&quot;&gt;Для тестирования RTP потока можно использовать следующий набор инструментов и методов:&lt;/p&gt;
  &lt;p id=&quot;6gcC&quot;&gt;1. Анализ RTP-потока:&lt;/p&gt;
  &lt;pre id=&quot;cEG9&quot; data-lang=&quot;bash&quot;&gt;rtpdump -i eth0 -F ascii &amp;gt; output.txt  # захват пакетов в ASCII формате
rtpdump -F hex -n -t &amp;lt;timestamp&amp;gt; -u &amp;lt;ip&amp;gt; &amp;lt; input.pcap &amp;gt; output.txt  # анализ записанного потока&lt;/pre&gt;
  &lt;p id=&quot;Pybq&quot;&gt;2. Проверка статистики:&lt;/p&gt;
  &lt;pre id=&quot;mjLf&quot; data-lang=&quot;bash&quot;&gt;rtpdump -r input.pcap -s 0 -t &amp;lt;timestamp&amp;gt; -T s  # статистика потока&lt;/pre&gt;
  &lt;p id=&quot;0wwq&quot;&gt;Основные параметры для проверки:&lt;/p&gt;
  &lt;ul id=&quot;sGEF&quot;&gt;
    &lt;li id=&quot;ApKt&quot;&gt;Счетчики пакетов&lt;/li&gt;
    &lt;li id=&quot;tcsF&quot;&gt;Тайминг и задержки&lt;/li&gt;
    &lt;li id=&quot;i7Ph&quot;&gt;Нагрузка на сеть&lt;/li&gt;
    &lt;li id=&quot;wfDX&quot;&gt;Качество передачи данных&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;Jm2Z&quot;&gt;3. Воспроизведение записанного потока для тестирования:&lt;/p&gt;
  &lt;pre id=&quot;fVrt&quot; data-lang=&quot;bash&quot;&gt;rtpplay input.rtp  # простое воспроизведение
rtpplay -s 10 input.rtp  # с смещением на 10 секунд
rtpplay -T 50 input.rtp  # с ограничением скорости 50%&lt;/pre&gt;
  &lt;p id=&quot;nC1b&quot;&gt;4. Отправка тестовых пакетов:&lt;/p&gt;
  &lt;pre id=&quot;R4GY&quot; data-lang=&quot;bash&quot;&gt;rtpsend -a &amp;lt;ip&amp;gt; -p &amp;lt;port&amp;gt; -F &amp;lt;format&amp;gt; -f &amp;lt;file&amp;gt;  # базовая отправка
rtpsend -a &amp;lt;ip&amp;gt; -p &amp;lt;port&amp;gt; -F &amp;lt;format&amp;gt; -f &amp;lt;file&amp;gt; -t &amp;lt;rtcp&amp;gt;  # с RTCP&lt;/pre&gt;
  &lt;p id=&quot;g5e5&quot;&gt;Рекомендации по тестированию:&lt;/p&gt;
  &lt;ol id=&quot;PMSy&quot;&gt;
    &lt;li id=&quot;et9W&quot;&gt;Записать небольшой участок RTP-потока&lt;/li&gt;
    &lt;li id=&quot;tB85&quot;&gt;Проанализировать базовые параметры&lt;/li&gt;
    &lt;li id=&quot;jtDu&quot;&gt;Воспроизвести записанный поток&lt;/li&gt;
    &lt;li id=&quot;t7bA&quot;&gt;Проверить качество воспроизведения&lt;/li&gt;
    &lt;li id=&quot;nrda&quot;&gt;При необходимости отправить тестовый поток&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;1n5i&quot;&gt;При анализе следует обращать внимание на:&lt;/p&gt;
  &lt;ul id=&quot;IWJq&quot;&gt;
    &lt;li id=&quot;eDdy&quot;&gt;Стабильность потока&lt;/li&gt;
    &lt;li id=&quot;8Lh8&quot;&gt;Наличие потерь пакетов&lt;/li&gt;
    &lt;li id=&quot;yIa9&quot;&gt;Задержки и вариацию задержки&lt;/li&gt;
    &lt;li id=&quot;sKUU&quot;&gt;Качество передаваемых данных&lt;/li&gt;
  &lt;/ul&gt;

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

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

</content></entry><entry><id>factoblog:qcow2-server</id><link rel="alternate" type="text/html" href="https://graff45.ru/qcow2-server?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=factoblog"></link><title>Развертывание .qcow2 на сервере</title><published>2024-11-25T16:21:22.328Z</published><updated>2024-11-25T16:27:49.171Z</updated><category term="linux" label="Linux"></category><summary type="html">Образ диска в формате .qcow2 можно развернуть на другом сервере, если на этом сервере установлено программное обеспечение, поддерживающее этот формат, например, QEMU/KVM. Вот основные шаги для развертывания QCOW2-образа на другом сервере:</summary><content type="html">
  &lt;p id=&quot;UWaJ&quot;&gt;Образ диска в формате .qcow2 можно развернуть на другом сервере, если на этом сервере установлено программное обеспечение, поддерживающее этот формат, например, QEMU/KVM. Вот основные шаги для развертывания QCOW2-образа на другом сервере:&lt;/p&gt;
  &lt;h3 id=&quot;WSnf&quot;&gt;1. Копирование QCOW2-образа:&lt;/h3&gt;
  &lt;p id=&quot;6uYt&quot;&gt;Сначала вам нужно скопировать файл .qcow2 на целевой сервер. Это можно сделать с помощью SCP, rsync или любого другого метода передачи файлов. Например:&lt;/p&gt;
  &lt;pre id=&quot;4RA5&quot; data-lang=&quot;bash&quot;&gt;scp путь/к/образу.qcow2 пользователь@целевой_сервер:путь/к/папке/     &lt;/pre&gt;
  &lt;h3 id=&quot;hB68&quot;&gt;2. Установка необходимых компонентов:&lt;/h3&gt;
  &lt;p id=&quot;tc7W&quot;&gt;Убедитесь, что на целевом сервере установлены QEMU и KVM (если вы планируете использовать виртуализацию). Это можно сделать с помощью пакетного менеджера. Например, для Ubuntu:&lt;/p&gt;
  &lt;pre id=&quot;7LMn&quot; data-lang=&quot;bash&quot;&gt;sudo apt update
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils    &lt;/pre&gt;
  &lt;h3 id=&quot;UU7S&quot;&gt;3. Создание виртуальной машины:&lt;/h3&gt;
  &lt;p id=&quot;aUdT&quot;&gt;После того как QCOW2-образ будет скопирован, вы можете создать виртуальную машину, указав этот образ в качестве диска. Это можно сделать через командную строку или с помощью графических интерфейсов, таких как virt-manager.&lt;/p&gt;
  &lt;p id=&quot;tsHV&quot;&gt;Пример команды для создания виртуальной машины с использованием virt-install:&lt;/p&gt;
  &lt;pre id=&quot;55q6&quot; data-lang=&quot;bash&quot;&gt;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 &amp;#x27;http://archive.ubuntu.com/ubuntu/dists/focal/main/installer-amd64/&amp;#x27; 
     --extra-args &amp;#x27;console=ttyS0,115200n8 serial&amp;#x27;
   &lt;/pre&gt;
  &lt;h3 id=&quot;18qp&quot;&gt;4. Запуск виртуальной машины:&lt;/h3&gt;
  &lt;p id=&quot;pYqh&quot;&gt; После создания виртуальной машины вы можете запустить её с помощью команды virsh:&lt;/p&gt;
  &lt;pre id=&quot;x1Kg&quot; data-lang=&quot;bash&quot;&gt;virsh start имя_виртуальной_машины&lt;/pre&gt;
  &lt;h3 id=&quot;sqvE&quot;&gt;Дополнительные советы&lt;/h3&gt;
  &lt;ul id=&quot;ZV46&quot;&gt;
    &lt;li id=&quot;Mj3T&quot;&gt;Настройка сети: Убедитесь, что ваша виртуальная машина настроена на использование сети, чтобы иметь доступ к интернету или другим ресурсам.&lt;/li&gt;
    &lt;li id=&quot;62OM&quot;&gt;Проверка совместимости: Убедитесь, что версия QEMU/KVM на новом сервере совместима с версией, на которой был создан QCOW2-образ.&lt;/li&gt;
    &lt;li id=&quot;n7Cm&quot;&gt;Снимки и резервные копии: Если у вас есть снимки виртуальной машины, убедитесь, что они также перенесены и доступны на новом сервере.&lt;/li&gt;
    &lt;li id=&quot;Bd4D&quot;&gt;Следуя этим шагам, вы сможете успешно развернуть QCOW2-образ на другом сервере. Если у вас есть дополнительные вопросы или требуется помощь с конкретными шагами, дайте знать!&lt;/li&gt;
  &lt;/ul&gt;

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

</content></entry><entry><id>factoblog:tests-flask</id><link rel="alternate" type="text/html" href="https://graff45.ru/tests-flask?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=factoblog"></link><title>Использование pytest в Flask</title><published>2024-05-12T18:27:58.563Z</published><updated>2024-05-12T18:39:28.054Z</updated><category term="python" label="Python"></category><summary type="html">Краткое представление о том, как использовать pytest в фремворке Flask.</summary><content type="html">
  &lt;p id=&quot;xUqx&quot;&gt;Краткое представление о том, как использовать pytest в фреймворке Flask.&lt;/p&gt;
  &lt;h2 id=&quot;IIhR&quot;&gt;Структура проекта&lt;/h2&gt;
  &lt;pre id=&quot;2ezY&quot;&gt;/WebApp
├── flask/
│   ├── __init__.py
│   ├── app.py
│   ├── templates/
│   ├── routes/
│   │    └── hello.py
│   └── static/
│       
└── tests/
    ├── conftest.py
    └── test_hello.py&lt;/pre&gt;
  &lt;h2 id=&quot;Cw06&quot;&gt;Tests&lt;/h2&gt;
  &lt;h3 id=&quot;Ufz0&quot;&gt;conftest.py&lt;/h3&gt;
  &lt;pre id=&quot;Cupl&quot; data-lang=&quot;python&quot;&gt;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({
        &amp;quot;TESTING&amp;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()&lt;/pre&gt;
  &lt;h3 id=&quot;EOdA&quot;&gt;test_hello.py&lt;/h3&gt;
  &lt;pre id=&quot;znC7&quot; data-lang=&quot;python&quot;&gt;def test_hello(client):
    response = client.get(&amp;#x27;/&amp;#x27;)
    assert response.status_code == 200, f&amp;#x27;Код ответа сервера: {response.status_code}&amp;#x27;&lt;/pre&gt;
  &lt;h2 id=&quot;xO9G&quot;&gt;Flask&lt;/h2&gt;
  &lt;p id=&quot;r5lK&quot;&gt;Использовать шаблон построения &amp;quot;&lt;em&gt;application factory&amp;quot; &lt;/em&gt;(&lt;a href=&quot;https://flask.palletsprojects.com/en/3.0.x/blueprints/&quot; target=&quot;_blank&quot;&gt;Blueprint&lt;/a&gt;).&lt;/p&gt;
  &lt;h3 id=&quot;deT6&quot;&gt;__init__.py&lt;/h3&gt;
  &lt;p id=&quot;EPFh&quot;&gt;В корневом каталоге Flask.&lt;/p&gt;
  &lt;pre id=&quot;2jgD&quot; data-lang=&quot;python&quot;&gt;from flask import Flask

def create_app():
    app = Flask(__name__)

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

    return app&lt;/pre&gt;
  &lt;h3 id=&quot;AP4Q&quot;&gt;app.py&lt;/h3&gt;
  &lt;pre id=&quot;QLHV&quot; data-lang=&quot;python&quot;&gt;from flask import Flask
from route.hello import mainPage

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

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

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

</content></entry><entry><id>factoblog:socket-server</id><link rel="alternate" type="text/html" href="https://graff45.ru/socket-server?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=factoblog"></link><title>Socket-сервер для GPS маяка</title><published>2024-03-11T15:39:05.817Z</published><updated>2024-05-12T18:31:01.433Z</updated><category term="python" label="Python"></category><summary type="html">Простая реализация сокет-сервера на Python для перехвата данных от GPS маяка SinoTrack с последующей отправкой на сервер мониторинга.</summary><content type="html">
  &lt;p id=&quot;H4OX&quot;&gt;Простая реализация сокет-сервера на Python для перехвата данных от GPS маяка SinoTrack с последующей отправкой на сервер мониторинга Ruhavik, а также записью координат во временную базу данных Influx с последующей визуализацией данных в Grafana.&lt;/p&gt;
  &lt;p id=&quot;NI7m&quot;&gt;Такая схема используется для того, чтобы в Grafana выставить уведомление на различные события, например, низкий заряд батареи или когда маяк начал движение.&lt;/p&gt;
  &lt;h3 id=&quot;8lGJ&quot;&gt;Сервер на Python&lt;/h3&gt;
  &lt;p id=&quot;F3PB&quot;&gt;Запускать через Supervisor.&lt;/p&gt;
  &lt;blockquote id=&quot;h7k5&quot; data-align=&quot;center&quot;&gt;Supervisor - это простой менеджер процессов с открытым исходным кодом, написанный на Python, с помощью которого можно запускать нужное количество копий процесса и следить за их состоянием.&lt;/blockquote&gt;
  &lt;section style=&quot;background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;figure id=&quot;lItZ&quot; class=&quot;m_original&quot;&gt;
      &lt;img src=&quot;https://img3.teletype.in/files/ea/a3/eaa3af4a-e7e6-4e82-ae3d-994a8345ea6e.png&quot; width=&quot;1662&quot; /&gt;
    &lt;/figure&gt;
    &lt;p id=&quot;LJxB&quot;&gt;&lt;strong&gt;GitHub Gist:&lt;/strong&gt; Socket-сервер на Python и Influx&lt;/p&gt;
    &lt;p id=&quot;4mRf&quot;&gt;&lt;a href=&quot;https://gist.github.com/telnex/8aa003055062b4c5f142321fe6da31d6&quot; target=&quot;_blank&quot;&gt;https://gist.github.com/telnex/8aa003055062b4c5f142321fe6da31d6&lt;/a&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;h3 id=&quot;G8Ov&quot;&gt;Клиент&lt;/h3&gt;
  &lt;p id=&quot;9zrW&quot;&gt;В нашем случае клиент нужен только для отладки, т.к. на практике в роли клиента будет наш SinoTrack маяк.&lt;/p&gt;
  &lt;pre id=&quot;XXpg&quot; data-lang=&quot;python&quot;&gt;import socket

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

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

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

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

</content></entry><entry><id>factoblog:linux-file</id><link rel="alternate" type="text/html" href="https://graff45.ru/linux-file?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=factoblog"></link><title>Передача файлов между Linux машинами</title><published>2024-02-18T22:11:34.154Z</published><updated>2024-02-22T21:01:16.432Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/f8/bb/f8bb20b2-a433-4a7d-966b-6cd23c8704a4.png"></media:thumbnail><category term="linux" label="Linux"></category><summary type="html">Недавно встретился простой, но очень занятный вопрос: как можно перенести файл с одного компьютера на другой? Оказалось, что вариантов на любой вкус и цвет. Оформлю списком, который может когда-то пополниться новыми извращениями.</summary><content type="html">
  &lt;p id=&quot;n59M&quot;&gt;Лично у меня прижились следующие способы передачи. &lt;/p&gt;
  &lt;p id=&quot;phGJ&quot;&gt;Если надо перекинуть один файл между серверами, я использую scp:&lt;/p&gt;
  &lt;pre id=&quot;EhQE&quot; data-lang=&quot;bash&quot;&gt;scp -P 22777 user@10.1.4.4:/mnt/data/BackUp/onlyoffice.tar.gz /backup&lt;/pre&gt;
  &lt;p id=&quot;Og0G&quot;&gt;Сразу привёл пример с нестандартным портом, там как тут используется заглавная -P. Я долго не мог запомнить это, используя маленькую -p, как в ssh.&lt;/p&gt;
  &lt;p id=&quot;lQXp&quot;&gt;Если файлов много, использую rsync:&lt;/p&gt;
  &lt;pre id=&quot;jRBf&quot; data-lang=&quot;bash&quot;&gt;rsync -avz -e &amp;quot;ssh -p 1234 -i /root/.ssh/id_rsa&amp;quot; user@10.1.4.22:/data/mail /data&lt;/pre&gt;
  &lt;p id=&quot;Q1GE&quot;&gt;Тоже такой универсальный пример, где сразу и порт, и ключ указан, если аутентификация не по паролю.&lt;/p&gt;
  &lt;p id=&quot;Dkii&quot;&gt;А вот если надо скопировать что-то разово на мой рабочий ноут или какой-то виндовый комп, то я запускаю веб сервер на python и просто скачиваю. Для текстовых логов актуально, чтобы сразу забрать все, что нужны:&lt;/p&gt;
  &lt;pre id=&quot;ssem&quot; data-lang=&quot;bash&quot;&gt;cd /var/log
python3 -m http.server 8080&lt;/pre&gt;
  &lt;p id=&quot;zhPQ&quot;&gt;А вот простой трюк, когда надо перекинуть файл с одного сервера на другой, но при этом подключение между серверами не настроено, но я со своего ноута или jump сервера могу подключиться к обоим. Тогда можно сделать вот так:&lt;/p&gt;
  &lt;pre id=&quot;Szbc&quot; data-lang=&quot;bash&quot;&gt;ssh user01@10.1.4.4 &amp;#x27;cat /home/user01/file.tar.gz&amp;#x27; | ssh user02@10.1.5.10 &amp;#x27;cat &amp;gt; /home/user02/file.tar.gz&amp;#x27;&lt;/pre&gt;

</content></entry></feed>