Скрипты.

Установка, настройка, эксплуатация.

Модератор: ROOT

Скрипты.

Сообщение ROOT » 17 сен 2015, 19:45

Оглавление


Темы
 Сервис архивации 
 Чистка каталогов по списку 
 Создание пользователей и баз для MySQL 
 Добавление виртуального хоста APACHE 
 Включение по сети (Wake-on-LAN) 
 Построение файлов зон для DNS-сервера 
 Построение MD5-ХЭШ сумм файлов 
 Примеры монтирования CIFS 
 Синхронизация локального репозитория для CentOS 
 Очистка и переиндексация баз данных Postgres 
 Скрипт для архивирования баз 
 Список активных хостов в сети 
 Тестирование группы хостов на корректность записей в прямой и обратной DNS-зоне 
 Управление виртуальными машинами скриптами 
 NMAP: Сканирование хостов и портов (обёртка) 
 Резервное копирование Файловой системы XFS 
 Перезапуск сервисов после сна 
 Динамическое сообщение дня (motd) 
 Резервное копирование виртуальных машин VirtualBox 
Дополнительные материалы
Wake on Lan: Удалённое включение компьютера


 Сервис архивации 
backup-hosts.sh
Код: выделить все
#!/bin/sh
##############################################
# Сервис резервного копирования хостов WEB-сервера
# перечисленных в файле hosts.txt
# Создание архивных копий баз данных MySQL-сервера
# перечисленных в файле db.txt
# Составлено: SSERGEY
# Дата: 12.06.2017 v2.0
#############################################
BASE_PATH="$(dirname $(readlink -f $0))"
file="$BASE_PATH/hosts.txt"
db="$BASE_PATH/db.txt"
BACKUP_PATH="/root/BACKUP/"
WEB_DIR="/var/www/"
DATE=`date +%d-%m-%Y`
LOG="/var/log/backup-hosts.log"
# Максимальное сжатие архивных копий
if [ "$SHELL" == "/bin/bash" ]
        then
                export GZIP=-9
fi

echo "$(date) Создание архивных копий хостов WEB-сервера" >> $LOG

if ! [ -d $BACKUP_PATH$DATE ]
        then
                mkdir $BACKUP_PATH$DATE
        else
                echo "$(date) Каталог $BACKUP_PATH$DATE уже существует!" >> $LOG
fi
cd $WEB_DIR
while read line
do
        case $line in
                [a-zA-Z]* )
                        if [ -d $line ]
                                then
                                        backup=`date +%H-%M`".$line.tar.gz"
                                        tar -zcf $BACKUP_PATH$DATE/$backup $line
                                        if [ $? -eq 0 ];
                                        then
                                                echo "$(date) Создан архив $backup" >> $LOG
                                        fi

                                else
                                        echo "$(date) Хост $line не существует" >> $LOG
                        fi
                ;;
        esac
done < $file

echo "$(date) Архивирование хостов WEB-сервера завершено" >> $LOG
echo "$(date) Созание архивных копий баз данных MySQL-сервера" >> $LOG
while read line2
do
        case $line2 in
                [a-zA-Z]* )
                        if [ -d $line ]
                                then
                                        backup=`date +%H-%M`".$line2.sql"
                    mysqldump -uroot -pRootMySQL --add-drop-database -c -e -B $line2  > $BACKUP_PATH$DATE/$backup
                    if [ $? -eq 0 ];
                    then
                        echo "$(date) Создан архив $backup для базы $line" >> $LOG
                    fi
                else
                    echo "$(date) Ошибка создания архива. Возможно $line2 не существует" >> $LOG
           fi
       ;;
        esac
done < $db

echo "$(date) Архивирование Баз Данных MySQL-сервера завершено" >> $LOG
echo "$(date) Архивирование каталогов и файлов" >> $LOG
cd /var
tar -zcf $BACKUP_PATH$DATE/`date +%H-%M`.named.tar named
cd /
tar -zcf $BACKUP_PATH$DATE/`date +%H-%M`.etc.tar etc
cd /usr/lib/systemd/
tar -zcf $BACKUP_PATH$DATE/`date +%H-%M`.services.tar system
cd /root/
tar -zcf $BACKUP_PATH$DATE/`date +%H-%M`.doc.tar doc
tar -zcf $BACKUP_PATH$DATE/`date +%H-%M`.scripts.tar SH
cd /sbin/
tar -zcf $BACKUP_PATH$DATE/`date +%H-%M`.my-script.tar my-script

Список баз MySQL сервера db.txt
Код: выделить все
acdr
blog-prog
forum
myblog
mysql
nb
pam
proftpd
valak
www
phpmyadmin

Список хостов WEB-сервера hosts.txt
Код: выделить все
acdr.free-adm.ru
blog-prog.free-adm.ru
forum.free-adm.ru
myblog.free-adm.ru
nb.free-adm.ru
pam.free-adm.ru
pma.free-adm.ru
valak.free-adm.ru
wiki.free-adm.ru
www.free-adm.ru

 Подготавливаем скрипт к работе в режиме демона по расписанию 
e /etc/systemd/system/backup-hosts.service
Код: выделить все
[Unit]
Description=Backup Apache virtual hosts & MySQL databases

[Service]
Type=oneshot
ExecStart=/sbin/my-script/backup-hosts.sh
StandardOutput=syslog

cat /etc/systemd/system/backup-hosts.timer
Код: выделить все
[Unit]
Description=Run 20:10 Backup Apache virtual hosts & MySQL databases

[Timer]
OnCalendar=20:10
Persistent=true

[Install]
WantedBy=timers.target

Запуск сервиса
Код: выделить все
systemctl enable --now backup-hosts.timer

Enable для задания означает то, что оно появится в списке заданий, --now - включит задание в работу

Пример задания на ротацию логов в systemd
cat /etc/systemd/system/logrotate.timer
Код: выделить все
[Unit]
Description=Run on 23:59 Rotate log files

[Timer]
OnCalendar=23:59
Persistent=true

[Install]
WantedBy=timers.target

cat /etc/systemd/system/logrotate.service
Код: выделить все
[Unit]
Description=Rotate log files

[Service]
Type=oneshot
ExecStart=/sbin/my-script/logrotate
StandardOutput=rsyslog

Не забываем снести задание в CRON
Администрирование Fedora Linux + настройка сети и прочая IT-Ботва


Для желающих поддержать
Карта SB: 5469 4009 6510 2267


Лучше ужасный конец, чем ужас без конца!
Аватар пользователя
ROOT
Администратор
 
Сообщений: 432
Зарегистрирован: 01 авг 2011, 09:36
Откуда: Моск. обл., г. Железнодорожный

Сообщение ROOT » 09 апр 2022, 19:30



 Чистка каталогов по списку 
cat deldir.sh
Код: выделить все
#!/bin/bash
##############################################
# Чистка старых логов в перечисленных
# каталогах с указанием маски
# /var/log/audit/*log.*
# Составлено: SSERGEY
# Дата: 01.10.2015 v1.0
#############################################

BASE_PATH="$(dirname $(readlink -f $0))"
file="$BASE_PATH/deldir.txt"
n=0
echo "==========================================="
while read line
do
    case $line in
    [\/]* )
    #rm -f  $line
    ((++n))
    ;;
    esac
done < $file

echo "Очищено $n каталогов перечисленных в $file"
echo "==========================================="

