Показ дописів із міткою bash. Показати всі дописи
Показ дописів із міткою bash. Показати всі дописи

автозапуск сервіс в Ubuntu 18

# cd /etc/systemd/system/
# touch some.service
# mcedit some.service

[Unit]
Description=Some site service
[Service]
ExecStartPre=
ExecStart=/sbin/runuser -l asuser -c '/some/script/start.sh'
Restart=always
KillSignal=SIGQUIT
Type=notify
NotifyAccess=all
[Install]
WantedBy=multi-user.target

# sudo systemctl enable some

gre tunnel bash function

#!/bin/bash

/sbin/modprobe gre

function tun2-up {
    NAME=$1
    REMOTE=$2
    IP=$3
    PPTP=$4

    #ip link set ${NAME} down
    #ip tunnel del ${NAME}

    ip tunnel add ${NAME} mode gre remote ${REMOTE} local MY_EXTERNAL_IP
    ifconfig ${NAME} inet ${IP} pointopoint ${PPTP}

    ip link set ${NAME} up
}

tun2-up tunnelname REMOTE_IP 10.77.253.222/30 10.77.253.221

postfix: вибірка з maillog по e-mail

postfix має своєрідний формат логів і вибирати потрібну інформацію потрібно в два проходи. Ось команда, яка робить гарну вибірку по потрібному е-мейлу.

grep 'to=<email@domain.com' /var/log/mail.log | cut -d ' ' -f 6 | grep -f - /var/log/mail.log > email@domain.com.txt

Конвертація mysql таблиць і полів

mysql --database=dbname -B -N -e "SHOW TABLES" \ 
| awk '{print "ALTER TABLE", $1, "CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;"}' \
| mysql --database=dbname

zoneminder: images to avi converter

#!/bin/bash

MYSQL_HOST="localhost"
MYSQL_USER="user"
MYSQL_DB="zm"
MYSQL_PASS="pass"

CACHE_DIR="/var/cache/zoneminder/events"
VIDEO_DIR="video-archive"
cameras=(
 5 # kafedra
 1 # krapka1
 2 # krapka2
 6 # krapka2in
 3 # krapka3
 4 # stoyanka
)

for i in ${cameras[@]}; do
    echo
    echo "Monitor $i"
    echo

    if [ ! -d $CACHE_DIR/$i/$VIDEO_DIR ]; then
 mkdir $CACHE_DIR/$i/$VIDEO_DIR
    fi

    IFS=$'\t\n'
    #MYSQL_RESULT=(`mysql --skip-column-names -h$MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASS $MYSQL_DB -e "SELECT StartTime, EndTime FROM Events WHERE MonitorId='$i' AND EndTime IS NOT NULL"`)
    MYSQL_RESULT=(`mysql --skip-column-names -h$MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASS $MYSQL_DB -e "SELECT StartTime FROM Events WHERE MonitorId='$i' AND EndTime IS NOT NULL"`)
    IFS=$' \t\n'

    for (( j=0 ; j<${#MYSQL_RESULT[*]}; j++ )) ; do 
 echo "${MYSQL_RESULT[j][1]}"
 PARSED_DATE=(`echo ${MYSQL_RESULT[j]} | sed -e 's/[:-]/ /g'`)
 YEAR=${PARSED_DATE[0]:2:3}
 MONTH=${PARSED_DATE[1]}
 DAY=${PARSED_DATE[2]}
 HOUR=${PARSED_DATE[3]}
 MINUTE=${PARSED_DATE[4]}
 SECOND=${PARSED_DATE[5]}
 #echo ${PARSED_DATE[*]}

 if [ -d  $CACHE_DIR/$i/$YEAR/$MONTH/$DAY/$HOUR/$MINUTE/$SECOND ]; then
     ffmpeg -f image2 -framerate 5 -r 5 -i $CACHE_DIR/$i/$YEAR/$MONTH/$DAY/$HOUR/$MINUTE/$SECOND/%03d-capture.jpg -s 640x480 $CACHE_DIR/$i/$VIDEO_DIR/${YEAR}.${MONTH}.${DAY}-${HOUR}.${MINUTE}.${SECOND}.avi
     rm -rf $CACHE_DIR/$i/$YEAR/$MONTH/$DAY/$HOUR/$MINUTE/$SECOND
 fi
 
    done
done

mcedit і mc кольори

Стандартна убунтівська кольорова схема для mcedit просто виїдає мозок. Є кусок роботи, де потрібно правити код в mcedit таки. Вставляємо наступний сніпєтц в .bashrc

автоматизація підключення WebDAV-шари

Є багато машин, на кожну потрібно підключити відповідну webdav-шару. Формат http://davhost/pc_0xx і 192.168.0.xx клієнт, відповідно.
#!/bin/bash

IP=`ifconfig | grep -v '127.0.0.1' | sed -n 's/.*inet addr:\([0-9.]\+\)\s.*/\1/p'`
IP_ARRAY=(${IP//./ })

FSTAB=/etc/fstab
USER_HOME=/home/user
CLIENT_DIR=$USER_HOME/client
DAVFS_DIR=.davfs2
CLIENT_SECRET=secrets

if [ ! -d $CLIENT_DIR ]; then
    echo "create $CLIENT_DIR"
    mkdir $CLIENT_DIR
    chown user:user $CLIENT_DIR
else
    echo "exist $CLIENT_DIR"
fi

if [ ! -d $USER_HOME/$DAVFS_DIR ]; then
    echo "create $USER_HOME/$DAVFS_DIR"
    mkdir $USER_HOME/$DAVFS_DIR
    chown user:user $USER_HOME/$DAVFS_DIR
else
    echo "exist $USER_HOME/$DAVFS_DIR"
fi

if [ ! -f $USER_HOME/$DAVFS_DIR/$CLIENT_SECRET ]; then
    echo "create $USER_HOME/$DAVFS_DIR/$CLIENT_SECRET"
    touch $USER_HOME/$DAVFS_DIR/$CLIENT_SECRET
    chown user:user $USER_HOME/$DAVFS_DIR/$CLIENT_SECRET
    chmod 0600 $USER_HOME/$DAVFS_DIR/$CLIENT_SECRET
    echo "http://davhost/pc_0${IP_ARRAY[3]} user user" >> $USER_HOME/$DAVFS_DIR/$CLIENT_SECRET
else
    echo "exist $USER_HOME/$DAVFS_DIR/$CLIENT_SECRET"
fi

if grep "http://davhost/pc_0${IP_ARRAY[3]}" $FSTAB
then
    echo "exist mount access in $FSTAB"
else
    echo "create mount access in $FSTAB"
    echo "http://davhost/pc_0${IP_ARRAY[3]} /home/user/client davfs user,rw,auto,_netdev 0 0" >> $FSTAB
fi

chmod u+s /sbin/mount.davfs
usermod -a -G davfs2 user

split на bash'і

snat=(
    55410:192.168.10.99:80
    55415:192.168.10.199:80
    55411:192.168.20.99:80
    55412:192.168.30.199:80
    55413:192.168.24.99:80
    55414:192.168.20.199:80
)

for i in ${snat[@]}; do
    set -- "$i"
    IFS=":"; declare -a Array=($*)

    iptables -A FORWARD -p tcp -s ${Array[1]} --sport ${Array[2]} -j ACCEPT
    iptables -A FORWARD -p tcp -d ${Array[1]} --dport ${Array[2]} -j ACCEPT
    iptables -t nat -A PREROUTING -p tcp -i eth0 --dport ${Array[0]} -j DNAT --to-destination ${Array[1]}\:${Array[2]}

    echo "${Array[@]}"
done
п.с. збоченська мова

програмне (HTTP) перезавантаження китайських ІР-камер

Є ноунеймовська китайська ІР-камера. Постала задача програмно її перевантажувати. Перше що спало на думку - телнет. І він виявився навіть відкритим, але зайти таки не вдалось. Так званий український сапорт сказав що телнет не працює, закрили його китайці. Довелось копати в сторону HTTP.
Отож рішення:

wget --cookies=on \
          --keep-session-cookies \
          --save-cookies cookies.txt \
          --post-data 'A=login&B=password&button=Login' \
          http://x.y.z.x/cgi-bin/LoginAction.cgi
wget --load-cookies cookies.txt \
     -p http://x.y.z.x/cgi-bin/Reboot.cgi

Подібним методом можна автоматизувати не лише камери. FireBug в поміч.

простенький скрипт резервного копіювання

#!/bin/bash

DATE=`date +%Y%m%d%H`
BACKUP_DIR=/mnt/backups/backups

dirs=( /mnt/dir1
       /mnt/file1
       /mnt/dir2
)

for i in ${dirs[@]}; do
    tar -cvf $BACKUP_DIR/${i##*/}-$DATE.tar $i
    gzip $BACKUP_DIR/${i##*/}-$DATE.tar
done

find $BACKUP_DIR/* -maxdepth 0 -ctime +15 -type f -exec rm -rfv {} \;

Перевірялка Апача на живучість

#!/bin/bash

PATH=/bin:/usr/bin
THEDIR=/tmp/apache-watchdog
EMAIL=blablabla@gmail.com
mkdir -p $THEDIR

if ( wget --timeout=30 -q -P $THEDIR http://localhost/robots.txt )
then
# we are up
touch ~/.apache-was-up
else
# down! but if it was down already, don't keep spamming
if [[ -f ~/.apache-was-up ]]
then
# write a nice e-mail
echo -n "apache crashed at " > $THEDIR/mail
date >> $THEDIR/mail
echo >> $THEDIR/mail
echo "Access log:" >> $THEDIR/mail
tail -n 30 /var/log/httpd/access_log >> $THEDIR/mail
echo >> $THEDIR/mail
echo "Error log:" >> $THEDIR/mail
tail -n 30 /var/log/httpd/access_log >> $THEDIR/mail
echo >> $THEDIR/mail
# kick apache
echo "Now kicking apache..." >> $THEDIR/mail
/etc/rc.d/init.d/httpd stop >> $THEDIR/mail 2>&1
killall -9 httpd >> $THEDIR/mail 2>&1
/etc/rc.d/init.d/httpd start >> $THEDIR/mail 2>&1
# send the mail
echo >> $THEDIR/mail
echo "Good luck troubleshooting!" >> $THEDIR/mail
mail -s "apache-watchdog: apache crashed" $EMAIL < $THEDIR/mail
rm ~/.apache-was-up
fi
fi
rm -rf $THEDIR


(c) десь нагуглено і допиляно під федору

пакетна нормалізація звуку в avi файлах

Є старий DVD-плеєр в публічному місці, який не має функції shuffle (випадкового програвання файлів з плей-ліста), крім того, старі відео-файли мають різний рівень звуку, що створює певні незручності.
Погуглив віндові рішення, але нічого толкового і безкоштовного не знайшов. Тож лінукс виручає, як завжди.


#!/bin/bash

IN_DIR="music_in"
OUT_DIR="music_out"

for i in `ls $IN_DIR`; do
##### extract MP3 file
ffmpeg -i $IN_DIR/$i $OUT_DIR/$i.mp3
##### normalize MP3 file
normalize -m -v $OUT_DIR/$i.mp3
##### remove MP3 from AVI
ffmpeg -i $IN_DIR/$i -vcodec copy -an $OUT_DIR/$i.avi
##### merge AVI and new normalized MP3
ffmpeg -i $OUT_DIR/$i.avi \
-i $OUT_DIR/$i.mp3 \
-vcodec copy \
-acodec copy \
$OUT_DIR/$i.new.avi
##### remove temp files
rm -f $OUT_DIR/$i.mp3
rm -f $OUT_DIR/$i.avi
##### change filename to random
mv $OUT_DIR/$i.new.avi $OUT_DIR/$RANDOM.avi
done