#!/bin/bash # # Bash utility for getting specific network info # Author: Jake Meyer # Github: https://github.com/jakewmeyer # setglobal currentVersion = '"1.11.1'" setglobal configuredClient = ''"" ## This function determines which http get tool the system has installed and returns an error if there isnt one proc getConfiguredClient { if command -v curl &>/dev/null { setglobal configuredClient = '"curl'" } elif command -v wget &>/dev/null { setglobal configuredClient = '"wget'" } elif command -v fetch &>/dev/null { setglobal configuredClient = '"fetch'" } else { echo "Error: This tool reqires either curl, wget, or fetch to be installed." return 1 } } ## Allows to call the users configured client without if statements everywhere proc httpGet { match $configuredClient { with curl curl -A curl -s @Argv with wget wget -qO- @Argv with fetch fetch -o "..." } } # Parse arguments passed + help formatting proc usage { echo "Geo" echo "Description: Provides quick access for wan, lan, router, dns, mac, and ip geolocation data" echo "Usage: geo [flag]" echo " -w Returns WAN IP" echo " -l Returns LAN IP(s)" echo " -r Returns Router IP" echo " -d Returns DNS Nameserver" echo " -m Returns MAC address for interface. Ex. eth0" echo " -g Returns Current IP Geodata" echo "Examples:" echo " geo -g" echo " geo -wlrdgm eth0" echo "Custom Geo Output =>" echo "[all] [query] [city] [region] [country] [zip] [isp]" echo "Example: geo -a 8.8.8.8 -o city,zip,isp" echo " -o [options] Returns Specific Geodata" echo " -a [address] For specific ip in -s" echo " -v Returns Version" echo " -h Returns Help Screen" echo " -u Updates Bash-Snippets" exit } # Displays version number proc version { echo "Version $currentVersion"; } # Fetches WAN ip address proc wan_search { dig +short myip.opendns.com @resolver1.opendns.com } # Fetches current LAN ip address proc lan_search { if test $[uname] = "Darwin" { ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1' } elif test $[uname -s] = "Linux" { ip addr show | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1' } else { echo "OS not supported" exit 1 } } # Fetches Router ip address proc router_search { if test $[uname] = "Darwin" { netstat -rn | grep default | head -1 | awk '{print$2}' } elif test $[uname -s] = "Linux" { ip route | grep ^default'\s'via | head -1 | awk '{print$3}' } else { echo "OS not supported" exit 1 } } # Fetches DNS nameserver proc dns_search { if test $[uname] = "Darwin" { grep -i nameserver /etc/resolv.conf |head -n1|cut -d ' ' -f2 } elif test $[uname -s] = "Linux" { cat /etc/resolv.conf | grep -i ^nameserver | cut -d ' ' -f2 } else { echo "OS not supported" exit 1 } } # Fetches MAC address of proc mac_search { if test $[uname] = "Darwin" { ifconfig $MAC | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}' } elif test $[uname -s] = "Linux" { ip addr show $MAC | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}' | grep -v ff: } else { echo "OS not supported" exit 1 } } # Fetches current geodata based on ip proc geodata_search { httpGet "http://ip-api.com/line/?fields=query,city,region,country,zip,isp" } # Fetches specific geodata based on args proc specific_geo { if test $OPTIONS = "all" { httpGet "http://ip-api.com/line/$(ADDRESS)?fields=query,city,region,country,zip,isp" } else { httpGet "http://ip-api.com/line/$(ADDRESS)?fields=$(OPTIONS)" } } proc update { # Author: Alexander Epstein https://github.com/alexanderepstein # Update utility version 1.2.0 # To test the tool enter in the defualt values that are in the examples for each variable setglobal repositoryName = '"Bash-Snippets'" #Name of repostiory to be updated ex. Sandman-Lite setglobal githubUserName = '"alexanderepstein'" #username that hosts the repostiory ex. alexanderepstein setglobal nameOfInstallFile = '"install.sh'" # change this if the installer file has a different name be sure to include file extension if there is one setglobal latestVersion = $[httpGet https://api.github.com/repos/$githubUserName/$repositoryName/tags | grep -Eo '"name":.*?[^\\]",'| head -1 | grep -Eo "[0-9.]+] #always grabs the tag without the v option if [[ $currentVersion == "" || $repositoryName == "" || $githubUserName == "" || $nameOfInstallFile == "" ]]{ echo "Error: update utility has not been configured correctly." > !2 exit 1 } elif [[ $latestVersion == "" ]]{ echo "Error: no active internet connection" > !2 exit 1 } else { if [[ "$latestVersion" != "$currentVersion" ]] { echo "Version $latestVersion available" echo -n "Do you wish to update $repositoryName [Y/n]: " read -r answer if [[ "$answer" == "Y" || "$answer" == "y" ]] { cd ~ || do { echo 'Update Failed' ; exit 1 ; } if [[ -d ~/$repositoryName ]] { rm -r -f $repositoryName || do { echo "Permissions Error: try running the update as sudo"; exit 1; } ; } git clone "https://github.com/$githubUserName/$repositoryName" || do { echo "Couldn't download latest version" ; exit 1; } cd $repositoryName || do { echo 'Update Failed' ; exit 1 ;} git checkout "v$latestVersion" !2 > /dev/null || git checkout $latestVersion !2 > /dev/null || echo "Couldn't git checkout to stable release, updating to latest commit." chmod a+x install.sh #this might be necessary in your case but wasnt in mine. ./$nameOfInstallFile "update" || exit 1 cd .. rm -r -f $repositoryName || do { echo "Permissions Error: update succesfull but cannot delete temp files located at ~/$repositoryName delete this directory with sudo"; exit 1; } } else { exit 1 } } else { echo "$repositoryName is already the latest version" } } } proc checkInternet { echo "GET http://google.com HTTP/1.0\n\n" | nc google.com 80 > /dev/null !2 > !1 # query google with a get request if test $Status -eq 0 { #check if the output is 0, if so no errors have occured and we have connected to google successfully return 0 } else { echo "Error: no active internet connection" > !2 #sent to stderr return 1 } } # Option parsing "controller" setglobal optspec = '"uwlrdm:go:a:vh*:'" while getopts "$optspec" optchar { match $(optchar) { with w wan_search with l lan_search with r router_search with d dns_search with m env MAC=$OPTARG mac_search with g getConfiguredClient && checkInternet && geodata_search || exit 1 with a setglobal ADDRESS = $OPTARG with o getConfiguredClient && checkInternet && env OPTIONS=$OPTARG specific_geo || exit 1 with v version with h usage with u getConfiguredClient && checkInternet && update || exit 1 with * usage } } # Makes geo command default to help screen for usability if test $Argc -eq 0 { usage exit 0 } elif [[ $1 == "update" ]]{ getConfiguredClient && checkInternet && update || exit 1 } elif [[ $1 == "help" ]]{ usage exit 0 }