cat deldir.txt
Код: выделить все
/var/log/audit/*log.*
/var/log/btmp-*
/var/log/cron-*
/var/log/maillog-*
/var/log/secure-*
/var/log/spooler-*
/var/log/samba/old/*
/var/log/httpd/*-*
/var/log/tuned/*log.*
/var/log/cacti/*.gz
Администрирование Fedora Linux + настройка сети и прочая IT-Ботва


Для желающих поддержать
Карта SB: 5469 4009 6510 2267


Лучше ужасный конец, чем ужас без конца!
Аватар пользователя
ROOT
Администратор
 
Сообщений: 432
Зарегистрирован: 01 авг 2011, 09:36
Откуда: Моск. обл., г. Железнодорожный

Сообщение ROOT » 09 апр 2022, 19:31



 Создание пользователей и баз для MySQL 
cat add-user-sql.sh
Код: выделить все
#!/bin/bash
##############################################
# Создание пользователей и баз для MySQL 6.5
# Составлено: SSERGEY
# Дата: 12.06.2017 v2.0
#############################################
EXPECTED_ARGS=3
E_BADARGS=65
MYSQL=`which mysql`

Q1="CREATE DATABASE IF NOT EXISTS $1 DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;"
Q2="GRANT DELETE, INSERT, SELECT, UPDATE ON $1.* TO $2@localhost IDENTIFIED BY '$3';"
Q3="FLUSH PRIVILEGES;"
SQL="${Q1}${Q2}${Q3}"

if [ $# -ne $EXPECTED_ARGS ]
then
        echo "Пример: $0 имя_бд пользователь пароль"
        exit $E_BADARGS
else
        $MYSQL -uroot -e "$SQL"
        echo -e "$1\t\t$2\t\t$3" >> pass
fi
Администрирование Fedora Linux + настройка сети и прочая IT-Ботва


Для желающих поддержать
Карта SB: 5469 4009 6510 2267


Лучше ужасный конец, чем ужас без конца!
Аватар пользователя
ROOT
Администратор
 
Сообщений: 432
Зарегистрирован: 01 авг 2011, 09:36
Откуда: Моск. обл., г. Железнодорожный

Сообщение ROOT » 09 апр 2022, 19:33



 Добавление виртуального хоста APACHE 
cat add-vh.sh
Код: выделить все
#!/bin/bash
##############################################
# создание виртуальных хостов для APACHE 2.4
# Составлено: SSERGEY
# Дата: 19.09.2015 v1.0
#############################################
WEBROOT="/var/www/"
VHOSTAV="/etc/httpd/sites-available/"
VHOSTEN="/etc/httpd/sites-enabled/"
VSITE="$1.free-adm.ru"

function VHost(){
cat <<EOF > $VHOSTAV$VSITE.conf
<VirtualHost $VSITE:80>
DocumentRoot $WEBROOT$VSITE/public_html
        ServerName $VSITE
        #ServerAlias $VSITE
        ErrorLog $WEBROOT$VSITE/log/error.log
        CustomLog $WEBROOT$VSITE/log/requests.log combined

        <Directory "$WEBROOT$VSITE/public_html">
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
        <IfModule mod_authz_core.c>
                <RequireAny>
                        Require ip 127.0.0.1 195.0.1.0/24
                </RequireAny>
        </IfModule>
        </Directory>

    php_admin_value upload_tmp_dir "$WEBROOT$VSITE/tmp"
    php_admin_value error_log "$WEBROOT$VSITE/log/php.log"
    php_admin_value session.save_path "$WEBROOT$VSITE/sess"
    php_admin_value doc_root "$WEBROOT$VSITE/public_html"
    php_admin_value open_basedir "$WEBROOT$VSITE/public_html"
</VirtualHost>
EOF
}
function Index(){
cat <<EOF > $WEBROOT$VSITE/public_html/index.html
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    <meta http-equiv="content-style-type" content="text/css" />
    <meta http-equiv="content-language" content="ru-ru" />
    <meta http-equiv="imagetoolbar" content="no" />
    <meta name="resource-type" content="document" />
    <meta name="distribution" content="global" />
    <meta name="keywords" content="" />
    <meta name="description" content="" />
    <title>$VSITE</title>
</head>
<body>
    <h1>Стартовая страница для $VSITE<h1>
</body>
</html>
EOF
}

if [ "$1" != '' ]; then
    if [ ! -f "$VHOSTAV$VSITE.conf" ]; then
        VHost
        echo "создан $VHOSTAV$VSITE.conf"
    else
       mv "$VHOSTDIR$VSITE.conf" "$VHOSTDIR$VSITE.bak"
       echo "created $VHOSTAV$VSITE and made a backup of the existing conf"
    fi

    if [ ! -d "$WEBROOT$VSITE/" ]; then
        mkdir -p $WEBROOT$VSITE/{sess,log,tmp,public_html}/
        chown -R apache:apache "$WEBROOT$VSITE"
        echo "Каталог $WEBROOT$VSITE/ создан"
        Index
        ln -s $VHOSTAV$VSITE.conf $VHOSTEN$VSITE.conf
        systemctl reload httpd
        echo "reloaded apache"
    else
        echo "$WEBROOT$VSITE/ Уже существует "
    fi

elif [ "$1" = 'help' ] || [ "$1" = '' ]; then
    echo "Использование:"
    echo "${0##*/}"
    echo "Пример: Для создания hostname просто запустите команду"
    echo "'${0##*/} hostname'"
fi

Создаём базу www и одноимённого пользователя с минимально необходимыми правами
Код: выделить все
CREATE DATABASE IF NOT EXISTS `www` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
GRANT DELETE, INSERT, SELECT, UPDATE ON www.* TO 'www'@'localhost' IDENTIFIED BY 'password';
Администрирование Fedora Linux + настройка сети и прочая IT-Ботва


Для желающих поддержать
Карта SB: 5469 4009 6510 2267


Лучше ужасный конец, чем ужас без конца!
Аватар пользователя
ROOT
Администратор
 
Сообщений: 432
Зарегистрирован: 01 авг 2011, 09:36
Откуда: Моск. обл., г. Железнодорожный

Сообщение ROOT » 09 апр 2022, 19:35



 Включение по сети (Wake-on-LAN) 
Скрипт написан под стандартный дистрибутив Fedora, но адаптирован для использования на роутере Netgear WNDR3800 с прошивкой dd-wrt. Для полноценной работы скрипта нужен пакет arping из ревозитория rpmsphere
cat wol.sh
Код: выделить все
#!/bin/sh
##############################################
# Скрипт включения машин по сети
# перечисленных в файле vol.txt
# Составлено: SSERGEY
# Дата: 18.12.2019 v2.0
#############################################
ME=`basename $0`
BASE_PATH="$(dirname $0)"
vol="$BASE_PATH/wol.txt"
BRCST="195.0.1.255"
WOL="/usr/sbin/wol"

function start() {
    MAC=`grep $node $vol | awk -F" " '{ print $2 }'`
    echo "Пакет на включение машины $node отправлен"
    $WOL -i $BRCST -p 9 $MAC
}

function create() {
    if grep -q $node $vol;
    then
        echo "Указанное имя $node уже существует"
    else
        MAC=`arping -c 1 -I enp5s0 $node | grep "reply" | awk '{print $5}' | cut -c 2-18`
        echo "$node $MAC" >> $vol
    fi
}

function help() {
    echo -e "\nНазначение: Скрипт включения машин по сети"
    echo -e "\nИспользовать:"
    echo -e "\t\t$ME -s | --start hostname"
    echo -e "\t\t$ME -c | --create hostname"
    echo -e "\t\t$ME -h | --help | -v | --ver"
    echo -e "\nПараметры запуска"
    echo -e "\t\t-s | --start\t-\tВключить машину с указанным именем"
    echo -e "\t\t-c | --create\t-\tСоздать запись о машине на основе DNS-имени"
    echo -e "\t\t-h | --help\t\t-\tПоказать помощь"
    echo -e "\t\t-v | --ver\t\t-\tВыводит версию "
}

function ver() {
    echo -e "\n\t$ME Версия 2.0\t©SSERGEY\tДата: 18.12.2019"
}

if [ $# -eq 0 ]
then
    echo "ОШИБКА: Запуск без параметров не возможен"
    help
    exit 1
else
    for arg in "$@"
    do
        case $arg in
            "-s" | "--start")
            node="$2"
            start
            exit;;

            "-c" | "--create")
                node="$2"
                create
                exit;;

            "-h" | "--help")
                help
                exit;;

            "-v" | "--ver")
                ver
                exit;;

            *)  echo "ОШИБКА: Недопустимый параметр"
                help
                exit 1 ;;
        esac
    done
fi
Администрирование Fedora Linux + настройка сети и прочая IT-Ботва


Для желающих поддержать
Карта SB: 5469 4009 6510 2267


Лучше ужасный конец, чем ужас без конца!
Аватар пользователя
ROOT
Администратор
 
Сообщений: 432
Зарегистрирован: 01 авг 2011, 09:36
Откуда: Моск. обл., г. Железнодорожный

Сообщение ROOT » 09 апр 2022, 19:36



 Построение файлов зон для DNS-сервера 
