10 заметок с тегом

скрипт

/core.php, line 2
Error 2: Use of undefined constant k - assumed 'k' (this will throw an Error in a future version of PHP)

/core.php, line 2
Error 2: Use of undefined constant k - assumed 'k' (this will throw an Error in a future version of PHP)

/core.php, line 2
Error 2: Use of undefined constant k - assumed 'k' (this will throw an Error in a future version of PHP)

/core.php, line 2
Error 2: Use of undefined constant k - assumed 'k' (this will throw an Error in a future version of PHP)

/core.php, line 2
Error 2: Use of undefined constant k - assumed 'k' (this will throw an Error in a future version of PHP)

/core.php, line 2
Error 2: Use of undefined constant k - assumed 'k' (this will throw an Error in a future version of PHP)

/core.php, line 2
Error 2: Use of undefined constant k - assumed 'k' (this will throw an Error in a future version of PHP)

/core.php, line 2
Error 2: Use of undefined constant k - assumed 'k' (this will throw an Error in a future version of PHP)

/core.php, line 2
Error 2: Use of undefined constant k - assumed 'k' (this will throw an Error in a future version of PHP)

/core.php, line 2
Error 2: Use of undefined constant k - assumed 'k' (this will throw an Error in a future version of PHP)

Выполнение внешних скриптов в Sieve

Понадобилось недавно каким-то образом запускать внешний скрипт по приходу определенного письма. Начал поиски как это сделать. В Postfix это можно сделать, используя файл aliases, но мне этот способ не подходил, потому что он подразумевает приход письма на определенный почтовый адрес. С Dovecot сильно не разбирался, но вот информацию по Sieve нашел. Немного времени спустя у меня был наполовину рабочий вариант. Наполовину потому, что выполняемая во внешнем скрипте команда напрочь отказалась принимать отправляемые ей данные. Пришлось немного подправить скрипт в самом Sieve, чтобы получить желаемый результат.
Все оказалось очень просто. Для начала нужно включить доступ к плагину vnd.dovecot.execute. Для этого открываем файл с настройками Sieve /etc/dovecot/conf.d/90-sieve.conf и вносим следующие изменения:

plugin {
  sieve_extensions = +vnd.dovecot.execute
  sieve_plugins = sieve_extprograms
  sieve_execute_bin_dir = /etc/dovecot/sieve/execute
}

Все остальные параметры нам не нужны.
В первой строчке включаем доступ к плагину для пользователей. Можно использовать параметр sieve_global_extensions, в таком случае плагин будет работать глобально. Но глобальный скрипт работает ТОЛЬКО если у пользователя нет своего файла скрипта Sieve. Пользователей на моем сервере очень мало, поэтому такой вариант мне не подходит.
Во второй строке мы разрешаем использование плагинов как таковых.
И, наконец, в третьей строке указывает папку, в которой будут находиться эти самые внешние скрипты. Доступ к этой папке для Dovecot, конечно, нужно обеспечить. Подозреваю, что папку можно и не указывать, а в скрипте Sieve просто указать полный путь к запускаемой программе, но проверять лень.
Теперь остается только написать правило обработки входящих писем. Что-то вроде такого:

# rule:[Test rule]
if allof (header :contains "from" "test@example.com", header :contains "subject" "Prikaz 66")
{
        execute "test.sh";
	fileinto "Trash";
	stop;
}

Получив письмо от отправителя test@example.com с темой «Prikaz 66» Sieve запустит на выполнение скрипт /etc/dovecot/sieve/execute/test.sh, затем удалит письмо в корзину и завершит обработку писем.
Знаю, что информации по этой теме в интернете достаточно. Но большая часть из нее, как водится, на английском и содержит много воды. Хотелось сделать небольшую выдержку на более привычном русском языке.

5 июня   dovecot   sieve   внешний   запуск   почта   программа   сервер   скрипт

Переезд сервера Narodmon

