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

скрипт

Сцена́рный язы́к (язык сценариев, жарг. скрипто́вый язык, от англ. scripting language) — высокоуровневый язык программирования для написания сценариев (англ. script) — кратких описаний действий, выполняемых системой. Разница между программами и сценариями довольно размыта. Сценарий — это программа, имеющая дело с готовыми программными компонентами.

Согласно Джону Устерхауту, автору языка Tcl, высокоуровневые языки можно разделить на языки системного программирования (англ. system programming languages) и сценарные языки (англ. scripting languages). Последние он также назвал склеивающими языками (англ. glue languages) или языками системной интеграции (англ. system integration languages). Сценарии обычно интерпретируются, а не компилируются, хотя сценарные языки программирования один за другим обзаводятся JIT-компиляторами.

В более узком смысле под скриптовым языком может пониматься специализированный язык для расширения возможностей командной оболочки или текстового редактора и средств администрирования операционных систем.

YASZAIT — Yet Another Simple Zabbix Agent Installer Tool

Понадобилось на несколько разных серверов на Debian/Ubuntu поставить агент Zabbix, чтобы подключить их к мониторингу. Вместо того, чтобы ставить совсем все руками, немного автоматизировал процесс и добавил интерактива и в конце немного покажет адреса, чтобы удобно добавить в inventory. Скрипт спрашивает ровно три вещи:

  1. хостнейм сервера — можно прощелкать, укажет автоматически
  2. адрес Zabbix сервера — указывать обязательно
  3. порт — можно прощелка, укажет стандартный 10050

Для запуска скрипта:

