ilawn-hark.sh - gopher-lawn - The gopher lawn gopher directory project. Err bitreich.org 70 hgit clone git://bitreich.org/gopher-lawn/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/gopher-lawn/ URL:git://bitreich.org/gopher-lawn/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/gopher-lawn/ bitreich.org 70 1Log /scm/gopher-lawn/log.gph bitreich.org 70 1Files /scm/gopher-lawn/files.gph bitreich.org 70 1Refs /scm/gopher-lawn/refs.gph bitreich.org 70 1Tags /scm/gopher-lawn/tag bitreich.org 70 i--- Err bitreich.org 70 ilawn-hark.sh (4426B) Err bitreich.org 70 i--- Err bitreich.org 70 i 1 #!/bin/bash Err bitreich.org 70 i 2 # Err bitreich.org 70 i 3 # Originally written by pazz0. Err bitreich.org 70 i 4 # Err bitreich.org 70 i 5 Err bitreich.org 70 i 6 errorthreshold=3 Err bitreich.org 70 i 7 timeout=15 Err bitreich.org 70 i 8 maxworkers=8 Err bitreich.org 70 i 9 onionsocksproxy="127.0.0.1:9050" Err bitreich.org 70 i 10 Err bitreich.org 70 i 11 function tcpdial() { Err bitreich.org 70 i 12 if [ -z "${1##*.onion}" ]; Err bitreich.org 70 i 13 then Err bitreich.org 70 i 14 nc -w "${timeout}" -X 5 -x "${onionsocksproxy}" "$1" "$2" \ Err bitreich.org 70 i 15 2>/dev/null Err bitreich.org 70 i 16 else Err bitreich.org 70 i 17 nc -w "${timeout}" "$1" "$2" 2>/dev/null Err bitreich.org 70 i 18 fi Err bitreich.org 70 i 19 } Err bitreich.org 70 i 20 Err bitreich.org 70 i 21 function checkgopher() { Err bitreich.org 70 i 22 if [ "$#" -gt 3 ]; Err bitreich.org 70 i 23 then Err bitreich.org 70 i 24 data="$(printf "%s\t%s\r\n" "$3" "$4" \ Err bitreich.org 70 i 25 | tcpdial "$1" "$2" \ Err bitreich.org 70 i 26 | dd bs=128 count=1 2>/dev/null)" Err bitreich.org 70 i 27 else Err bitreich.org 70 i 28 data="$(printf "%s\r\n" "$3" \ Err bitreich.org 70 i 29 | tcpdial "$1" "$2" \ Err bitreich.org 70 i 30 | dd bs=128 count=1 2>/dev/null)" Err bitreich.org 70 i 31 fi Err bitreich.org 70 i 32 Err bitreich.org 70 i 33 if [ -z "${data}" ]; Err bitreich.org 70 i 34 then Err bitreich.org 70 i 35 printf "Can't connect, timeout or no content\n" Err bitreich.org 70 i 36 return 1 Err bitreich.org 70 i 37 fi Err bitreich.org 70 i 38 Err bitreich.org 70 i 39 if [ -z "${data##3?* *}" ]; Err bitreich.org 70 i 40 then Err bitreich.org 70 i 41 printf "Got type '3' on first line\n" Err bitreich.org 70 i 42 return 1 Err bitreich.org 70 i 43 fi Err bitreich.org 70 i 44 Err bitreich.org 70 i 45 if [ -z "${data##Error: File or directory not found!*}" ] \ Err bitreich.org 70 i 46 || [ -z "${data##Error: Access denied!*}" ]; Err bitreich.org 70 i 47 then Err bitreich.org 70 i 48 printf "Got Gophernicus error\n" Err bitreich.org 70 i 49 return 1 Err bitreich.org 70 i 50 fi Err bitreich.org 70 i 51 Err bitreich.org 70 i 52 return 0 Err bitreich.org 70 i 53 } Err bitreich.org 70 i 54 Err bitreich.org 70 i 55 function checkhttp() { Err bitreich.org 70 i 56 # max. one redirect (2) for http->https things Err bitreich.org 70 i 57 bc="$(curl -L --max-redirs 2 -m "${timeout}" -f "$1" 2>/dev/null \ Err bitreich.org 70 i 58 | dd bs=16 count=1 2>/dev/null \ Err bitreich.org 70 i 59 | wc -c \ Err bitreich.org 70 i 60 | xargs)" Err bitreich.org 70 i 61 if [ "${bc}" -eq 0 ]; Err bitreich.org 70 i 62 then Err bitreich.org 70 i 63 printf "Can't connect, timout, too many redirects or no content\n" Err bitreich.org 70 i 64 return 1 Err bitreich.org 70 i 65 fi Err bitreich.org 70 i 66 Err bitreich.org 70 i 67 return 0 Err bitreich.org 70 i 68 } Err bitreich.org 70 i 69 Err bitreich.org 70 i 70 function checkcso() { Err bitreich.org 70 i 71 bc="$(printf "status\r\n" \ Err bitreich.org 70 i 72 | tcpdial "$1" "$2" \ Err bitreich.org 70 i 73 | dd bs=16 count=1 2>/dev/null \ Err bitreich.org 70 i 74 | wc -c \ Err bitreich.org 70 i 75 | xargs)" Err bitreich.org 70 i 76 if [ "${bc}" -eq 0 ]; Err bitreich.org 70 i 77 then Err bitreich.org 70 i 78 printf "Can't connect, timeout or no content\n" Err bitreich.org 70 i 79 return 1 Err bitreich.org 70 i 80 fi Err bitreich.org 70 i 81 Err bitreich.org 70 i 82 return 0 Err bitreich.org 70 i 83 } Err bitreich.org 70 i 84 Err bitreich.org 70 i 85 function checkraw() { Err bitreich.org 70 i 86 bc="$(tcpdial "$1" "$2" \ Err bitreich.org 70 i 87 | dd bs=16 count=1 2>/dev/null \ Err bitreich.org 70 i 88 | wc -c \ Err bitreich.org 70 i 89 | xargs)" Err bitreich.org 70 i 90 if [ "${bc}" -eq 0 ]; Err bitreich.org 70 i 91 then Err bitreich.org 70 i 92 printf "Can't connect, timeout or no content\n" Err bitreich.org 70 i 93 return 1 Err bitreich.org 70 i 94 fi Err bitreich.org 70 i 95 Err bitreich.org 70 i 96 return 0 Err bitreich.org 70 i 97 } Err bitreich.org 70 i 98 Err bitreich.org 70 i 99 program="$(readlink -f "$0")" Err bitreich.org 70 i 100 Err bitreich.org 70 i 101 if [ "${LAWNHARK_WORKER}" = "1" ]; Err bitreich.org 70 i 102 then Err bitreich.org 70 i 103 statedir="$1" Err bitreich.org 70 i 104 checktime="$2" Err bitreich.org 70 i 105 f="$3" Err bitreich.org 70 i 106 Err bitreich.org 70 i 107 type="" Err bitreich.org 70 i 108 selector="" Err bitreich.org 70 i 109 host="" Err bitreich.org 70 i 110 port="" Err bitreich.org 70 i 111 Err bitreich.org 70 i 112 while read -r line; Err bitreich.org 70 i 113 do Err bitreich.org 70 i 114 value="$(printf '%s\n' "${line}" \ Err bitreich.org 70 i 115 | cut -f 2- -d ':' \ Err bitreich.org 70 i 116 | sed -n 's/^[[:space:]]*\(.*\)$/\1/p')" Err bitreich.org 70 i 117 case "${line}" in Err bitreich.org 70 i 118 Type:* ) Err bitreich.org 70 i 119 type="${value}" Err bitreich.org 70 i 120 ;; Err bitreich.org 70 i 121 Selector:* ) Err bitreich.org 70 i 122 selector="${value}" Err bitreich.org 70 i 123 ;; Err bitreich.org 70 i 124 Host:* ) Err bitreich.org 70 i 125 host="${value}" Err bitreich.org 70 i 126 ;; Err bitreich.org 70 i 127 Port:* ) Err bitreich.org 70 i 128 port="${value}" Err bitreich.org 70 i 129 ;; Err bitreich.org 70 i 130 esac Err bitreich.org 70 i 131 done < "$f" Err bitreich.org 70 i 132 Err bitreich.org 70 i 133 if [ -z "${type}" ] \ Err bitreich.org 70 i 134 || [ -z "${host}" ] \ Err bitreich.org 70 i 135 || [ -z "${port}" ]; Err bitreich.org 70 i 136 then Err bitreich.org 70 i 137 flock -x "${program}" printf "ERROR\t%s\tInvalid entry!\n" "${f}" >&2 Err bitreich.org 70 i 138 exit Err bitreich.org 70 i 139 fi Err bitreich.org 70 i 140 Err bitreich.org 70 i 141 case "${type}" in Err bitreich.org 70 i 142 cso ) Err bitreich.org 70 i 143 error="$(checkcso "${host}" "${port}")" Err bitreich.org 70 i 144 ;; Err bitreich.org 70 i 145 telnet ) Err bitreich.org 70 i 146 error="$(checkraw "${host}" "${port}")" Err bitreich.org 70 i 147 ;; Err bitreich.org 70 i 148 error ) Err bitreich.org 70 i 149 error="Type = 'error'" Err bitreich.org 70 i 150 ;; Err bitreich.org 70 i 151 link ) Err bitreich.org 70 i 152 if [ -n "${selector}" ] && [ -z "${selector##URL:*}" ]; Err bitreich.org 70 i 153 then Err bitreich.org 70 i 154 url="${selector##URL:}" Err bitreich.org 70 i 155 case "${url}" in Err bitreich.org 70 i 156 http://* | https://* ) Err bitreich.org 70 i 157 error="$(checkhttp "${url}")" Err bitreich.org 70 i 158 ;; Err bitreich.org 70 i 159 ssh://* ) Err bitreich.org 70 i 160 sshhost="${url##ssh://}" Err bitreich.org 70 i 161 sshhost="${sshhost##*@}" Err bitreich.org 70 i 162 sshhost="${sshhost%%/*}" Err bitreich.org 70 i 163 sshport="22" Err bitreich.org 70 i 164 if [ -z "${sshhost##*:*}" ]; Err bitreich.org 70 i 165 then Err bitreich.org 70 i 166 sshport="${sshhost##*:}" Err bitreich.org 70 i 167 sshhost="${sshhost%%:*}" Err bitreich.org 70 i 168 fi Err bitreich.org 70 i 169 error="$(checkraw "${sshhost}" "${sshport}")" Err bitreich.org 70 i 170 ;; Err bitreich.org 70 i 171 * ) Err bitreich.org 70 i 172 flock -x "${program}" printf "TODO\t%s\tCan't handle %s\n" "${f}" "${url}" >&2 Err bitreich.org 70 i 173 exit Err bitreich.org 70 i 174 ;; Err bitreich.org 70 i 175 esac Err bitreich.org 70 i 176 else Err bitreich.org 70 i 177 error="$(checkgopher "${host}" "${port}" "${selector}")" Err bitreich.org 70 i 178 fi Err bitreich.org 70 i 179 ;; Err bitreich.org 70 i 180 search ) Err bitreich.org 70 i 181 error="$(checkgopher "${host}" "${port}" "${selector}" "")" Err bitreich.org 70 i 182 ;; Err bitreich.org 70 i 183 text | uuencoded | * ) Err bitreich.org 70 i 184 error="$(checkgopher "${host}" "${port}" "${selector}")" Err bitreich.org 70 i 185 ;; Err bitreich.org 70 i 186 esac Err bitreich.org 70 i 187 Err bitreich.org 70 i 188 lastcheck="" Err bitreich.org 70 i 189 errorcount=0 Err bitreich.org 70 i 190 statefile="${statedir}/$(basename "$f")" Err bitreich.org 70 i 191 if [ -f "${statefile}" ]; Err bitreich.org 70 i 192 then Err bitreich.org 70 i 193 IFS=" " read -r lastcheck errorcount < "${statefile}" Err bitreich.org 70 i 194 fi Err bitreich.org 70 i 195 Err bitreich.org 70 i 196 if [ -n "${error}" ]; Err bitreich.org 70 i 197 then Err bitreich.org 70 i 198 errorcount=$((errorcount + 1)) Err bitreich.org 70 i 199 else Err bitreich.org 70 i 200 errorcount=0 Err bitreich.org 70 i 201 fi Err bitreich.org 70 i 202 Err bitreich.org 70 i 203 if [ ${errorcount} -ge ${errorthreshold} ]; Err bitreich.org 70 i 204 then Err bitreich.org 70 i 205 flock -x "${program}" printf "ERROR\t%s\t%s\n" "${f}" "${error}" >&2 Err bitreich.org 70 i 206 fi Err bitreich.org 70 i 207 Err bitreich.org 70 i 208 printf "%s\t%s\n" "${checktime}" "${errorcount}" > "${statefile}" Err bitreich.org 70 i 209 else Err bitreich.org 70 i 210 checktime="$(date +%s)" Err bitreich.org 70 i 211 statedir="$1" Err bitreich.org 70 i 212 Err bitreich.org 70 i 213 if [ -z "${statedir}" ]; Err bitreich.org 70 i 214 then Err bitreich.org 70 i 215 printf "You need to specify a state dir.\n" >&2 Err bitreich.org 70 i 216 exit 1 Err bitreich.org 70 i 217 fi Err bitreich.org 70 i 218 Err bitreich.org 70 i 219 mkdir -p "${statedir}" Err bitreich.org 70 i 220 if [ ! -d "${statedir}" ]; Err bitreich.org 70 i 221 then Err bitreich.org 70 i 222 printf "%s is not a directory! Aborting.\n" "${statedir}" >&2 Err bitreich.org 70 i 223 exit 1 Err bitreich.org 70 i 224 fi Err bitreich.org 70 i 225 Err bitreich.org 70 i 226 shift Err bitreich.org 70 i 227 Err bitreich.org 70 i 228 for f; Err bitreich.org 70 i 229 do Err bitreich.org 70 i 230 printf "%s\0" "${f}" Err bitreich.org 70 i 231 done | LAWNHARK_WORKER=1 xargs -r -0 -P "${maxworkers}" -L1 "${program}" "${statedir}" "${checktime}" Err bitreich.org 70 i 232 Err bitreich.org 70 i 233 # garbage collection Err bitreich.org 70 i 234 find "${statedir}" -type f | while read -r f; Err bitreich.org 70 i 235 do Err bitreich.org 70 i 236 IFS=" " read -r lastcheck errorcount < "${f}" Err bitreich.org 70 i 237 Err bitreich.org 70 i 238 if [ ${lastcheck} -ne ${checktime} ]; Err bitreich.org 70 i 239 then Err bitreich.org 70 i 240 rm -f "${f}" Err bitreich.org 70 i 241 fi Err bitreich.org 70 i 242 done Err bitreich.org 70 i 243 fi Err bitreich.org 70 .