На днях сервер проекта Narodmon перебрался на более мощный сервер и, как следствие, сменил свой IP-адрес. Скорее всего, последовавшие события не связаны с этим, но мой сервер перестал отправлять данные на Narodmon. Пришлось в кои-то веки зайти на него и посмотреть что случилось.
Проблема оказалась в том, что накопилось слишком много данных на отправку. Пришлось взять в руки «скальпель» и отредактировать свой скрипт отправки данных. Если быть точней, то наконец-то завершить идею, до реализации которой все никак руки не доходили — постепенная отправка ранее не доставленных данных. Заодно немного изменил скрипт в части отправки сообщений об ошибках мне на Telegram. Раньше это было невозможно из-за отсутствия в списке пакетов curl. Сейчас ситуация изменилась, curl стал доступен, равно как и отправка сообщений в «телегу».
Пока что скрипт проходит тестирование, после небольшой обкатки выложу его на гитхаб.

13 мая   github   narodmon   обновление   скрипт

Привет из прошлого

Работал я несколько лет назад в одной компании, которая занималась сборкой и продажей компьютеров и разной околокомпьютерной техникой. В одни прекрасный момент решили собрать сервер для 1С. Люди собрались знающие, скидали комп в один момент. Поставили все, что нужно, протестировали и запустили в работу. А какое первое правило хорошего системного администратора? Бэкап, бэкап и еще 100 раз бэкап. Вот и занялся я написанием скрипта, который все это проделывал.
Скрипт был простой, в формате bat-файла:

  1. Рассылал всем предупреждение, что базы 1С скоро будут недоступны и ждал две минуты, пока все не закроют подключение. Кто не успел, я не виноват.
  2. Отключал все сетевые карты, чтобы не было соблазна.
  3. Создавал архивы баз 1С.
  4. Заново включал сетевые подключения.
  5. Перезагружал компьютер.

На все-провсе уходило от 15 до 30 минут, точней было лень считать. Через некоторое время я получил более выгодное предложение о работе и ушел из фирмы.
Около недели назад я получил оттуда звонок с просьбой немного переделать скрипт так, чтобы он копировал все архивы на новенький NAS. Времени свободного почти не было, поэтому отложили на несколько дней. Во второй половине недели подключаюсь к серверу и смотрю что там и как.
Архивация перестала работать из-за того, что скрипт не видел исполняемого файла архиватора. Но резервная копия продолжала создаваться копированием папок с базами до последнего дня. Посмотрел на все это и порадовался — скрипт получился действительно хороший, отработал без сбоев много лет. А я тогда был все-таки догадливым мальчиком и все выполняемые команды очень хорошо прокомментировал.
Немного покопался в системе с командами — в разных версиях серверных систем от мелкомягких некоторые команды могут не выполняться. А потом мне стало лень все это тестировать и я установил xStarter. Программа достаточно известная, алгоритмы работы гибкие, позволяют выполнять множество нужных команд. Давно уже не обновляется, автор, видимо, забросил проект. Есть косяки с некоторыми операциями, но их знание, позволяет их обойти.
В общем, воспользовался этой программой, написал последовательность действий и оставил тестироваться. В первый день или два она по неизвестной причине не запустила создание резервной копии. Затем не смогла подключиться к NAS. Вчера, зайдя на сервер, я обнаружил, что задания нет как такового. Вот это уже удивило, ибо на нескольких других серверах никогда ничего такого не случалось. Написал все заново, установил пароль на редактирование и оставил на ночь.
Утром первым делом пошел смотреть на результат. Бэкап был создан и успешно перенесен на NAS. Добавил в программу отправку мне извещения на электронную почту и отправил номер своей карты для зачисления оплаты за работу.

Резервное копирование баз SQL

Резервное копирование баз было первым, что я настроил после устройства на эту работу. Потеря данных дважды была одной из причин увольнения предыдущего системного администратора. На текущий момент копий создается две: одна на втором жестком диске сервера и вторая — на внешнем диске. Данная схема будет работать до того момента, пока по перепаду напряжения не сгорят все диски (тьфу-тьфу-тьфу). Но за это отвечает достаточно хороший ИБП.
Оповещение об успешном создании бэкапов приходило мне на почту. Но там было просто письмо без указания конкретной информации. Сегодня наконец-то переделал эту схему и теперь на почту будет приходить более конкретная информация: результат остановки сервера SQL, результат копирования файлов, размер свободного места на обоих дисках и размер последнего созданного бэкапа. Последний пункт был включен по той причине, что xStarter при нехватке свободного места создает файлы нулевого размера, которые, конечно, мне нафиг не нужны. Критические данные сравниваются с эталоном и, в случае расхождений, выделяются жирным красным текстом.
Пока набирал этот текст, в кабинет залетела синица. Это уже третий раз за последние 10 дней. Как эти птицы умудряются пробраться сквозь маленькую щель в приоткрытых окнах — непонятно. И почему-то мне кажется, что это одна и та же птица.

Обновление зеркала NOD32

Итак. Старый скрипт, который работал на сервере не один год по какой-то непонятной причине перестал функционировать. Обновления скачиваются, но установленные антивирусы не могут его нормально обработать. По этой причине было решено подыскать скрипту достойную замену. Интересно, что, в итоге, я получил даже более функциональный и интересный скрипт, чем планировал.
Какие у него есть «плюсы»:

  1. Самообновление. При запуске скрипта он сам пытается найти более новую версию себя и обновиться. Можно отключить или настроить только на уведомление;
  2. Само собой приходят оповещения на почту;
  3. Работает со всеми версиями антивирусов. Тоже можно настроить;
  4. Настраиваются списки серверов обновлений ESET;
  5. Поддержка нескольких языков;
  6. Поиск валидных ключей лицензии в интернете;
  7. Ведение журнала работы с ротацией;
  8. Генерирование либо полноценного html-файла с информацией о текущем состоянии обновлений, либо только таблицы для встраивания ее в другой файл.
  9. Кроссплатформенность.

Из «минусов» я бы назвал создание слишком большого дерева файлов (некоторые из них, на мой взгляд, лишние) и немного некрасивой таблицы. Впрочем, последнее достаточно легко исправляется редактированием соответствующего файла.
Сам скрипт брал отсюда

2017   nod32   замена   зеркало   обновление   скрипт

Исправление ошибок

Уже вечером исправил косяки с новой станцией. После переброса на другую линию питания датчика ds18b20 он заработал. Это радует.
Также вроде бы решил проблему со скриптом отправки данных. Вместо накопления данных в нескольких файлах, размер каждого из которых не превышает 4 кБ, сделал обработу ответа «ERROR NO CHANGES». Если скрипт получает такой ответ, то просто стирается содержимое временного файла. Иными словами, он реагирует так же, как будто получил ответ «ОК». Это, конечно, не решает вопроса длительного отсутствия связи с сервером. Так что будем думать дальше.
Не могу пока что придумать как разместить станцию. По хорошему ее нужно разместить подальше от стены, чтобы исключить ее влияние на показания. Но тут встает вопрос как закрепить круглую металлическую трубку на стене. С другой стороны, самый простой вариант — разместить станцию, прикрутив с наружной стороны лоджии, просто на саморезы. На решение времени осталось не так уж и много — скоро наступят холода, работать будет не очень комфортно.

Тестирование новое метеостанции