cat create-zone.sh
Код: выделить все
#!/bin/bash
##############################################
# создание зонных файлов для DNS-сервера
# Составлено: SSERGEY
# Дата: 13.01.2017 v1.0
#############################################
#ZONEROOT="/var/named/master/"
ZONEROOT="/root/"
HOSTNAME=$1
ZONE=$HOSTNAME | awk -F. '{print $2"."$3}'
HOST=$HOSTNAME | awk -F. '{print $1}'
ZONE_IP=$2 | awk -F. '{print $3"."$2"."$1}'
SN=`date "+%Y%m%d"`."00"
IP=$2
echo "$HOST $ZONE"
function CreateZone(){
cat <<EOF > ${ZONEROOT}${ZONE}.zone
\$TTL 900
\$ORIGIN ${ZONE}.
@     SOA host.${ZONE}. root.${ZONE}. (
                  $SN   ; serial
                  900          ; 15 Minutes slave refresh interval
                  600          ; 10 Minutes slave retry interval
                  2592000      ; 1 month slave copy expire time
                  900          ; 15 Minutes NXDOMAIN cache time
                  )

          NS    host.${ZONE}.
          ;; add Slave server
          ;; IN  NS      ns.example.host.
          MX 10 host.${ZONE}.

@         A     ${IP}
host      A     ${IP}
EOF
}

function CreateZoneRev(){
cat <<EOF > ${ZONEROOT}${ZONE_IP}.zone
\$TTL 30m
\$ORIGIN ${ZONE_IP}.in-addr.arpa.
@       SOA host.${ZONE}. root.${ZONE}. (
                  2016082101
                      10h; slave-server connection preiod
                      1h; retry
                      1w; lifetime
                      1m; negative ttl
                      )

      NS host.${ZONE}.

15    PTR host.${ZONE}.
EOF
}

if [ $ZONE ! "" ]
then
    if [ ! -f "${ZONEROOT}${ZONE}.zone" ];
        then
        CreateZone
        echo "Создана новая зона прямого просмотра ${ZONE}"
    else
       echo "зона ${ZONE} уже существует"
    fi

        if [ ! -f "${ZONEROOT}${ZONE_IP}.zone" ];
        then
                CreateZoneRev
                echo "Создана новая зона обратного просмотра ${ZONE_IP}.in-addr.arpa."
        else
                echo "зона обратного просмотра ${ZONE_IP} уже существует"
                fi

elif [ "$1" = 'help' ] || [ "$1" = '' ] || [ "$2" = '' ];
then
    echo "Использование: Для создания domain.ru просто запустите команду"
    echo "'${0} host.domain.ru 192.168.1.5'"
fi
Администрирование Fedora Linux + настройка сети и прочая IT-Ботва


Для желающих поддержать
Карта SB: 5469 4009 6510 2267


Лучше ужасный конец, чем ужас без конца!
Аватар пользователя
ROOT
Администратор
 
Сообщений: 432
Зарегистрирован: 01 авг 2011, 09:36
Откуда: Моск. обл., г. Железнодорожный

Сообщение ROOT » 09 апр 2022, 19:38



 Построение MD5-ХЭШ сумм файлов 
cat md5list.sh
Код: выделить все
#!/bin/bash
##############################################
# Сбор MD5-ХЭШ сумм файлов по указанному пути
# Составлено: SSERGEY
# Дата: 10.02.2017 v1.0
#############################################
ME=`basename $0`
function main(){
        file="/tmp/key.txt"
        # Находим все файлы в каталогах ниже указанного
        # Формируем вспомогательный файл md5.sum с ХЭШ-суммами
        find $DIRPATH -type f | xargs md5sum > /tmp/md5.sum
        # Сортировка файла по ХЭШ-суммам
        sort -nk 1 /tmp/md5.sum > md5.sort
        # Создаём вспомогательный файл с ХЭШ-суммами для поиска по ним
        cat md5.sort | awk ' {print $1} ' > $file

        while read line
        do
                # Подсчитываем количество совпадений с суммами в md5.sort
                ad=`grep -c $line md5.sort`
                # Если количество совпадений равно 1, то удаляем строку как не интересующую
                if [ $ad == 1 ]; then
                        sed -i -e "/$line/d" md5.sort
                fi
        done < $file
        # Удаляем вспомогательные файлы
        rm -f /tmp/{md5.sum,key.txt}
}

while getopts "vhd:" opt ;
do
        case $opt in
                d) DIRPATH=$OPTARG
                        main  ;;
                h)      echo "Назначение: Сбор MD5-ХЭШ сумм файлов по указанному пути"
                        echo "Использовать: $ME -d Путь_к_каталогу" ;;
                v)      echo "Версия 1.0" ;;
                *)  echo "Ошибка: Неправильный параметр";
                        echo "Для вызова справки запустите $ME -h";
                    exit 1 ;;
        esac
done

if [ "$1" == '' ]; then
        echo "Ошибка: Запуск без параметров невозможен"
        echo "Для вызова справки запустите $ME -h"
        exit 1
fi
Аватар пользователя
ROOT
Администратор
 
Сообщений: 432
Зарегистрирован: 01 авг 2011, 09:36
Откуда: Моск. обл., г. Железнодорожный

Сообщение ROOT » 09 апр 2022, 19:39



 Примеры монтирования CIFS 
cat mnt-cifs.sh
Код: выделить все
#!/bin/sh
# IPv4
#mount -t cifs //195.0.1.3/SEVEN -o username="ssergey",password="password" /mnt/sergey
# IPv6
#mount -t cifs //fec0:128::10:18:2:182/SEVEN -o username="ssergey",password="password" /mnt/sergey
mount -t cifs //fec0:128::10:18:2:182/SEVEN /mnt/sergey -o username="sergey",password="password"
Администрирование Fedora Linux + настройка сети и прочая IT-Ботва


Для желающих поддержать
Карта SB: 5469 4009 6510 2267


Лучше ужасный конец, чем ужас без конца!
Аватар пользователя
ROOT
Администратор
 
Сообщений: 432
Зарегистрирован: 01 авг 2011, 09:36
Откуда: Моск. обл., г. Железнодорожный

Сообщение ROOT » 09 апр 2022, 19:40



 Синхронизация локального репозитория для CentOS 
cat repo-updates.sh
Код: выделить все
#!/bin/sh
#######################################################
# Синхронизация локального репозитория для CentOS 7.2
# Составлено: SSERGEY
# Дата: 25.07.2016 v1.0
#######################################################
rsync="rsync -arvth --bwlimit=1024"
mirror="rsync://ftp.yandex.ru/centos"
verlist="7.2.1511"
archlist="x86_64"
baselist="os updates extras"
local=/var/www/repo.free-adm.ru/public_html/centos

for ver in $verlist
do
    for arch in $archlist
    do
           for base in $baselist
           do
                   remote=$mirror/$ver/$base/$arch/
                   $rsync $remote $local/$ver/$base/$arch/
           done
    done
done
Администрирование Fedora Linux + настройка сети и прочая IT-Ботва


Для желающих поддержать
Карта SB: 5469 4009 6510 2267


Лучше ужасный конец, чем ужас без конца!
Аватар пользователя
ROOT
Администратор
 
Сообщений: 432
Зарегистрирован: 01 авг 2011, 09:36
Откуда: Моск. обл., г. Железнодорожный

Сообщение ROOT » 09 апр 2022, 19:42



 Очистка и переиндексация баз данных Postgres 
cat service-db.sh
Код: выделить все
#!/bin/bash
##############################################
# Обслуживание баз Postgres перечисленных в файле
# Составлено: SSERGEY
# Дата: 01.01.2017 v1.0
#############################################
BASE_PATH="$(dirname $(readlink -f $0))"
file="$BASE_PATH/db.txt"

echo "Остановка сервера 1C"
echo "==========================================="
systemctl stop srv1cv83
echo "Очистка и переиндексация баз данных Postgres"
echo "==========================================="
while read line
do
        case $line in
                [a-zA-Z]* )
                        if `psql -Upostgres -lqt | cut -d \| -f 1 | grep -qw $line`
                        then
                                echo "Очистка базы данных $line"
                                vacuumdb -h localhost -U postgres --analyze --full --dbname=$line > /dev/null
                                echo "Переиндексация базы данных $line"
                                psql -h localhost -Upostgres --dbname=$line -c "REINDEX DATABASE \"$line\";" > /dev/null
                                echo "==========================================="
                        else
                                echo "База $line не существует"
                                echo "==========================================="
                        fi
                        ;;
        esac
done < $file

echo "Запуск сервера 1C"
echo "==========================================="
systemctl start srv1cv83
Администрирование Fedora Linux + настройка сети и прочая IT-Ботва


Для желающих поддержать
Карта SB: 5469 4009 6510 2267


