dbk: Delete the `.check` file after the write test
[sunny256-utils.git] / sj
blobacf7c3edb9d6b84c1eba8f94ff94dd67573834a3
1 #!/usr/bin/env bash
3 #=======================================================================
4 # sj
5 # File ID: 29dba898-4962-11df-adc3-d5e071bed206
7 # Shortcut to check various stuff.
9 # Author: Øyvind A. Holm <sunny@sunbase.org>
10 # License: GNU General Public License version 2 or later.
11 #=======================================================================
13 progname=sj
14 VERSION=0.8.5
16 ARGS="$(getopt -o "\
20 " -l "\
21 help,\
22 maxtemp:,\
23 quiet,\
24 space:,\
25 verbose,\
26 version,\
27 " -n "$progname" -- "$@")"
28 test "$?" = "0" || exit 1
29 eval set -- "$ARGS"
31 std_maxtemp=94
33 opt_help=0
34 opt_maxtemp=$std_maxtemp
35 opt_quiet=0
36 opt_space='0'
37 opt_verbose=0
38 while :; do
39 case "$1" in
40 -h|--help) opt_help=1; shift ;;
41 --maxtemp) opt_maxtemp=$2; shift 2 ;;
42 -q|--quiet) opt_quiet=$(($opt_quiet + 1)); shift ;;
43 --space) opt_space=$2; shift 2 ;;
44 -v|--verbose) opt_verbose=$(($opt_verbose + 1)); shift ;;
45 --version) echo $progname $VERSION; exit 0 ;;
46 --) shift; break ;;
47 *) echo $progname: Internal error >&2; exit 1 ;;
48 esac
49 done
50 opt_verbose=$(($opt_verbose - $opt_quiet))
52 if test "$opt_help" = "1"; then
53 test $opt_verbose -gt 0 && { echo; echo $progname $VERSION; }
54 cat <<END
56 Usage: $progname [options] [command]
58 Options:
60 -h, --help
61 Show this help.
62 --maxtemp NUM
63 Define maximum acceptable temperature for "$progname temp-warn".
64 Default value: $std_maxtemp
65 -q, --quiet
66 Be more quiet. Can be repeated to increase silence.
67 --space BYTES
68 When used with "dfull":
69 Estimate time until the free disk space reaches BYTES. This value
70 is parsed by numfmt(1) from GNU coreutils, check the man page for
71 allowed values. Examples: 10M = 10000000, 10Mi = 10485760.
72 -v, --verbose
73 Increase level of verbosity. Can be repeated.
74 --version
75 Print version information.
77 If no command is specified, it checks that the network is up by issuing
78 a ping command until interrupted. These commands are also available:
80 allspace
81 Display free space of all local disks every 2nd second until
82 interrupted.
83 date
84 Run a query against pool.ntp.org to see how accurate the system
85 clock is.
86 dfull
87 Display estimated time until the current disk is full based on the
88 disk usage since the script was started.
90 Display free space of all local disks, sorted by free space.
91 kern
92 Follow the kernel log and display new entries immediately when they
93 occur.
94 space
95 Display free space of the current disk every second until
96 interrupted.
97 temp
98 Display current temperature.
99 temp-warn, tw
100 Loop and check CPU temperature. If it gets too high, create an
101 xmessage(1) window and send a warning to stderr.
104 exit 0
107 space_val="$(numfmt --from=auto -- $opt_space)"
108 test -z "$space_val" && {
109 echo "$progname: Invalid value in --space argument" >&2
110 exit 1
112 test $opt_verbose -ge 1 &&
113 echo "$progname: Using --space $space_val" >&2
115 free_space() {
116 df -h --si "$1" -P | tail -1 | tr -s ' ' | cut -f 4 -d ' ' | tr -d '\n'
119 free_space_bytes() {
120 df -B 1 "$1" -P | tail -1 | tr -s ' ' | cut -f 4 -d ' ' | tr -d '\n'
123 all_free_space() {
124 mount | grep ^/dev/ | cut -f 3 -d ' ' | sort | while read f; do
125 if test "$f" = "/"; then
126 echo -n "/ ";
127 free_space /
128 else
129 echo "$f " | rev | cut -f 1 -d / | rev | tr -d '\n'
130 free_space "$f"
132 echo -n " "
133 done
134 echo
137 if test "$1" = "allspace"; then
138 unset prev
139 while :; do
140 curr="$(all_free_space)"
141 if test "$curr" != "$prev"; then
142 echo
143 echo -n "$(date +"%d %H:%M:%S") $curr$(tput el)"
145 prev="$curr"
146 sleep 2
147 done
148 elif test "$1" = "date"; then
149 ntpdate -q pool.ntp.org
150 elif test "$1" = "df"; then
151 df -h --si | grep ^Filesystem
152 df -h --si --total | grep -e /dev/ -e ^total | sort -h -k4
153 elif test "$1" = "dfull"; then
154 origsec=$(date +%s)
155 origtime="$(date -u +"%Y-%m-%d %H:%M:%S.%N")"
156 origdf=$(( $(free_space_bytes .) - $space_val ))
157 prevdf=$origdf
158 ml_goalint=14
159 ml_goaltime=9
160 ml_dfdiff=1
161 while :; do
162 currtime="$(date -u +"%Y-%m-%d %H:%M:%S.%N")"
163 currsec=$(date +%s)
164 currdf=$(( $(free_space_bytes .) - $space_val ))
165 goal_output="$(
166 goal "$origtime" "$origdf" 0 "$currdf" 2>/dev/null
168 dfdiff="$(( $currdf-$origdf ))"
169 goalint=$(echo $goal_output | awk '{print $1}' | sed 's/\..*//')
170 goaldate=$(echo $goal_output | awk '{print $2}')
171 goaltime=$(echo $goal_output | awk '{print $3}' | sed 's/\..*//')
172 cl_goalint=$(echo $goalint | wc -L)
173 cl_goaltime=$(echo $goaltime | wc -L)
174 cl_dfdiff=$(echo $dfdiff | commify | wc -L)
175 seconds=$(echo $currsec-$origsec | bc)
177 test $cl_goalint -gt $ml_goalint && ml_goalint=$cl_goalint
178 test $cl_goaltime -gt $ml_goaltime && ml_goaltime=$cl_goaltime
179 test $cl_dfdiff -gt $ml_dfdiff && ml_dfdiff=$cl_dfdiff
181 if test "$(echo "$currdf < $prevdf" | bc)" = "1"; then
182 t_diskfree="$(tput bold; tput setaf 1)"
183 t_diskfree_reset="$(tput sgr0)"
184 elif test "$(echo "$currdf > $prevdf" | bc)" = "1"; then
185 t_diskfree="$(tput bold; tput setaf 2)"
186 t_diskfree_reset="$(tput sgr0)"
187 else
188 t_diskfree=""
189 t_diskfree_reset=""
192 if test -n "$goal_output"; then
193 printf \
194 "\\n"\
195 "%-${ml_goalint}s "\
196 "%s "\
197 "%-${ml_goaltime}s "\
198 "diff: %s%-${ml_dfdiff}s%s "\
199 "free: %s%s%s"\
200 "%s "\
201 "%s"\
202 "$goalint" \
203 "$goaldate" \
204 "$goaltime" \
205 "$t_diskfree" \
206 "$(echo $dfdiff | commify)" \
207 "$t_diskfree_reset" \
208 "$t_diskfree" \
209 "$(echo $currdf | commify)" \
210 "$t_diskfree_reset" \
211 "$(tput el)" \
213 if test $seconds -gt 0; then
214 printf " %s B/s" $(
215 printf 'scale=0; %d/%u\n' $dfdiff $seconds |
216 bc | commify
220 else
221 printf "\\n$progname dfull: No changes yet, %s%s%s bytes free%s" \
222 "$t_diskfree" \
223 "$(echo $currdf | commify)" \
224 "$t_diskfree_reset" \
225 "$(tput el)"
227 prevdf=$currdf
228 sleep 2
229 done
230 elif test "$1" = "kern"; then
231 tail -Fq /var/log/kern.log /var/log/syslog /var/log/auth.log \
232 | grep -v " $(hostname) CRON"
233 elif test "$1" = "space"; then
234 unset prevlast
235 while :; do
236 lastspace=$(free_space .)
237 if test "$lastspace" != "$prevlast"; then
238 echo -n " $lastspace $(tput el)"
239 prevlast=$lastspace
241 sleep 1
242 done
243 elif test "$1" = "temp"; then
244 temperature_file=/sys/devices/virtual/thermal/thermal_zone0/temp
245 if test ! -e "$temperature_file"; then
246 echo $progname: $temperature_file: File not found >&2
247 echo $progname: Cannot read temperature >&2
248 exit 1
251 echo scale=1
252 echo -n $(cat "$temperature_file")
253 echo / 1000
254 ) | bc -l
255 elif test "$1" = "temp-warn" -o "$1" = "tw"; then
256 unset prevtemp
257 dispfile="/tmp/sj_tw.$(date +%s).$$.tmp"
258 if test -e "$dispfile"; then
259 echo $progname: $dispfile: Tempfile already exists, that\'s spooky >&2
260 exit 1
262 while :; do
263 currtemp="$($progname temp)"
264 if test -z "$currtemp"; then
265 echo -n "$progname: Unable to read temperature, " >&2
266 echo \"$progname temp\" returned nothing >&2
267 exit 1
269 if test "$currtemp" != "$prevtemp"; then
270 echo $(date -u +"%Y-%m-%dT%H:%M:%SZ") $currtemp >>~/log/temp.log
271 echo -n " $currtemp $(tput el)"
272 prevtemp=$currtemp
274 if test $(echo "$currtemp > $opt_maxtemp" | bc) = "1"; then
275 grep Blimey "$dispfile" 2>/dev/null | grep -q . && rm "$dispfile"
276 if test ! -e $dispfile; then
277 warning="Oi! The temperature is $currtemp!"
278 xmessage -button Blimey -print "$warning" >"$dispfile" &
280 echo
281 tput setab 1
282 tput bold
283 tput setaf 3
284 echo -n "$progname: $warning"
285 tput sgr0
286 echo -n " "
287 tput el
288 ) >&2
291 sleep 2
292 done
293 else
294 test -d /n900/. && sudo=sudo || unset sudo
295 while :; do
296 $sudo ping 178.79.142.16
297 sleep 1
298 echo ============================================
299 done