Bshellz shell autorenew — IRC-perl-скрипт для обновления аккаунта в Bshellz

Как-то я писал про бесплатный linux shell от провайдера Bshellz в заметке Бесплатный Linux-shell с Tmux на борту. Там же был приведён способ автоматического продления аккаунта — путём отправки (по расписанию) служебного сообщения боту Beschbot с помощью имеющегося на самом хостинге IRC-клиента irssi. Время показало, что способ, как и следовало ожидать, не лишён недостатков. А именно — периодически сервер Bshellz перезагружается, после чего настройка расписания в irssi слетает. Также — несколько раз наблюдались проблемы с подключением клиента к сети Freenode IRC. В результате возникло решение зарезервировать автообновление аккаунта в Bshellz путём использования дополнительного внешнего скрипта, также запускающегося по расписанию (раз в день в произвольное время, на домашней машине).

Непосредственно сам скрипт доступен по ссылке: bshellz-autorenew.pl. Принцип действия примитивен — подключается к Freenode IRC, заходит на канал #bshellz и даёт боту Beschbot команду продлить «время жизни» указанного в настройках аккаунта (в моём случае — аккаунт dimio): PRIVMSG Beschbot :!keep dimio.

Некоторых пояснений могут потребовать разве что настройки скрипта (изменяются в нём же самом). На части из них и остановлюсь чуть подробней:

my $opt = {
    server_name => 'irc.freenode.net',
    server_port => '6667',
    channel     => 'bshellz',
    bot_name    => 'Beschbot',
    nickname    => 'dimio',
    bshellz_name    => 'dimio', # name of bshellz account
    verbose     => 0, # print irc server responses & debug data
    print_log   => 1, # print Beschbot "!keep" response for cron sending report email
};
  • channel — название канала, на который будет заходить скрипт;
  • bot_name — пользователю с указанным здесь именем будет отправлено сообщение от продлении аккаунта;
  • nickname — ник для IRC, любой, допускаемый правилами сети;
  • bshellz_name — название аккаунта в Bshellz, для которого требуется запросить продление времени жизни;
  • verbose — вывод отладочной информации, может принимать значения от 0 (не выводит никакой отладочной информации) до 2 (выводит полный лог запросов-ответов сервера);
  • print_log — 0 (не выводить) или 1 (выводить) ответ бота на запрос о продлении аккаунта, при запуске через планировщик заданий — ответ попадёт в отчёт планировщика, что удобно.

После запуска скрипта с приведёнными в примере выше настройками должно быть получено ответное сообщение от Beschbot:

dimio@ibm:~$ perl bshellz-autorenew.pl
bshellz-autorenew.pl:   :Beschbot!beschbot@services.bshellz.net PRIVMSG dimio :dimio's shell has 168 more hours to live!

— скрипт отработал успешно, время жизни аккаунта dimio продлено на 168 часов.

Запуск скрипта по нерегулярному расписанию (cron, anacron)

Основной вопрос — запуск скрипта. Поскольку он резервный — запуск у меня происходит на домашней машине, а она, в свою очередь, работает не круглосуточно. Использование «чистого» cron в таких условиях — не очень удобно (в указанное в расписании время запуска компьютер может быть выключен). Мне пришли в голову два выхода: применить anacron (anachronistic cron) или сделать простенькую shell-обёртку для запуска скрипта при помощи обычного cron. Первый вариант удобен тем, что используется готовый инструмент (который, однако, может потребоваться сначала установить), а второй вариант — удобен отсутствием необходимости устанавливать дополнительные утилиты.

Вариант первый — запуск через anacron

Запуск скрипта можно прописать в /etc/anacrontab непосредственно (см. пример ниже) или положить его (ссылку на него) в /etc/cron.daily/ (в этом случае файл скрипта должен быть исполняемым).

# format: period delay job-identifier command
1       5       cron.daily      run-parts --report /etc/cron.daily
7       10      cron.weekly     run-parts --report /etc/cron.weekly
@monthly        15      cron.monthly    run-parts --report /etc/cron.monthly

@daily  5       bshellz-autorenew       perl /home/dimio/bshellz-autorenew.pl

