#!/bin/bash
# Bound to Mod+n
case $(tty) in
*tty*) mymenu="dwmenu -l"
runprefix="$TERMINAL -e" ;;
*) mymenu="slmenu -l 8 -i -p"
runprefix= ;;
esac
# Where network documents are stored
Docs="/home/$USER/Documents/networks/"
# Where should log files be stored
Logs="/home/$USER/Logs/"
MenuChoices="Info\nServers\nNetworking\nWorkstations\nPrinters\nPing\nPullRC\nReboot\nShoVer\nTime Entry\nVPN"
ClearExit() { clear ; exit 0 ;}
SecurePW() {
PassFile=$(mktemp)
echo "$Password" >$PassFile ;}
Say() {
echo "$1" "$2"
notify-send "$1" "$2" ;}
MainMenu() {
Chosen=$(cat /tmp/nets-names | $mymenu "Choose a network:") || ClearExit
clear
[[ $Chosen = "Time Entry" ]] && timeentry && ClearExit
for i in $Docs* ; do
[[ $Chosen = $( (sed "3q;d" $i) | awk '{print $2;}' | cut -d '"' -f2) ]] && Document=$i
done
[[ -z $Document ]] && ClearExit
ScanDoc $Document
CommandMenu
}
CommandMenu() {
CommandChoice=$(echo -e "$MenuChoices" | $mymenu "$Network Command:")
clear
[[ -z $CommandChoice ]] && ClearExit
case $CommandChoice in
"Info") openfile $Document ; exit 0 ;;
"Time Entry") timeentry $Network ; exit 0 ;;
"VPN") connectvpn "$VPNType" "$VPNName" "$Network" ; exit 0 ;;
*) SubMenu ;;
esac
}
SubMenu() {
case $CommandChoice in
Ping) ChosenHost=$(echo -e "$ServerChoices\n$SwitchChoices\n$WorkPCChoices\n$DeviceChoices" | \
$mymenu "$Network Choose a device to ping:") ;;
Reboot) ChosenHost=$(echo -e "$ServerChoices" | $mymenu "$Network Choose a device to reboot:") ;;
PullRC) ChosenHost=$(echo -e "$CiscoChoices\nALL!" | $mymenu "$Network Cisco Devices:") ;;
ShoVer) ChosenHost=$(echo -e "$CiscoChoices\nALL!" | $mymenu "$Network Cisco Devices:") ;;
Servers) ChosenHost=$(echo -e "$ServerChoices" | $mymenu "$Network Servers:") ;;
Networking) ChosenHost=$(echo -e "$SwitchChoices" | $mymenu "$Network Networking Devices:") ;;
Workstations) ChosenHost=$(echo -e "$WorkPCChoices" | $mymenu "$Network PCs:") ;;
Printers) ChosenHost=$(echo -e "$DeviceChoices" | $mymenu "$Network Printers:") ;;
esac
clear
if [ -z $ChosenHost ]
then CommandMenu
elif [ $ChosenHost = "ALL!" ]
then
CiscoChoices=${CiscoChoices//'\n'/ }
for arg in $CiscoChoices ; do
ChosenHost=$arg
ExecuteMyCommand
done
Say "👍 Finished 'ALL!' tasks"
else
Skipopen="prompt"
ExecuteMyCommand
fi
}
ExecuteMyCommand() {
HostAddr=$(awk -F '|' '/^'$ChosenHost'/ { print $2 }' "$Document" | sed -e 's/^\s*//' -e '/^$/d' -e 's/\s*$//')
Protocol=$(awk -F '|' '/^'$ChosenHost'/ { print $3 }' "$Document" | sed -e 's/^\s*//' -e '/^$/d' -e 's/\s*$//')
Username=$(awk -F '|' '/^'$ChosenHost'/ { print $4 }' "$Document" | sed -e 's/^\s*//' -e '/^$/d' -e 's/\s*$//')
Password=$(awk -F '|' '/^'$ChosenHost'/ { print $5 }' "$Document" | sed -e 's/^\s*//' -e '/^$/d' -e 's/\s*$//')
EnablePw=$(awk -F '|' '/^'$ChosenHost'/ { print $6 }' "$Document" | sed -e 's/^\s*//' -e '/^$/d' -e 's/\s*$//')
if [ $CommandChoice = "Workstations" ] ; then Protocol="RDP" ; fi
if [ ! $Protocol = "KEY" ]
then
Say "🔗 Checking network connectivity."
if ! ping -c 1 -w 5 "$HostAddr" &>/dev/null
then connectvpn "$VPNType" "$VPNName" "$Network" ; fi
fi
if ! grep -R $ChosenHost.$Domain /etc/hosts &>/dev/null ; then
Line=$(echo -e "$HostAddr\t$ChosenHost.$Domain\t\t$ChosenHost")
sudo -- sh -c -e "echo '$Line' >> /etc/hosts" ; fi
case $CommandChoice in
Ping) $runprefix cping $HostAddr ;;
Reboot) SecurePW ; remotereboot "$Protocol" "$ChosenHost.$Domain" "$Username" "$PassFile" ;;
PullRC) SecurePW ; ciscorun "$ChosenHost" "$Username" "$PassFile" "$EnablePw" "$Network" "$Domain" "$Skipopen" ;;
ShoVer) SecurePW ; ciscover "$ChosenHost" "$Username" "$PassFile" "$EnablePw" "$Network" "$Domain" "$Skipopen" ;;
Servers|Networking|Workstations|Printers)
case $Protocol in
# HTTP|HTTPS) $BROWSER $HostAddr >/dev/null &disown ;;
HTTP|HTTPS) firefox $HostAddr >/dev/null &disown ;;
KEY)
LogFile="$Logs/nets/$(date +%b%d)/$(date +%H%M).$Network.SSH.$ChosenHost.log"
mkdir -p $Logs/nets/$(date +%b%d)/
> $LogFile
clear
$runprefix ssh $EnablePw &&
Say "⛔ Disconnected from $ChosenHost." ||
faillog $Network $Protocol $LogFile "$ChosenHost.$Domain" ;;
*SSH*|RDP)
LogFile="$Logs/nets/$(date +%b%d)/$(date +%H%M).$Network.$Protocol.$ChosenHost.log"
mkdir -p $Logs/nets/$(date +%b%d)/
> $LogFile
[[ $(echo -e "Scrape\nManual" | $mymenu "Scrape or input credentials?") = "Manual" ]] && \
temp1=$(inprompt "Username:") && temp2=$(dmenupass "Password:") && \
Username="$temp1" && Password="$temp2"
SecurePW
clear
connectcomputer "$Protocol" "$ChosenHost.$Domain" "$Username" "$PassFile" "$Network" "$LogFile" "$Domain" "$EnablePw" ||
faillog $Network $Protocol $LogFile "$ChosenHost.$Domain" ;;
esac ;;
esac
}
FindCiscoDevices() {
for arg in "$@" ; do
Protocol=$(awk -F '|' '/^'$arg'/ { print $3 }' "$Document" | sed -e 's/^\s*//' -e '/^$/d' -e 's/\s*$//')
[[ "$Protocol" == "CISCOSSH" ]] &&
CiscoChoices="$CiscoChoices $arg"
done
CiscoChoices=${CiscoChoices// /'\n'}
CiscoChoices=${CiscoChoices:2}
}
ScanDoc() {
Network= Domain= VPNType= VPNName=
SwitchChoices=() ServerChoices=() WorkPCChoices=() DeviceChoices=() CiscoChoices=()
local section temp skip_read=false a b
{
read
read
IFS=$'" \t' read -r __ Network
IFS=$'" \t' read -r __ Domain
IFS=$'" \t' read -r __ VPNType
IFS=$'" \t' read -r __ VPNName
while [[ $skip_read == true ]] || IFS=$' \t' read -r a b ; do
skip_read=false
case "$a $b" in
'## SWITCHING'*|'## SERVERS'|'## WORKSTATIONS'|'## PRINTERS')
section=$b
temp=()
while IFS=$' \t' read -r a b ; do
if [[ $a == '##' ]]
then skip_read=true ; break ; fi
if [[ $a != 'NAME' ]] && [[ $a != *---* ]]
then temp+=("$a") ; fi
done
case $section in
SWITCHING*) SwitchChoices="${temp[@]}"
FindCiscoDevices "${temp[@]}" ;;
SERVERS) ServerChoices="${temp[@]}" ;;
WORKSTATIONS) WorkPCChoices="${temp[@]}" ;;
PRINTERS) DeviceChoices="${temp[@]}" ;;
esac ;;
esac
done
SwitchChoices=${SwitchChoices// /'\n'}
SwitchChoices=${SwitchChoices:2:-2}
ServerChoices=${ServerChoices// /'\n'}
ServerChoices=${ServerChoices:2:-2}
WorkPCChoices=${WorkPCChoices// /'\n'}
WorkPCChoices=${WorkPCChoices:2:-2}
DeviceChoices=${DeviceChoices// /'\n'}
DeviceChoices=${DeviceChoices:2:-2}
} < "$1"
}
> ~/.config/networkalias
> /tmp/nets-names
for file in $Docs* ; do
echo $(sed "3q;d" $file | cut -d '"' -f2) >> /tmp/nets-names
echo alias $(basename "${file:0:-3}")=\"$EDITOR $file\" >> ~/.config/networkalias
done
echo "Time Entry" >> /tmp/nets-names
MainMenu
if [ ! $Network = "Home" ] && [ $(echo -e "Yes\nNo" | $mymenu "Make a time entry note?") == "Yes" ]
then timeentry $Network $SECONDS $ChosenHost
else ClearExit ; fi
exit 0