bash <(wget -O - https://raw.githubusercontent.com/skurudo/usefulbash/main/zabbix-add-agent-on-debian.sh)

Код приведен ниже и также доступен на Github:

#!/bin/bash
# YASZAIT
# Yet Another Simple Zabbix Agent Installer Tool
##############################################################
# enter some data to start
echo -n "Enter this server name: "
read SRV_HOSTNAME
# if SRV_HOSTNAME is empty, use server hostname
if [ -z "$SRV_HOSTNAME" ]; then
        SRV_HOSTNAME=($(hostname -f))
fi
echo -n "Enter Zabbix Server (FQDN or IP): "
read ZABBIX_SERVER
# if ZABBIX_SERVER is empty, try again
if [ -z "$ZABBIX_SERVER" ]; then
    echo -n "=> Please enter address of your Zabbix server... [example.org or IP]: "
        read -r ZABBIX_SERVER
fi
echo -n "Listening port (10050): "
read LISTEN_PORT
# if LISTEN_PORT is empty, set it to 10050
if [ -z "$LISTEN_PORT" ]; then
    LISTEN_PORT=10050
fi

# Zabbix agent simple installation
apt-get install zabbix-agent
# change configuration file
cat > /etc/zabbix/zabbix_agentd.conf << EOF
# simple core config file
#
# address of the server
Server=$ZABBIX_SERVER
ServerActive=$ZABBIX_SERVER
# port for Zabbix
ListenPort=$LISTEN_PORT
# hostname 
Hostname=$SRV_HOSTNAME
#Hostname=$(hostname -f)
# pid and logs
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix-agent/zabbix_agentd.log
LogFileSize=0
EOF
# restart the zabbix agent
service zabbix-agent restart 
# check agent status
service zabbix-agent status
# show a little ip4 addresses for Zabbix server
echo "######################################"
echo "# Information about IP addresses #####"
echo "######################################"
echo "Server ipv4 addresses:"
ip addr show | grep "inet "

Сейчас пока задач по доработкам нет — свои задачи скрипт выполнил, но некоторые мысли есть...

  • * сейчас скрипт не проверяет OS и отработает только под Debian-подобной системой (поскольку CentOS и других под рукой уже нет — дописывать и проверять сложно, пока отложено);
  • * скрипт не проверяет установлен ли сейчас какой-то агент, он просто перезапишет конфиг (не очень ясно, насколько это востребованная история);
  • * скрипт не проверяет занятость порта (отсылка к предыдущему пункту по сути);
  • * скрипт не использует сертификаты или PKI (при наличии задачи возможно стоило бы использовать);
  • * при однородности серверов мониторинга можно было бы наверное использовать фиксированные значения или давать выбор (здесь опущено для универсальности, серверы были разные);
  • * возможно стоило бы подумать и усложнить конфигурационный файл агента (стоит обдумать опции на досуге);
 1 комментарий   2 мес   bash   Debian   Ubuntu   Zabbix   скрипт

Импорт пользователей в Яндекс.Коннект через API

Возникла задача добавить несколько десятков пользователей в Яндекс.Коннект и сразу же начались поиски пути решения, чтобы избавиться от ручного труда и в дальнейшем облегчить жизнь. Решил попробовать вариант от Energys — статья на habr’e. Почему попробовать? За пару лет что-то могло перестать работать, как говорится — «За время пути собака могла подрасти!»

С первого взгляда не понравилось то, что пароли у сотрудников будущих одинаковые — это обязательно нужно было поменять, плюс не указана должность — потребовалось добавить. Однако для общего понимания статья подходит как нельзя лучше. К тому же изменения сравнительно не сложные — готовимся и применяем.

Самое не простое в этой истории — возня с токеном от Яндекса. В статье она описана, пройдем по шагам для истории и чтобы ничего не забыть:

  • * зайти в аккаунт яндекса под администратором домена;
  • * в Я.OAuth первым делом нужно создать приложение;
  • * приложению даем права, в нашем случае — Яндекс.Коннект Directory API;
  • * выбираем платформу «веб-сервисы» и нажимаем «подставить url для разработки»;
  • * сохраняемся и получим ID приложения — именно оно понадобится для получения токене;
  • * вставляем ID приложения и получаем токен:
https://oauth.yandex.ru/authorize?response_type=token&client_id=<ID приложения>
  • * именно этот токен и будет использоваться в скрипте;

Идея сравнительно не сложная:

  1. готовим файл определенного образца;
  2. добавляем переменных;
  3. читаем список из файла;
  4. в запросе в цикле добавляем переменные;
  5. в каждой итерации ждем пару секунд.

Сам скрипт выглядит следующим образом — он же на GitHub:

#!/bin/bash
# path to users list - путь к списку пользователей
employees='./usrlist'
# line example from users list - пример строки файла 
# usrlist: email_lastname_firstname_middlename_password_position
# for example: petrova_Петрова_Авдотья_Федоровна_eeKrutoiparol23_Менеджер

# OAuth_Token
# link to material about token - ссылка на формирование отладочного токена
# https://tech.yandex.ru/oauth/doc/dg/tasks/get-oauth-token-docpage/
# link about our apps - список ваших приложений
# https://oauth.yandex.ru/
# get token from apps id - получить токен из ID приложения
# https://oauth.yandex.ru/verification_code#access_token=435843755894374389
TOKEN="token-here-and-there"

# read and trim user file - читаем и перебираем файл со списком пользователей
for i in $( cat $employees ); do
value=($(echo $i | tr "_" " "))

# make variables for api request from file - заводим переменные для запроса из файла
email="${value[0]}"
lastname="${value[1]}"
firstname="${value[2]}"
middlename="${value[3]}"
password="${value[4]}"
position="${value[5]}"

# Make user for good - создаем сотрудника ради добра
# department = 1 for default - департамент 1 умолчанию
#only http answers, not full - только http ответы, не полный лог
curl -i -X POST -H 'Content-type: application/json' -d '{"department_id": 1, "position": "'$position'", "password": "'$password'", "nickname": "'$email'", "name": {"first": "'$firstname'", "last": "'$lastname'", "middle": "'$middlename'"}}' -H "Authorization: OAuth $TOKEN" 'https://api.directory.yandex.net/v6/users/' | grep HTTP
#full answers - полные ответы
#curl -i -X POST -H 'Content-type: application/json' -d '{"department_id": 1, "position": "'$position'", "password": "'$password'", "nickname": "'$email'", "name": {"first": "'$firstname'", "last": "'$lastname'", "middle": "'$middlename'"}}' -H "Authorization: OAuth $TOKEN" 'https://api.directory.yandex.net/v6/users/' 
# wait for 2 sec - ждем пару секунд
wait 2
done

C чем удалось столкнуться при отладке и работе скрипта? Буквально несколько моментов:

  • * если посылать запросы слишком часто, часть может не сработать — нужно подбирать тайминги между запросами.. пауза в 1-2 секунды работает;
  • * обязательно нужно смотреть на входные данные — аккуратность с символами в названиях важна;
  • * моя частая ошибка — 422 Unprocessable Entity — при разборе оказалось, что пароль был слишком простой;
 Нет комментариев   5 мес   api   bash   почта   скрипт   Яндекс

Сравнение значений в скриптах

Немного ошибся и не модернизировал везде скрипты при обновлении, в результате при выходе новой ветки извещений о новой версии не получил. А все почему? Сравнение нужно делать правильно.

Не правильно
$Installed < $Latest

Правильно
$Installed != $Latest

Например мы сравниванием версии 6.45.6 (Installed) и 6.46 (Latest). Получается, что Mikrotik берет значение как число и выходит, что 646 (Latest) никак не может быть больше 6.45.6 (Installed) . В итоге неправильное сравнение больше-меньше конечно будет работать, но не во всех случаях. Для обеспечения универсальности лучше использовать сравнение. Иными словами, если у нас есть различия в версии, то явно нужно обновляться.

 Нет комментариев   2020   Mikrotik   скрипт

Скрипт для обновления AddressList

Соорудил скрипт для обновления адрес листа или листов более или менее автоматически. Давно хотел завести что-то подобное для автоматизации.

Первоначальная задумка:

  • * у нас удаленно лежит адрес лист (где-то на веб сервере);
  • * мы по расписанию (это шедулер) забираем его к себе (это фетч);
  • * далее смотрим не нулевой ли размер, если нулевой — то выходим (пока не сделано, проверка идет по наличию файла);
  • * если все в порядке, то очищаем существующий адрес лист, импортируем новый и удаляем файл;

Из ограничений:

  • * пока не умеем работать с динамическими записями и очищать их;
  • * список адресов — это по сути rsc;
  • * список адресов там пока жестко задан адрес лист (непонятно получится ли это обратить в динамичный выбор);

Ссылка на сам скрипт:
https://github.com/skurudo/mikrotik-alau

 Нет комментариев   2019   Mikrotik   RouterOS   скрипт

Cisco AnyConnect autoconnect

Появилась задача — сделать автоматическое подключение и переподключение к VPN пользователей, чтобы у них был доступ к определенному внутреннему ресурсу. VPN не наш, ресурс тоже не наш. Конечно проще всего было подключать одного пользователя и всем остальным пользователям при помощи маршрутизации отдавать тот самый заветный ресурс. Осталось решить, как быть с остальными пользователями, которые должны раз в определенный период времени показывать сетевую активность на VPN, чтобы избежать блокировки.

Идея в том, чтобы по списку подключать пользователя с учетом его логина и пароля. Далее держать его какое-то время на линии и благополучно отключать. Нам дан Cisco AnyConnect для решения задачи и сначала нужно будет разобраться с cli. Оказалось, что работа с cli и из командной строки различаются у этого клиента от версии к версии, потому далеко не все советы и руководства сработали. Для версии 4.1.х подошел вот такой вариант:

set FILE=C:\Temp\tmp.txt
echo connect vpn.server.ru> %FILE%
echo clientusername>> %FILE%
echo clientpassword>> %FILE%
"C:\Program Files\Cisco\Cisco AnyConnect Secure Mobility Client\vpncli.exe" -s < %FILE%

Осталось только сделать красиво:

  • показывать дату и время при соединении;
  • писать в лог дату и время соединения и отключения;
  • временные интервалы отсчитываем «ping localhost -n 20 >nul»;

Листинг — https://sku.ovh/?03e14b7bab3c5264#7+ocEkLcKGOjqlmJyBVDtDgEYZXMsVr4EBldB3OZat8=

 Нет комментариев   2016   bat   Cisco   VPN   скрипт

webasyst: missing temporary folder

Обратились с ошибкой при загрузке фотографий — «Error: missing temporary folder». С правами проблем не было, других ошибок не видно. Решение оказалось на редкость простым. Дело в том, что webasyst весьма придирчив к upload_tmp_dir. Если значение пустое, то получаем ошибку. Поэтому определим значение для пользователя четко в конфигурационном файле apache2:

php_admin_value upload_tmp_dir /home/user/tmp
 Нет комментариев   2015   apache   cms   php   webasyst   ошибка   скрипт