Last active
May 12, 2020 08:17
-
-
Save JonTheNiceGuy/8de85d662463f27eff94d2dff56ecba7 to your computer and use it in GitHub Desktop.
Canon MG3050 Printer Ink Level reporting tool
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
rc=0 | |
function matchIP() { | |
# These regex based on https://stackoverflow.com/a/17871737 | |
if echo "$1" | egrep '^((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])$' >/dev/null 2>/dev/null | |
then | |
echo 4 | |
return 4 | |
elif echo "$1" | egrep '(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1, | |
4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((: | |
[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3 | |
}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))' >/dev/null 2>/dev | |
/null | |
then | |
echo 6 | |
return 6 | |
fi | |
echo 0 | |
return 0 | |
} | |
function getMessage() { | |
echo "$1" | cut -d\' -f2 | |
} | |
if [ -n "$1" ] | |
then | |
if [ $(matchIP "$1") -eq 4 ] | |
then | |
printer="$1" | |
elif [ $(matchIP "$1") -eq 6 ] | |
then | |
printer="\[$1\]" | |
elif echo "$1" | egrep '^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$' >/dev/null 2>/dev/null | |
then | |
if [ -n "$2" ] | |
then | |
interface="$2" | |
else | |
# Based on https://unix.stackexchange.com/a/302613 | |
interface="$(ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)')" | |
fi | |
# Based on https://stackoverflow.com/a/17429136 | |
printer=$(gssdp-discover -i $interface -n 3 -t uuid:$1 -m available | grep "Location" | cut -d\/ -f3 | cut -d: -f1) | |
else | |
printer="$1" | |
fi | |
fi | |
if [ -n "$printer" ] | |
then | |
while read -r line | |
do | |
if echo $line | egrep "var g_err_msg_id = 'MES.+';" >/dev/null 2>&1 | |
then | |
ref="$(getMessage "$line")" | |
mes="$(curl -s http://$printer/LANG/messID.js | grep "$ref")" | |
echo "!! $(echo "$mes" | cut -d\" -f2) !!" | |
rc=255 | |
# Following block based on working back the dispInkInfo function | |
# which is in http://$printer/rui/JS/top.js | |
elif echo $line | egrep '^inktank\[' >/dev/null 2>&1 | |
then | |
values=$(echo $line | cut -d\[ -f3 | cut -d\] -f1) | |
case $(echo $values | cut -d, -f1) in | |
[07]) | |
colour=Black | |
;; | |
1) | |
colour=PigmentBlack | |
;; | |
2) | |
colour=Cyan | |
;; | |
3) | |
colour=Magenta | |
;; | |
4) | |
colour=Yellow | |
;; | |
5) | |
colour=Grey | |
;; | |
6) | |
colour=Colour | |
;; | |
esac | |
case $(echo $values | cut -d, -f2) in | |
0) | |
scale=100 | |
;; | |
1) | |
scale=90 | |
;; | |
2) | |
scale=80 | |
;; | |
3) | |
scale=70 | |
;; | |
4) | |
scale=60 | |
;; | |
5) | |
scale=50 | |
;; | |
6) | |
scale=40 | |
;; | |
7) | |
scale=30 | |
;; | |
8) | |
scale=20 | |
;; | |
9) | |
scale=10 | |
;; | |
10) | |
scale=5 | |
;; | |
11) | |
scale=0 | |
;; | |
esac | |
# 0 = Fine | |
# 1 = Low | |
# 2 = Empty | |
# 3 = Unknown | |
case $(echo $values | cut -d, -f3) in | |
0) | |
echo "$colour cartridge is fine - quantity $scale% remaining" | |
;; | |
1) | |
echo "$colour cartridge is low - quantity $scale% remaining" | |
if [ $rc -eq 0 ] | |
then | |
rc=1 | |
fi | |
;; | |
2) | |
echo "$colour cartridge is empty - quantity $scale% remaining" | |
if [ $rc -lt 2 ] | |
then | |
rc=2 | |
fi | |
;; | |
3) | |
echo "$colour cartridge is in an unknown state - quantity $scale% remaining" | |
if [ $rc -lt 2 ] | |
then | |
rc=2 | |
fi | |
;; | |
esac | |
fi | |
done <<< "$(curl -s http://$printer/JS_MDL/model.js)" | |
exit $rc | |
else | |
echo "ink_level.sh" | |
echo "Options are: ink_level.sh [ip_address | uuid [interface]]" | |
echo "For example: ink_level.sh 192.0.2.1" | |
echo " ink_level.sh 2001:db8::1" | |
echo " ink_level.sh 00000000-0000-0000-0000-DECAFBAD1234" | |
echo " ink_level.sh 00000000-0000-0000-0000-DECAFBAD1234 wlan0" | |
exit 255 | |
fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment