MYCSS

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

2023-05-13

Нотатка. Монтування дисків NFS, ZFS поверх iSCSI. FreeBSD rc.d.

Є підключення диска через iSCSI, надалі диск форматується у ZFS. При завантаженні системи потрібно зачекати мережевого з'єднання iSCSI Initiatior з iSCSI target. Потім, змотувати ZFS pool. Потім запустити hook скрипт, після успішного монтування.  

source imgage : https://www.data-storage.uk
iSCSI Storage

iSCSI

/etc/rc.conf:

#iSCSI
iscsid_enable="YES"
iscsictl_enable="YES"
iscsictl_flags="-Aa"
/etc/iscsi.conf:
t0 {
    TargetAddress   = nas1
    TargetName      = iqn.2023-05.net.server.nas1:server1-storage
    AuthMethod      = CHAP
    chapIName       = server1
    chapSecret      = "kdwkjdqhdww3qq@@6td3_3eiw9e7w43"
}

ZFS: 

/etc/rc.conf:

#iSCSI_ZFS
iscsi_zfs_enable="YES"
iscsi_zfs_wait_iqn="server1-storage"
iscsi_zfs_wait_pool="storage"
iscsi_zfs_post_hook="/root/script/post-mount.sh"
iscsi_zfs_pre_hook="/root/script/pre-umount.sh"

2023-02-12

Скрипт для Proxmox - Періодичний знімок віртуальної машини

Буває що віртуальна машина використовує якийсь довготривалий розрахунок. А якщо що ?

То всі результати розрахунку пропали ?

Тому ось простий скрипт що періодично створює знімок віртуальної машини (snapshot) зі станом пам'яті. Також змінює назву збільшуючи її на одиницю.

#!/usr/bin/env bash

PATH=$PATH:/usr/sbin

VM=309

prevsn=$(qm listsnapshot ${VM} | head -n 1 | awk '{print $2}')

if [ "$prevsn" == "current"  ];then
 snname="a1"
else
 snname="a$(( ${prevsn:1} + 1 ))"
fi
echo prev:$prevsn new:${snname}
qm snapshot $VM ${snname}  --vmstate true
if [ $? -eq 0 ] && [ "$prevsn" != "current" ];then
 echo "all ok with new snapshot: ${snname}, remove prev: $prevsn"
 qm delsnapshot $VM  $prevsn
fi

Результат:

bash result

2023-01-04

Скрипт автоматизації перейменування віртуальних машин у Proxomos VE для приєднання до кластеру


При переносі віртуальних машин з ноду в кластер необхідно мати пустий нод, і номера віртуальних машин що не конфліктують з іншими. 

Для вирішення цієї задачі простіше і надійніше використати метод створення резервної копії і потім її відновлення в кластері. 

Але я створив малий скрип що допомагає обійтися без цього методу.

Тому цей простий скрип перейменовує гуртом віртуальні машини з номерами 1ХХ на 6ХХ і де дані зберігаються на ZFS диску з назвою 'mdata'.

2022-12-02

Install JAVA, HADOOP, ELASTICSEARCH, CRAWLER - NUTCH on DEPLOY MODE. Problem: Store INDEX to ELASTICSEARCH (PART I)

The task is to create a web crawler of http sites using Apache-Nutch on multiple servers and store the index on the elasticsearch server. HADOOP with DFS file system is used to manage JAVA tasks.
A distributed version .job file was used to run Apache-Nutch via HADOOP.
Currently testing on one Ubuntu 22.04 LTS 'el-mix' server with IP 10.110.6.77.

Based on this :  https://phoenixnap.com/kb/install-hadoop-ubuntu

JAVA

root@el-mix:/home/developer# java -version; javac -version
bash: /usr/bin/java: No such file or directory
Command 'javac' not found, but can be installed with:
apt install default-jdk              # version 2:1.11-72build2, or
apt install openjdk-11-jdk-headless  # version 11.0.17+8-1ubuntu2~22.04
apt install openjdk-17-jdk-headless  # version 17.0.3+7-0ubuntu0.22.04.1
apt install ecj                      # version 3.16.0-1
apt install openjdk-18-jdk-headless  # version 18~36ea-1
apt install openjdk-8-jdk-headless   # version 8u312-b07-0ubuntu1
root@el-mix:/home/developer# apt install openjdk-11-jdk-headless
root@el-mix:/home/developer# java -version; javac -version
openjdk version "11.0.17" 2022-10-18
OpenJDK Runtime Environment (build 11.0.17+8-post-Ubuntu-1ubuntu222.04)
OpenJDK 64-Bit Server VM (build 11.0.17+8-post-Ubuntu-1ubuntu222.04, mixed mode, sharing)
javac 11.0.17

Install JAVA HADOOP, ELASTICSEARCH, CRAWLER - NUTCH on DEPLOY MODE , problem with last stage of store INDEX to ELASTICSEARCH on UBUNTU 22.04 (PART II)

DEPLOY RUN

developer@el-mix:~$ ./cr-deploy.sh


Map output records=37
Map output bytes=9749
Map output materialized bytes=4790
Input split bytes=1836
Combine input records=0
Spilled Records=37
Failed Shuffles=0
Merged Map outputs=0
GC time elapsed (ms)=1189
CPU time spent (ms)=9720
Physical memory (bytes) snapshot=3526860800
Virtual memory (bytes) snapshot=32680042496
Total committed heap usage (bytes)=3002073088
Peak Map Physical memory (bytes)=328626176
Peak Map Virtual memory (bytes)=2730352640
File Input Format Counters
Bytes Read=8211
2022-12-01 02:48:46,099 ERROR indexer.IndexingJob: Indexing job did not succeed, job id: job_1669862098511_0011, job status: FAILED, reason: Task failed task_1669862098511_0011_r_000001
Job failed as tasks failed. failedMaps:0 failedReduces:1 killedMaps:0 killedReduces: 0

2022-12-01 02:48:46,119 ERROR indexer.IndexingJob: Indexer: java.lang.RuntimeException: Indexing job did not succeed, job id: job_1669862098511_0011, job status: FAILED, reason: Task failed task_1669862098511_0011_r_000001
Job failed as tasks failed. failedMaps:0 failedReduces:1 killedMaps:0 killedReduces: 0

at org.apache.nutch.indexer.IndexingJob.index(IndexingJob.java:150)
at org.apache.nutch.indexer.IndexingJob.run(IndexingJob.java:291)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:81)
at org.apache.nutch.indexer.IndexingJob.main(IndexingJob.java:300)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.apache.hadoop.util.RunJar.run(RunJar.java:323)
at org.apache.hadoop.util.RunJar.main(RunJar.java:236)

Error running:
/home/developer/nutch/runtime/deploy/bin/nutch index -Dmapreduce.job.reduces=2 -Dmapreduce.reduce.speculative=false -Dmapreduce.map.speculative=false -Dmapreduce.map.output.compress=true crawl/crawldb -linkdb crawl/linkdb crawl/segments/20221201024052 -deleteGone
Failed with exit value 255.

2022-11-28

Скрипт для показу значень температури та вологості Bluetooth BLE термометра Xiaomi

Є Bluetooth BLE термометр Xiaomi Mijia (LYWSD03MMC) з альтернативною прошивкою PVVX.

Xiaomi Mijia (LYWSD03MMC)

Написаний простий скрипт (Python) що сканує мережу Bluetooth BLE на наявність broadcasting advertising packets.

Якщо назва пристрою починається з 'ATC' то виводяться декодовані данні телеметрії в консоль.

2022-02-14

Нотатка для себе. Proxmox easy HA script.

В деяких ситуаціях HA (High Availability) системи Proxmox для віртуальних машин не допомагає.

Такою ситуацією є випадок коли резервна копія віртуальної машини налаштована як stop mode, а не snapshot mode.

І бувають ситуації на кшталт цієї:

INFO: timeout waiting on systemd
command 'qm start 101 --skiplock' failed: exit code 255
ERROR: Backup of VM 101 failed - timeout waiting on systemd
INFO: Failed at 2022-02-11 01:15:48
INFO: Backup job finished with errors

Тому простий скрипт котрий запускає за розкладом crond вирішує цю задачу:

#!/bin/sh

vmlist="101 102"
for i in $vmlist; do
 status=$(/usr/sbin/qm status $i)
 echo $status
  if [ ! "${status}" = "status: running" ];then
   echo "BAD"
   /usr/sbin/qm start $i
  else
   echo "OK"
  fi
done
corontab -e
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command

*/30 * * * *      /home/check-vm.sh 2>1 >/dev/null

Результат роботи скрипту

 


2022-02-03

Нотатка. Оновлення запису DNS для DHCP CLIENT FreeBSD з використанням nsupdate

Є сервер FreeBSD, з використанням dhclient для мережевого інтерфейсу.

Задача, оновити  запис в власному сервері DNS з отриманим IP від DHCP сервером.

Встановлюю додатковий компонент pkg install samba-nsupdate.

nsupdate


dhclient

Створюю скрипт dhclient-exit-hooks для dhclient.

/etc/dhclient-exit-hooks
#!/bin/sh

/usr/bin/logger -t dhclient-exit-hooks REASON ${reason} IP: ${new_ip_address}
case "${reason}" in BOUND|RENEW|REBIND|REBOOT)
        echo ${new_ip_address} ${reason}
        /usr/local/etc/ddns/ddns.sh ${new_ip_address} ${reason}
;;
esac

 Створюю теку /usr/local/etc/ddns, там завантажую файл ключа ddns.key для оновлення DNS з RFC 2136 і також цей скрипт: 

 nsupdate

/usr/local/etc/ddns/ddns.sh

#!/usr/bin/env /bin/sh

IP=$1
KEY=/usr/local/etc/ddns/ddns.key
NSUPDATE=/usr/local/bin/samba-nsupdate
DNSSERVER=your_dns_server
DNSHOST=host.example.net

if [ ! -z ${IP} ];then
 echo updating:  ${IP} [ $2 ]  - ${USER}
 /usr/bin/logger -t dyndns updating:  ${IP} [ $2 ]  - ${USER}
 if [ -f ${KEY} ];then
  ${NSUPDATE} -4  -k ${KEY}  <<EOF
server ${DNSSERVER}  53
update delete ${DNSHOST}
update add ${DNSHOST} 300 A ${IP}
send
EOF
  else
   logger -t dyndns no key file ${KEY}
  fi
else
 echo IP missed
 logger -t dyndns IP missed
fi

BIND 

ddns-confgen -a hmac-sha512 -z host.example.net

# To activate this key, place the following in named.conf, and
# in a separate keyfile on the system or systems from which nsupdate
# will be run:
key "ddns-key.host.example.net" {
        algorithm hmac-sha512;
        secret "SdimvwKG5SDqeS7hD+C6ap89sRN4I2EuYrJKHFXtJ83CuUF6kbELxrv5OgVeVctzyqbafcQTGJgQh/svkv+/Yg==";
};

# Then, in the "zone" definition statement for "host.example.net",
# place an "update-policy" statement like this one, adjusted as
# needed for your preferred permissions:
update-policy {
          grant ddns-key.host.example.net zonesub ANY;
};

# After the keyfile has been placed, the following command will
# execute nsupdate using this key:
nsupdate -k 

2022-01-15

Нотатка: Динамічний таймер на базі "розумної" розетки SONOFF S26 з Tasmota та MQTT

Є завдання, вмикати освітлення у приміщенні тамбура перед квартирою, за певними персоналізованими умовами.

SONOFF S26 - Tasmota

Умови

  • ручне керування: вимикання, вмикання на короткий час, на довгий час
  • віддалене керування через MQTT брокер, вимикання, вмикання на короткий час, на середній час,на довгий час.
  • вимикання завжди за аварійним або контрольованим таймером

2021-12-17

Перший код в LUA. Скрипт для роутера з OpenWRT. MQTT та Telegram статус підключених WiFi clients.

З метою оптимізації мого попереднього коду (Нотатки : Простий скрипт для wifi device tracker в OpenWRT : відсилання повідомлень до MQTT ) в SHELL script так як його можливості дещо обмежені. Перевів код на LUA -  швидка і компактна скриптова мова програмування.

Мета коду - зробити автоматизацію вдома на основі присутності людей. Один з варіантів визначення присутності це за тим чи підключений мобільний телефон особи до домашньої Wi-Fi мережі.

Результати роботи визначення статусу в телеграм групі
Так як мобільний телефон при підключенні до мережі Wi-Fi використовує унікальні MAC адреси, то за активністю MAC адрес можна припустити по наявність особи вдома.

2021-12-11

Нотатка для себе, Proxmox QEMU agent для VM - запуск команд

Як взаємодіє гіпервізор з віртуальними машинами ?
Один з варіантів використати агент для віртуальної машини. 

У Proxmox це qemu-agent [1],  від існує для різних операційних систем.
Так для FreeBSD існує версія пакунку "qemu-guest-agent-5.0.1  QEMU guest-agent utilities", з функціоналом але дещо обмеженим.

Для роботи з агентом є команда  qm guest.

 qm guest cmd <vmid> <command>
 qm guest exec-status <vmid> <pid>
 qm guest passwd <vmid> <username> [OPTIONS]
 qm guest exec <vmid> [<extra-args>] [OPTIONS]

2021-11-27

Нотатки: ZFS for postgresql database, Restore pleroma database, ZFS Snapshot for postgresql db

FreeBSD, Postgress SQL Database v14.
Відновлення бази даних Pleroma на сервері з резервної копії.

pkg install postgresql14-server
pkg install postgresql14-contrib
zfs create -o mountpoint=none zroot/var/db
zfs create -o mountpoint=/var/db/postgres
zroot/var/db/postgres
zfs list
zfs zfs set atime=off zroot/var/db/postgres
zfs set atime=off zroot/var/db/postgres
zfs set relatime=on zroot/var/db/postgres
zfs set recordsize=8k zroot/var/db/postgres
chown -R postgres:postrgres /var/db/postgres
chmod 750 /var/db/postgres
service postgresql initdb
pkg install sudo

restore_db.sh

#!/usr/bin/env sh
DBSAVE=. #DBFILE=pleroma_2021-11-09-0000.sql.gz sudo -u postgres psql < pleroma_init.sql cd ${DBSAVE} DBFILE=$( ls -1 *.sql.gz | tail -1 ) echo ${DBFILE} zcat ${DBSAVE}/${DBFILE} | sudo -u postgres psql -d pleroma

pleroma_init.sql:

REVOKE CONNECT ON DATABASE  pleroma FROM public;
SELECT pg_terminate_backend(pg_stat_activity.pid)
 FROM pg_stat_activity
 WHERE pg_stat_activity.datname = 'pleroma';