Вчера провел на лоджию электричество, только розетку пока что не закреплял. Собрал станцию, включил в розетку и выставил на улицу. К стене дома крепить не стал, закреплю когда она пройдет испытания. К сожалению, почему-то перестал работать один из датчиков — ds18b20. Думал, что где-то нет контакта, подергал все проводки, проверил разъем, но ничего не изменилось. Так как мультиметр остался на работе, то поиск неисправности, похоже, откладывается до понедельника.
Попробовал также настроить станцию на отправку показаний на сервер WeatherUnderground, но с этим вышла какая-то непонятка. В прошивке esp8266 есть только поля для ввода логина и пароля, в то время как в скрипте на роутере, который отправляет показания, надо также указывать ID станции, которая была создана при регистрации на сайте. Вчера ввел качестве логина ID станции, в качестве пароля указал ключ от нее. Потом смотреть журнал отправки было некогда, проверил только сейчас. Появились показания влажности воздуха, но с пропусками. Пока что непонятно, идет отправка или нет, буду наблюдать дальше.
Также в скрипте обнаружилась досадная ошибка, которую нужно исправлять, но я не совсем пока что понимаю как это реализовать. Суть ошибки состоит в том, что в какой-то момент скрипт перестает стирать содержимое временного файла с показаниями. При следующей отправке сервер отвечает не «ОК», а «ERROR NO CHANGES», так как в пакете присутствуют более ранние показания, которые сервер принял, а скрипт заново пытается их отправить. В результате данные начинают накапливаться и через примерно 4 часа размер файла начинает превышать 4 кБ — максимальный размер данных, которые можно отправить на сервер. Как результат данные, которые принимает сервер, обрезаются до 4 кБ. То есть появляется новая ошибка — отсутствует строка с закрывающими «##». По логике нужно начинать записывать данные в другой файл, но как потом искать все файлы с данными — непонятно. Буду думать.

Скрипт передачи данных на сервер narodmon.ru

Как и писал ранее, в какой-то момент надоело, что роутер периодически не может отправить данные на сервер, поэтому пришлось немного подредактировать его. После недельного тестирования отправил его администрации ресурса и, после некоторых уточнений, он был добавлен на сайт. Сейчас он находится в разделе «Справка» — «OpenWRT, OR-WRT» — «6. Скрипт для отправки показаний с отказоустойчивостью». Сам скрипт был размещен на github. Было добавлено краткое описание работы и кусок журнала его работы, из которого видно как он накапливает данные во время отсутствия связи с сервером, а затем, когда она появляется вновь, отправляет все недоставленные пакеты.
Самый «интересный» на мой взгляд момент состоит в том, что в моих планах заменить текущий датчик температуры на другие, которые будут передавать данные через домашний WiFi, что, в свою очередь, означает, что я не смогу воспользоваться пакетом owfs и скрипт будет бесполезен для меня. Хотя возможно, что я оставлю этот датчик в качестве «контрольной группы».

Еще одна модификация скрипта

Сутки наблюдения за модифицированным скриптом отправки данных на narodmon.ru показали, что есть огрехи в выбранном алгоритме — данные отправляются, сервер отвечает с задержкой, которую скрипт воспринимает за «молчание» сервера. Спустя некоторое время, от 15 минут до одного часа, сервер все-таки отвечает за настолько короткий промежуток, что скрипт успевает его «поймать». Пришлось еще раз изменить скрипт. На этот раз был добавлен цикл, в котором данные отправляются, затем он ждет 5 секунд ответ от сервера и, если ответ не получен, повторяет отправку данных. После 5 попыток отправки цикл сбрасывается и начинает накапливать данные во временном файле. Анализ журнала отправки показал, что данные отправляются если не с первого, то со второго раза. Будем продолжать наблюдение.

2017   narodmon   задержка   модификация   скрипт   цикл

Отправка данных на narodmon.ru

Так как порой случались сбои в отправке данных на сервер narodmon (нет интернета, сервер занят либо ничего не отвечает и т. д.) принял решение немного модифицировать скрипт отправки. В идеале, в случае любого сбоя данные должны накапливаться и затем, когда все «устаканиться», скопом быть отправлены.
Скрипт был модифицирован, были внесены несколько дополнительных проверок и он ушел в работу. В ходе работы создается временный файл, куда пишутся все данные. Если сервер narodmon ответил, что данные приняты нормально, то содержимое файла удалялось. В противном случае данные добавляются в этот файл с отметкой времени, когда они были добавлены.
Но, как обычно, не обошлось без ложки дегтя. В случае, если сервер не отвечает достаточно долгое время, данных накапливается много (в обычном варианте замеры проводятся каждые 5 минут). Когда их размер превысит 4 Кб, сервер narodmon, насколько я понимаю, просто откажется принимать такое множество данных. Но тут ничего не попишешь, будем тестировать и смотреть что получится.