THEAARBS sysadmin - nets

Published 12-29-2018 13:18:36

Raw

#!/bin/bash
# Bound to Mod+n

# Set menu properties
mymenu=$(setmenu -l)

# Where network documents are stored
Docs="/home/$USER/Documents/networks/"

# Where should log files be stored
Logs="/home/$USER/Logs/"

MenuChoices=\
"Info
Servers
Networking
Workstations
Printers
Ping
PullRC
Reboot
ShoVer
Time Entry
VPN"

runprefix=
tty=$(tty)
case $tty in
    *tty1|"not a tty") runprefix="$TERMINAL -e" ;;
esac

ClearExit() {
    clear
    exit 0
    }
SecurePW() {
    PassFile=$(mktemp)
    echo "$Password" >$PassFile
    }
Say() {
    (echo "$1" "$2" | lolcat)
    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 [ ! $Protocol = "KEY" ]
    then
        Say "🔗 Checking network connectivity."
        if ! ping -c 1 -w 5 "$HostAddr" &>/dev/null
        then connectvpn "$VPNType" "$VPNName" "$Network" ; fi
    fi
    [[ "$CommandChoice" == "Workstations" ]] && Protocol="RDP"
    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 ;;
                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