Лучше ужасный конец, чем ужас без конца!
Аватар пользователя
ROOT
Администратор
 
Сообщений: 432
Зарегистрирован: 01 авг 2011, 09:36
Откуда: Моск. обл., г. Железнодорожный

Сообщение ROOT » 09 апр 2022, 19:44



 backup.sh скрипт для архивирования баз 
db.txt - Список баз для резервирования
Код: выделить все
#!/bin/bash
##############################################
# BACKUP баз Postgres перечисленных в файле
# Составлено: SSERGEY
# Дата: 09.01.2017 v3.0
#############################################
BASE_PATH="$(dirname $(readlink -f $0))"
file="$BASE_PATH/db.txt"
BACKUP_PATH="/1C_backup"
systemctl stop srv1cv83
if [ $? -eq 0 ]
then
        echo "==========================================="
        echo "Сервера 1C остановлен"
        echo "==========================================="
else
        echo "==========================================="
        echo "Не удалось остановить Сервера 1C"
    echo "==========================================="
        exit 1
fi

echo "$BACKUP_PATH - Каталог для архивных копий"
echo "==========================================="
while read line
do
        case $line in
                [a-zA-Z]* )
                        if `psql -Upostgres -lqt | cut -d \| -f 1 | grep -qw $line`
                        then
                                backup=`date +%d-%m-%Y.%H:%M`".$line"
                                pg_dump -h localhost -U postgres -Fc -Z9 -c -C -f $BACKUP_PATH/$backup $line
                                # -Fc - format custom Вывести копию в архивном формате, пригодном
                                #       для дальнейшего использования утилитой pg_restore
                                # -Z9 - Уровень сжатия данных MAX.
                                # -c  - clean Включить в выходной файл команды удаления (DROP) объектов базы данных
                                #       перед командами создания (CREATE) этих объектов. Если дополнительно не указать
                                #       флаг --if-exists, то при восстановлении в базу данных, где некоторые объекты
                                #       отсутствуют, попытка удаления несуществующего объекта будет приводить к ошибке,
                                #       которую можно игнорировать.
                                # -C  - create Сформировать в начале вывода команду для создания базы данных и затем
                                #       подключения к ней. В этом случае не важно, какая база указана в параметрах
                                #       подключения перед выполнением скрипта. Также, если указан ключ --clean, то скрипт
                                #       сначала удалит, а затем пересоздаст базу данных перед подключением к ней.
                                if [ $? -eq 0 ]
                                then
                                        echo "Создан файл $backup копия базы  $line"
                                        echo "==========================================="
                                else
                                        echo "Не удалось создать backup для базы $line"
                    echo "==========================================="
                                fi
                        else
                                echo "База данных $line не существует"
                                echo "==========================================="
                        fi
                        ;;
        esac
done < $file
systemctl start srv1cv83
if [ $? -eq 0 ]
then
        echo "Сервера 1C запущен"
        echo "==========================================="
else
        echo "Не удалось запустить Сервера 1C"
        echo "==========================================="
        exit 2
fi

Или почти готовый сервис
Код: выделить все
#!/bin/bash
##############################################
# Зачатки сервиса
# BACKUP баз Postgres перечисленных в файле
# Составлено: SSERGEY
# Дата: 09.01.2017 v3.0
#############################################
BASE_PATH="${0%/*}"
file="$BASE_PATH/db.txt"
BACKUP_PATH="/1C_backup"
LOG="/var/log/db_backup"
systemctl stop srv1cv83

if [ $? -eq 0 ]
then
        echo "$(date) Сервер 1C остановлен" >> $LOG
else
        echo "$(date) Не удалось остановить Сервер 1C" >> $LOG
        exit 1
fi

echo "$(date) Каталог для архивных копи - $BACKUP_PATH" >> $LOG

while read line
do
        case $line in
                [a-zA-Z]* )
                        if `psql -Upostgres -lqt | cut -d \| -f 1 | grep -qw $line`
                        then
                                backup=`date +%d-%m-%Y.%H:%M`".$line"
                                pg_dump -h localhost -U postgres -Fc -Z9 -c -C -f $BACKUP_PATH/$backup $line
                                # -Fc - format custom Вывести копию в архивном формате, пригодном
                                #       для дальнейшего использования утилитой pg_restore
                                # -Z9 - Уровень сжатия данных MAX.
                                # -c  - clean Включить в выходной файл команды удаления (DROP) объектов базы данных
                                #       перед командами создания (CREATE) этих объектов. Если дополнительно не указать
                                #       флаг --if-exists, то при восстановлении в базу данных, где некоторые объекты
                                #       отсутствуют, попытка удаления несуществующего объекта будет приводить к ошибке,
                                #       которую можно игнорировать.
                                # -C  - create Сформировать в начале вывода команду для создания базы данных и затем
                                #       подключения к ней. В этом случае не важно, какая база указана в параметрах
                                #       подключения перед выполнением скрипта. Также, если указан ключ --clean, то скрипт
                                #       сначала удалит, а затем пересоздаст базу данных перед подключением к ней.
                                if [ $? -eq 0 ]
                                then
                                        echo "$(date) Создан файл $backup копия базы $line" >> $LOG
                                else
                                        echo "$(date) Не удалось создать backup для базы $line" >> $LOG
                                fi
                        else
                                echo "$(date) База данных $line не существует" >> $LOG
                        fi
                        ;;
        esac
done < $file

systemctl start srv1cv83
if [ $? -eq 0 ]
then
        echo "$(date) Сервер 1C запущен" >> $LOG
else
        echo "$(date) Не удалось запустить Сервер 1C" >> $LOG
        exit 2
fi

в итоге получаем в каталоге ~/backup файлы по формату "дата.имя_базы"
Код: выделить все
07-09-2015.OLGA
Администрирование Fedora Linux + настройка сети и прочая IT-Ботва


Для желающих поддержать
Карта SB: 5469 4009 6510 2267


Лучше ужасный конец, чем ужас без конца!
Аватар пользователя
ROOT
Администратор
 
Сообщений: 432
Зарегистрирован: 01 авг 2011, 09:36
Откуда: Моск. обл., г. Железнодорожный

Сообщение ROOT » 09 апр 2022, 19:45



 Список активных хостов в сети 
Сформировать список активных хостов в сети можно так:
Код: выделить все
fping -Asg 195.0.1.0/24 -r2 | /bin/grep alive | cut -d ' ' -f1  >> fping.txt

Результат записывается в файл fping.txt в текущем каталоге. Для функционирования необходима утилита fping которая ставиться из одноимённого пакета
Код: выделить все
dnf install fping
Администрирование Fedora Linux + настройка сети и прочая IT-Ботва


Для желающих поддержать
Карта SB: 5469 4009 6510 2267


Лучше ужасный конец, чем ужас без конца!
Аватар пользователя
ROOT
Администратор
 
Сообщений: 432
Зарегистрирован: 01 авг 2011, 09:36
Откуда: Моск. обл., г. Железнодорожный

Сообщение ROOT » 09 апр 2022, 19:46



 Тестирование группы хостов на корректность записей в прямой и обратной DNS-зоне 
список участвующих файлов
Код: выделить все
arp-ping.sh        ipv4-list        ipv6-list        dns-test.sh

Основной скрипт dns-test.sh
Код: выделить все
#!/bin/bash
##############################################
# Тестирование группы хостов на корректность
# записей в прямой и обратной DNS-зоне
# Чтение хостовой части происходит из файлов
# ipv4-list и ipv6-list
# Составлено: SSERGEY Дата: 17.01.2023 v1.2
#############################################
ME=`basename $0`
# Хоствая часть IPv4-адреса читается из файла ipv4-list
readarray -t host4 < ipv4-list
# Хоствая часть IPv6-адреса читается из файла ipv6-list
readarray -t host6 < ipv6-list
# Сетвая часть IP-адресов
net4="195.0.1."
net6="2001:470:1f21:16b::"
dns_srv="@195.0.1.3"

FILES=(hosts A.log AAAA.log PTR.log PTR6.log)
for F in ${!host4[@]}; do
        if [[ -f ${FILES[F]} ]] && [[ -s ${FILES[F]} ]]; then
            :> ${FILES[F]}
        fi
done

function TESTIPv4() {
    for i in ${!host4[@]}; do
        # Наполняем массив ответами DNS сервера записей PTR
        PTRFULL[n++]=`dig $dns_srv -x ${net4}${host4[i]}`
    done

    for x in ${!PTRFULL[@]}; do
        # Выризаем из массива PTRFULL FQDN
        PTR=`echo ${PTRFULL[x]} | cut -d " " -f 5`
        # Проверяем существование записей A  в зоне по FQDN
        A[n++]=`dig $dns_srv ${PTR}`
        echo "$PTR" >> hosts
    done

    echo -e "\n\t\t================================="
    echo -e "\t\tТестирование записей A для IPv4"
    echo -e "\t\t=================================\n"
    for a in ${!A[@]};  do
        printf "%s\n" "${A[a]}"
        echo ${A[a]} >> A.log
    done

    echo -e "\n\t\t================================="
    echo -e "\t\tТестирование записей PTR для IPv4"
    echo -e "\t\t=================================\n"
    for y in ${!PTRFULL[@]};  do
        printf "%s\n" "${PTRFULL[y]}"
        echo ${PTRFULL[y]} >> PTR.log
    done
}

function TESTIPv6() {
    for i in ${!host6[@]}; do
        PTRFULL[n++]=`dig $dns_srv -x ${net6}${host6[i]}`
    done

    for x in ${!PTRFULL[@]}; do
        PTR=`echo ${PTRFULL[x]} | cut -d " " -f 5`
        AAAA[n++]=`dig $dns_srv AAAA ${PTR}`
        echo "$PTR" >> hosts
    done

    echo -e "\n\t\t================================="
    echo -e "\t\tТестирование записей AAAA для IPv6"
    echo -e "\t\t=================================\n"
    for a in ${!AAAA[@]};  do
        printf "%s\n" "${AAAA[a]}"
        echo ${AAAA[a]} >> AAAA.log
    done

    echo -e "\n\t\t================================="
    echo -e "\t\tТестирование записей PTR для IPv6"
    echo -e "\t\t=================================\n"
    for y in ${!PTRFULL[@]};  do
        printf "%s\n" "${PTRFULL[y]}"
        echo ${PTRFULL[y]} >> PTR6.log
    done
}

function help(){
    printf "\n\t\t\t\t\t\tСправка\n
\t$ME: Тестирование группы хостов на корректность
\t\t\t\t записей в прямой и обратной DNS-зоне

\n\tПараметры:
\t-4 - Тестирование IPv4 записей
\t-6 - Тестирование IPv6 записей
\t-h - Справка к программе
\t-v - выводит версию программы\n"
}

function version() {
    printf "\n\t$ME Версия 1.2
\t\t\t\tДата: 18.01.2023\n"
}

function err(){
    echo -e "\n\tОшибка: Неверный или пустой параметр запуска"
    echo -e "\n\tДля вызова справки запустите $ME -h\n"
}

if [ -z "$1" ]
then
    err
    exit 1
else
    while getopts "46hv" opt ;
    do
        case $opt in
            4) TESTIPv4 ;;
            6) TESTIPv6 ;;
            h) help ;;
            v) version ;;
            ''|*) err
                exit 1 ;;
        esac
    done
fi

дополнительный скрипт arp-ping.sh
Код: выделить все
#!/bin/bash
#-vx
##############################################
# Сканирование MAC-адресов по списку из файла
# Составлено: SSERGEY Дата: 19.12.2014 v1.0
#############################################
while read LINE; do
    LINE2=`echo ${LINE}|grep -E -o "(^[0-9]{1,3}[\.])([0-9]{1,3}[\.])([0-9]{1,3}[\.])([0-9]{1,3})"`
    if [ "$LINE" == "$LINE2" ]
    then
        arp=`arping -c1 ${LINE} |grep -P -o '((([0-9a-fA-F]{2})[ :-]){5}[0-9a-fA-F]{2})'`
        if [ $? = 0 ]
        then
            echo $arp $LINE
        fi
    fi
done < ip-list
Администрирование Fedora Linux + настройка сети и прочая IT-Ботва


Для желающих поддержать
Карта SB: 5469 4009 6510 2267


Лучше ужасный конец, чем ужас без конца!
Аватар пользователя
ROOT
Администратор
 
Сообщений: 432
Зарегистрирован: 01 авг 2011, 09:36
Откуда: Моск. обл., г. Железнодорожный

Сообщение ROOT » 09 апр 2022, 19:48



 Управление виртуальными машинами скриптами 
Скрипт управления виртуальными машинами решает следующие задачи:
  1. создание файла со списком всех машин что есть в VirtualBox (в каталоге со скриптом)
  2. Запуск виртуальных машин по списку из файла
  3. Завершение всех запущенных машин (затачивалось под завершение системы)
  4. Вывести список запущенных машин
  5. Все действия с виртуальными машинами производятся от имени пользователя под котором они находятся

cat /sbin/my-script/vb-mng.sh
Код: выделить все
#!/bin/bash
##############################################
# Скрипт управления виртуальными машинами VirtualBox
# перечисленных в файле vb.txt
# ПРИМЕЧАНИЕ: В именах машин крайне нежелательны.
# Составлено: SSERGEY
# Дата: 29.10.2017 v1.0
#############################################
ME=`basename $0`
BASE_PATH="$(dirname $(readlink -f $0))"
vb="$BASE_PATH/vb.txt"
user="sergey"
DATE=`date +%d-%m-%Y`
LOG="/var/log/vb-mng.log"
# Шаблон ID виртуальной машины для проверки прочитанного из файла значения
REGEX="^[[:xdigit:]]{8}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{12}"

# --type gui - используется стандартный графический интерфейс (по умолчанию)
# --type sdl - Для запуска виртуальной машины с использованием простого графического
#                               интерфейса без элементов управления в фоновом режиме
# --type headless - Для запуска виртуальной машины без GUI в фоновом режиме
type="sdl"
# Чтобы запустить виртуальную машину без GUI:
#  VBoxHeadless --startvm Crunchabang
function start() {
        echo "$(date) ### Запуск виртуальных машин VirtualBox ###" >> $LOG
        # читаем файл со списком виртуальных машин построчно
        while read line
                do
                        # Проверяем является ли строка закомментированной
                        if [[ $line =~ $REGEX ]];
                        then
                        case $line in
                                * )
                                        # Проверяем существование виртуальной машины с именем в VirtualBox
                                        su $user -c "vboxmanage list vms | grep $line > /dev/null"
                                        if [ $? -eq 0 ]
                                        then
                                                # Запускаем виртуальную машину и проверяем успешность запуска по коду ответа
                                                su $user -c "virtualbox --startvm \"$line\" --type $type &"
                                                # Для запуска без графики (возможно сгодиться для сервиса запуска)
                                                # su $user -c "VBoxHeadless -startvm \"$line\" &"
                                                if [ $? -eq 0 ];
                                                then
                                                        # Определяем Имя по ID виртуальной машины для занесения в LOG
                                                        name=`su sergey -c "vboxmanage list vms" | grep "$line" | awk -F\" '{print $2}'`
                                                        echo "$(date) Виртуальная машина $name стартовала" >> $LOG
                                                fi
                                        else
                                                # Если запуск прошёл неудачно то заносим об этом запись в LOG
                                                echo "$(date) Виртуальной машины с указанным именем  $line не существует" >> $LOG
                                        fi
                        ;;
                        esac
                        else
                                # Если строка закомментирована, то пропускаем итерацию цикла
                                continue
                        fi

        done < $vb
}

function stop() {
        su $user -c "vboxmanage list runningvms | sed -r 's/.*\{(.*)\}/\1/' | xargs -L1 -I {} VBoxManage controlvm {} acpipowerbutton"
        if [ $? -eq 0 ];
    then
                echo "$(date) Завершение работы запущенных виртуальных машин"  >> $LOG
        else
                echo "$(date) Не удалось завершить работу виртуальных машин" >> $LOG

        fi
}

function create() {
        su $user -c "vboxmanage list vms | sed 's,[\"{}],,g;s/ /\n/g;s/^/##/'" > $vb
        echo -e "\n\tПроверить имена машин, в созданном файле $vb, на предмет переноса строки\n"
}

function show() {
        # Показать список запущенных машин
        su $user -c "vboxmanage list runningvms"
}

function help() {
        echo -e "\nНазначение: Скрипт управления виртуальными машинами VirtualBox"
        echo -e "\nИспользовать: $ME start | stop | show | create | -h | --help | -v | --ver\n"
        echo -e "\n\tПараметры запуска\n"
        echo -e "\t\tstart - Запустить виртуальные машины"
        echo -e "\t\tstop - Остановить запущенные виртуальные машины"
        echo -e "\t\tshow - Вывести список запущенных машин"
        echo -e "\t\tcreate - Создать файл с именами запущенных машин"
        echo -e "\t\t-h | --help - Показать помощь"
        echo -e "\t\t-v | --ver - выводит версию "
}

function ver() {
        echo "Версия 1.0"
        echo "© SSERGEY  Дата: 29.10.2017"
}

for arg in "$@"
do
    case $arg in
                "start" )                       start ;;
                "stop"  )                       stop ;;
                "show"  )           show ;;
                "create" )                      create ;;
                "-h" | "--help" )       help ;;
                "-v" | "--ver" )        ver  ;;
                *)                                      help
                                                        echo "ОШИБКА: Недопустимый параметр"
                                                        exit 1 ;;
        esac
done

Примерный вид файла со списком машин для их запуска
cat vb.txt
Код: выделить все
##TEST
2cdf77d5-0ff4-4a57-9499-fa38041bc74c

Теперь с помощью systemd создадим возможность выключать все запущенные машины. Для этого создадим сервис shutdown.service
cat /etc/systemd/system/shutdown.service
Код: выделить все
[Unit]
# Описание сервиса Действия при завершении системы
Description=System Shutdown Actions
# Отключить неявные зависимости
DefaultDependencies=no
# запускать данный юнит прежде чем указанные ниже.
Before=shutdown.target reboot.target halt.target

[Service]
# Тип сервиса - полезен для скриптов, которые выполняют одно задание и завершаются
Type=oneshot
# Запускаем исполняемый скрипт данного сервиса
ExecStart=/sbin/my-script/shutdown.sh
[Install]
# Содержит рекомендации по установке юнита. Описывает, в каких случаях юнит должен быть запущен.
# WantedBy - описывает, в каких случаях юнит должен быть активирован.
WantedBy=halt.target reboot.target shutdown.target

Этот сервис при завершении системы вызывает скрипт shutdown.sh в котором перечисляются действия при завершении системы
Теперь включаем сервис
Код: выделить все
systemctl enable shutdown.service

Либо можно обойтись без написания своего юнита, поместив нужные скрипты в
Код: выделить все
/usr/lib/systemd/system-shutdown

cat /sbin/my-script/shutdown.sh
Код: выделить все
#!/bin/bash
/sbin/my-script/vb-mng.sh stop
...

Запуск машин можно выполнить через автозапуск в любой графической оболочки
Код: выделить все
/sbin/my-script/vb-start.sh start

Либо написать сервис, подобный тому что изложен выше.
Администрирование Fedora Linux + настройка сети и прочая IT-Ботва


Для желающих поддержать
Карта SB: 5469 4009 6510 2267


Лучше ужасный конец, чем ужас без конца!
Аватар пользователя
ROOT
Администратор
 
Сообщений: 432
Зарегистрирован: 01 авг 2011, 09:36
Откуда: Моск. обл., г. Железнодорожный

Сообщение ROOT » 09 апр 2022, 19:50



 NMAP: Сканирование хостов и портов (обёртка) 
Код: выделить все
#!/bin/bash
#############################################
# Тестирование хостов на открытые порты
# Группа хостов проверяется на конкретный порт, а конкретный
# хост на доступность всего диапазона портов
# Составлено: SSERGEY  Дата: 16.11.2020 v1.1
#############################################
ME=`basename $0`

if [[ $1=="i" ]] || [[ $1=="t" ]]
then
    # Проверка переменных на корректность
    REGIP="^([0-9]{1,3}\.){3}[0-9]{1,3}$"
    if [[ $2=~$REGIP ]]
    then
        ip="$2"
    else
        echo "Введённое значедие не является IP адресом"
        exit
    fi
fi

if [[ $1=="s" ]]
then
    REGSUB="^([0-9]{1,3}\.){3}[0-9]{1,3}(/[0-9]{1,3})$"
    REGPORT="^([0-9]{1,2})$"
    if [[ $2=~"$REGSUB" ]]
    # && [[ $3=~$REGPORT ]]
    then
        subnet="$2"
        port="$3"
        echo "Введённое"
    else
        echo "Введённое значедие не является адресом подсети"
        exit
    fi
fi

function SUBNET() {
    nmap -p $port -sT $subnet -oG res
    cat res |grep open >result
}

function IP() {
    nmap -PE $ip -oN resultip
}

function OSSTYPE() {
    nmap -O --osscan-guess $ip
}

function help(){
    printf "\n\t\tСправка
\t$ME: Тестирование хостов на открытые порты
\n\t\tПараметры:
\t-s 192.168.1.0/24 80 - Сканировать хосты подсети для порта 80
\t-i 192.168.1.45  - Сканировать все порта на хосте
\t-t - Предположительная информация об установленной ОС на хосте
\t-v - Вывод версии $ME
\t-h - Вывод этой справки\n"
}

function version() {
    printf "\n\t$ME Версия 1.1 Дата: 16.11.2020\n"
}

function err(){
    echo -e "\n\tОшибка: Неверный или пустой параметр запуска"
    echo -e "\n\tДля вызова справки запустите $ME -h\n"
}

if [ -z "$1" ] && [-n "$1" ]; then
    err
    exit 1
else
    if [ $1="i" ]
    then
        while getopts "sithv" OPT ;
        do
        case ${OPT} in
            s)  SUBNET ;;
            i)  IP ;;
            t)  OSSTYPE ;;
            h)  help ;;
            v)  version ;;
            *)  err
                exit 1 ;;
        esac
            done
    fi
fi
Администрирование Fedora Linux + настройка сети и прочая IT-Ботва


Для желающих поддержать
Карта SB: 5469 4009 6510 2267


Лучше ужасный конец, чем ужас без конца!
Аватар пользователя
ROOT
Администратор
 
Сообщений: 432
Зарегистрирован: 01 авг 2011, 09:36
Откуда: Моск. обл., г. Железнодорожный

Сообщение ROOT » 09 апр 2022, 19:52



 Резервное копирование Файловой системы XFS 
