💾 Archived View for gemini.mingmengtou.org › publicipscript-source.gmi captured on 2023-09-28 at 16:47:02. Gemini links have been rewritten to link to archived content
⬅️ Previous capture (2021-12-04)
-=-=-=-=-=-=-
i am always keen to learn so i am open to suggestions for improvement. one of the points for me writing this script was to keep the process simple, understandable, well commented, and for me to learn. i will likely smile politely and then ignore suggestions to get this done in one line of [your favourite lang] and regex's:-)
#!/bin/bash # getpublicip.sh # # what this does # # get a public ip using a source randomly (sorta) selected # from a text file of public ip urls: publicipsources.txt # but change that filename if you want # we are playing nice and not bothering any source too much # check a log for our last ip # if it has changed # log the date time source url and ip: publicip.log # change that filename if you want # publicip log uses space as a delimiter # change DEFAULT_PUBLIC_IP_SOURCE to whatever you want # use absolute pathnames if you are going to cron this # # this script will expect a file with public ip sources but # will make it's own if necessary and not break # # useage # # if you extracted this from the tar.gz then this will # be in a directory: publicipscript # make the script executable and run it # or run it from bash or sh # or make the script executable and run it from cron # # changelog # # 20210302: first working version # 20210304: # - changed var names closer to bash convention # - added file exists check for sources and a default source # 20210306: # - added line to remove whitespace from curl response # - added check for empty or non numeric first char # curl response and set to "fail..." # - added even more comments for clarity re curl # 20210312: # - fixed bug for detecting first ip digit: it can be 0-9 # 20210313: # - changed date format to +%Y-%m-%d-%H:%M # - moved some comments to the top of the file # - added usage # 2021-03-16: # - changed date format again to be isoish: -u +%FT%TZ # ##################################################################### ##################################################################### # Copyright [2021] [neil c timms] # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License.# ##################################################################### ##################################################################### # how not to write a bash script or get this done efficiently:-) # # var for publicip.log, sources, and defaults PUBLIC_IP_LOG=publicip.log PUBLIC_IP_SOURCES=publicipsources.txt last_ip="none" DEFAULT_PUBLIC_IP_SOURCE="http://ifconfig.me" # # check that our publicip.log exists if [ -f "$PUBLIC_IP_LOG" ]; then # save our last ip from publicip.log last_ip=$(tail -1 $PUBLIC_IP_LOG | awk '{print $3}') fi # if it doesn't exist then we already have a last_ip # and will write PUBLIC_IP_LOG anyway so no need to make it now # # check that the publicipsources.txt file exists else make it # else make our sources file using our default source # get a random public ip source url for publicipsources.txt if [ -f "$PUBLIC_IP_SOURCES" ]; then ip_source=$(shuf -n 1 $PUBLIC_IP_SOURCES) else # we will make our PUBLIC_IP_SOURCES file # and set an ip_source echo $DEFAULT_PUBLIC_IP_SOURCE >> $PUBLIC_IP_SOURCES ip_source=$DEFAULT_PUBLIC_IP_SOURCE fi # # curl the public ip_source to set public_ip using curl option -s, silent # if curl fails to get a valid ip then public_ip can be empty # so we could check if empty with [ -z etc... # for info -n will check if not empty # but what if we get a webpage back and it starts with <? so # if public_ip doesn't start with 0-2 as an ip should # set it to "fail.etc" this also works if empty public_ip=$(curl -s $ip_source) # strip off any whitespace that might be there, or not public_ip="${public_ip//[[:space:]]/}" if [[ ! $public_ip =~ ^[0-9] ]] then public_ip="fail.to.get.ip" fi # # if the ip changed then log the new ip else do nothing if [ "$last_ip" != "$public_ip" ] then # log the date time and public ip to publicipsources.txt # we use >> to make publicip log if missing echo "$(date -u +%FT%TZ) $ip_source $public_ip" >> $PUBLIC_IP_LOG # for debugging uncomment the next two lines for logging all gets # else # echo "$(date -u +%FT%TZ) $ip_source $public_ip" >> $PUBLIC_IP_LOG fi # exit - that's all folks!
content licensed CC-BY-SA 4.0 unless stated.