Add bash trap article

This commit is contained in:
Yorick Barbanneau 2022-07-05 00:23:16 +02:00
parent af9f9b65be
commit 9e3e4729ab
7 changed files with 601 additions and 0 deletions

View file

@ -0,0 +1,55 @@
#!/usr/bin/env bash
DATE_FMT="+%s"
msg() {
local message="$*"
[ -z "$message" ] && return
if [ -t 1 ]
then
printf "%b\n" "$message"
else
log "$message"
fi
}
log() {
local message="${*-}"
[ -z "$message" ] && return
printf "%s %b\n" "$(date $DATE_FMT)" "$message"
}
debug() {
local message="$*"
[[ -z $DEBUG || $DEBUG -ne 1 ]] && return
[ -z "$message" ] && return
message="DEBUG [${BASH_SOURCE[1]}:${FUNCNAME[1]}]: $message"
if [ -t 2 ]
then
>&2 msg "\e[34m$message\e[0m"
else
>&2 log "$message"
fi
}
error() {
local message="$*"
[ -z "$message" ] && return
message="ERROR: $message"
if [[ -n $DEBUG && $DEBUG -eq 1 ]]
then
message="$message\n\tstack trace:\n"
for (( i=1; i<${#FUNCNAME[@]}; i++ ))
do
message="${message}\t source:${BASH_SOURCE[i]}"
message="${message} function:${FUNCNAME[$i]}"
message="${message} line:${BASH_LINENO[$i-1]}\n"
done
fi
if [ -t 2 ]
then
>&2 msg "\e[31m$message\e[0m"
else
>&2 log "$message"
fi
}

View file

@ -0,0 +1,49 @@
#!/usr/bin/env bash
server="192.168.0.254 -i ~/.ssh/rick.epha.se.ed25519"
user="ephase"
# Reutilisons ce que nous avons créé lors du précédent article
source ./message.sh
ssh_sock="/tmp/$(mktemp -u XXXXXXXXXX)"
connect() {
msg "Create SSH main connection wih socket ${ssh_sock}"
ssh -N -o ControlMaster=yes -o ControlPath="$ssh_sock" -f ${user}@${server} || {
error "Can't connect to $server";
exit 20;
}
}
launch_command() {
if [ -z "$1" ]
then
error "Launch command require 1 parameter"
exit 31
fi
local command
command="$1"
ssh -q -t -S "$ssh_sock" ${user}@${server} "$command" || {
error "";
exit 30;
}
}
cleanup() {
# close the master control connexion before
msg "Close SSH main connection"
ssh -q -o ControlPath="$ssh_sock" -O exit $server || {
error "Can't close SSH master connection, $ssh_sock remain";
}
}
connect
trap cleanup EXIT
if [ "$1" = "error" ]
then
launch_command
fi
for (( i=1; i<=5; i++ ))
do
launch_command "echo 'Message N°$i from $server'"
sleep 5
done

View file

@ -0,0 +1,56 @@
#!/usr/bin/env bash
server="192.168.0.254 -i ~/.ssh/rick.epha.se.ed25519"
user="ephase"
# Reutilisons ce que nous avons créé lors du précédent article
source ./message.sh
ssh_sock="/tmp/$(mktemp -u XXXXXXXXXX)"
connect() {
msg "Create SSH main connection wih socket ${ssh_sock}"
ssh -N -o ControlMaster=yes -o ControlPath="$ssh_sock" -f ${user}@${server} || {
error "Can't connect to $server";
exit 20;
}
}
launch_command() {
if [ -z "$1" ]
then
error "Launch command require 1 parameter"
exit 31
fi
local command
command="$1"
ssh -q -t -S "$ssh_sock" ${user}@${server} "$command" || {
error "";
exit 30;
}
}
cleanup() {
# close the master control connexion before
msg "Close SSH main connection"
ssh -q -o ControlPath="$ssh_sock" -O exit $server || {
error "Can't close SSH master connection, $ssh_sock remain";
}
}
process_int() {
error "Script interrupted by user (SIGINT)"
exit 255
}
connect
trap cleanup EXIT
trap process_int INT
if [ "$1" = "error" ]
then
launch_command
fi
for (( i=1; i<=5; i++ ))
do
launch_command "echo 'Message N°$i from $server'"
sleep 5
done

View file

@ -0,0 +1,40 @@
#!/usr/bin/env bash
server="192.168.0.254 -i ~/.ssh/rick.epha.se.ed25519"
user=ephase
source message.sh
ssh_sock="/tmp/$(mktemp -u XXXXXXXXXX)"
connect() {
msg "Create SSH main connection wih socket ${ssh_sock}"
ssh -N -o ControlMaster=yes -o ControlPath="$ssh_sock" -f ${user}@${server} || {
# reuse
error "Can't connect to $server";
exit 210;
}
}
launch_command() {
local command
command="$1"
ssh -q -t -S "$ssh_sock" ${user}@${server} "$command"
}
cleanup() {
# close the master control connexion before
msg "Close SSH main connection"
ssh -q -o ControlPath="$ssh_sock" -O exit ${server} || {
error "Can't close SSH master connection, $ssh_sock remain";
exit 21;
}
exit
}
trap "cleanup 255" INT ERR
trap "cleanup" EXIT
connect
for (( i=10; i<=20; i++ ))
do
launch_command "echo 'Message N°$i from ${server}'"
sleep 1
done

View file

@ -0,0 +1,65 @@
#!/usr/bin/env bash
server="192.168.0.254 -i ~/.ssh/rick.epha.se.ed25519"
user="ephase"
# Reutilisons ce que nous avons créé lors du précédent article
source ./message.sh
ssh_sock="/tmp/$(mktemp -u XXXXXXXXXX)"
connect() {
msg "Create SSH main connection wih socket ${ssh_sock}"
ssh -N -o ControlMaster=yes -o ControlPath="$ssh_sock" -f ${user}@${server} || {
error "Can't connect to $server";
exit 20;
}
}
launch_command() {
if [ -z "$1" ]
then
error "Launch command require 1 parameter"
exit 31
fi
local command
command="$1"
ssh -q -t -S "$ssh_sock" ${user}@${server} "$command" || {
error "";
exit 30;
}
}
cleanup() {
# close the master control connexion before
msg "Close SSH main connection"
ssh -q -o ControlPath="$ssh_sock" -O exit $server || {
error "Can't close SSH master connection, $ssh_sock remain";
}
}
process_int() {
error "Script interrupted by user (SIGINT)"
exit 255
}
check_conn() {
msg "Check connection on ${server}"
ssh -S "$ssh_sock" -O check $server
sleep 20
}
msg "Current PID: $$"
connect
trap cleanup EXIT
trap process_int INT
trap check_conn USR1
if [ "$1" = "error" ]
then
launch_command
fi
for (( i=1; i<=20; i++ ))
do
launch_command "echo 'Message N°$i from $server'"
sleep 2
done