restructured, added installer, new functions

This commit is contained in:
BuildTools 2022-02-25 06:47:56 -08:00
parent a42d3fb431
commit 5ff18f3874
10 changed files with 568 additions and 143 deletions

81
install.sh Normal file
View file

@ -0,0 +1,81 @@
#!/bin/bash
# initial vars
rundir=${0%/*}
source ${rundir}/functions
scriptname=${0##*/}
runuser=$(whoami)
#-----------------------------------------------------------------#
# Script-specific Parameters
#-----------------------------------------------------------------#
VERSION=1.0
#-----------------------------------------------------------------#
# Script-specific Funcitons
#-----------------------------------------------------------------#
usage(){
boxtop
boxline "${lyl}$scriptname - v${VERSION}:${dfl}"
boxline "${lbl}Usage:${dfl}"
boxline "${lyl}$scriptname ${bld}[args]"
boxseparator
boxline "[args:]"
boxline " -i [--install]"
boxline " -r [--remove]"
boxline " -u [--update]"
boxline " -h [--help]"
boxbottom
}
install(){
scp -r $rundir/lib/skel/* $HOME
cp $rundir/lib/vimfiles/crystallite.vim /usr/share/vim/vim*/colors/crystallite.vim
cp $rundir/lib/vimfiles/vimrc.local /etc/vim/vimrc.local
}
remove(){
echo -e "\n"
}
update(){
pushd $rundir
remove
git fetch && git pull
install
popd
}
#------------------------------------------------------#
# Options and Arguments Parser
#------------------------------------------------------#
if [[ $runuser == root ]] ; then
case $1 in
-i | --install)
install
;;
-r | --remove)
remove
;;
-u | --update)
update
#sleep $ratelimit
exit 0
;;
-h | --help)
usage
;;
*)
warn "Invalid argument $@"
usage
#exit 2
;;
esac
else
fail "Must be run as user 'root'"
fi
#------------------------------------------------------#
# Script begins here
#------------------------------------------------------#

2
lib/quickinfo.cron Normal file
View file

@ -0,0 +1,2 @@
# quickinfo cronjob
0 */1 * * * $HOME/.bashrc.d/11-quickinfo.bashrc -c

0
.bashrc → lib/skel/.bashrc Executable file → Normal file
View file

272
functions → lib/skel/.bashrc.d/functions Executable file → Normal file
View file

@ -1,142 +1,130 @@
#!/bin/bash #!/bin/bash
# pyr0ball script functions library # pyr0ball script functions library
#
# Utilities (Setting up colors and bounding boxes) # Initial Vars
if [[ "$TERM" != "linux" ]] ; then scriptname=${0##*/}
red=$(echo -e "\033[38;5;1m") # red rundir=${0%/*}
grn=$(echo -e "\033[38;5;2m") # green runuser=$(whoami)
ylw=$(echo -e "\033[38;5;3m") # yellow
blu=$(echo -e "\033[38;5;27m") # blue # Utilities (Setting up colors and bounding boxes)
lbl=$(echo -e "\033[38;5;69m") # light blue if [[ "$TERM" != "linux" ]] ; then
mag=$(echo -e "\033[38;5;5m") # magenta red=$(echo -e "\033[38;5;1m") # red
cyn=$(echo -e "\033[38;5;6m") # cyan grn=$(echo -e "\033[38;5;2m") # green
pur=$(echo -e "\033[38;5;135m") # purple ylw=$(echo -e "\033[38;5;3m") # yellow
ong=$(echo -e "\033[38;5;166m") # orange blu=$(echo -e "\033[38;5;27m") # blue
lyl=$(echo -e "\033[38;5;228m") # light yellow lbl=$(echo -e "\033[38;5;69m") # light blue
lrd=$(echo -e "\033[38;5;196m") # light red mag=$(echo -e "\033[38;5;5m") # magenta
norm=$(echo -e "\033[38;5;9m") # default/normal cyn=$(echo -e "\033[38;5;6m") # cyan
# pur=$(echo -e "\033[38;5;135m") # purple
bld=$(echo -e "\033[1m") # bold ong=$(echo -e "\033[38;5;166m") # orange
unl=$(echo -e "\033[4m") # underline lyl=$(echo -e "\033[38;5;228m") # light yellow
blk=$(echo -e "\033[7m") # blinking not supported in our xterm, so reverse instead lrd=$(echo -e "\033[38;5;196m") # light red
nln=$(echo -e "\033[24") norm=$(echo -e "\033[38;5;9m") # default/normal
dfl=$(echo -e "\e[0m") #
fi bld=$(echo -e "\033[1m") # bold
unl=$(echo -e "\033[4m") # underline
# For drawing pretty menus and prompts blk=$(echo -e "\033[7m") # blinking not supported in our xterm, so reverse instead
terminal_width=$(tput cols) nln=$(echo -e "\033[24")
if [ $terminal_width -le 81 ] ; then dfl=$(echo -e "\e[0m")
BOXWIDTH=$((terminal_width - 1)) fi
else
BOXWIDTH=80 # For drawing pretty boxes
fi terminal_width=$(tput cols)
top_border=$(echo -e '\u2501') if [ $terminal_width -le 81 ] ; then
left_border=$(echo -e '\u2503') BOXWIDTH=$((terminal_width - 1))
right_border=$(echo -e '\u2503') else
left_top_border=$(echo -e '\u250f') BOXWIDTH=80
right_top_border=$(echo -e '\u2513') fi
left_bottom_border=$(echo -e '\u2517') top_border=$(echo -e '\u2501')
right_bottom_border=$(echo -e '\u251b') left_border=$(echo -e '\u2503')
right_border=$(echo -e '\u2503')
repchar(){ left_top_border=$(echo -e '\u250f')
n=1 right_top_border=$(echo -e '\u2513')
while [ $n -le $2 ] ; do left_bottom_border=$(echo -e '\u2517')
echo -n "$1" right_bottom_border=$(echo -e '\u251b')
n=$((n+1))
done repchar() {
} n=1
while [ $n -le $2 ] ; do
boxtop(){ echo -n "$1"
echo -n "$left_top_border" n=$((n+1))
repchar "$top_border" $((BOXWIDTH-1)) done
echo -n "$right_top_border" }
echo
} boxtop() {
echo -n "$left_top_border"
boxbottom(){ repchar "$top_border" $((BOXWIDTH-1))
echo -n "$left_bottom_border" echo -n "$right_top_border"
repchar "$top_border" $((BOXWIDTH-1)) echo
echo -n "$right_bottom_border" }
echo
} boxbottom() {
echo -n "$left_bottom_border"
boxline(){ repchar "$top_border" $((BOXWIDTH-1))
echo -e "$left_border $1\r\033[${BOXWIDTH}C$right_border" echo -n "$right_bottom_border"
} echo
}
boxseparator(){
echo -n "$left_border" boxline() {
repchar "-" $((BOXWIDTH-1)) echo -e "$left_border $1\r\033[${BOXWIDTH}C$right_border"
echo -n "$right_border" }
echo
} boxseparator(){
echo -n "$left_border"
success(){ repchar "-" $((BOXWIDTH-1))
echo -e "\n" echo -n "$right_border"
boxtop echo
boxline " ${script_name} ${grn}SUCCESS${dfl}$@" }
boxbottom
exit 0 success(){
} echo -e "\n"
boxtop
warn(){ boxline " ${scriptname} ${grn}SUCCESS${dfl}$@"
echo -e "\n" boxbottom
ec=$? exit 0
boxtop }
boxline "${lrd}WARNING${lyl}[${ong}code=${red}$ec${lyl}]: $@${dfl}"
boxbottom warn(){
} echo -e "\n"
ec=$?
fail(){ boxtop
ec=$? boxline "${lrd}WARNING${lyl}[${ong}code=${red}$ec${lyl}]: $@${dfl}"
echo -e "\n" boxbottom
boxtop }
boxline "${lrd}FAILED${lyl}[${ong}code=${red}$ec${lyl}]: $@${dfl}"
boxbottom fail(){
exit $ec ec=$?
} echo -e "\n"
boxtop
pushd(){ boxline "${lrd}FAILED${lyl}[${ong}code=${red}$ec${lyl}]: $@${dfl}"
command pushd "$@" > /dev/null boxbottom
} exit $ec
}
popd(){
command popd "$@" > /dev/null pushd(){
} command pushd "$@" > /dev/null
}
popdfail(){
ec=$? popd(){
popd command popd "$@" > /dev/null
$(exit $ec) #restore the exit code }
fail "$@"
} popdfail(){
ec=$?
ctrl_c(){ popd
fail "User interrupted with Ctrl-C" $(exit $ec) #restore the exit code
} fail "$@"
}
# ensure ctrl-c to cancel script ends the entire process and not just the current function
trap ctrl_c INT logger(){
#$@ 2>&1 | tee >(ts "[$scriptname][%d-%m-%y %H_%M_%S]" > $logfile) # This version of prepend requires the 'ts' utility from 'moreutils' package
# ensure runuser is service $@ 2>&1 | tee >(while IFS= read -r line; do printf '[%s] %s\n' "${scriptname}][$(date '+%Y-%m-%d %H:%M:%S')" "$line"; done >> $logfile)
#[ "$(whoami)" == "service" ] || fail "Must be run as service user (no sudo)" }
#-----------------------------------------------------------------# ctrl_c(){
# Script-specific Funcitons echo -e "\n"
#-----------------------------------------------------------------# fail "User interrupted with Ctrl-C"
}
#------------------------------------------------------# # ensure ctrl-c to cancel script ends the entire process and not just the current function
# Setup trap ctrl_c INT
#------------------------------------------------------#
#------------------------------------------------------#
# Options and Arguments Parser
#------------------------------------------------------#
#------------------------------------------------------#
# Script begins here
#------------------------------------------------------#

0
.vimrc → lib/skel/.vimrc Executable file → Normal file
View file

0
crystallite.vim → lib/vimfiles/crystallite.vim Executable file → Normal file
View file

View file

@ -1,7 +1,7 @@
if $TERM !~ "linux" if $TERM !~ "linux"
syntax on syntax on
set t_Co=256 set t_Co=256
colorscheme bdv_crystallite colorscheme crystallite
else else
syntax on syntax on
colorscheme default colorscheme default

354
scriptexample.sh Normal file
View file

@ -0,0 +1,354 @@
#!/bin/bash
# Moxa NPort Driver loader and watchdog script
# initial vars
scriptname=${0##*/}
rundir=${0%/*}
source ${rundir}/functions
#-----------------------------------------------------------------#
# Script-specific Parameters
#-----------------------------------------------------------------#
VERSION=1.0
logfile=/var/log/bdv/moxaloader.log
ratelimit=15
rst_threshold=1
god=/opt/ruby-enterprise/bin/god
pingfile=/usr/lib/npreal2/driver/pingup
daemonpid=$(ps -ef | grep -v grep | grep moxaloader.*daemon | awk {'print $2'})
config_sh=$(grep DNS /.AVC-X/etc/networking/profiles/default/ifcfg-Public)
resolv_conf=$(grep nameserver /.AVC-X/etc/networking/profiles/default/resolv.conf)
config_dev=$(grep DNS /.AVC-X/etc/networking/devices/ifcfg-Public)
sys_resolv_conf=$(grep nameserver /etc/resolv.conf)
etc_net_sh=$(grep DNS /etc/network-scripts/ifcfg-Public)
dns=$(grep DNS1 /.AVC-X/etc/networking/profiles/default/ifcfg-Public | cut -c 6-)
#-----------------------------------------------------------------#
# Script-specific Funcitons
#-----------------------------------------------------------------#
usage(){
boxtop
boxline "${lyl}Moxa NPort Watchdog & Recovery v$VERSION${dfl}"
boxseparator
boxline "Usage:"
boxline "$scriptname [FUNCTIONS][-d|--daemon|--usage|--version]"
boxseparator
boxline "-s | --start - Initializes the Moxa NPort Driver only and exits"
boxline "-S | --stop - stops the NPort driver and any ongoing daemonized watchdog"
boxline "-r | --restart - Restarts all BDV hardware services, and re-initialized moxa if DNS is valid"
boxline "-R | --force-restart - forces a restart of both the NPort driver and BDV services (assume -9)"
boxline "-p | --ping - Detect nPort online and write 'pingup' file if true or remove if false"
boxline "-P | --pid - returns the PID's of any ongoing NPort Driver processes"
boxline "-d | --daemon - daemonizes the service as a watchdog"
boxline "-F | --fix-dns - Checks system's DNS config and removes entries if invalid"
boxline "-u | --usage - Show this help text"
boxline "-h | --help - Show this help text"
boxline "-v | --version - returns the version of this script"
boxbottom
}
removedns(){
# Look for existing DNS entries if there are any
config_sh=$(grep DNS /.AVC-X/etc/networking/profiles/default/ifcfg-Public)
resolv_conf=$(grep nameserver /.AVC-X/etc/networking/profiles/default/resolv.conf)
resolv_search=$(grep search /.AVC-X/etc/networking/profiles/default/resolv.conf)
config_dev=$(grep DNS /.AVC-X/etc/networking/devices/ifcfg-Public)
sys_resolv_conf=$(grep nameserver /etc/resolv.conf)
sys_resolv_search=$(grep search /etc/resolv.conf)
etc_net_sh=$(grep DNS /etc/network-scripts/ifcfg-Public)
# Checks if the above variables are empty, and if all are, exits the function only
if [[ -z "$config_sh" && -z "$resolv_conf" && -z "$resolv_search" && -z "$config_dev" && -z "$sys_resolv_conf" && -z "$sys_resolv_search" && -z "$etc_net_sh" ]] ; then
logger echo -e "${grn}No DNS entries found${dfl}"
return 0
else
# If either of the above variables are not empty, proceeds with checking
# and printing their contents
if [[ ! -z "$config_sh" ]] ; then
logger echo -e "${lbl}Current DNS is set to:${dfl}"
logger echo -e "$config_sh"
# sed uses regex to detect and delete lines out of the configuration script
# files that contain DNS entries
sudo sed -i '/DNS/d' /.AVC-X/etc/networking/profiles/default/ifcfg-Public && logger echo -e "${ylw}Successfully removed DNS entries from ifcfg-Public${dfl}\n" || logger fail "${red}Unable to remove DNS entries from /.AVC-X/etc/networking/profiles/default/ifcfg-Public${dfl}"
fi
if [[ ! -z "$resolv_conf" ]] ; then
logger echo -e "${lbl}Current resolv.conf entry is${dfl}"
logger echo -e "$resolv_conf"
sudo sed -i '/nameserver/d' /.AVC-X/etc/networking/profiles/default/resolv.conf && logger echo -e "${ylw}Successfully removed DNS entries from resolv.conf${dfl}\n" || logger warn "${red}Unable to remove DNS entries from /.AVC-X/etc/networking/profiles/default/resolv.conf${dfl}"
fi
if [[ ! -z "$resolv_conf" ]] ; then
logger echo -e "${lbl}Current resolv.conf is searching${dfl}"
logger echo -e "$resolv_search"
sudo sed -i '/search/d' /.AVC-X/etc/networking/profiles/default/resolv.conf && logger echo -e "${ylw}Successfully removed DNS entries from resolv.conf${dfl}\n" || logger warn "${red}Unable to remove DNS entries from /.AVC-X/etc/networking/profiles/default/resolv.conf${dfl}"
fi
if [[ ! -z "$config_dev" ]] ; then
logger echo -e "${lbl}Current DNS is set to:${dfl}"
logger echo -e "$config_dev"
# sed uses regex to detect and delete lines out of the configuration script
# files that contain DNS entries
sudo sed -i '/DNS/d' /.AVC-X/etc/networking/devices/ifcfg-Public && logger echo -e "${ylw}Successfully removed DNS entries from ifcfg-Public${dfl}\n" || logger fail "${red}Unable to remove DNS entries from /.AVC-X/etc/networking/devices/ifcfg-Public${dfl}"
fi
if [[ ! -z "$sys_resolv_conf" ]] ; then
logger echo -e "${lbl}Current resolv.conf entry is${dfl}"
logger echo -e "$sys_resolv_conf"
sudo sed -i '/nameserver/d' /.AVC-X/etc/networking/profiles/default/resolv.conf && logger echo -e "${ylw}Successfully removed DNS entries from /etc/resolv.conf${dfl}\n" || logger warn "${red}Unable to remove DNS entries from /etc/resolv.conf${dfl}"
fi
if [[ ! -z "$sys_resolv_search" ]] ; then
logger echo -e "${lbl}Current resolv.conf is searching${dfl}"
logger echo -e "$sys_resolv_search"
sudo sed -i '/search/d' /.AVC-X/etc/networking/profiles/default/resolv.conf && logger echo -e "${ylw}Successfully removed DNS entries from /etc/resolv.conf${dfl}\n" || logger warn "${red}Unable to remove DNS entries from /etc/resolv.conf${dfl}"
fi
if [[ ! -z "$etc_net_sh" ]] ; then
logger echo -e "${lbl}Current DNS is set to:${dfl}"
logger echo -e "$etc_net_sh"
# sed uses regex to detect and delete lines out of the configuration script
# files that contain DNS entries
sudo sed -i '/DNS/d' /etc/network-scripts/ifcfg-Public && logger echo -e "${ylw}Successfully removed DNS entries from ifcfg-Public${dfl}\n" || logger fail "${red}Unable to remove DNS entries from /.AVC-X/etc/networking/profiles/default/ifcfg-Public${dfl}"
fi
return 1
fi
}
dnscheck(){
# The Moxa drivers are built in such a way that they will hang if no outside
# network is available, unless DNS entries are not present. Below checks for
# external network access, then removes dns entries if outside network is unavailable
# Check if dns entries exist
if [[ ! -z "$config_sh" || ! -z "$resolv_conf" || ! -z "$config_dev" || ! -z "$sys_resolv_conf" || ! -z "$etc_net_sh" ]] ; then
# If DNS entries are found, check that the server can ping them
logger echo -e "DNS Entries found, checking for internet connection"
ping -c 1 $dns >/dev/null 2>&1
if [[ $? != 0 ]] ; then
# If DNS entries are found, but not responding,
# remove DNS entries to prevent drivers from hanging on boot
logger echo -e "${ong}DNS $dns is not responding to ping${dfl}"
logger echo -e "Removing DNS entries from network configuration"
return 1
else
# If DNS entries are found, but responding, leave the entries intact
logger echo -e "${grn}DNS is responding, entries valid.${dfl}"
logger echo -e "${lyl}Proceeding with initialization.${dfl}"
return 0
fi
else
logger echo -e "DNS Entries not found, skipping DNS pingcheck"
return 0
fi
}
dnspurge(){
# Run first dns check and removal
removedns
# Run network reset
sudo /sbin/service network restart
# Run second dns check for lingering entries
logger echo -e "${pur}Re-checking dns entries${dfl}"
removedns
}
moxatty(){
ls /dev/tty* | grep -c ttyr00
}
# Checks moxa's online status and stores state via external 'pingtest' file
online(){
if [ ! -f $pingfile ] ; then
if ping -c 1 -W 1 $@ &> /dev/null ; then
echo 2
else
echo 1
fi
else
if ping -c 1 -W 1 $@ &> /dev/null ; then
echo 0
else
echo 3
fi
fi
}
# Checks moxa's online status and stores state in a variable
pingtest(){
if [[ $moxaonline == true ]] ; then
if ping -c 1 -W 1 $@ &> /dev/null ; then
echo 0
else
echo 3
fi
else
if ping -c 1 -W 1 $@ &> /dev/null ; then
echo 2
else
echo 1
fi
fi
}
# Launch the Moxa NPort loader application
start(){
/usr/lib/npreal2/driver/mxloadsvr
}
# Force terminate any instances of the Moxa NPort application
stop(){
sudo pkill -9 npreal2d
}
# Force stop of any daemonized instances of this script
fullstop(){
stop
sudo kill -9 $daemonpid
}
# Restart of multiple services is required to re-establish device control after
# the NPort loses its connection. The order of restarting these services is
# significant, and should be maintained.
restart(){
stop
start
god restart rs232
sudo /sbin/service SimpleHttpDeviceServer restart_noscript
sudo /sbin/service BDVHardwareManager restart
god restart steris_act
}
conditionalrestart(){
if [[ $(dnscheck) == 0 ]] ; then
stop
start
fi
god restart rs232
sudo /sbin/service SimpleHttpDeviceServer restart_noscript
sudo /sbin/service BDVHardwareManager restart
god restart steris_act
}
# Clears loop flag variables
clearflags(){
moxaonline=
pingfails=
state=
}
#------------------------------------------------------#
# Options and Arguments Parser
#------------------------------------------------------#
case $1 in
-s | start | --start)
start
exit 0
;;
-S | stop | --stop)
fullstop
exit $?
;;
-R | --force-restart)
fullstop
restart
exit 0
;;
-r | restart | --restart)
conditionalrestart
exit 0
;;
-p | ping | --ping)
online moxa
exit $?
;;
-P | pid | --pid)
echo -e "$daemonpid"
exit $?
;;
-d | daemon | --daemon)
start
;;
-u | --usage)
usage
exit -1
;;
-h | --help)
usage
exit -1
;;
-v | --version)
echo $VERSION
exit 0
;;
-F | --fix-dns)
purgedns
exit 0
;;
*)
warn "Invalid argument $@"
usage
exit -1
;;
esac
#-----------------------------------------------------------------#
# Process substitution to fork log output
# Only uncomment if all script output should be logged!
#-----------------------------------------------------------------#
# exec &> >(tee $logfile)
#------------------------------------------------------#
# Script begins here
#------------------------------------------------------#
logger boxtop
logger boxline "${lbl}Moxa NPort Driver Loader v$VERSION${dfl}"
logger boxbottom
# Unset flags
clearflags
while true ; do
state=$(online moxa)
case $state in
0) # State 0 = Moxa is online, and was online in previous loop. No action needed
boxtop
boxline "${grn}Moxa NPort Online...${dfl}"
boxbottom
moxaonline=true
;;
1) # State 1 = Moxa is offline, and was offline in previous loop. No action needed
boxtop
boxline "${lrd}Moxa NPort Offline${dfl}"
boxbottom
moxaonline=false
failpings=$((failpings+1))
;;
2) # State 2 = Moxa is online, but was offline in previous loop. Service Restart required to restore functionality and update moxaonline state
#if [[ $rst_threshold -gt $failpings ]] ; then
logger boxtop
logger boxline "${grn}Moxa NPort Came Online!${dfl}"
logger boxline "... ${lyl}Restarting Services${dfl} ..."
logger boxbottom
moxaonline=true
touch $pingfile
conditionalrestart
#fi
;;
3) # State 3 = Moxa is offline, but was online in previous loop. Start counting failed pings, and update moxaonline state
logger boxtop
logger boxline "${grn}Moxa NPort Has Gone Offline${dfl}"
logger boxline "${lyl}Awaiting Response before Restart${dfl} ..."
logger boxbottom
moxaonline=false
rm $pingfile
failpings=1
;;
esac
boxtop
boxline "Moxa Online = $moxaonline"
boxline "Checking again in $ratelimit seconds..."
boxbottom
sleep $ratelimit
done