Код: выделить все
#!/bin/bash
#-vx
#############################################
# Резервное копирование Файловой системы XFS
# Составлено: SSERGEY  Дата: 13.09.2019 v3.0
#############################################
ME=`basename $0`
DATE=`date '+%d-%m-%Y'`
# куда монитируется раздел для backup'ов
BACKUP="/mnt/BACKUP/$DATE"
declare -a EXT
EXT=(".*old" ".*OLD" ".*gz" ".*([0-9]{8})" ".*([0-9]{8}|old|OLD|gz)" ".*([a-z].[0-9])")
declare -a PATHLOG
PATHLOG=("/var/www/*/log" "/var/log" )
declare -A DEV
DEV=([boot]="/dev/nvme0n1p2" [root]="/dev/nvme0n1p3" [home]="/dev/nvme0n1p4" [var]="/dev/nvme0n1p5")
#######################################
function ClearLogs(){
    dnf clean all
    rm -f /var/cache/abrt-di/*
    rm -f /var/core/*
    # Очищаем старые логи
    for ((i=0; i<${#PATHLOG[@]}; i++)); do
        for ((x=0; x<${#EXT[@]}; x++)); do
            find ${PATHLOG[i]} -regextype posix-egrep -regex "${EXT[x]}$" -type f -print0 | xargs -0 rm -f
        done
    done
    unset PATHLOG EXT
    journalctl --rotate && journalctl --vacuum-time=1s -o short 2> /tmp/journ && tail -n1 /tmp/journ && rm -f /tmp/journ
    sync && echo 3 > /proc/sys/vm/drop_caches && sync
}
#######################################
function CreateBackup() {
    mkdir -p $BACKUP
    # Монтируем раздел для архивов Монтируем boot и root (/) в режиме RO
#   xfs_freeze -f / && xfs_freeze -f /boot && xfs_freeze -f /home && xfs_freeze -f /var
    if [ $? -eq 0 ]
    then
        for key in "${!DEV[@]}"; do
            xfsdump -l 0 -L "Backup level 0 of ${key} $DATE" -M "file" -f "$BACKUP/${key}.dump" ${DEV[$key]} > /dev/null 2>&1
            if [ $? -eq 0 ]
            then
                echo "ДАМП раздела ${key} (${DEV[$key]}) успешно создан"
            fi
        done
#   xfs_freeze -u / && xfs_freeze -u /boot && xfs_freeze -u /home && xfs_freeze -u /var
    else
        echo "Ошибка монтирования разделов"
    fi
}

function MakePart () {
    if [ ! -e "$DISK" ]; then
        printf "\n\tУказанный диск $DISK не существует"
        exit 1
    else
        printf "\n\tСоздание структуры разделов на $DISK"
        printf "\nТаблица разделов: gpt

            Модель: Seagate BarraCuda Q5 ZP500CV30001 (nvme)
            Диск /dev/nvme0n1: 476940MiB
            Таблица разделов: gpt
                 START       ENDE NAME                 Флаги
                 2048    411647   EFI System Partition загрузочный, esp
               411648   1460223   Boot
              1460224 211175423   RootFS
            211175424 840321023   HomesDir
            840321024 871778303   Var"

        # Структура разделов загрузочного диска
        # parted -a optimal -s $DISK 'mklabel msdos' \
        # 'mkpart primary fat32 2048s 411647s' 'set 1 efi on' 'name 1 "EFI System Partition"' \
        # 'mkpart primary xfs 411648s 1460223s'  'name 2 "Boot"' \
        # 'mkpart primary xfs 1460224s 211175423s' 'name 3 "RootFS"' \
        # 'mkpart primary xfs 211175424s 840321023s' 'name 4 "HomesDir"' \
        # 'mkpart primary xfs 840321024s 871778303s' 'name 5 "Var"'
    fi
}

function RecoveryDump () {
    printf "\n\tВосстановление файловой системы"
    echo $DISK"1"
    # xfsrestore -f /dev/st0 -L "Backup level 0 of boot" /mnt/boot/
    # xfsrestore -f /dev/st0 -L "Backup level 0 of root" /mnt/boot/
}

function help(){
    printf "\n\t\t\t\t\t\tСправка
\t$ME: Управление бэкапами файловой системы XFS
\n\t\t\t\t\t\tПараметры:
\t-b - Создать ДАМП файловой системы
\t-c - Создание структуры разделов на целевом диске
\t-r - Восстановление файловой системы из резервной копии
\t-v - Вывод версии $ME
\t-h - Вывод этой справки
\n\t\t\t\t\t\tИспользовать в SINGLE USER
\tЧтобы загрузить в монопольном режиме компьютер с загрузчиком GRUB, выполните
\tследующие действия:
\t1. Увидев окно приветствия GRUB при загрузке, нажмите любую клавишу для входа
\tв интерактивное меню GRUB.
\t2. Выберите Fedora с версией ядра, которую вы хотите загрузить, и нажмите \"e\"
\tдля редактирования параметров запуска ядра.   Перейдите к концу строки и введите
\tsingle или число \"1\" (номер уровня запуска системы) в качестве параметра
\t3. Нажмите CTRL+x или F10 для выхода из режима редактирования параметров ядра.
\tПосле выхода произойдёт запуск системы с откорректированными параметрами
\tИли можно перевести систему в режим восстановления выполнив команду:
\t\t\tsystemctl isolate rescue.target\n"
}

function version() {
    printf "\n\t$ME Версия 3.0 Дата: 10.03.2019\n"
}

function err(){
    echo -e "\n\tОшибка: Непверный или пустой параметр запуска"
    echo -e "\n\tДля вызова справки запустите $ME -h\n"
}

if [ -z "$1" ]
then
    err
    exit 1
else
    while getopts "bсrhv" opt ;
    do
        case $opt in
            b)  ClearLogs
                CreateBackup ;;
            с)  DISK="/dev/$2" ;
                MakePart ;;
            r)  DISK="/dev/$2" ;
                RecoveryDump ;;
            h) help ;;
            v) version ;;
            ''|*) err
                exit 1 ;;
        esac
    done
fi
Администрирование Fedora Linux + настройка сети и прочая IT-Ботва


Для желающих поддержать
Карта SB: 5469 4009 6510 2267


Лучше ужасный конец, чем ужас без конца!
Аватар пользователя
ROOT
Администратор
 
Сообщений: 432
Зарегистрирован: 01 авг 2011, 09:36
Откуда: Моск. обл., г. Железнодорожный

Сообщение ROOT » 09 апр 2022, 20:27



 Перезапуск сервисов после сна 
Создаём сам сервис, который запускается при выходе машины из сна. Данный сервис дёргает SH-скрипт из каталога /sbin
e /usr/lib/systemd/system/after-suspend.service
Код: выделить все
[Unit]
Description=After suspend
After=suspend.target

[Service]
User=root
Type=oneshot
ExecStart=/sbin/after-suspend.sh
TimeoutSec=30
StandardOutput=syslog

[Install]
WantedBy=suspend.target

Скрипт перезапуска сервисов. В него можно при необходимости добавить сервисы, нуждающиеся в перезапуске. Информация о результате перезапуска заносится в лог-файл
e /sbin/my-script/after-suspend.sh
Код: выделить все
#!/bin/bash
##############################################
# Перезапуск сервисов после сна
# Составлено: SSERGEY
# Дата: 04.04.2017 v1.0
#############################################
BASE_PATH="${0%/*}"
LOG="/var/log/after-suspend"
systemctl restart named > /dev/null 2>&1
if [ $? -eq 0 ]
then
        echo "$(date) Сервер DNS перезапущен" >> $LOG
else
        echo "$(date) Не удалось перезапустить Сервер DNS" >> $LOG
        exit 1
fi

Пример лог-файла
e /var/log/after-suspend
Код: выделить все
Вт апр  4 22:03:13 MSK 2017 Сервер DNS перезапущен
Администрирование Fedora Linux + настройка сети и прочая IT-Ботва


Для желающих поддержать
Карта SB: 5469 4009 6510 2267


Лучше ужасный конец, чем ужас без конца!
Аватар пользователя
ROOT
Администратор
 
Сообщений: 432
Зарегистрирован: 01 авг 2011, 09:36
Откуда: Моск. обл., г. Железнодорожный

Сообщение ROOT » 11 апр 2022, 21:58



 Динамическое сообщение дня (motd) 
скрипт использует утилиту lsb_release, которую можно получить, установив пакет redhat-lsb-core:
Код: выделить все
dnf install redhat-lsb-core

Создаём скрипт
Код: выделить все
e /sbin/my-script/dynmotd.sh

Наполняем его содержимым:
Код: выделить все
#!/bin/sh

##############################################
# Динамическое сообщение дня
# Составлено: SSERGEY
# Дата: 04.05.2022 v1.0
#############################################

FOR_CL='\033[0m'                        # RESET
FOR_BLACK='\033[01;30m'         # DARK GRAY
FOR_RED='\033[01;31m'           # LIGHT RED
FOR_GREEN='\033[01;32m'         # LIGHT GREEN
FOR_YELLOW='\033[01;33m'        # YELLOW
FOR_BLUE='\033[01;34m'          # LIGHT BLUE
FOR_MAGENTA='\033[01;35m'       # LIGHT PURPLE
FOR_CYAN='\033[01;36m'          # LIGHT CYAN
FOR_LGRAY='\033[00;37m'         # LIGHT GRAY
FOR_WHITE='\033[01;37m'         # WHITE
FOR_ORANGE="\033[38;5;209m"     # ORANGE

# Time of day
HOUR=$(date +"%H")
if [ $HOUR -lt 12  -a $HOUR -ge 0 ]; then TIME="morning"
elif [ $HOUR -lt 17 -a $HOUR -ge 12 ]; then TIME="afternoon"
else TIME="evening"
fi

# System uptime
uptime=`cat /proc/uptime | cut -f1 -d.`
upDays=$((uptime/60/60/24))
upHours=$((uptime/60/60%24))
upMins=$((uptime/60%60))

# System + Memory
F_SERVICE=`systemctl --failed | tail -n1 | cut -d " " -f1`
SYS_LOADS=`cat /proc/loadavg | awk '{print $1}'`
MEMORY_USED=`free -b | grep Mem | awk '{print $3/$2 * 100.0}'`
SWAP_USED=`free -b | grep Swap | awk '{print $3/$2 * 100.0}'`
NUM_PROCS=`ps aux | wc -l`
IPADDRESS=`hostname --all-ip-addresses`
RELEASE=`lsb_release -s -d | sed 's/"//g'`
HOST=`hostname -f`
KERNEL=`uname -a | awk '{print $1" "$3" "$12}'`
DATE=`date`
USERS=`users | wc -w`

[[ ${F_SERVICE} > 0 ]] && ST=${FOR_RED} || ST=${FOR_GREEN}

#
printf "${FOR_CYAN}================================================================\n"
printf "${FOR_LGRAY}    Good ${TIME}!                        ${FOR_ORANGE} IT Dept Free-Adm\n"
printf "${FOR_CYAN}================================================================\n"
printf "${FOR_LGRAY}  - Hostname         :${FOR_WHITE} ${HOST}\n"
printf "${FOR_LGRAY}  - Release          :${FOR_WHITE} ${RELEASE}\n"
printf "${FOR_LGRAY}  - Kernel           :${FOR_WHITE} ${KERNEL}\n"
printf "${FOR_LGRAY}  - Server Time      :${FOR_WHITE} %s %s %s %s %s %s\n" ${DATE}
printf "${FOR_LGRAY}  - IP Address       :${FOR_WHITE} %-13s %-13s\n" ${IPADDRESS}
printf "${FOR_LGRAY}  - Users            :${FOR_WHITE} Currently ${USERS} user(s) logged on\n"
printf "${FOR_LGRAY}  - System load      :${FOR_WHITE} ${SYS_LOADS} / ${NUM_PROCS} processes running\n"
printf "${FOR_LGRAY}  - Memory used      :${FOR_WHITE} %.2f %%\n"  ${MEMORY_USED}
printf "${FOR_LGRAY}  - Swap used        :${FOR_WHITE} %.2f %%\n" ${SWAP_USED}
printf "${FOR_LGRAY}  - System uptime    :${FOR_WHITE} %s days %s hours %s minutes\n" ${upDays}  $upHours ${upMins}
printf "${FOR_LGRAY}  - Services failed  :${ST} ${F_SERVICE}\n"
printf "${FOR_CYAN}================================================================\n${FOR_CL}"
#

Скрипты.
Внешний вид

Сделаем скрипт исполняемым:
Код: выделить все
chmod +x /sbin/my-script/dynmotd.sh

Отключим встроенную обработку motd для SSH-сессий:
Код: выделить все
nano /etc/ssh/sshd_config

Код: выделить все
...
PrintMotd no
...

Перезапустим службу:
Код: выделить все
systemctl restart sshd

Подключаем вызов скрипта в механизм обработки загрузки профиля пользователей, отредактировав основной системный конфигурационный файл profile
Код: выделить все
e /etc/profile

в конец файла /etc/profile добавляем вызов скрипта
Код: выделить все
...
# Dynamic motd
/usr/local/sbin/dynmotd.sh
Администрирование Fedora Linux + настройка сети и прочая IT-Ботва


Для желающих поддержать
Карта SB: 5469 4009 6510 2267


Лучше ужасный конец, чем ужас без конца!
Аватар пользователя
ROOT
Администратор
 
Сообщений: 432
Зарегистрирован: 01 авг 2011, 09:36
Откуда: Моск. обл., г. Железнодорожный

Сообщение ROOT » 29 июл 2024, 04:43



 Резервное копирование виртуальных машин VirtualBox 
Код: выделить все
#!/bin/bash
##############################################
# Скрипт архивирования виртуальными машинами VirtualBox
# # Составлено: SSERGEY
# Дата: 29.07.2024 v1.0
#############################################
# Конфигурационные параметры
ME=$(basename "$0")                       # Получаем имя запущенного скрипта
BASE_PATH="$(dirname "$(readlink -f "$0")")" # Получаем текущий каталог
BACKUP_DIR="/mnt/BACKUP/VIRTUALBOX"       # Директория для резервных копий
MAX_BACKUPS=5                             # Максимальное количество резервных копий
LOG_FILE="$BASE_PATH/vm_backup.log"       # Файл логирования
DATE_TIME=$(date +"%Y%m%d")               # Получаем текущую дату и время
BACKUP_PATH="$BACKUP_DIR/$DATE_TIME"

CREATE_DIR() {
# Проверяем, существует ли директория для резервных копий
if [ ! -d "$BACKUP_DIR" ]; then
    mkdir -p "$BACKUP_DIR"
fi

# Создаем каталог для резервных копий, если его еще нет
if [ ! -d "$BACKUP_PATH" ]; then
    mkdir -p "$BACKUP_PATH"
fi
}

# Функция для архивирования виртуальных машин
backup_vm() {
    local VM_NAME="$1"
    local OUTPUT_FILE="$BACKUP_PATH/$VM_NAME.ova"

    # Ваша команда для архивирования виртуальной машины, например:
    # vboxmanage export "$VM_NAME" --output "$OUTPUT_FILE"
    if vboxmanage export "$VM_NAME" --output "$OUTPUT_FILE"; then
        echo "$(date) - Архивирование VM '$VM_NAME' в '$OUTPUT_FILE'" >> "$LOG_FILE"
    else
        echo "$(date) - Ошибка при архивировании VM '$VM_NAME'" >> "$LOG_FILE"
    fi
}

CHECK_LIST() {
    local param="$1"
    if [ "$param" != "all" ]; then
        if vboxmanage list vms | grep -q "\"$param\""; then
            VM_LIST="$param"
        else
            echo "Ошибка: Виртуальная машина с именем '$param' отсутсвует."
            exit 1
        fi
    else
        VM_LIST=$(vboxmanage list vms | awk -F'"' '{print $2}')
    fi
    echo "$VM_LIST"
}

ARCH() {
    local VM_LIST="$1"
    CREATE_DIR

    for VM in $VM_LIST; do
        if  [ ! -f "$BACKUP_PATH/$VM.ova" ]; then
            backup_vm "$VM"
        else
            echo "Предупреждение: архив $BACKUP_PATH/$VM.ova уже существует."
            echo "$(date) - Предупреждение: архив $BACKUP_PATH/$VM.ova уже существует" >> "$LOG_FILE"
        fi

    done
}

HELP() {
    echo -e "\n\n\tСправка..."
    echo -e "\n\tНазначение: Скрипт архивирования виртуальных машин VirtualBox"
    echo -e "\t\t\t\tИмена машин НЕ должны содержать пробелов"
    echo -e "\t\t\t\tЗапускается из-под обычного пользователя"
    echo -e "\n\tИспользовать: $ME [all | name | show | help | ver]\n"
    echo -e "\n\tПараметры:\n"
    echo -e "\t\tall\t\t- Архивировать ВСЕ виртуальные машины\n"
    echo -e "\t\tname\t- Имя виртуальной машины для архивирования\n"
    echo -e "\t\tshow\t- Вывести список виртуальных машин\n"
    echo -e "\t\thelp\t- Показать помощь\n"
    echo -e "\t\tver\t\t- Вывести версию"
}

VER() {
    echo "©SSERGEY Дата: 29.07.2024 Версия 1.0"
}

DEL_OLD() {
    BACKUP_COUNT=$(ls -1 "$BACKUP_DIR" | wc -l)
    if [ "$BACKUP_COUNT" -gt "$MAX_BACKUPS" ]; then
        OLD_BACKUPS=$(ls -1t "$BACKUP_DIR" | tail -n +$((MAX_BACKUPS + 1)))
        for OLD_BACKUP in $OLD_BACKUPS; do
            rm -rf "$BACKUP_DIR/$OLD_BACKUP"
            echo "$(date) - Удален старый бэкап '$OLD_BACKUP'" >> "$LOG_FILE"
        done
    fi
}

# Проверяем, был ли передан параметр
if [ $# -eq 0 ]; then
    echo "Ошибка: Необходимо указать один параметр."
    echo "Для справки: $ME help"
    exit 1
fi

# Получаем первый параметр
param="$1"

# Проверяем значение параметра
case "$param" in
    help)
        HELP
        ;;
    show)
        echo "Список виртуальных машин..."
        vboxmanage list vms
        ;;
    ver)
        VER
        ;;
    all)
        VM_LIST=$(CHECK_LIST "$param")
        ARCH "$VM_LIST"
        DEL_OLD
        ;;
    *)
        VM_LIST=$(CHECK_LIST "$param")
        ARCH "$VM_LIST"
        DEL_OLD
        ;;
esac
Администрирование Fedora Linux + настройка сети и прочая IT-Ботва


Для желающих поддержать
Карта SB: 5469 4009 6510 2267


Лучше ужасный конец, чем ужас без конца!
Аватар пользователя
ROOT
Администратор
 
Сообщений: 432
Зарегистрирован: 01 авг 2011, 09:36
Откуда: Моск. обл., г. Железнодорожный


Вернуться в Fedora

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron