Advertisement
Guduche

speedtest-start

Aug 10th, 2017
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.60 KB | None | 0 0
  1. #!/usr/bin/env bash
  2. ### speedtest-csv {{SPEEDTEST_CSV_VERSION}}
  3. ###
  4. ### Usage:
  5. ### speedtest-csv [options]
  6. ###
  7. ### Options:
  8. ### --header Display field names (only)
  9. ###
  10. ### --header-units Units (ms, Mbit/s and km) are in header (default)
  11. ### --no-header-units Units are in the values
  12. ### --standardize Standardize units and number formats (default)
  13. ### --no-standardize Disable --standardize
  14. ### --share Generate and provide a URL to the speedtest.net
  15. ### share results image (default)
  16. ### --no-share Disable --share
  17. ###
  18. ### --quote <str> Quote fields using <str> (default: none)
  19. ### --sep <str> Separate fields using <str> (default '\t')
  20. ###
  21. ### --help This help
  22. ### --version Display version
  23. ###
  24. ### --debug Output extra debug information
  25. ### --last Use most recent stats, if available
  26. ### (avoids calling `speedtest-cli`)
  27. ###
  28. ### Any other options are passed to speedtest-cli as is.
  29. ###
  30. ### Example:
  31. ### speedtest-csv --header
  32. ### speedtest-csv
  33. ###
  34. ### # Defaults in speedtest-csv (<= 1.3.0):
  35. ### speedtest-csv --sep ';' --no-standardize --no-header-units
  36. ###
  37. ### Installed dependencies:
  38. ### speedtest-cli {{SPEEDTEST_CLI_VERSION}} (https://github.com/sivel/speedtest-cli)
  39. ### python {{PYTHON_VERSION}}
  40. ###
  41. ### Copyright: 2014-2017 Henrik Bengtsson
  42. ### License: GPL (>= 2.1) (https://www.gnu.org/licenses/gpl.html)
  43. call="$0 $*"
  44.  
  45. SPEEDTEST_CSV_VERSION="2.0.1"
  46.  
  47. # In case speedtest-cli is in the same directory
  48. # as speedtest-csv, but neither is on the PATH
  49. PATH=$(dirname $0):$PATH
  50.  
  51. # Temporary file holding speedtest-cli output
  52. user=$USER
  53. if [[ -z $user ]]; then
  54. user=$USERNAME
  55. fi
  56. log=/tmp/$user/speedtest-csv.log
  57.  
  58. # Local functions
  59. function mecho() { echo "$@" 1>&2; }
  60. function mdebug() {
  61. if [[ $debug == true ]]; then
  62. mecho "[DEBUG] $@";
  63. fi
  64. }
  65. function str_extract() {
  66. pattern=$1
  67. # Extract
  68. res=`grep "$pattern" $log | sed "s/$pattern//g"`
  69. # Drop trailing '...'
  70. res=`echo $res | sed 's/[.][.][.]//g'`
  71. # WORKAROUND: Drop stray preceeding '.' (Issue #19)
  72. res=`echo $res | sed 's/^[.]*//g'`
  73. # Trim
  74. res=`echo $res | sed 's/^ *//g' | sed 's/ *$//g'`
  75. echo $res
  76. }
  77.  
  78. debug=false
  79. header=false
  80. standardize=true
  81. share=true
  82. last=false
  83. version=false
  84. help=false
  85. header_units=true
  86.  
  87. # Character for separating values
  88. sep="\t"
  89. quote=""
  90. opts=
  91.  
  92. # Parse command-line options
  93. while [[ $# > 0 ]]; do
  94. opt=$1
  95. if [[ "$opt" == "--header" ]]; then
  96. header=true
  97. elif [[ "$opt" == "--header-units" ]]; then
  98. header_units=true
  99. elif [[ "$opt" == "--no-header-units" ]]; then
  100. header_units=false
  101. elif [[ "$opt" == "--quote" ]]; then
  102. quote=$2
  103. shift
  104. elif [[ "$opt" == "--sep" ]]; then
  105. sep=$2
  106. shift
  107. elif [[ "$1" == "--share" ]]; then
  108. share=true
  109. elif [[ "$1" == "--no-share" ]]; then
  110. share=false
  111. elif [[ "$1" == "--standardize" ]]; then
  112. standardize=true
  113. elif [[ "$1" == "--no-standardize" ]]; then
  114. standardize=false
  115. elif [[ "$1" == "--last" ]]; then
  116. last=true
  117. elif [[ "$1" == "--debug" ]]; then
  118. debug=true
  119. elif [[ "$1" == "--version" ]]; then
  120. version=true
  121. elif [[ "$1" == "--help" ]]; then
  122. help=true
  123. else
  124. opts="$opts $1"
  125. fi
  126. shift
  127. done
  128.  
  129. if [[ $share == true ]]; then
  130. opts="$opts --share"
  131. fi
  132.  
  133. # Trim
  134. opts=`echo $opts | sed 's/^ *//g' | sed 's/ *$//g'`
  135.  
  136. if [[ -n "$SPEEDTEST_CSV_SKIP" ]]; then
  137. mdebug "\$SPEEDTEST_CSV_SKIP => --last"
  138. last=true
  139. fi
  140.  
  141. if [[ $debug == true ]]; then
  142. mdebug "call: $call"
  143. mdebug "header: $header"
  144. mdebug "header_units: $header_units"
  145. mdebug "standardize: $standardize"
  146. mdebug "share: $share"
  147. mdebug "last: $last"
  148. mdebug "version: $version"
  149. mdebug "field delimiter: '$sep'"
  150. mdebug "quotation mark: $quote"
  151. mdebug "speedtest-cli options: $opts"
  152. fi
  153.  
  154. if [[ $version == true ]]; then
  155. echo ${SPEEDTEST_CSV_VERSION}
  156. exit 0
  157. fi
  158.  
  159. if [[ $help == true ]]; then
  160. SPEEDTEST_CLI_VERSION=$(speedtest-cli --version 2>&1)
  161. if [[ $? -ne 0 ]]; then
  162. SPEEDTEST_CLI_VERSION="<PLEASE INSTALL>"
  163. fi
  164. PYTHON_VERSION=$(python --version 2>&1)
  165. if [[ $? -ne 0 ]]; then
  166. PYTHON_VERSION="<PLEASE INSTALL>"
  167. else
  168. PYTHON_VERSION=${PYTHON_VERSION/Python /}
  169. fi
  170. grep "^###" $0 | grep -v "^####" | cut -b 5- | sed "s/{{SPEEDTEST_CSV_VERSION}}/${SPEEDTEST_CSV_VERSION}/" | sed "s/{{SPEEDTEST_CLI_VERSION}}/${SPEEDTEST_CLI_VERSION}/" | sed "s/{{PYTHON_VERSION}}/${PYTHON_VERSION}/"
  171. exit 0
  172. fi
  173.  
  174. # Display header?
  175. if [[ $header == true ]]; then
  176. mdebug "Generating header"
  177. start="start"
  178. stop="stop"
  179. from="from"
  180. from_ip="from_ip"
  181. server="server"
  182. share_url="share_url"
  183. if [[ $header_units == true ]]; then
  184. server_dist="server_dist (km)"
  185. server_ping="server_ping (ms)"
  186. download="download (Mbit/s)"
  187. upload="upload (Mbit/s)"
  188. else
  189. server_dist="server_dist"
  190. server_ping="server_ping"
  191. download="download"
  192. upload="upload"
  193. fi
  194. else
  195. mkdir -p $(dirname $log)
  196.  
  197. start=$(date +"%Y-%m-%d %H:%M:%S")
  198.  
  199. if [[ $last == true && -f "$log" ]]; then
  200. # Reuse existing results (useful for debugging)
  201. mdebug "Reusing existing results: $log"
  202. else
  203. # Query Speedtest
  204. cmd="speedtest-cli $opts"
  205. mdebug "Querying Speedtest using '$cmd'"
  206. $cmd > $log
  207. status=$?
  208. mdebug "Exit code: $status"
  209. fi
  210.  
  211. stop=$(date +"%Y-%m-%d %H:%M:%S")
  212.  
  213. # Was speedtest-cli successful?
  214. if [[ $status -ne 0 ]]; then
  215. mecho "ERROR: '$cmd' failed (exit code $status)."
  216. mecho $(cat /tmp/$user/speedtest-csv.log)
  217. exit $status
  218. fi
  219.  
  220. # Raw results
  221. if [[ $debug == true ]]; then
  222. mdebug "Raw results"
  223. bfr=$(cat $log | tr '\n' '~')
  224. echo "[DEBUG] - ${bfr}" | sed 's/~/\n[DEBUG] - /g' | head -n -1 1>&2;
  225. fi
  226.  
  227. # Parse
  228. mdebug "Parsing results"
  229. from=$(str_extract "Testing from ")
  230. from_ip=$(echo $from | sed 's/.*(//g' | sed 's/).*//g')
  231. from=$(echo $from | sed 's/ (.*//g')
  232. server=$(str_extract "Hosted by ")
  233. server_ping=$(echo $server | sed 's/.*: //g')
  234. server=$(echo $server | sed 's/: .*//g')
  235. server_dist=$(echo $server | sed 's/.*\[//g' | sed 's/\].*//g')
  236. server=$(echo $server | sed 's/ \[.*//g')
  237.  
  238. download=$(str_extract "Download: ")
  239. upload=$(str_extract "Upload: ")
  240. if [[ $share == true ]]; then
  241. share_url=$(str_extract "Share results: ")
  242. else
  243. share_url=
  244. fi
  245.  
  246. # Standardize units?
  247. if [[ $standardize == true ]]; then
  248. ## Mbits/s -> Mbit/s
  249. mdebug "Standardize to Mbit/s"
  250. download=$(echo $download | sed 's/Mbits/Mbit/')
  251. upload=$(echo $upload | sed 's/Mbits/Mbit/')
  252.  
  253. ## commas to periods
  254. mdebug "Standardize to periods (not commas)"
  255. download=$(echo $download | sed 's/,/./')
  256. upload=$(echo $upload | sed 's/,/./')
  257. server_dist=$(echo $server_dist | sed 's/,/./')
  258. server_ping=$(echo $server_ping | sed 's/,/./')
  259. fi
  260.  
  261. if [[ $header_units == true ]]; then
  262. download=$(echo $download | sed 's/ .*//')
  263. upload=$(echo $upload | sed 's/ .*//')
  264. server_dist=$(echo $server_dist | sed 's/ .*//')
  265. server_ping=$(echo $server_ping | sed 's/ .*//')
  266. fi
  267.  
  268. mdebug "start: '$start'"
  269. mdebug "stop: '$stop'"
  270. mdebug "from: '$from'"
  271. mdebug "from_ip: '$from_ip'"
  272. mdebug "server: '$server'"
  273. mdebug "server_dist: '$server_dist'"
  274. mdebug "server_ping: '$server_ping'"
  275. mdebug "download: '$download'"
  276. mdebug "upload: '$upload'"
  277. mdebug "share_url: '$share_url'"
  278. fi
  279.  
  280.  
  281. # Output CSV results
  282. #sep="$quote$sep$quote"
  283. #printf "$quote$start$sep$stop$sep$from$sep$from_ip$sep$server$sep$server_dist$sep$server_ping$sep$download$sep$upload$sep$share_url$quote\n"
  284.  
  285. # Output
  286. #sep="$quote$sep$quote"
  287. dateday=$(date +"%d.%m.%Y")
  288. datetime=$(date +"%H:%M")
  289. printf "$dateday;$datetime;$server_ping;$download;$upload\n"
  290. #printf "ping: $server_ping\n"
  291. #printf "download: $download\n"
  292. #printf "upload: $upload\n"
  293.  
  294. # Send to IFTTT
  295. secret_key="SECRET_KEY"
  296. value1=`echo $server_ping | cut -d" " -f1`
  297. value2=`echo $download | cut -d" " -f1`
  298. value3=`echo $upload | cut -d" " -f1`
  299. json="{\"value1\":\"'${value1}\",\"value2\":\"'${value2}\",\"value3\":\"'${value3}\"}"
  300. curl -X POST -H "Content-Type: application/json" -d "${json}" https://maker.ifttt.com/trigger/speedtest/with/key/${secret_key} >> /dev/null
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement