diff --git a/geo/geo b/geo/geo index 3dddf9e..eb827ef 100755 --- a/geo/geo +++ b/geo/geo @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/bin/bash # # Bash utility for getting specific network info @@ -6,6 +6,34 @@ # Github: https://github.com/jakewmeyer # +currentVersion="1.5.0" +configuredClient="" + +## This function determines which http get tool the system has installed and returns an error if there isnt one +getConfiguredClient() +{ + if command -v curl &>/dev/null ; then + configuredClient="curl" + elif command -v wget &>/dev/null ; then + configuredClient="wget" + elif command -v fetch &>/dev/null ; then + configuredClient="fetch" + else + echo "Error: This tool reqires either curl, wget, or fetch to be installed." + return 1 + fi + +} + +## Allows to call the users configured client without if statements everywhere +httpGet() +{ + case "$configuredClient" in + curl) curl -A curl -s "$@";; + wget) wget -qO- "$@";; + fetch) fetch -o "...";; + esac +} # Parse arguments passed + help formatting usage() { echo "Usage: geo [flag]" @@ -27,7 +55,7 @@ usage() { # Displays version number version() { - echo "Version 0.1.5"; + echo $currentVersion; } # Fetches WAN ip address @@ -85,20 +113,76 @@ mac_search() { # Fetches current geodata based on ip geodata_search() { - curl -sf "http://ip-api.com/line/?fields=query,city,region,country,zip,isp" + httpGet "http://ip-api.com/line/?fields=query,city,region,country,zip,isp" } # Fetches specific geodata based on args specific_geo() { if [ "$OPTIONS" = "all" ]; then - curl -s "http://ip-api.com/line/${ADDRESS}?fields=query,city,region,country,zip,isp" + httpGet "http://ip-api.com/line/${ADDRESS}?fields=query,city,region,country,zip,isp" else - curl -sf "http://ip-api.com/line/${ADDRESS}?fields=${OPTIONS}" + httpGet "http://ip-api.com/line/${ADDRESS}?fields=${OPTIONS}" fi } + +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 + repositoryName="Bash-Snippets" #Name of repostiory to be updated ex. Sandman-Lite + githubUserName="alexanderepstein" #username that hosts the repostiory ex. alexanderepstein + nameOfInstallFile="install.sh" # change this if the installer file has a different name be sure to include file extension if there is one + 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 == "" ]];then + echo "Error: update utility has not been configured correctly." >&2 + exit 1 + elif [[ $latestVersion == "" ]];then + echo "Error: no active internet connection" >&2 + exit 1 + else + if [[ "$latestVersion" != "$currentVersion" ]]; then + echo "Version $latestVersion available" + echo -n "Do you wish to update $repositoryName [Y/n]: " + read -r answer + if [[ "$answer" == "Y" || "$answer" == "y" ]] ;then + cd ~ || { echo 'Update Failed' ; exit 1 ; } + if [[ -d ~/$repositoryName ]]; then rm -r -f $repositoryName || { echo "Permissions Error: try running the update as sudo"; exit 1; } ; fi + git clone "https://github.com/$githubUserName/$repositoryName" || { echo "Couldn't download latest version" ; exit 1; } + cd $repositoryName || { 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 || { echo "Permissions Error: update succesfull but cannot delete temp files located at ~/$repositoryName delete this directory with sudo"; exit 1; } + else + exit 1 + fi + else + echo "$repositoryName is already the latest version" + fi + fi + +} + + + +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 [ $? -eq 0 ]; then #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 + fi +} + + # Option parsing "controller" -optspec="wlrdm:go:a:vh*:" +optspec="uwlrdm:go:a:vh*:" while getopts "$optspec" optchar do case "${optchar}" in @@ -107,11 +191,12 @@ do r) router_search ;; d) dns_search ;; m) MAC=$OPTARG mac_search;; - g) geodata_search ;; + g) getConfiguredClient && checkInternet && geodata_search || exit 1 ;; a) ADDRESS=$OPTARG ;; - o) OPTIONS=$OPTARG specific_geo ;; + o) getConfiguredClient && checkInternet && OPTIONS=$OPTARG specific_geo || exit 1 ;; v) version ;; h) usage ;; + u) getConfiguredClient && checkInternet && update || exit 1 ;; *) usage ;; esac done @@ -121,4 +206,6 @@ if [ $# -eq 0 ]; then usage exit 0 +elif [[ $1 == "update" ]];then getConfiguredClient && checkInternet && update || exit 1 +elif [[ $1 == "help" ]];then usage fi