Формат anacrontab следующий: периодичность запуска задачи, задержка перед запуском задачи после старта системы, имя задачи и выполняемая команда.
Проверяем срабатывание — задача была создана, время последнего выполнения — указано в /var/spool/anacron/bshellz-autorenew:

dimio@ibm:~$ ls -lh /var/spool/anacron/
...
-rw------- 1 root root 9 мар 15 11:35 bshellz-autorenew

dimio@ibm:~$ cat /var/spool/anacron/bshellz-autorenew
20170314

Вариант второй — cron плюс обёртка для запуска

Небольшой shell-скрипт cron_daily_bshellz.bash, который будет запускаться по расписанию обычного cron, но выполнять указанную задачу только раз в сутки. В crontab запуск у меня поставлен раз в 30 минут:

*/30 * * * * if [ "$(shuf -i '0-10' -n 1)" -gt 5 ]; then sh /home/dimio/bshellz-autorenew/cron_daily_bshellz.bash; fi

Под спойлером — лог запуска этого скрипта для проверки его работы, если кому интересно.

Показать лог »

Первый запуск:

dimio@ibm:~$ sh -x cron_daily_bshellz.bash
+ LOG_FILE=/home/dimio/log/cron_daily_bshellz.bash.log
+ RUN_FILE=/home/dimio/bshellz-autorenew.pl
++ which perl
+ PERL_BIN=/usr/bin/perl
+ '[' '!' -r /home/dimio/log/cron_daily_bshellz.bash.log ']'
+ touch /home/dimio/log/cron_daily_bshellz.bash.log
++ date +%Y-%m-%d
+ CURR_DATE=2017-03-14
++ tail --quiet --lines=1 /home/dimio/log/cron_daily_bshellz.bash.log
++ cut '--delimiter= ' --fields=1
+ LAST_RUN_DATE=
+ '[' -n '' ']'
+ eval '/usr/bin/perl /home/dimio/bshellz-autorenew.pl'
++ /usr/bin/perl /home/dimio/bshellz-autorenew.pl
/home/dimio/bshellz-autorenew.pl:   :Beschbot!beschbot@services.bshellz.net PRIVMSG dimio :dimio's shell has 168 more hours to live!
++ date +%H:%M
+ echo '
2017-03-14 13:37'
+ exit 0

Повторный запуск в тот же день:

dimio@ibm:~$ sh -x cron_daily_bshellz.bash
+ LOG_FILE=/home/dimio/log/cron_daily_bshellz.bash.log
+ RUN_FILE=/home/dimio/bshellz-autorenew.pl
++ which perl
+ PERL_BIN=/usr/bin/perl
+ '[' '!' -r /home/dimio/log/cron_daily_bshellz.bash.log ']'
++ date +%Y-%m-%d
+ CURR_DATE=2017-03-14
++ tail --quiet --lines=1 /home/dimio/log/cron_daily_bshellz.bash.log
++ cut '--delimiter= ' --fields=1
+ LAST_RUN_DATE=2017-03-14
+ '[' -n 2017-03-14 ']'
+ '[' 2017-03-14 = 2017-03-14 ']'
+ exit 0

Вот и всё, теперь аккаунт Bshellz защищён от удаления дополнительным инструментом, помимо использованного ранее автопродления регистрации Bshellz через irssi.



Category Рубрики: *NIX, Кодинг, Мелочи, Полезности | Tag Метки: , , , , | Comments 2 комментария »

2 комментария

  1. Йо! Мэн, я с бшелзом знаком хз с каких лохматых годов, тоже когда-то маялся с автопродливалками, потом плюнул и задонатил 20 евро за пожизненный аккаунт. Какое-то время контактировал с Вуком — он временно админил бшелловские сервера, а сейчас там какой-то кромешный мрак. Главная — в дауне, на письма никто не отвечает.
    Я всякую мелочь тестирую, но у меня доступа к логам апача нет — даже не знаю к кому обращаться. Вероятно прийдется на фриноде вылавливать кого-нибудь, но может быть у тебя есть контакты?
    Заранее благодарен!

    • dimio says:

      Нету. Сам пытался в ирке выяснить, почему периодические ошибки с логином на сервер, но глухо. А потом логиниться вовсе перестало, так что плюнул в итоге. Донатить за это — ну уж нет, лучше VPS за бакс в месяц взять.

Добавить комментарий