{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Skurudo Blog(post): заметки с тегом скрипт",
    "_rss_description": "Сцена́рный язы́к (язык сценариев, жарг. скрипто́вый язык, от англ. scripting language) — высокоуровневый язык программирования для написания сценариев",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/www.skurudo.ru\/tags\/script\/",
    "feed_url": "https:\/\/www.skurudo.ru\/tags\/script\/json\/",
    "icon": "https:\/\/www.skurudo.ru\/pictures\/userpic\/userpic@2x.jpg?1691593083",
    "authors": [
        {
            "name": "Pavel Galkin",
            "url": "https:\/\/www.skurudo.ru\/",
            "avatar": "https:\/\/www.skurudo.ru\/pictures\/userpic\/userpic@2x.jpg?1691593083"
        }
    ],
    "items": [
        {
            "id": "264",
            "url": "https:\/\/www.skurudo.ru\/all\/notifications-about-problems-in-oxidized\/",
            "title": "Уведомления о проблемах в Oxidized",
            "content_html": "<p>Разбор не сильно освещенных мест в довольно популярных продуктах несет с собой некоторое количество боли. Разработчики пишут документацию, считая некоторые вещи очевидными, но так бывает довольно не всегда и примеров с конфигурациями частенько бывает не хватает. В случае же с блогерами все тоже довольно грустно. Обзоры похожи один на другой и никто не старается копнуть вглубь и предложить что-то интересное или необычное.<\/p>\n<p>Например есть довольно зрелый продукт для резервного копирования конфигурация — Oxidized. Разработка пришла на смену RANCID и заменила его чуть более чем полностью. В нем исторически есть набор фич, но развитие за годы замедлилось. Работает ведь отлично, зачем ломать? Но есть задачи немного в сторону.<\/p>\n<p>В Oxidized нет возможности из коробки направить уведомлении об успешном или наоборот — не очень успешном процессе резервирования. Для этого можно использовать так называемые хуки. И вроде hook не слишком сложный, но важно помнить, что важен формат — yaml.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">hooks:\r\n  failed:\r\n    type: exec\r\n    events: [node_fail]\r\n    cmd: &#039;echo &quot;$OX_NODE_NAME,$OX_NODE_IP,$OX_JOB_STATUS&quot; &gt;&gt; \/home\/oxidized\/.config\/oxidized\/ox_node_failed.log&#039;<\/code><\/pre><p>На выходе мы получаем текстовый файл в формате csv и сможем еще уже отправить дальше. Например в телеграм путем не очень хитрых манипуляций:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">#!\/bin\/bash\r\n\r\n# Set the API token and chat ID - обозначаем токен и id чата\r\nAPI_TOKEN=&quot;token&quot;\r\nCHAT_ID=&quot;chat-id&quot;\r\n\r\n# Parse file with error - объявляем путь к файлу\r\nFILE=\/opt\/oxidized\/ox_node_failed.log\r\n\r\n# Checking if file is empty or not - проверяем, пустой ли файл\r\nif [ -s $FILE ]\r\nthen\r\n     echo &quot;File is not empty, do the JOB&quot;\r\n\r\n       # Read file, prepare messade and send to Telegram - читаем файл, готовим сообщение и отправляем\r\n        while IFS=, read -r col1 col2 col3\r\n        do\r\n            MESSAGE=(&quot;&lt;b&gt;ERROR DETECTED&lt;\/b&gt; while backup on device $col1 with IP: $col2 reason: &lt;b&gt;$col3&lt;\/b&gt;. Check &lt;a href=\\&quot;http:\/\/oxidized.url\\&quot;&gt;Oxidized&lt;\/a&gt;!&quot;);\r\n            echo $MESSAGE\r\n\r\n        # Use the curl command to send the message - отправляем сообщение\r\n        curl -s -X POST https:\/\/api.telegram.org\/bot$API_TOKEN\/sendMessage -d parse_mode=&quot;html&quot; -d chat_id=$CHAT_ID -d text=&quot;$MESSAGE&quot;;\r\n\r\n        done &lt; $FILE\r\n      \r\n        # Clean file - очищаем файл, чтобы избежать повторной отправки\r\n        &gt;$FILE\r\n\r\nelse\r\n     echo &quot;File is empty, nothing to do&quot;\r\n     exit;\r\nfi<\/code><\/pre><p>Теперь и на <a href=\"https:\/\/github.com\/skurudo\/usefulbash\/blob\/main\/oxidized-check-file-and-send-notify.sh\">Github<\/a>! ^_^<\/p>\n",
            "date_published": "2024-11-27T09:07:35+03:00",
            "date_modified": "2024-11-27T09:15:50+03:00",
            "tags": [
                "Mikrotik",
                "Oxidized",
                "Telegram",
                "скрипт"
            ],
            "_date_published_rfc2822": "Wed, 27 Nov 2024 09:07:35 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "264",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "257",
            "url": "https:\/\/www.skurudo.ru\/all\/how-to-spend-some-time-and-overcome-anxiety\/",
            "title": "Как потратить немного времени и победить тревожность",
            "content_html": "<p>В небольшие промежутки времени между домашними и рабочими делами есть большое желание приобщиться к мировой мультипликации и посмотреть, какие новые и волшебные идеи приходят к нам из страны восходящего солнца. И как большинство длинных историй начинаются со слов «короче», здесь будет нечто подобное.<\/p>\n<p>Короче началось все с того, что любимый торрент трекер AnimeBytes снова по каким-то своим техническим проблемам слег и анонсов восстановления его не было. Пришлось какое-то продолжительное время использовать NyaaTorrents. Он менее удобен и проигрывает визуально, но прост и функционален. В момент использования стало понятно — есть проблема, которая касается и NyaaTorrents, и AnimeBytes. Для получения нужных нам материалов для проведения досуга нужно заходить, обновлять страничку, смотреть обновления, скачивать.<\/p>\n<p>ДОКОЛЕ?! Автоматизацию в массы!<\/p>\n<p>И вспомнилось мне, что еще со времен uTorrent была прекрасная возможность использовать RSS для получения о новых релизах и ссылки на сами торренты. Точно такая же фишка обнаружилась и в QBittorrent, идейном наследнике uTorrent. Таким образом мы делаем следующее — добавляем в наш торрент клиент RSS фид от торрент трекера и с помощью встроенных фильтров автоматически скачивает то, что нам нужно.<\/p>\n<p>Вот так выглядит список правил для зимнего сезона 2024 года + остатки 2023-ого:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/www.skurudo.ru\/pictures\/2024-02-26_005.png\" width=\"1054\" height=\"1083\" alt=\"\" \/>\n<\/div>\n<p>Сложности? Есть некоторые моменты, на которые стоит обратить внимание — разные названия в разных rss-фидах и релизах (нужно учесть варианты), а также имеет смысл фильтровать разрешения (т. е. скачивать релиз только 720р или только 1080р, чтобы несколько раз не скачивать одно и то же). Поскольку расписание на сезон более или менее фиксированное, в начале сезона составляем список и в течение этого времени оно работает автоматически, без нашего участия.<\/p>\n<p>И казалось бы, оно работает и чего еще желать? Неплохо бы все-таки знать, а что там нового реально скачалось? Кто-то же должен сказать: «Скачано, подано, давайте смотреть! Позязя!».<\/p>\n<p>По умолчанию QBittorrent дает возможность отправлять данные по электронной почте, уже даже с поддержкой SSL. Но использовать электронную почту в 2024 году для уведомлений? А почему бы не использовать телеграм сразу? Можно и его.<\/p>\n<p>Если бы мы сидели где-нибудь под линуксами, то у нас была бы возможность сразу использовать готовый скрипт — <a href=\"https:\/\/github.com\/rteixeirax\/qbittorrent_telegram_notification\">qbittorrent_telegram_notification<\/a>. Однако у нас Windows и нужно как-то выкручиваться по-другому. Под другим подразумевается использование Powershell для отправки сообщений.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/www.skurudo.ru\/pictures\/2024-02-27_006v2.png\" width=\"1277\" height=\"711\" alt=\"\" \/>\n<\/div>\n<p>В настройках QBittorrent нам нужно вызвать внешнюю программу после завершения скачивания: <i>«powershell.exe -File C:\\cmd\\qbittorrent-alert.ps1 „%N“»<\/i>. Встроенный в Windows Powershell вызывает наш скрипт с параметрами. Не стоит забывать про Powershell Policy, обычно по умолчанию выполнение скриптов запрещено — нужно будет разрешить: <i>Set-Executionpolicy -Scope CurrentUser -ExecutionPolicy UnRestricted<\/i><\/p>\n<p>Сам скрипт распространяется свободно и доступен в Github — <a href=\"https:\/\/github.com\/skurudo\/poshpower\/tree\/main?tab=readme-ov-file#telegram-notification-template-with-qbittorrent\">Telegram notification template with Qbittorrent<\/a>. Для работы достаточно указать токен телеграм бота и идентификатор чата, куда будут отправляться сообщения.<\/p>\n<p>По итогу наших стараний получаем приватную «уведомлялку» о новинках.<\/p>\n<div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"855\" data-ratio=\"0.62408759124088\">\n<img src=\"https:\/\/www.skurudo.ru\/pictures\/2024-02-27_007.png\" width=\"855\" height=\"1370\" alt=\"\" \/>\n<img src=\"https:\/\/www.skurudo.ru\/pictures\/2024-02-27_004.png\" width=\"379\" height=\"805\" alt=\"\" \/>\n<\/div>\n<\/div>\n",
            "date_published": "2024-02-27T13:16:06+03:00",
            "date_modified": "2025-05-27T11:51:55+03:00",
            "tags": [
                "Microsoft",
                "Powershell",
                "Telegram",
                "скрипт",
                "торрент"
            ],
            "image": "https:\/\/www.skurudo.ru\/pictures\/2024-02-27_006.png",
            "_date_published_rfc2822": "Tue, 27 Feb 2024 13:16:06 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "257",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/jquery\/jquery.js",
                    "system\/library\/fotorama\/fotorama.css",
                    "system\/library\/fotorama\/fotorama.js"
                ],
                "og_images": [
                    "https:\/\/www.skurudo.ru\/pictures\/2024-02-27_006.png",
                    "https:\/\/www.skurudo.ru\/pictures\/2024-02-26_005.png",
                    "https:\/\/www.skurudo.ru\/pictures\/2024-02-27_006v2.png",
                    "https:\/\/www.skurudo.ru\/pictures\/2024-02-27_007.png",
                    "https:\/\/www.skurudo.ru\/pictures\/2024-02-27_004.png"
                ]
            }
        },
        {
            "id": "230",
            "url": "https:\/\/www.skurudo.ru\/all\/yaszait-yet-another-simple-zabbix-agent-installer-tool\/",
            "title": "YASZAIT — Yet Another Simple Zabbix Agent Installer Tool",
            "content_html": "<p>Понадобилось на несколько разных серверов на Debian\/Ubuntu поставить агент Zabbix, чтобы подключить их к мониторингу. Вместо того, чтобы ставить совсем все руками, немного автоматизировал процесс и добавил интерактива и в конце немного покажет адреса, чтобы удобно добавить в inventory. Скрипт спрашивает ровно три вещи:<\/p>\n<ol start=\"1\">\n<li>хостнейм сервера — можно прощелкать, укажет автоматически<\/li>\n<li>адрес Zabbix сервера — указывать обязательно<\/li>\n<li>порт — можно прощелка, укажет стандартный 10050<\/li>\n<\/ol>\n<p>Для запуска скрипта:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">bash &lt;(wget -O - https:\/\/raw.githubusercontent.com\/skurudo\/usefulbash\/main\/zabbix-add-agent-on-debian.sh)<\/code><\/pre><p>Код приведен ниже и также доступен на <a href=\"https:\/\/github.com\/skurudo\/usefulbash\/blob\/main\/zabbix-add-agent-on-debian.sh\">Github<\/a>:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">#!\/bin\/bash\r\n# YASZAIT\r\n# Yet Another Simple Zabbix Agent Installer Tool\r\n##############################################################\r\n# enter some data to start\r\necho -n &quot;Enter this server name: &quot;\r\nread SRV_HOSTNAME\r\n# if SRV_HOSTNAME is empty, use server hostname\r\nif [ -z &quot;$SRV_HOSTNAME&quot; ]; then\r\n        SRV_HOSTNAME=($(hostname -f))\r\nfi\r\necho -n &quot;Enter Zabbix Server (FQDN or IP): &quot;\r\nread ZABBIX_SERVER\r\n# if ZABBIX_SERVER is empty, try again\r\nif [ -z &quot;$ZABBIX_SERVER&quot; ]; then\r\n    echo -n &quot;=&gt; Please enter address of your Zabbix server... [example.org or IP]: &quot;\r\n        read -r ZABBIX_SERVER\r\nfi\r\necho -n &quot;Listening port (10050): &quot;\r\nread LISTEN_PORT\r\n# if LISTEN_PORT is empty, set it to 10050\r\nif [ -z &quot;$LISTEN_PORT&quot; ]; then\r\n    LISTEN_PORT=10050\r\nfi\r\n\r\n# Zabbix agent simple installation\r\napt-get install zabbix-agent\r\n# change configuration file\r\ncat &gt; \/etc\/zabbix\/zabbix_agentd.conf &lt;&lt; EOF\r\n# simple core config file\r\n#\r\n# address of the server\r\nServer=$ZABBIX_SERVER\r\nServerActive=$ZABBIX_SERVER\r\n# port for Zabbix\r\nListenPort=$LISTEN_PORT\r\n# hostname \r\nHostname=$SRV_HOSTNAME\r\n#Hostname=$(hostname -f)\r\n# pid and logs\r\nPidFile=\/var\/run\/zabbix\/zabbix_agentd.pid\r\nLogFile=\/var\/log\/zabbix-agent\/zabbix_agentd.log\r\nLogFileSize=0\r\nEOF\r\n# restart the zabbix agent\r\nservice zabbix-agent restart \r\n# check agent status\r\nservice zabbix-agent status\r\n# show a little ip4 addresses for Zabbix server\r\necho &quot;######################################&quot;\r\necho &quot;# Information about IP addresses #####&quot;\r\necho &quot;######################################&quot;\r\necho &quot;Server ipv4 addresses:&quot;\r\nip addr show | grep &quot;inet &quot;<\/code><\/pre><p>Сейчас пока задач по доработкам нет — свои задачи скрипт выполнил, но некоторые мысли есть...<\/p>\n<ul>\n<li>* сейчас скрипт не проверяет OS и отработает только под Debian-подобной системой (поскольку CentOS и других под рукой уже нет — дописывать и проверять сложно, пока отложено);<\/li>\n<li>* скрипт не проверяет установлен ли сейчас какой-то агент, он просто перезапишет конфиг (не очень ясно, насколько это востребованная история);<\/li>\n<li>* скрипт не проверяет занятость порта (отсылка к предыдущему пункту по сути);<\/li>\n<li>* скрипт не использует сертификаты или PKI (при наличии задачи возможно стоило бы использовать);<\/li>\n<li>* при однородности серверов мониторинга можно было бы наверное использовать фиксированные значения или давать выбор (здесь опущено для универсальности, серверы были разные);<\/li>\n<li>* возможно стоило бы подумать и усложнить конфигурационный файл агента (стоит обдумать опции на досуге);<\/li>\n<\/ul>\n",
            "date_published": "2021-05-21T10:14:45+03:00",
            "date_modified": "2021-05-21T15:05:38+03:00",
            "tags": [
                "bash",
                "Debian",
                "Ubuntu",
                "Zabbix",
                "скрипт"
            ],
            "_date_published_rfc2822": "Fri, 21 May 2021 10:14:45 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "230",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "227",
            "url": "https:\/\/www.skurudo.ru\/all\/import-users-to-yandex-connect\/",
            "title": "Импорт пользователей в Яндекс.Коннект через API",
            "content_html": "<p>Возникла задача добавить несколько десятков пользователей в Яндекс.Коннект и сразу же начались поиски пути решения, чтобы избавиться от ручного труда и в дальнейшем облегчить жизнь. Решил попробовать вариант от <a href=\"https:\/\/habr.com\/ru\/users\/Energys\/\">Energys<\/a> — статья на <a href=\"https:\/\/habr.com\/ru\/post\/448036\/\">habr’e<\/a>. Почему попробовать? За пару лет что-то могло перестать работать, как говорится — «За время пути собака могла подрасти!»<\/p>\n<p>С первого взгляда не понравилось то, что пароли у сотрудников будущих одинаковые — это обязательно нужно было поменять, плюс не указана должность — потребовалось добавить. Однако для общего понимания статья подходит как нельзя лучше. К тому же изменения сравнительно не сложные — готовимся и применяем.<\/p>\n<p>Самое не простое в этой истории — возня с токеном от Яндекса. В статье она описана, пройдем по шагам для истории и чтобы ничего не забыть:<\/p>\n<ul>\n<li>* зайти в аккаунт яндекса под администратором домена;<\/li>\n<li>* в <a href=\"https:\/\/oauth.yandex.ru\/\">Я.OAuth<\/a> первым делом нужно создать приложение;<\/li>\n<li>* приложению даем права, в нашем случае — Яндекс.Коннект Directory API;<\/li>\n<li>* выбираем платформу «веб-сервисы» и нажимаем «подставить url для разработки»;<\/li>\n<li>* сохраняемся и получим ID приложения — именно оно понадобится для получения токене;<\/li>\n<li>* вставляем ID приложения и получаем токен:<\/li>\n<\/ul>\n<pre class=\"e2-text-code\"><code class=\"\">https:\/\/oauth.yandex.ru\/authorize?response_type=token&amp;client_id=&lt;ID приложения&gt;<\/code><\/pre><ul>\n<li>* именно этот токен и будет использоваться в скрипте;<\/li>\n<\/ul>\n<p>Идея сравнительно не сложная:<\/p>\n<ol start=\"1\">\n<li>готовим файл определенного образца;<\/li>\n<li>добавляем переменных;<\/li>\n<li>читаем список из файла;<\/li>\n<li>в запросе в цикле добавляем переменные;<\/li>\n<li>в каждой итерации ждем пару секунд.<\/li>\n<\/ol>\n<p>Сам скрипт выглядит следующим образом — он же на <a href=\"https:\/\/github.com\/skurudo\/usefulbash\/blob\/main\/yandex-connect-mass-user-add.sh\">GitHub<\/a>:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">#!\/bin\/bash\r\n# path to users list - путь к списку пользователей\r\nemployees=&#039;.\/usrlist&#039;\r\n# line example from users list - пример строки файла \r\n# usrlist: email_lastname_firstname_middlename_password_position\r\n# for example: petrova_Петрова_Авдотья_Федоровна_eeKrutoiparol23_Менеджер\r\n\r\n# OAuth_Token\r\n# link to material about token - ссылка на формирование отладочного токена\r\n# https:\/\/tech.yandex.ru\/oauth\/doc\/dg\/tasks\/get-oauth-token-docpage\/\r\n# link about our apps - список ваших приложений\r\n# https:\/\/oauth.yandex.ru\/\r\n# get token from apps id - получить токен из ID приложения\r\n# https:\/\/oauth.yandex.ru\/verification_code#access_token=435843755894374389\r\nTOKEN=&quot;token-here-and-there&quot;\r\n\r\n# read and trim user file - читаем и перебираем файл со списком пользователей\r\nfor i in $( cat $employees ); do\r\nvalue=($(echo $i | tr &quot;_&quot; &quot; &quot;))\r\n\r\n# make variables for api request from file - заводим переменные для запроса из файла\r\nemail=&quot;${value[0]}&quot;\r\nlastname=&quot;${value[1]}&quot;\r\nfirstname=&quot;${value[2]}&quot;\r\nmiddlename=&quot;${value[3]}&quot;\r\npassword=&quot;${value[4]}&quot;\r\nposition=&quot;${value[5]}&quot;\r\n\r\n# Make user for good - создаем сотрудника ради добра\r\n# department = 1 for default - департамент 1 умолчанию\r\n#only http answers, not full - только http ответы, не полный лог\r\ncurl -i -X POST -H &#039;Content-type: application\/json&#039; -d &#039;{&quot;department_id&quot;: 1, &quot;position&quot;: &quot;&#039;$position&#039;&quot;, &quot;password&quot;: &quot;&#039;$password&#039;&quot;, &quot;nickname&quot;: &quot;&#039;$email&#039;&quot;, &quot;name&quot;: {&quot;first&quot;: &quot;&#039;$firstname&#039;&quot;, &quot;last&quot;: &quot;&#039;$lastname&#039;&quot;, &quot;middle&quot;: &quot;&#039;$middlename&#039;&quot;}}&#039; -H &quot;Authorization: OAuth $TOKEN&quot; &#039;https:\/\/api.directory.yandex.net\/v6\/users\/&#039; | grep HTTP\r\n#full answers - полные ответы\r\n#curl -i -X POST -H &#039;Content-type: application\/json&#039; -d &#039;{&quot;department_id&quot;: 1, &quot;position&quot;: &quot;&#039;$position&#039;&quot;, &quot;password&quot;: &quot;&#039;$password&#039;&quot;, &quot;nickname&quot;: &quot;&#039;$email&#039;&quot;, &quot;name&quot;: {&quot;first&quot;: &quot;&#039;$firstname&#039;&quot;, &quot;last&quot;: &quot;&#039;$lastname&#039;&quot;, &quot;middle&quot;: &quot;&#039;$middlename&#039;&quot;}}&#039; -H &quot;Authorization: OAuth $TOKEN&quot; &#039;https:\/\/api.directory.yandex.net\/v6\/users\/&#039; \r\n# wait for 2 sec - ждем пару секунд\r\nwait 2\r\ndone<\/code><\/pre><p>C чем удалось столкнуться при отладке и работе скрипта? Буквально несколько моментов:<\/p>\n<ul>\n<li>* если посылать запросы слишком часто, часть может не сработать — нужно подбирать тайминги между запросами.. пауза в 1-2 секунды работает;<\/li>\n<li>* обязательно нужно смотреть на входные данные — аккуратность с символами в названиях важна;<\/li>\n<li>* моя частая ошибка — 422 Unprocessable Entity — при разборе оказалось, что пароль был слишком простой;<\/li>\n<\/ul>\n",
            "date_published": "2021-03-04T15:00:15+03:00",
            "date_modified": "2021-05-21T10:15:44+03:00",
            "tags": [
                "api",
                "bash",
                "почта",
                "скрипт",
                "Яндекс"
            ],
            "_date_published_rfc2822": "Thu, 04 Mar 2021 15:00:15 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "227",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "213",
            "url": "https:\/\/www.skurudo.ru\/all\/comparing-values-in-mikrotik-scripts\/",
            "title": "Сравнение значений в скриптах",
            "content_html": "<p>Немного ошибся и не модернизировал везде скрипты при обновлении, в результате при выходе новой ветки извещений о новой версии не получил. А все почему? Сравнение нужно делать правильно.<\/p>\n<p><b>Не правильно<\/b><br \/>\n$Installed < $Latest<\/p>\n<p><b>Правильно<\/b><br \/>\n$Installed != $Latest<\/p>\n<p>Например мы сравниванием версии 6.45.6 (Installed) и 6.46 (Latest). Получается, что Mikrotik берет значение как число и выходит, что 646 (Latest) никак не может быть больше 6.45.6 (Installed) . В итоге неправильное сравнение больше-меньше конечно будет работать, но не во всех случаях. Для обеспечения универсальности лучше использовать сравнение. Иными словами, если у нас есть различия в версии, то явно нужно обновляться.<\/p>\n",
            "date_published": "2020-01-09T03:09:56+03:00",
            "date_modified": "2020-01-09T03:09:51+03:00",
            "tags": [
                "Mikrotik",
                "скрипт"
            ],
            "_date_published_rfc2822": "Thu, 09 Jan 2020 03:09:56 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "213",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        },
        {
            "id": "212",
            "url": "https:\/\/www.skurudo.ru\/all\/skript-dlya-obnovleniya-addresslist\/",
            "title": "Скрипт для обновления AddressList",
            "content_html": "<p>Соорудил скрипт для обновления адрес листа или листов более или менее автоматически. Давно хотел завести что-то подобное для автоматизации.<\/p>\n<p>Первоначальная задумка:<\/p>\n<ul>\n<li>* у нас удаленно лежит адрес лист (<i>где-то на веб сервере<\/i>);<\/li>\n<li>* мы по расписанию (<i>это шедулер<\/i>) забираем его к себе (<i>это фетч<\/i>);<\/li>\n<li>* далее смотрим не нулевой ли размер, если нулевой — то выходим (<i>пока не сделано, проверка идет по наличию файла<\/i>);<\/li>\n<li>* если все в порядке, то очищаем существующий адрес лист, импортируем новый и удаляем файл;<\/li>\n<\/ul>\n<p>Из ограничений:<\/p>\n<ul>\n<li>* пока не умеем работать с динамическими записями и очищать их;<\/li>\n<li>* список адресов — это по сути rsc;<\/li>\n<li>* список адресов там пока жестко задан адрес лист (непонятно получится ли это обратить в динамичный выбор);<\/li>\n<\/ul>\n<p>Ссылка на сам скрипт:<br \/>\n<a href=\"https:\/\/github.com\/skurudo\/mikrotik-alau\">https:\/\/github.com\/skurudo\/mikrotik-alau<\/a><\/p>\n",
            "date_published": "2019-12-04T14:52:41+03:00",
            "date_modified": "2020-02-03T18:10:45+03:00",
            "tags": [
                "Mikrotik",
                "RouterOS",
                "скрипт"
            ],
            "_date_published_rfc2822": "Wed, 04 Dec 2019 14:52:41 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "212",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        },
        {
            "id": "152",
            "url": "https:\/\/www.skurudo.ru\/all\/cisco-anyconnect-autoconnect\/",
            "title": "Cisco AnyConnect autoconnect",
            "content_html": "<p>Появилась задача — сделать автоматическое подключение и переподключение к VPN пользователей, чтобы у них был доступ к определенному внутреннему ресурсу. VPN не наш, ресурс тоже не наш. Конечно проще всего было подключать одного пользователя и всем остальным пользователям при помощи маршрутизации отдавать тот самый заветный ресурс. Осталось решить, как быть с остальными пользователями, которые должны раз в определенный период времени показывать сетевую активность на VPN, чтобы избежать блокировки.<\/p>\n<p>Идея в том, чтобы по списку подключать пользователя с учетом его логина и пароля. Далее держать его какое-то время на линии и благополучно отключать. Нам дан Cisco AnyConnect для решения задачи и сначала нужно будет разобраться с cli. Оказалось, что работа с cli и из командной строки различаются у этого клиента от версии к версии, потому далеко не все советы и руководства сработали. Для версии 4.1.х подошел вот такой вариант:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">set FILE=C:\\Temp\\tmp.txt\r\necho connect vpn.server.ru&gt; %FILE%\r\necho clientusername&gt;&gt; %FILE%\r\necho clientpassword&gt;&gt; %FILE%\r\n&quot;C:\\Program Files\\Cisco\\Cisco AnyConnect Secure Mobility Client\\vpncli.exe&quot; -s &lt; %FILE%<\/code><\/pre><p>Осталось только сделать красиво:<\/p>\n<ul>\n<li>показывать дату и время при соединении;<\/li>\n<li>писать в лог дату и время соединения и отключения;<\/li>\n<li>временные интервалы отсчитываем «ping localhost -n 20 >nul»;<\/li>\n<\/ul>\n<p>Листинг — <a href=\"https:\/\/sku.ovh\/?03e14b7bab3c5264#7+ocEkLcKGOjqlmJyBVDtDgEYZXMsVr4EBldB3OZat8=\">https:\/\/sku.ovh\/?03e14b7bab3c5264#7+ocEkLcKGOjqlmJyBVDtDgEYZXMsVr4EBldB3OZat8=<\/a><\/p>\n",
            "date_published": "2016-07-04T13:27:41+03:00",
            "date_modified": "2016-07-04T13:27:06+03:00",
            "tags": [
                "bat",
                "Cisco",
                "VPN",
                "скрипт"
            ],
            "_date_published_rfc2822": "Mon, 04 Jul 2016 13:27:41 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "152",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "78",
            "url": "https:\/\/www.skurudo.ru\/all\/webasyst-missing-temporary-folder\/",
            "title": "webasyst: missing temporary folder",
            "content_html": "<p>Обратились с ошибкой при загрузке фотографий — «Error: missing temporary folder». С правами проблем не было, других ошибок не видно. Решение оказалось на редкость простым. Дело в том, что webasyst весьма придирчив к upload_tmp_dir. Если значение пустое, то получаем ошибку. Поэтому определим значение для пользователя четко в конфигурационном файле apache2:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">php_admin_value upload_tmp_dir \/home\/user\/tmp<\/code><\/pre>",
            "date_published": "2015-07-01T23:59:29+03:00",
            "date_modified": "2015-07-02T00:11:07+03:00",
            "tags": [
                "apache",
                "cms",
                "php",
                "webasyst",
                "ошибка",
                "скрипт"
            ],
            "_date_published_rfc2822": "Wed, 01 Jul 2015 23:59:29 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "78",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        }
    ],
    "_e2_version": 4116,
    "_e2_ua_string": "Aegea 11.2 (v4116)"
}