Бот для управления домашним сервером Ubuntu 20.04.
- Для этого создается локальная sqlite БД и в ней таблица
scripts - Можно добавлять, удалять команды черз инлайн кнопки, редактирование существующей команды пока не реализовано
На моем веб-сервере через ipset установлено ограниченное количество стран, которые имеют доступ. Благодаря этой команде, я могу в одно касание добавить новую страну, которой будет открыт доступ(Реализовано на случай путешествий, или длятельных командировок). Сами исполняемые скрипты могут запускать без запроса пароля для sudo.
Запускает calibre на сканирование папки в которую я добавил новые книги. В идеале это должно запускаться автоматически, но если по каким-то причинам этого не произошло, я могу сделать это вручную. После добавления книг, код подключается к БД calibre и достает от туда названия книг, которые были добавлены.
➜ docker exec -ti calibre-web calibredb add /scan --add -r --with-library /books qt.gui.icc: Unsupported ICC profile class 70727472 The following books were not added as they already exist in the database (see --duplicates option): Один день Ивана Денисовича /scan/A_Solzhenitsyn_-_Odin_den_Ivana_Denisovicha.epub Архипелаг ГУЛАГ. 1918-1956: Опыт художественного исследования. Т. 2 /scan/Солженицын - Архипелаг ГУЛАГ. 1918-1956_ Опыт художественного исследования. Т. 2.fb2 Архипелаг ГУЛаг /scan/Архипелаг ГУЛАГ 3в1.fb2 Архипелаг ГУЛАГ. 1918-1956: Опыт художественного исследования. Т. 1 /scan/Солженицын - Архипелаг ГУЛАГ. 1918-1956_ Опыт художественного исследования. Т. 1.fb2 Архипелаг ГУЛаг /scan/Солженицын Александр. Архипелаг ГУЛАГ.fb2 Added book ids: 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216Я извлекаю последнюю строку, получаю id книг, которые были добавлены, и по ним получаю метаинформацию из БД metadata.db
Собрал единый SQL запрос:
SELECT id, title, ( SELECT bal.id|| ' '|| name FROM books_authors_link AS bal JOIN authors ON(author = authors.id) WHERE book = books.id ) authors, ( SELECT lang.lang_code FROM books_languages_link AS bll JOIN languages AS lang ON (bll.lang_code = lang.id) WHERE book = books.id ) langauge, ( SELECT name FROM publishers WHERE publishers.id IN ( SELECT publisher FROM books_publishers_link WHERE book=books.id) ) publisher, timestamp, ( SELECT name FROM tags WHERE tags.id IN ( SELECT tag FROM books_tags_link WHERE book=books.id) ) tags, (select text FROM comments WHERE book=books.id) comments, sort, author_sort, pubdate from books;Если одно из полей пустое, значит надо оформить ее как полагается. Возвращает в чат первую пятерку книг, оформленных как ссылки, чтобы я мог сразу приступить к найденной книге. Так же внизу присутствуют две инлайн кнопки, следующие 5 и предыдущие 5.
- Проверка статуса
fail2banВозвращает список заблокированных ip аздресов Возможность разблокировки этого адреса
- Слежение за сертификатами от
certbotПри подзоде срока истечении сертификата, присылал сообщение с напоминанием, и инлайн кнопкой для запуска обновления сертификатов.
- Поиск на rutracker.org и взаимодействие с установленным
transmission
Чтобы команда исполнялась без пароля и это было более-менее сесурно надо:
- записать команду в shell скрипт и сохранить ее
echo 'sudo some cmd -run' > /path/to/script.sh - Присвить права на исполнение только руту
sudo chown root:root /path/to/script.sh && sudo chmod 700 /path/to/script.sh - Выполнить команду
sudo visudoс помощью Nano модно будет редактировать документ - В конец добавить строку:
username ALL=(ALL) NOPASSWD: /path/to/script.shГде
usernameэто имя пользователя, от чьего имени будет запускаться команда. Чтобы узнать его в бот надо сохранить командуwhoami, чтобы он вернул имя пользователя
sudo update-alternatives --config editorThere are 6 choices for the alternative editor (providing /usr/bin/editor). Selection Path Priority Status ------------------------------------------------------------ * 0 /bin/nano 40 auto mode 1 /bin/ed -100 manual mode 2 /bin/nano 40 manual mode 3 /usr/bin/mcedit 25 manual mode 4 /usr/bin/nvim 30 manual mode 5 /usr/bin/vim.basic 30 manual mode 6 /usr/bin/vim.tiny 15 manual mode Press <enter> to keep the current choice[*], or type selection number: 4 update-alternatives: using /usr/bin/nvim to provide /usr/bin/editor (editor) in manual modeВыбрать редактор который нужен я выбрал 4
- Сохранить и выйти
- Передать боту на исполнение команду/путь к файлу
sudo /path/to/script.sh - Добавил проверку
exit-code-echo $?возвращает0если команда выполнена успешно