Очень часто в организации сопровождением 1С и администрированием занимаются разные люди. И иногда возникает ситуация, когда программисты добавили базу данных, а администратору сказать забыли. И по этой, уважительной, причине база не попала в архив.
Чтобы минимизировать ущерб предлагаю скрипт контроля списка баз данных. Скрипт может работать как с Postgresql, так и с файловым вариантом. При запуске скрипт проверяет список баз, и если он не изменился - Приходит письмо "ОК". Подтверждая, что контроль ведется. Если список баз изменился - приходит письмо с изменениями и заголовком "ALARM". В этом случает требуется уточнить причину, а после зафиксировать изменения, выполнив скрипт с ключом "-s" Предполагаю, что отправка почты на сервере уже настроена (я использую msmtp + mutt).
Для установки mutt на Dibian/Ubuntu.
sudo apt install mutt gpgsm
Здесь я не буду заострять внимание, как настроить отправку почты на linux, статей по этой тебе очень много.
Собственно скрипт:
#!/bin/bash
# check 1c files and Postgres databases list (C) Oleg N.Germanenko 2019-2021 revision 2021-02-22
#
# -h help
# -s Save current database list (fix changes)
# otherwise check hash
SCR_FILENAME=$(readlink -e "$0")
CUR_DIR=$(dirname $SCR_FILENAME)
TEMP_DIR=/dev/shm;test -d $TEMP_DIR ||TEMP_DIR=$(dirname $(mktemp -u))
declare -r CUR_BASE_LIST=$TEMP_DIR/curbaselist.txt
declare -r OLD_BASE_LIST=$CUR_DIR/oldbaselist.txt
declare -r LOG=$SCR_FILENAME.log
declare -r PG_USER=postgres
declare -r ADM_MAIL=admin@organization.ru
# commen FILES_BASE_DIR line for check PostgreSQL variant 1c
declare -r FILES_BASE_DIR=/usr/local/bases_1c
#Get current db list
cd $TEMP_DIR
if [[ -d $FILES_BASE_DIR ]];then #files 1c
find $FILES_BASE_DIR -type f -name "1Cv8.1CD" -printf "%h\n" |sort >$CUR_BASE_LIST
else # sql 1c
# Postgres user
sudo -u $PG_USER psql -l|head -n -2|awk '{if(NR>3 && $1!="|") print $1}'|sort>$CUR_BASE_LIST
fi
chmod 600 $CUR_BASE_LIST
cd - >/dev/null
#check or create old db list file
test -f $OLD_BASE_LIST || :>$OLD_BASE_LIST && chmod 600 $OLD_BASE_LIST
# compare current and old lists
diff $CUR_BASE_LIST $OLD_BASE_LIST |sed -E '/^[<>]/!d;s/</NEW_DB /g;s/>/DELETED_DB/g'>$LOG
NOW=$(date "+%Y%m%d")
case $1 in
-h)
# cat help only
sed '/^# /!d' $SCR_FILENAME
;;
-s)
# save current db list
cp -f $CUR_BASE_LIST $OLD_BASE_LIST
# send e-mail
echo "DB_LIST SAVED" $(cat $CUR_BASE_LIST |wc -l)|mutt -s "$HOSTNAME checkdblist $NOW DB_LIST SAVED" $ADM_MAIL
:>$LOG
;;
*)
if [[ -s $LOG ]];then
# db list was changed. send e-mail
cat $LOG |mutt -s "$HOSTNAME checkdblist ALARM $NOW" $ADM_MAIL
else
# db list not changed. send e-mail
echo "All OK" $(cat $CUR_BASE_LIST |wc -l) |mutt -s "$HOSTNAME checkdblist $NOW OK" $ADM_MAIL
fi
;;
esac
rm $CUR_BASE_LIST
Сохраняем скрипт под именем, например cbdl.sh
chmod 700 ./cdbl.sh
скрипт нужно запускать от root, поскольку используется sudo.
обычно cron с этим прекрасно справляется
0 0 * * * /root/work/cdbl/cdbl.sh
Если используется файловый вариант - путь к базам пропишите в переменной FILES_BASE_DIR.
Если sql - просто закомментируйте строку с этой переменной.
Всем стабильной работы!