{
    "version": "https:\/\/jsonfeed.org\/version\/1",
    "title": "Блог ни о чём, заметки с тегом: сисадминство",
    "home_page_url": "https:\/\/gladilov.org.ru\/blog\/tags\/anykeing\/",
    "feed_url": "https:\/\/gladilov.org.ru\/blog\/tags\/anykeing\/json\/",
    "icon": false,
    "author": {
        "name": "Павел Гладилов",
        "url": "https:\/\/gladilov.org.ru\/blog\/",
        "avatar": false
    },
    "items": [
        {
            "id": "2955",
            "url": "https:\/\/gladilov.org.ru\/blog\/all\/forward-events-to-clickhouse-with-vector-and-balancer\/",
            "title": "Проброс событий в ClickHouse с использованием Vector",
            "content_html": "<p>От устройства снаружи ИС на фронтальные балансировщики приходят сообщения в локейшн<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>\/&lt;device_location&gt;\/status<\/code><\/pre><\/pre>\n<p><\/font>Файл журнала<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>\/var\/log\/&lt;device_access_log_file_path&gt;.status.access.log<\/code><\/pre><\/pre>\n<p><\/font> разбирается с помощью vector, пересылающий события на внутренний балансировщик. Между фронтальными и внутренними балансировщиками есть сетевая связность по порту TCP<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>&lt;port&gt;<\/code><\/pre><\/pre>\n<p><\/font>Конфиг vector на фронтальных балансировщиках: <b class=\"spoiler-controller pop-up_camper_clickhouse-vector-balancer-1\">Показать<\/b><section class=\"spoiler pop-up_camper_clickhouse-vector-balancer-1\"><\/p>\n<p><\/p>\n<p><font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>sources:\r\n  device-status:\r\n    type: &quot;file&quot;\r\n    max_line_bytes: 1638400\r\n    include:\r\n      - \/var\/log\/&lt;device_access_log_file_path&gt;.status.access.log\r\n\r\ntransforms:\r\n  device-status_filter:\r\n    type: &quot;filter&quot;\r\n    inputs:\r\n      - device-status\r\n    condition:\r\n      .message != &quot;&quot;\r\n\r\n  device-status_transform:\r\n    type: &quot;remap&quot;\r\n    inputs:\r\n      - device-status_filter\r\n    source: |\r\n      .message = parse_jsonI(.message)\r\n      .message.traffic_source = .host\r\n      . = .message\r\n\r\nsinks:\r\n  sink_clickhouse:\r\n    type: &quot;clickhouse&quot;\r\n    inputs:\r\n      - device-status_transform\r\n    endpoint: &quot;http:\/\/&lt;inner_BGP_IP&gt;:&lt;port&gt;&quot;\r\n    format: &quot;json_as_string&quot;\r\n    healthcheck:\r\n        enabled: false\r\n    auth:\r\n      strategy: &quot;basic&quot;\r\n      user: &quot;&lt;clickhouse_DB_user&gt;&quot;\r\n      password: &quot;&lt;clickhouse_DB_password&gt;&quot;\r\n    database: &quot;&lt;clickhouse_DB&gt;&quot;\r\n    table: &quot;&lt;clickhouse_table&gt;&quot;<\/code><\/pre><\/pre>\n<p><\/font><\/section><\/p>\n<p>Конфиг внутреннего балансировщика, пробрасывающего события в clickhouse: <b class=\"spoiler-controller pop-up_camper_clickhouse-vector-balancer-2\">Показать<\/b><section class=\"spoiler pop-up_camper_clickhouse-vector-balancer-2\"><\/p>\n<p><\/p>\n<p><font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>stream {\r\ninclude \/etc\/&lt;path_to_balancer_config&gt;\/log-format-s.conf;\r\n\r\nupstream clickhouse8123 {\r\n    server &lt;clickhouse_BGP_IP&gt;:8123;\r\n    server &lt;clickhouse_node1_IP&gt;:8123 backup;\r\n    server &lt;clickhouse_node2_IP&gt;:8123 backup;\r\n}\r\n\r\nserver {\r\n    listen &lt;port&gt;;\r\n    proxy_pass clickhouse8123;\r\n    access_log \/var\/log\/&lt;access_log_file_path&gt; main_json_mini_s;\r\n    error_log \/var\/log\/&lt;error_log_file_path&gt;;\r\n}\r\n}<\/code><\/pre><\/pre>\n<p><\/font><\/section><\/p>\n<p>Команды clickhouse для создания БД, таблиц и представлений: <b class=\"spoiler-controller pop-up_camper_clickhouse-vector-balancer-3\">Показать<\/b><section class=\"spoiler pop-up_camper_clickhouse-vector-balancer-3\"><\/p>\n<p><\/p>\n<p><font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code># Создание БД\r\nCREATE DATABASE vector ON CLUSTER &lt;cluster_name&gt;;\r\n\r\nDROP TABLE IF EXISTS vector.device_status_logs ON CLUSTER &lt;cluster_name&gt;;\r\n# Создание таблицы\r\nCREATE TABLE vector.device_status_logs ON CLUSTER &lt;cluster_name&gt; (\r\n        'message' String\r\n)\r\nENGINE = ReplicatedReplacingMergeTree('\/сlickhouse\/{cluster}\/tables\/validator_status_logs','{replica}')\r\nORDER BY tuple();\r\n\r\nDROP VIEW IF EXISTS vector.device_status_logs_view ON CLUSTER &lt;cluster_name&gt;;\r\n# Создание представления\r\nCREATE MATERIALIZED VIEW vector.device_status_logs_view ON CLUSTER &lt;cluster_name&gt; (\r\n        'time_stamp' DateTime,\r\n        'req' String,\r\n        'req_body' String\r\n)\r\nENGINE = ReplicatedReplacingMergeTree('\/clickhouse\/{cluster}\/tables\/device_status_logs_view','{replica}')\r\nORDER BY time_stamp\r\nSETTINGS index_granularity = 8192\r\nAS SELECT\r\n        parseDateTimeBestEffortOrNull(JSONExtractString(message, 'timestamp')) AS time_stamp,\r\n        simpleJSONExtractRaw(message, 'req') AS req,\r\n        simpleJSONExtractRaw(message, 'req_body') AS req_body\r\nFROM (\r\n        SELECT message\r\n        FROM vector.device_status_logs\r\n);<\/code><\/pre><\/pre>\n<p><\/font><\/section><\/p>\n",
            "date_published": "2025-07-01T16:23:41+03:00",
            "date_modified": "2025-07-01T16:23:33+03:00",
            "_date_published_rfc2822": "Tue, 01 Jul 2025 16:23:41 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "2955",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "2950",
            "url": "https:\/\/gladilov.org.ru\/blog\/",
            "title": "Полезное: БД Postgres",
            "content_html": "<p><img style=\"vertical-align:middle!important;\" src=\"\/blog\/pictures\/work\/rncb\/tech\/postgresql-20.png\" \/> #postgresql #owner #create #delete<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>DROP DATABASE {db} with (FORCE);\r\nCREATE DATABASE {db} WITH OWNER {user|role};\r\n...&lt;импорт БД&gt;...\r\nSELECT concat ('ALTER TYPE ' , typname, ' OWNER TO {user|role};') from pg_type where typtype ='e' and typnamespace =(select oid from pg_catalog.pg_namespace where nspname ='checkpoint' );\r\nSELECT concat ('ALTER TABLE ' , {db} , ' OWNER TO {user|role};') from information_schema.&quot;tables&quot; t where table_schema = 'checkpoint' ;\r\nALTER SCHEMA checkpoint OWNER TO {user|role};<\/code><\/pre><\/pre>\n<p><\/font><\/p>\n<p><img style=\"vertical-align:middle!important;\" src=\"\/blog\/pictures\/work\/rncb\/tech\/postgresql-20.png\" \/> #включение сбора статистики на кластере PostgreSQL+patroni<br \/>\n<font size=\"2\">Имя кластера смотрится командой<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>patronictl -c \/etc\/patroni\/patroni.yml list<\/code><\/pre><\/pre>\n<p><\/font>На лидере кластера выполнить команду<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>\/usr\/local\/bin\/patronictl -c \/etc\/patroni\/patroni.yml edit-config<\/code><\/pre><\/pre>\n<p><\/font>В разделе postgresql: -> parameters: добавить строку<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>shared_preload_libraries: pg_stat_statements<\/code><\/pre><\/pre>\n<p><\/font>Согласиться на применение изменений. Перезагрузить кластер командой<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>\/usr\/local\/bin\/patronictl -c \/etc\/patroni\/patroni.yml restart &lt;имя кластера&gt;<\/code><\/pre><\/pre>\n<p><\/font>Затем от пользователя postgres запустить psql<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>sudo su postgres\r\npsql<\/code><\/pre><\/pre>\n<p><\/font>и выполнить команду<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>CREATE EXTENSION pg_stat_statements;<\/code><\/pre><\/pre>\n<p><\/font>Проверка, существует ли вьюшка pg_stat_statements:<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>select * from pg_stat_statements;<\/code><\/pre><\/pre>\n<p><\/font><\/font><\/p>\n<p><img style=\"vertical-align:middle!important;\" src=\"\/blog\/pictures\/work\/rncb\/tech\/postgresql-20.png\" \/> #изменение количества соединений в кластерной БД:<font size=\"2\"><br \/>\nНа лидере кластера выполнить команду<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>\/usr\/local\/bin\/patronictl -c \/etc\/patroni\/patroni.yml edit-config<\/code><\/pre><\/pre>\n<p><\/font>в строке max_connections: <число> изменить число на необходимое и согласиться на применение изменений. Перезагрузить кластер командой<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>\/usr\/local\/bin\/patronictl -c \/etc\/patroni\/patroni.yml restart &lt;cluster_name&gt;<\/code><\/pre><\/pre>\n<p><\/font>В файле \/etc\/haproxy\/haproxy.cfg поменять все вхождения строки<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>maxconn &lt;число&gt;<\/code><\/pre><\/pre>\n<p><\/font> и перегрузить сервис haproxy<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>systemctl restart haproxy<\/code><\/pre><\/pre>\n<p><\/font><\/font><\/p>\n<p><img style=\"vertical-align:middle!important;\" src=\"\/blog\/pictures\/work\/rncb\/tech\/postgresql-20.png\" \/> #аптайм БД<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>select pg_postmaster_start_time();<\/code><\/pre><\/pre>\n<p><\/font><\/p>\n",
            "date_published": "2025-06-25T11:57:37+03:00",
            "date_modified": "2025-07-03T17:19:04+03:00",
            "_date_published_rfc2822": "Wed, 25 Jun 2025 11:57:37 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "2950",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "2512",
            "url": "https:\/\/gladilov.org.ru\/blog\/all\/keepalived-lifehacks\/",
            "title": "Игры с keepalived",
            "content_html": "<p><img src=\"\/blog\/pictures\/keepalived\/logo.png\" class=\"main_left_img\" \/>В продолжение <a href=\"\/blog\/all\/setup-ip-failover-on-debian-with-keepalived\/\">поста о системном демоне Keepalived<\/a>, позволяющем организовать отказоустойчивость сервиса и балансировку нагрузки. Возник вопрос — как узнать, какая нода в каком состоянии запущена? Для этого я создал две ВМ, к примеру:<br \/>\nd1 IP=172.16.32.31\/24<br \/>\nd2 IP=172.16.32.32\/24<\/p>\n<p>Конфигурация d1: <b class=\"spoiler-controller pop-up_camper_keepalived_vm1_conf\">Показать<\/b><section class=\"spoiler pop-up_camper_keepalived_vm1_conf\"><\/p>\n<p><\/p>\n<p><font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>global_defs {\r\n   notification_email { root@localhost }\r\n   router_id PD\r\n    vrrp_garp_master_refresh 30\r\n    vrrp_garp_master_refresh_repeat 2\r\n}\r\nvrrp_instance TEST {\r\n    state MASTER\r\n!    state BACKUP\r\n    interface &lt;интерфейс&gt;\r\n    virtual_router_id 101\r\n    priority 103\r\n!    priority 102\r\n    advert_int 1\r\n    authentication {\r\n        auth_type PASS\r\n        auth_pass &lt;пароль&gt;\r\n    }\r\n    virtual_ipaddress { 172.16.32.30\/24 dev &lt;интерфейс&gt; label &lt;интерфейс&gt;:vrrp }\r\n    notify \/opt\/notify.sh\r\n}<\/code><\/pre><\/pre>\n<p><\/font><\/section>Конфигурация d2: <b class=\"spoiler-controller pop-up_camper_keepalived_vm2_conf\">Показать<\/b><section class=\"spoiler pop-up_camper_keepalived_vm2_conf\"><\/p>\n<p><\/p>\n<p><font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>global_defs {\r\n   notification_email { root@localhost }\r\n   router_id PD\r\n    vrrp_garp_master_refresh 30\r\n    vrrp_garp_master_refresh_repeat 2\r\n}\r\nvrrp_instance TEST {\r\n!    state MASTER\r\n    state BACKUP\r\n    interface &lt;интерфейс&gt;\r\n    virtual_router_id 101\r\n!    priority 103\r\n    priority 102\r\n    advert_int 1\r\n    authentication {\r\n        auth_type PASS\r\n        auth_pass &lt;пароль&gt;\r\n    }\r\n    virtual_ipaddress { 172.16.32.30\/24 dev &lt;интерфейс&gt; label &lt;интерфейс&gt;:vrrp }\r\n    notify \/opt\/notify.sh\r\n}<\/code><\/pre><\/pre>\n<p><\/font><\/section><\/p>\n<p>Для контроля текущей конфигурации (состояния) демона keepalived используется скрипт \/opt\/notify.sh: <b class=\"spoiler-controller pop-up_camper_keepalived_sh_script\">Показать<\/b><section class=\"spoiler pop-up_camper_keepalived_sh_script\"><\/p>\n<p><\/p>\n<p><font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>#!\/bin\/bash\r\necho $1 $2 is in $3 state &gt; \/var\/run\/keepalive.$1.$2.state<\/code><\/pre><\/pre>\n<p><\/font><\/section>Ещё полезный скрипт-однострочник:: <b class=\"spoiler-controller pop-up_camper_keepalived_script\">Показать<\/b><section class=\"spoiler pop-up_camper_keepalived_script\"><\/p>\n<p><\/p>\n<p><font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>conf=\/etc\/keepalived\/keepalived.conf &amp;&amp; vip=$(expr &quot;$(cat $conf)&quot; : '.*\\bvirtual_ipaddress\\s*{\\s*\\(.*\\)\/*}') &amp;&amp; vip=`expr &quot;$vip&quot; : '\\([^ ]*\\)' | sed 's\/\\.\/\\\\\\\\.\/g'` &amp;&amp; if ip addr | grep -q &quot;$vip&quot;; then echo Primary; else echo Secondary; fi<\/code><\/pre><\/pre>\n<p><\/font><\/section><\/p>\n",
            "date_published": "2022-12-25T22:00:09+03:00",
            "date_modified": "2025-07-01T17:46:38+03:00",
            "_date_published_rfc2822": "Sun, 25 Dec 2022 22:00:09 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "2512",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "2454",
            "url": "https:\/\/gladilov.org.ru\/blog\/all\/devuan-certificate\/",
            "title": "Команда Devuan просрочила ключ подписи репозиториев",
            "content_html": "<p>Ключ, которым подписываются все системные обновления, выпущенный в 2017 году, был действителен до 2 сентября 2022 года. Сегодня пользователи дистрибутива столкнулись с невозможностью штатного обновления системы через apt в связи с отсутствием действительного ключа. Разработчики дистрибутива, судя по всему, узнали о просрочке из жалобы на форуме и сгенерировали новый пакет devuan-keyring, который предлагают скачать через http (поскольку apt неработоспособен) и без каких-либо проверок сразу установить.<\/p>\n<p><b class=\"spoiler-controller pop-up_camper_03_09_2022\">Показать<\/b><section class=\"spoiler pop-up_camper_03_09_2022\"><\/p>\n<p><\/p>\n<p><font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>wget http:\/\/deb.devuan.org\/devuan\/pool\/main\/d\/devuan-keyring\/devuan-keyring_2022.09.04_all.deb\r\ndpkg -i devuan-keyring_2022.09.04_all.deb<\/code><\/pre><\/pre>\n<p><\/font><\/p>\n<p>Впрочем, какую-никакую проверку провести всё-таки можно, на странице пакета (по https) указан sha256-хэш deb-файла: 96c4a206e8dfdc21138ec619687ef9acf36e1524dd39190c040164f37cc3468d, который перед тем как запускать dpkg можно сравнить так:<br \/>\n<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>sha256sum devuan-keyring_2022.09.04_all.deb<\/code><\/pre><\/pre>\n<p><\/font>Старый ключ:<br \/>\n<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>\/etc\/apt\/trusted.gpg.d\/devuan-keyring-2017-archive.gpg\r\n------------------------------------------------------\r\npub   rsa4096 2017-09-04 [SC] [просрочен с: 2022-09-03]\r\n      E032 601B 7CA1 0BC3 EA53  FA81 BB23 C00C 61FC 752C\r\nuid         [  просрочен ] Devuan Repository (Amprolla3 on Nemesis) &lt;repository@devuan.org&gt;<\/code><\/pre><\/pre>\n<p><\/font>Новый ключ:<br \/>\n<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>\/etc\/apt\/trusted.gpg.d\/devuan-keyring-2022-archive.gpg\r\n------------------------------------------------------\r\npub   rsa4096 2017-09-04 [SC] [   годен до: 2023-09-03]\r\n      E032 601B 7CA1 0BC3 EA53  FA81 BB23 C00C 61FC 752C\r\nuid         [ неизвестно ] Devuan Repository (Amprolla3 on Nemesis) &lt;repository@devuan.org&gt;\r\nsub   rsa4096 2017-09-04 [E] [   годен до: 2023-09-03]<\/code><\/pre><\/pre>\n<p><\/font><\/p>\n<p>Несмотря на то, что, по-видимому, новый ключ легитимен, стоит отметить, что цепочка безопасного доверия ключей прервана, и пользователи вынуждены, при обновлении пакета, полагаться на https-сертификат сайта с информацией о пакетах, который может выпустить (поддельный) любая из огромного количества организаций, в том числе сомнительных, в доверенном списке браузера.<\/p>\n<p><font size=\"2\">Источники:<br \/>\n<a href=\"https:\/\/dev1galaxy.org\/viewtopic.php?id=5211\">https:\/\/dev1galaxy.org\/viewtopic.php?id=5211<\/a><br \/>\n<a href=\"https:\/\/www.linux.org.ru\/news\/security\/16964008\">https:\/\/www.linux.org.ru\/news\/security\/16964008<\/a><\/font><\/section><\/p>\n",
            "date_published": "2022-09-03T22:00:00+03:00",
            "date_modified": "2022-09-03T21:59:55+03:00",
            "_date_published_rfc2822": "Sat, 03 Sep 2022 22:00:00 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "2454",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "2444",
            "url": "https:\/\/gladilov.org.ru\/blog\/all\/file-for-aegea-vol-4\/",
            "title": "Напильник для Эгеи, часть 4",
            "content_html": "<p><img src=\"\/blog\/pictures\/file-aegea\/aegea-file.jpg\" align=\"left\" \/>      Четвёртая часть о «доводке напильником» Эгеи.<\/p>\n<p>      <strong>Август 2022 года:<\/strong><br \/>\nПозавчера (02.08.2022) вынужден был переместить сайт (и блог) на домашний сервер. После переезда в тегах блога стали отображаться сообщения об ошибках: <b class=\"spoiler-controller pop-up_camper_04_08_22-aegea-error\">Показать<\/b><section class=\"spoiler pop-up_camper_04_08_22-aegea-error\"><\/p>\n<p><\/p>\n<p><a class=\"lightbox2\" data-lightbox=\"04_08_22-aegea\" href=\"\/blog\/pictures\/file-aegea\/error.jpg\"><img src=\"\/blog\/pictures\/file-aegea\/error-preview.jpg\" style=\"vertical-align:middle;\" \/><\/a><\/section><\/p>\n<p>Лёгкий гугляж завёл меня на страницу Александра Токарева <a href=\"https:\/\/alexandertokarev.ru\/all\/aegea-core-php-line-2\/\">Эгея и красные банеры \/core.php, line 2<\/a>, но предлагаемый способ лечения (понизить версию PHP) оказался для меня неприемлемым. Решено было бороться радикальными методами — править код.<\/p>\n<p><a class=\"lightbox2\" data-lightbox=\"04_08_22-aegea\" href=\"\/blog\/pictures\/file-aegea\/mcedit.png\"><img src=\"\/blog\/pictures\/file-aegea\/mcedit-preview.png\" style=\"vertical-align:middle;\" \/><\/a><\/p>\n<p>В файле <b>system\/core.php<\/b> ищу переменную, вызвавшую сообщение об ошибке (<b>k<\/b>). Для этого в редакторе mc ищу символ <b>k<\/b> как слово целиком (whole word). Комментирую второе вхождение работы с этой переменной. После обновления страницы ошибка исчезла.<\/p>\n<p>P. S. Эмпирический список пакетов, необходимых к установке для работы <img src=\"\/img\/sites\/\/blog.png\" style=\"vertical-align:middle;width:20px;height:20px;\" \/> блога, <img src=\"\/img\/sites\/\/reader.png\" style=\"vertical-align:middle;width:20px;height:20px;\" \/> RSS-ридера и <img src=\"\/\/\/cloud.gladilov.org.ru\/core\/img\/favicon.ico\" style=\"vertical-align:middle;width:20px;height:20px;\" \/> облака:<br \/>\n<b>php-mbstring php-mysql php-gd php-curl php-cli libapache2-mod-php php-xml php-zip php-intl<\/b><\/p>\n<p>P. P. S. Версия Эгеи — релиз 2.7, версия 3249.<\/p>\n",
            "date_published": "2022-08-04T00:41:30+03:00",
            "date_modified": "2022-08-04T17:49:00+03:00",
            "_date_published_rfc2822": "Thu, 04 Aug 2022 00:41:30 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "2444",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        },
        {
            "id": "2211",
            "url": "https:\/\/gladilov.org.ru\/blog\/all\/packets-for-old-kde-localization\/",
            "title": "Пакеты для русской локализации старого KDE",
            "content_html": "<p><img src=\"\/blog\/pictures\/x\/kde-35.png\" class=\"main_left_img\" \/> Для целей «дистрособирательства» мне иногда нужно быстро русифицировать старые ОСи с разными рабочими столами. Иногда «родных» репозиториев для старых дистров уже нет, поэтому для KDE наскрёб несколько пакетов, пересобрал их и раскидал по архивам для будущего использования.<\/p>\n<p><a href=\"\/me\/hobby\/os\/kde\/kde4-l10n-ru.tar.gz\"><img style=\"vertical-align:middle!important;\" src=\"\/img\/special\/files\/archive.png\" \/> KDE 4 (kde4-l10n-ru.tar.gz)<\/a><br \/>\n<a href=\"\/me\/hobby\/os\/kde\/kde3-i18n-ru.tar.gz\"><img style=\"vertical-align:middle!important;\" src=\"\/img\/special\/files\/archive.png\" \/> KDE 3 (kde3-i18n-ru.tar.gz)<\/a><br \/>\n<a href=\"\/me\/hobby\/os\/kde\/t.tar.gz\"><img style=\"vertical-align:middle!important;\" src=\"\/img\/special\/files\/archive.png\" \/> t.tar.gz<\/a><br \/>\n<a href=\"\/me\/hobby\/os\/kde\/k.tgz\"><img style=\"vertical-align:middle!important;\" src=\"\/img\/special\/files\/archive.png\" \/> k.tgz<\/a><br \/>\n<a href=\"\/me\/hobby\/os\/kde\/ru.tgz\"><img style=\"vertical-align:middle!important;\" src=\"\/img\/special\/files\/archive.png\" \/> ru.tgz<\/a><\/p>\n<p><font size=\"2\">N. B. Файлы архивов доступны также по http.<\/font><\/p>\n",
            "date_published": "2022-02-16T18:53:49+03:00",
            "date_modified": "2022-02-16T18:28:19+03:00",
            "_date_published_rfc2822": "Wed, 16 Feb 2022 18:53:49 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "2211",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        },
        {
            "id": "2179",
            "url": "https:\/\/gladilov.org.ru\/blog\/all\/lets-encrypt-issue-with-tls-alpn-01-validation-method\/",
            "title": "Let’s Encrypt отзывает 2 млн сертификатов",
            "content_html": "<p><img src=\"\/blog\/pictures\/events\/letsencrypt.png\" class=\"main_left_img\" \/>Некоммерческий удостоверяющий центр Let’s Encrypt, контролируемый сообществом и предоставляющий сертификаты безвозмездно всем желающим, объявил о досрочном отзыве около двух миллионов TLS-сертификатов, что составляет около 1% от всех активных сертификатов данного удостоверяющего центра. Отзыв сертификатов инициирован из-за выявления несоответствия требованиям спецификации в применяемом в Let’s Encrypt коде с реализацией расширения TLS-ALPN-01 (RFC 7301, Application-Layer Protocol Negotiation). Несоответствие было связано с отсутствием некоторых проверок, выполняемых в процессе согласования соединений на базе TLS-расширения ALPN, применяемого в HTTP\/2. Детальная информация об инциденте будет опубликована после завершения отзыва проблемных сертификатов.<\/p>\n<p><b class=\"spoiler-controller pop-up_camper_27_01_22\">Показать<\/b><\/p>\n<p><section class=\"spoiler pop-up_camper_27_01_22\">26 января в 03:48 (MSK) проблема была устранена, но все сертификаты, при выдаче которых для верификации использовался метод TLS-ALPN-01, решено признать недействительными. Отзыв сертификатов начнётся 28 января в 19:00 (MSK). До этого времени пользователям, использующим метод проверки TLS-ALPN-01, рекомендуется успеть обновить свои сертификаты, иначе они досрочно будут признаны недействительными.<\/p>\n<p>Соответствующие уведомления о необходимости обновления сертификатов отправлены на email. Пользователей, применяющих для получения сертификата инструментарии Certbot и dehydrated, при использовании настроек по умолчанию проблема не затронула. Метод TLS-ALPN-01 поддерживается в пакетах Caddy, Traefik, apache mod_md и autocert. Проверить корректность своих сертификатов можно через поиск идентификаторов, серийных номеров или доменов в списке проблемных сертификатов.<\/p>\n<p>Так как изменения затрагивают поведение при проверке методом TLS-ALPN-01, для продолжения работы может требоваться обновление ACME-клиента или изменение настроек (Caddy, bitnami\/bn-cert, autocert, apache mod_md, Traefik). Изменения сводятся к использованию версий TLS не ниже 1.2 (клиенты теперь не смогут использовать TLS 1.1) и прекращению поддержки OID 1.3.6.1.5.5.7.1.30.1, идентифицирующего устаревшее расширение acmeIdentifier, поддерживаемое только в ранних черновиках спецификации RFC 8737 (при формировании сертификата теперь допускается только OID 1.3.6.1.5.5.7.1.31, а клиенты использующие OID 1.3.6.1.5.5.7.1.30.1 не смогут получить сертификат).<\/p>\n<p><font size=\"2\">Источники:<br \/>\n<a href=\"https:\/\/www.opennet.ru\/opennews\/art.shtml?num=56588\">https:\/\/www.opennet.ru\/opennews\/art.shtml?num=56588<\/a><br \/>\n<a href=\"https:\/\/community.letsencrypt.org\/t\/2022-01-25-issue-with-tls-alpn-01-validation-method\/170450\">https:\/\/community.letsencrypt.org\/t\/2022-01-25-issue-with-tls-alpn-01-validation-method\/170450<\/a><font><\/section><\/p>\n",
            "date_published": "2022-01-27T12:48:23+03:00",
            "date_modified": "2022-01-27T12:44:47+03:00",
            "_date_published_rfc2822": "Thu, 27 Jan 2022 12:48:23 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "2179",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        },
        {
            "id": "2173",
            "url": "https:\/\/gladilov.org.ru\/blog\/all\/google-drive-flags-file-with-only-one-number-copyright-infringem\/",
            "title": "Google Drive выявляет нарушения прав в файлах с одним числом",
            "content_html": "<p>Эмили Долсон (Emily Dolson), преподаватель из Мичиганского университета, столкнулась с необычным поведением сервиса Google Drive, который стал блокировать доступ к одному из сохранённых файлов с сообщением о нарушении правил сервиса, связанных с авторскими правами, и предупреждением о невозможности запросить для данного типа блокировок ручную проверку. Интересно то, что содержимое заблокированного файла состояло только из одной цифры «1».<\/p>\n<p><img src=\"https:\/\/web.archive.org\/web\/20220126000152if_\/https:\/\/pbs.twimg.com\/media\/FJ1LDHbXwAAlAfs?format=png&name=900x900\" \/><\/p>\n<p>Изначально предполагалось, что блокировка может быть вызвана коллизиями при вычислении хэшей, но данная гипотеза была отвергнута, так как экспериментальным путём выявлено, что блокировка срабатывает не только на «1», но и на многие другие цифры, независимо от наличия символа перевода строки и имени файла. Например, при создании файлов с числами из диапазона от -1000 до 1000, блокировка была применена для чисел 0, 500, 174, 833, 285, 302, 186, 451, 336 и 173. Блокировка производится не сразу, а примерно через час после размещения файла. Представители Google сообщили, что пытаются разобраться в причинах сбоя и работают над устранением проблемы.<\/p>\n<p><font size=\"2\">Источники:<br \/>\n<a href=\"https:\/\/news.ycombinator.com\/item?id=30060405\">https:\/\/news.ycombinator.com\/item?id=30060405<\/a><br \/>\n<a href=\"http:\/\/www.opennet.ru\/opennews\/art.shtml?num=56574\">http:\/\/www.opennet.ru\/opennews\/art.shtml?num=56574<\/a><\/font><\/p>\n<p>P. S. Как тут не вспомнить <a href=\"https:\/\/ru.wikipedia.org\/wiki\/Незаконное_простое_число\">Незаконное простое число<\/a>...<\/p>\n",
            "date_published": "2022-01-25T17:58:16+03:00",
            "date_modified": "2025-07-01T17:50:10+03:00",
            "_date_published_rfc2822": "Tue, 25 Jan 2022 17:58:16 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "2173",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        },
        {
            "id": "2164",
            "url": "https:\/\/gladilov.org.ru\/blog\/all\/nix-shutdown-ways\/",
            "title": "Разница между командами выключения *nix",
            "content_html": "<p><img src=\"\/blog\/pictures\/linux-shutdown.png\" class=\"main_right_img\" \/>Техническая разница между различными командами выключениями системы.<\/p>\n<p>*nix-систему можно выключить различными способами: можно использовать <b>poweroff<\/b>, <b>shutdown<\/b>, <b>init<\/b>, <b>halt<\/b>.<\/p>\n<p>Результат выполнения команд выключения:<\/p>\n<blockquote>\n<p><b><kbd>poweroff<\/kbd><\/b> (команда выключения) посылает команду ACPI на выключение системы (как при однократном нажатии кнопки выключения питания);<br \/>\n<b><kbd>shutdown<\/kbd><\/b> (команда завершения) — позволяет выполнить отложенные операции с питанием. При этом утилита выводит оповещение всем залогинившимся пользователям о предстоящем завершении работы и может с помощью файла \/run\/nologin блокировать вход в систему за 5 минут до времени выключения (если указан аргумент времени) После вызываются системные и локальные {init\/rc}.d-скрипты с параметром stop.. В конце вызывается тот же poweroff;<br \/>\n<b><kbd>halt<\/kbd><\/b> (команда останова) отдаёт команду аппаратному обеспечению приостановить все функции CPU, но оставляет систему включённой (в некоторых случаях использование команды без параметров полностью выключает ПК). На машинах с архитектурой x86 обычно происходит выключение, но на машинах Sun управление возвращается в «ROM monitor» для получения информации о состоянии системы. Как и reboot, команда сбрасывает кэш файловой системы на диск и посылает всем процессам сигналы TERM и KILL;<br \/>\n<b><kbd>init<\/kbd><\/b> (команда изменения уровня выполнения системы) — при переходе на уровень выполнения 0 производится остановка системы командой halt с помощью выполнения скриптов, соответствующих этому уровню.<\/p>\n<\/blockquote>\n<p>В большинстве современных *nix-систем для обратной совместимости со старыми проприетарными ОСями эти команды выполняют одно и то же и ссылаются на один и тот же файл. Например, команды <b>poweroff<\/b> и <b>shutdown<\/b> представляют из себя символические ссылки на \/bin\/systemctl:<\/p>\n<pre class=\"e2-text-code\"><code>user@localhost:\/sbin$ ls -l poweroff\r\nlrwxrwxrwx 1 root root 14 Sep  5 18:01 poweroff -&gt; \/bin\/systemctl\r\nuser@localhost:\/sbin$ ls -l shutdown \r\nlrwxrwxrwx 1 root root 14 Sep  5 18:01 shutdown -&gt; \/bin\/systemctl<\/code><\/pre>",
            "date_published": "2022-01-20T23:57:48+03:00",
            "date_modified": "2022-01-21T00:32:57+03:00",
            "_date_published_rfc2822": "Thu, 20 Jan 2022 23:57:48 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "2164",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "2123",
            "url": "https:\/\/gladilov.org.ru\/blog\/all\/boot-with-password-to-edit-grub\/",
            "title": "Защита опций загрузчика GRUB паролём",
            "content_html": "<p><img src=\"\/blog\/pictures\/grub-password\/grub-password.jpg\" class=\"main_right_img\" \/>Метод заключается в редактировании опций загрузчика GRUB, чтобы установить пароль на их изменение при загрузке системы. Настройка делается в текстовых конфигурационных файлах GRUB, и при физическом доступе к компьютеру с возможностью загрузки с LIVE-дистрибутива можно обойти и эту защиту. При физическом доступе всегда остаётся вариант вынуть жёсткий диск и просмотреть его содержимое в другой ОСи. То есть настоящую защиту данных обеспечивает только их шифрование или шифрование всего диска, защита в виде пароля на загрузку не является надёжной!<br \/>\n<b class=\"spoiler-controller pop-up_camper_29_12_21\">Показать<\/b><section class=\"spoiler pop-up_camper_29_12_21\"><\/p>\n<p><\/p>\n<h2>Настройка пароля на загрузку системы и на редактирование опций загрузки<\/h2>\n<p>От имени пользователя <b>root<\/b> генерируется хеш пароля:<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>sudo grub-mkpasswd-pbkdf2<\/code><\/pre><\/pre>\n<p><\/font>Будет показана примерно такая строка:<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>Хэш PBKDF2 вашего пароля: grub.pbkdf2.sha512.10000.6B2B740048C68DCEAD7B288ED37FCC577F1FFDBFE9955A3B9CA5CC47FEF524D07A75E97D17DB4F2E53AF836FBA08DF88CA8EEB7ABF87ABDE0A327A742F8DC745.476B122C205094968098043AF0DF40B4C009AA18F454A8D38E047BA7E50C5DA809F9E3C7FEAA927EF3C0F43CE0EB46072E7303F42559170A09C96DCD37A341D7<\/code><\/pre><\/pre>\n<p><\/font>Пример показан на рисунке 1:<br \/>\n<a class=\"lightbox2\" data-lightbox=\"grub-mkpasswd\" href=\"\/blog\/pictures\/grub-password\/mkpasswd.jpg\"><img src=\"\/blog\/pictures\/grub-password\/mkpasswd-preview.jpg\" style=\"vertical-align:middle;\" \/><\/a><br \/>\n<i>Рисунок 1. Пример генерации хеша пароля загрузки.<\/i><\/p>\n<p>Из выведенных данных скопировать строку «<b>grub.pbkdf2.sha512.10000………….<\/b>» (полностью) и дописать в файл <b>\/etc\/grub.d\/40_custom<\/b>:<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>set superusers=&quot;&lt;имя&gt;&quot;\r\npassword_pbkdf2 &lt;имя&gt; grub.pbkdf2.sha512.10000.6B2B740048C68DCEAD7...<\/code><\/pre><\/pre>\n<p><\/font>Поскольку файл <b>\/etc\/grub.d\/40_custom<\/b> содержит хеш пароля, то рекомендуется запретить его чтение и изменение всеми пользователями, кроме пользователя <b>root<\/b>:<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>sudo chmod 711 \/etc\/grub.d\/40_custom<\/code><\/pre><\/pre>\n<p><\/font>Создание нового конфигурационного файла загрузчика:<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>sudo grub-mkconfig -o \/boot\/grub\/grub.cfg<\/code><\/pre><\/pre>\n<p><\/font>После выполнения процесса перезагрузки ПК при попытке выбрать любой пункт меню будет предложено ввести имя пользователя и пароль. При вводе логина <b>&lt;имя&gt;<\/b> и пароля, используемого в команде <b>grub-mkpasswd-pbkdf2<\/b>, если учётные данные верны, система продолжит загрузку.<\/p>\n<p><i>N. B. Логин <b>&lt;имя&gt;<\/b> в файле <b>\/etc\/grub.d\/40_custom<\/b> можно указать любой, он никак не связан с именами пользователей в системе, главное — не забыть его в дальнейшем. Кроме того, информацию о ​​пользователе и пароле не обязательно требуется вносить в определённый файл. Информация может быть помещена в любой файл  каталога <b>\/etc\/grub.d<\/b>, если этот файл включён в <b>grub.cfg<\/b>. Файл <b>\/etc\/grub.d\/40_custom<\/b> выбран потому, что он не перезаписывается при обновлении пакета GRUB.<\/i><\/p>\n<p>P. S. Для возможности загрузки без пароля какого-либо пункта (или пунктов) меню их необходимо найти в файле <b>\/etc\/grub.d\/10_linux<\/b> и добавить опцию:<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>--unrestricted<\/code><\/pre><\/pre>\n<p><\/font>Пример показан на рисунке 2:<br \/>\n<a class=\"lightbox2\" data-lightbox=\"grub-unrestricted\" href=\"\/blog\/pictures\/grub-password\/unrestricted.jpg\"><img src=\"\/blog\/pictures\/grub-password\/unrestricted-preview.jpg\" style=\"vertical-align:middle;\" \/><\/a><br \/>\n<i>Рисунок 2. Пример добавления опции класса загрузки в файл <b>\/etc\/grub.d\/10_linux<\/b>.<\/i><\/p>\n<p>В результате загрузка системы будет выполняться как и раньше — пароль в загрузчике GRUB вводить не нужно, при выборе пункта меню GRUB продолжится обычная загрузка. Но при попытке отредактировать опции загрузчика будет предложено ввести имя и пароль. Без их ввода доступ к опциям загрузки не будет дан.<\/p>\n<p>P. P. S. Если в меню загрузчика содержатся параметры для других ОСей, отличных от операционной системы по умолчанию (другие установки Linux, Mac OS, Windows и т. д.), в файле <b>\/etc\/grub.d\/30_os-prober<\/b> вносятся изменения в опции класса загрузки соответствующей ОСи с добавлением строки<font size=\"2\"><\/p>\n<pre class=\"e2-text-code\"><pre class=\"e2-text-code\"><code>--unrestricted<\/code><\/pre><\/pre>\n<p><\/font>Пример показан на рисунке 3:<br \/>\n<a class=\"lightbox2\" data-lightbox=\"grub-os-prober\" href=\"\/blog\/pictures\/grub-password\/os-prober.jpg\"><img src=\"\/blog\/pictures\/grub-password\/os-prober-preview.jpg\" style=\"vertical-align:middle;\" \/><\/a><br \/>\n<i>Рисунок 3. Пример добавления опции класса загрузки в файл <b>\/etc\/grub.d\/30_os-prober<\/b> для всех найденных типов операционных систем.<\/i><\/section><\/p>\n",
            "date_published": "2021-12-30T18:42:59+03:00",
            "date_modified": "2021-12-30T18:44:29+03:00",
            "_date_published_rfc2822": "Thu, 30 Dec 2021 18:42:59 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "2123",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        }
    ],
    "_e2_version": 3249,
    "_e2_ua_string": "E2 (v3249; Aegea)"
}