CREATE USER pleroma WITH ENCRYPTED PASSWORD '.......................................';
DROP DATABASE pleroma;
CREATE DATABASE pleroma OWNER pleroma;
\c pleroma;
--Extensions made by ecto.migrate that need superuser access
CREATE EXTENSION IF NOT EXISTS citext;
CREATE EXTENSION IF NOT EXISTS pg_trgm;
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
GRANT CONNECT ON DATABASE pleroma TO public;
zfs-snapshot-pgsql.sh
#!/usr/bin/env sh
DATASQL=data14
DATABASE=/var/db/postgres/${DATASQL}
DBDATASET=zroot/var/db/postgres
DBDATASET_CLONE=zroot/var/db/postgres-clonedb
DATABASE_CLONE=/var/db/postgres-clonedb
SHAREDSQL=/usr/local/share/postgresql
zfs list -t snapshot
zfs destroy ${DBDATASET}@snap1
touch ${DATABASE}/backup_in_progress
#START BACKUP SQL by SQL SNAPSHOT
sql="SELECT pg_start_backup('snapshot', true);"
sudo -u postgres psql -c "$sql"
#Fix state of DATABSE DIRECTORY to ZFS snapshot
zfs snapshot ${DBDATASET}@snap1
sql="SELECT pg_stop_backup();"
sudo -u postgres psql -c "$sql"
rm ${DATABASE}/backup_in_progress
#STOP BACKUP SQL by SQL SNAPSHOT
zfs list -t snapshot 
#CLONE ZFS SNAPSHOT to new SQL DATABSE DIRECTORY
zfs clone -o mountpoint=${DATABASE_CLONE} ${DBDATASET}@snap1 ${DBDATASET_CLONE}
#Backup by file archive
tar -cf ~/backup.tar ${DATABASE_CLONE}
#Backup by pg_dump to SQL by start tmp instance of pgsql on port 5433
rm ${DATABASE_CLONE}/${DATASQL}/postmaster.*
cp ${SHAREDSQL}/postgresql.conf.sample ${DATABASE_CLONE}/${DATASQL}/postgresql.conf
sudo -u postgres pg_ctl -D ${DATABASE_CLONE}/${DATASQL} -o "-p 5433" start
umask 077
sudo -u postgres pg_dump pleroma -p 5433 --clean --create | gzip >  pleroma_`date +%F-%H%M`.sql.gz
sudo -u postgres pg_ctl -D ${DATABASE_CLONE}/${DATASQL} stop -m immediate
umount  ${DATABASE_CLONE}
zfs destroy ${DBDATASET_CLONE}


 

 Ref.: 

2021-05-24

Нотатка для себе. CARP monitoring script pfsense.

Маю два сервери pfsense (2.5.1-RELEASE ) у різних віртуальних машинах з налаштованими Proxy сервер - Squid, та Virtual IP type CARP.

Virtual IP type CARP.

Задача мати на напоготові резервний Proxy сервер у випадку коли ведуться роботи на одному з гіпервізорів. 

Для цього існує пункт налаштування "Squid General Settings/


pfSense Proxy Server - CARP Status VIP

2021-01-31

Нотатки : Простий скрипт для wifi device tracker в OpenWRT : відсилання повідомлень до MQTT

Скрипт для ash сценарію в OpenWRT.
Пошук активних WiFi пристроїв за їх MAC адресою, і якщо такий є то надсилання повідомлення до MQTT брокера зі станом пристрою при зміні стану. А інший скрипт надсилає стан вже до Телеграм каналу..


#!/bin/sh

uUser1='00:13:33:44:11:77'
uUser2='00:3D:33:5D:11:39'
users="User1 User2"

next=

function publish()
{
 mosquitto_pub -t "$1" -m "$2" -r
}

#MAIN
sleep 120

for m in $users; do
  eval p${m}=0
done

while true; do
 for m in $users; do
  um=$(eval "echo \${u${m}}")
  us=$(iwinfo wlan0 assoclist | grep -m 1 -c $um )
  ps=$(eval "echo \${p${m}}")
  if [ "$us" -ne $ps ];then
   eval p${m}=$us
   if [ -n "$next" ];then
     publish "tele/wifi_$m/LWT" "$us"
   fi
  fi
 done
 next=1
 sleep 90
done

Так як масивів в ash не має, то приходиться використовувати eval для  симуляції віртуального масиву.

Створив версію для LUA: Перший код в LUA. Скрипт для роутера з OpenWRT. MQTT та Telegram статус підключених WiFi clients.


2021-01-17

Використання Google Cloud IoT MQTT з консольного BASH сценарію та Mosquitto

Google Cloud Platform надає можливість використати IoT Core для підключення IoT пристроїв за протоколом MQTT та HTTP.
Приклади налаштування, і основи роботи є на багатьох ресурсах і у відео:

Моя задача створити безпечне підключення до Google IoT Core з консолі свого пристрою і використати мінімум програм:

Зв'язок mqtt topic (ts2) з google topic event (b01)

Публікація до google topic event (b01) з mosquitto_pub

Перегляд отриманих повідомлень в google sub підписки на mqtt topic (ts2)
 
Підписка до topic - error

Скрипти для автоматизації підключення.

Головна особливість для зв'язку з Google Cloud Platform, те що потрібно автентифікувати пристрій котрий надсилає #MQTT повідомлення за допомогою JWT.
Автентифікація пристрою за JWT
 

2021-01-10

Нотатки : Простий скрипт для MQTT в OpenWRT : відсилання Telegram повідомлень з Emoji. Tasmota.

Маю роутер з #OpenWRT, і локально інстальованим брокером #MQTT  #mosquitto.

Роутер - OpenWRT, ext USB disk, RAM 64M

Сповіщення

Що б виконати простіші операції з сповіщення в телеграм каналі, написаний даний скрипт, що надсилає до телеграм каналу повідомлення при певних умовах.
Такі умови можуть бути від різних сенсорів розумного будинку, наприклад: 

  • стан вхідних дверей : зачинені / відчинені
  • стан замку в дверях : закрито / відкрито
  • стан охорони :  поставлено на охорону / знято з охорони
  • стан пристрою - датчику руху : працює / не працює
  • стан пристрою - лампи освітлення : працює / не працює

Emoji

Завдання це стан цих сенсорів показати відповідними зрозумілими зображеннями використовуючи Emoji:

Приклад використання зображень - емодзі

Список доступних зображень "Full Emoji List, v13.1"

2020-08-21

renew SSL certificate Let'Script by ACME script (DNS) for Tomcat web server

Я використовую проект OpenMeeting котрий працює на Tomcat web server (Java).
Стала задача використати SSL сертифікати від Let's Encript для OpenMeeting.

Але безкоштовні сертифікати мають особливість, короткий термін життя, і їх періодично потрібно оновлювати. Для звичайних Web серверів, існують скрипти які автоматично спрощують життя.

Для OpenMeeting і відповідно для Tomcat web server, дещо інше рішення так як сховищами ключів та сертифікатів є Java KeyStore.

Для генерації та оновлення сертифікати від Let's Encript є скрипт наш кшталт ACME. Я використовую цей скрипт під операційною системою Ubuntu 18.04 LTS в режимі DNS manual mode.

2020-05-02

Нотатка. Shell, PHP script. GeoIP detect TimeZone.

Скрипт за IP адресою, визначає часовий пояс.
ip-timezone-info.sh
!/bin/bash

IP=$1

if [ -z "${IP}" ];then
 echo "-- Missed paramter of IP"
 exit
fi


function install()
{
howinstalled=$(apt list --installed 2>/dev/null  | grep  "^$1" | wc -l)
if [ "${howinstalled}" -lt 1 ] ;then
 echo !!!!!!!!! MISSED FILE "$1", please install it : sudo apt install $1
 sudo apt-get install $1
 #exit
fi
}

install mmdb-bin

TZCity=$(mmdblookup --file GeoLite2-City.mmdb --ip ${IP} location time_zone |\
 awk 'match( $0, /"([a-z|A-Z|/]*)"/ ,arr ) { print  arr[1] }' )
TZone=$(TZ=${TZCity} date +%z)
echo "${TZCity} GMT${TZone%??}"

2020-04-17

Керування плеєром MPV за допомогою API JSON

Є багатоплатформовий відео плеєр з відкрити кодом - MPV.
Все що він може і як цим керувати описано в офіційній документації.
Є задача - керувати цим плеєром коли він запушений на віддаленому екрані.
Один з варіантів керування це використати JSON-based IPC протокол.
У документації є приклади, тому на їх основі запускаю плеєр в ОС Ubuntu.

Коли забув ти рідну мову, біднієш духом ти щодня...
When you forgot your native language you would become a poor at spirit every day ...

Д.Білоус / D.Bilous
Рабів до раю не пускають. Будь вільним!

ipv6 ready