В нашей компании 4 офиса в каждом по 3-4 этажа, много кабинетов и почти в каждом стоит 1-3 принтера и МФУ. Статья о том, как с помощью bash зная лишь ip-адреса принтеров автоматизировать собор с них количества отпечатков.
Вся информация собирается в базу данных, попутно добавляется модель принтера MAC -адрес, серийный номер и вся информация по количеству отпечатков.

Первый скрипт считывает из базы все ip-адреса принтеров, проверяет их на пинг, будит принтеры kyocera, и пишет в поле test_ping ok или error в зависимости от результатов пинга.
На этом этапе достаточно в базе иметь только ip адреса принтеров.
Будилка принтеров kyocera
Второй скрипт ищет в базе ip-адреса принтеров успешно прошедших пинг и с помощью curl запрашивает модель принтера, далее он сравнивает полученный результат со списком моделей из отдельной таблицы в базе данных. Если результат запроса совпадает со списком моделей в базу записывается соответствие ip-адрес-модель.
Третий скрипт зная модель и ip-адрес делает нужный для конкретной модели запрос серийного номера.
Четвертый скрипт так-же зная ip-адрес и модель делает соответствующие запросы для поиска информации по количеству отпечатков.
Для сбора количества отпечатков с принтеров Kyocera оказалось удобнее использовать дополнительный скрипт kyocera.sh
который я взял вот из этой статьи и немного адаптировал.
И последний скрипт, который запускает все эти скрипты в нужном порядке
→ База данных
Возможно кто-то скажет что это костыль или извращение, но именно на этих скриптах я изучал регулярные выражения, grep, awk, sed, tr. Многие заметят что регулярки не совсем красивые, зато это рабочие скрипты, которые более или менее справляются со своими задачами.
Более или менее потому, что не все принтеры отдают серийный номер или мак-адрес. В общем это неплохая заготовка для дальнейшего развития.
P.S. так и не разобрался как авторизовываться в web-интерфейсе принтеров, поэтому выдергивается всё, что можно выдернуть без авторизации.
Сюда просится красивый WEB-интерфейс, в базе есть поля для адреса, этажа и номера комнаты, а так-же пути на сетевой диск с драйверами для каждой модели.
Если кому интересно, присоединяйтесь на гитхабе.
Вся информация собирается в базу данных, попутно добавляется модель принтера MAC -адрес, серийный номер и вся информация по количеству отпечатков.

Первый скрипт считывает из базы все ip-адреса принтеров, проверяет их на пинг, будит принтеры kyocera, и пишет в поле test_ping ok или error в зависимости от результатов пинга.
На этом этапе достаточно в базе иметь только ip адреса принтеров.
Ping.sh
#!/bin/bash ROOT_PATH=$(cd $(dirname $0) && pwd) # Определяем директорию, где сейчас находимся. test="" #test=yes_test # Закоментировать для работы скрипа в режиме отладки sql='mysql -uprinters_user -pVHBCQpcRO1VIeNsz -Dprinters -e' # Имя бызы данных, имя пользователя и пароль для доступа к базе данных for line in $($sql "SELECT ipaddr FROM all_printers" | awk 'NR>1') do host=$line; # Тест на доступность if [ -n "$test" ]; then echo Проверим доступность принтеров;fi a=$(ping -c 1 $host | tail -n2 | head -n1 | awk {'print $6'} | sed s/%//) if [ -n "$test" ]; then echo Пинговали ip $host;fi if [ -n "$test" ]; then echo Потеряно пакетов: $a;fi if [ $a != 0 ] then if [ -n "$test" ]; then echo Принтер не пингуется;fi $sql "update all_printers set test_ping='error' where ipaddr like '%$host%'" continue fi ${ROOT_PATH}/wakeup_kyocera.sh $host > /dev/null 2>&1; sleep 3 mac=$(arping -c 1 -i eth0 $host | head -n2 | tail -n1 | awk {'print $4'}) $sql "update all_printers set test_ping='ok' where ipaddr like '%$host%'" $sql "update all_printers set mac='$mac' where ipaddr like '%$host%'" if [ -n "$test" ]; then echo ------------------------------------------------------; fi done exit 0
Будилка принтеров kyocera
wakeup_kyocera.sh
#!/bin/bash
host=$1;
xml=`curl -X POST -s -d '\
<?xml version=«1.0» encoding=«utf-8»?>\
<SOAP-ENV:Envelope \
xmlns:SOAP-ENV=«www.w3.org/2003/05/soap-envelope»\
xmlns:SOAP-ENC=«www.w3.org/2003/05/soap-encoding»\
xmlns:xsi=«www.w3.org/2001/XMLSchema-instance»\
xmlns:xsd=«www.w3.org/2001/XMLSchema»\
xmlns:wsa=«schemas.xmlsoap.org/ws/2004/08/addressing»\
xmlns:xop=«www.w3.org/2004/08/xop/include»\
xmlns:ns1=«www.kyoceramita.com/ws/km-wsdl/log/counter_information»>\
<SOAP-ENV:Header>\
<wsa:Action SOAP-ENV:mustUnderstand=«true»>\
www.kyoceramita.com/ws/km-wsdl/log/counter_information/get_counter\
</wsa:Action>\
</SOAP-ENV:Header>\
<SOAP-ENV:Body>\
<ns1:get_counterRequest>\
<ns1:counter_type>\
ALL_COUNTER\
</ns1:counter_type>\
</ns1:get_counterRequest>\
</SOAP-ENV:Body>\
</SOAP-ENV:Envelope>\
' $host:9090`;
#echo $xml
exit 0
#!/bin/bash
host=$1;
xml=`curl -X POST -s -d '\
<?xml version=«1.0» encoding=«utf-8»?>\
<SOAP-ENV:Envelope \
xmlns:SOAP-ENV=«www.w3.org/2003/05/soap-envelope»\
xmlns:SOAP-ENC=«www.w3.org/2003/05/soap-encoding»\
xmlns:xsi=«www.w3.org/2001/XMLSchema-instance»\
xmlns:xsd=«www.w3.org/2001/XMLSchema»\
xmlns:wsa=«schemas.xmlsoap.org/ws/2004/08/addressing»\
xmlns:xop=«www.w3.org/2004/08/xop/include»\
xmlns:ns1=«www.kyoceramita.com/ws/km-wsdl/log/counter_information»>\
<SOAP-ENV:Header>\
<wsa:Action SOAP-ENV:mustUnderstand=«true»>\
www.kyoceramita.com/ws/km-wsdl/log/counter_information/get_counter\
</wsa:Action>\
</SOAP-ENV:Header>\
<SOAP-ENV:Body>\
<ns1:get_counterRequest>\
<ns1:counter_type>\
ALL_COUNTER\
</ns1:counter_type>\
</ns1:get_counterRequest>\
</SOAP-ENV:Body>\
</SOAP-ENV:Envelope>\
' $host:9090`;
#echo $xml
exit 0
Второй скрипт ищет в базе ip-адреса принтеров успешно прошедших пинг и с помощью curl запрашивает модель принтера, далее он сравнивает полученный результат со списком моделей из отдельной таблицы в базе данных. Если результат запроса совпадает со списком моделей в базу записывается соответствие ip-адрес-модель.
Model.sh
#!/bin/bash sql='mysql -uprinters_user -pVHBCQpcRO1VIeNsz -Dprinters -e' # Имя бызы данных, имя пользователя и пароль для доступа к базе данных ROOT_PATH=$(cd $(dirname $0) && pwd) # Определяем директорию, где сейчас находимся. test="" #test=yes_test # Закоментировать для работы скрипа в режиме отладки for line in $($sql "SELECT ipaddr FROM all_printers WHERE test_ping not like 'error'" | awk 'NR>1') do host=$line; model=0; if [ -n "$test" ]; then echo ip -- $host;fi # Принтеры Kyocera name1=$(curl -s http://$host/printer/printersum_top.htm | grep TITLE | sed -r 's/^[^>]+//' | sed -r 's/<.+//' | sed 's/^\(\)*./\1/') if [ -n "$test" ]; then echo name1 $name1;fi tmp=$($sql "select name from liquid_names where name like '%$name1%'" | awk 'NR>1') if [ "$tmp" == "$name1" ]; then $sql "update all_printers set model='$name1' where ipaddr like '%$host%'"; fi name2=$(curl -s http://$host/status.htm | grep title | head -n1 | sed -r 's/^[^>]+//' | sed -r 's/<.+//' | sed 's/^\(\)*./\1/') if [ -n "$test" ]; then echo name2 $name2;fi tmp=$($sql "select name from liquid_names where name like '%$name2%'" | awk 'NR>1') if [ "$tmp" == "$name2" ]; then $sql "update all_printers set model='$name2' where ipaddr like '%$host%'"; fi name3=$(curl -s http://$host/start/start.htm | grep h1 | sed -r 's/^[^>]+//' | sed -r 's/<.+//' | sed 's/^\(\)*./\1/') if [ -n "$test" ]; then echo name3 $name3;fi tmp=$($sql "select name from liquid_names where name like '%$name3%'" | awk 'NR>1') if [ "$tmp" == "$name3" ]; then $sql "update all_printers set model='$name3' where ipaddr like '%$host%'"; fi name4=$(curl -s http://$host/eng/start/start.htm | grep h1 | sed -r 's/^[^>]+//' | sed -r 's/<.+//' | sed 's/^\(\)*./\1/') if [ -n "$test" ]; then echo name4 $name4;fi tmp=$($sql "select name from liquid_names where name like '%$name4%'" | awk 'NR>1') if [ "$tmp" == "$name4" ]; then $sql "update all_printers set model='$name4' where ipaddr like '%$host%'"; fi name5=$(curl -s http://$host/DeepSleep.js | sed -r 's!^[^"]+!!' | sed -r 's/[)].+//' | sed 's,",,g') if [ -n "$test" ]; then echo name5 $name5;fi tmp=$($sql "select name from liquid_names where name like '%$name5%'" | awk 'NR>1') if [ "$tmp" == "$name5" ]; then $sql "update all_printers set model='$name5' where ipaddr like '%$host%'"; fi name6=$(curl -s http://$host/DeepSleep.js | grep ModelName | sed -r 's!^[^"]+!!' | sed -r 's/[)].+//' | sed 's,",,g') if [ -n "$test" ]; then echo name6 $name6;fi tmp=$($sql "select name from liquid_names where name like '%$name6%'" | awk 'NR>1') if [ "$tmp" == "$name6" ]; then $sql "update all_printers set model='$name6' where ipaddr like '%$host%'"; fi name7=$(curl -s http://$host/startwlm/Start_Wlm.htm | grep HeaderStatusPC | sed -r 's/^[^"]+//' | sed -r 's/,.+//' | sed 's/"//g') if [ -n "$test" ]; then echo name7 $name7;fi tmp=$($sql "select name from liquid_names where name like '%$name7%'" | awk 'NR>1') if [ "$tmp" == "$name7" ]; then $sql "update all_printers set model='$name7' where ipaddr like '%$host%'"; fi # Принтеры OKI #c610 name8=$(curl -s http://$host/printer/printersum_top.htm | grep TITLE | sed -r 's/^[^>]+//' | sed -r 's/<.+//' | sed 's/^\(\)*./\1/') if [ -n "$test" ]; then echo name8 $name8;fi tmp=$($sql "select name from liquid_names where name like '%$name8%'" | awk 'NR>1') if [ "$tmp" == "$name8" ]; then $sql "update all_printers set model='$name8' where ipaddr like '%$host%'"; fi #C9655 MC562 name9=$(curl -s http://$host/status.htm | grep title | head -n1 | sed -r 's/^[^>]+//' | sed -r 's/<.+//' | sed 's/^\(\)*./\1/') if [ -n "$test" ]; then echo name9 $name9;fi tmp=$($sql "select name from liquid_names where name like '%$name9%'" | awk 'NR>1') if [ "$tmp" == "$name9" ]; then $sql "update all_printers set model='$name9' where ipaddr like '%$host%'"; fi ### Принтеры HP #HP Designjet 510 name10=$(curl -s http://$host/index_top.htm | grep HP | tail -n1 | sed -r 's/^[ ]+//') if [ -n "$test" ]; then echo name10 $name10;fi tmp=$($sql "select name from liquid_names where name like '%$name10%'" | awk 'NR>1') if [ "$tmp" == "$name10" ]; then $sql "update all_printers set model='$name10' where ipaddr like '%$host%'"; fi # hp LaserJet 2420 name11=$(curl -s http://$host/hp/device/this.LCDispatcher?nav=hp.DeviceInfo | grep span\ \ class\=\"hpPageText\" | head -n2 | tail -n1 | sed -r 's/^[^>]+//' | sed -r 's/<.+//' | sed 's/^\(\)*./\1/') if [ -n "$test" ]; then echo name11 $name11;fi tmp=$($sql "select name from liquid_names where name like '%$name11%'" | awk 'NR>1') if [ "$tmp" == "$name11" ]; then $sql "update all_printers set model='$name11' where ipaddr like '%$host%'"; fi # hp LaserJet 2410 name12=$(curl -s http://$host/index_top.htm | grep hp | tail -n1 | sed -r 's/^[ ]+//') if [ -n "$test" ]; then echo name12 $name12;fi tmp=$($sql "select name from liquid_names where name like '%$name12%'" | awk 'NR>1') if [ "$tmp" == "$name12" ]; then $sql "update all_printers set model='$name12' where ipaddr like '%$host%'"; fi # HP LaserJet P3005 Printers name13=$(curl -s http://$host/hp/device/this.LCDispatcher?nav=hp.Config | grep id\=\"Text4\" | sed -r 's/^[^>]+//' | sed -r 's/<.+//' | sed 's/>//g') if [ -n "$test" ]; then echo name13 $name13;fi tmp=$($sql "select name from liquid_names where name like '%$name13%'" | awk 'NR>1') if [ "$tmp" == "$name13" ]; then $sql "update all_printers set model='$name13' where ipaddr like '%$host%'"; fi if [ -n "$test" ]; then echo ________________________________________________;fi done exit 0
Третий скрипт зная модель и ip-адрес делает нужный для конкретной модели запрос серийного номера.
Serial.sh
#!/bin/bash sql='mysql -uprinters_user -pVHBCQpcRO1VIeNsz -Dprinters -e' # Имя бызы данных, имя пользователя и пароль для доступа к базе данных ROOT_PATH=$(cd $(dirname $0) && pwd) # Определяем директорию, где сейчас находимся. test="" #test=yes_test # Закоментировать для работы скрипа в режиме отладки for line in $($sql "SELECT ipaddr FROM all_printers WHERE test_ping not like 'error'" | awk 'NR>1') do host=$line; model=""; serial=""; # Kyocera FS-1030MFP sql='$sql' model=$($sql "SELECT model FROM all_printers WHERE ipaddr like '%$host%'" | awk 'NR>1') if [ "$model" == "FS-1030MFP" ] || [ "$model" == "FS-1130MFP" ] || [ "$model" == "FS-3920DN" ] || [ "$model" == "FS-6525MFP" ] then if [ -n "$test" ]; then echo $model;fi if [ -n "$test" ]; then echo $host;fi if [ -n "$test" ]; then echo FS-9530DN FS-1030MFP FS-1130MFP FS-3920DN;fi serial=$(curl -s http://$host/start/start.htm | grep sData'\['8'\]''\ '= | tail -n1 | sed -r 's!^[^"]+!!' | sed -r 's/;.+//' | sed 's,",,g') $sql "update all_printers set serial_nomber='$serial' where ipaddr like '%$host%'" if [ -n "$test" ]; then echo $serial;fi fi if [ "$model" == "FS-9530DN" ] then if [ -n "$test" ]; then echo $model;fi if [ -n "$test" ]; then echo $host;fi if [ -n "$test" ]; then echo FS-9530DN FS-1030MFP FS-1130MFP FS-3920DN;fi serial=$(curl -s http://$host/start/start.htm | grep sData\.6.\ \= | sed -r 's!^[^"]+!!' | sed -r 's/;.+//' | sed 's,",,g') $sql "update all_printers set serial_nomber='$serial' where ipaddr like '%$host%'" if [ -n "$test" ]; then echo $serial;fi fi if [ "$model" == "FS-1320D" ] then if [ -n "$test" ]; then echo model -- $model;fi if [ -n "$test" ]; then echo $model;fi if [ -n "$test" ]; then echo $host;fi serial=$(curl -s http://$host/eng/start/start.htm | grep sData'\['6'\]''\ '= | sed -r 's!^[^"]+!!' | sed -r 's/;.+//' | sed 's,",,g') $sql "update all_printers set serial_nomber='$serial' where ipaddr like '%$host%'" if [ -n "$test" ]; then echo $serial;fi fi if [ "$model" == "ECOSYS M2530dn" ] || [ "$model" == "ECOSYS M2030dn" ] || [ "$model" == "ECOSYS P6021cdn" ] || [ "$model" == "ECOSYS P2135dn" ] then if [ -n "$test" ]; then echo model -- $model;fi if [ -n "$test" ]; then echo $model;fi if [ -n "$test" ]; then echo $host;fi serial=$(curl -s http://$host/dvcinfo/dvcconfig/DvcConfig_Config.htm | grep ComnAddLabelProperty\(\'2\'\,mes.174.+ | sed -r 's/[^"]+//' | sed -r 's/[": ]//g' | sed -r 's/^.//' | sed -r 's/,.+//') if [ "$serial" == "" ] then ${ROOT_PATH}/wakeup_kyocera.sh $host > /dev/null 2>&1; sleep 30 serial=$(curl -s http://$host/dvcinfo/dvcconfig/DvcConfig_Config.htm | grep ComnAddLabelProperty\(\'2\'\,mes.174.+ | sed -r 's/[^"]+//' | sed -r 's/[": ]//g' | sed -r 's/^.//' | sed -r 's/,.+//') fi $sql "update all_printers set serial_nomber='$serial' where ipaddr like '%$host%'" if [ -n "$test" ]; then echo $serial;fi fi ########################### if [ "$model" == "FS-2100DN" ] || [ "$model" == "FS-6525MFP" ] then if [ -n "$test" ]; then echo $model;fi if [ -n "$test" ]; then echo $host;fi serial=$(curl -s http://$host/startwlm/DvcConfig_Config.htm | grep sLabel\.nTmp.\ \=\ mes.174 | sed -r 's/[^"]+//' | sed -r 's/[":; ]//g') if [ "$serial" == "" ] then ${ROOT_PATH}/wakeup_kyocera.sh $host > /dev/null 2>&1; sleep 30 serial=$(curl -s http://$host/startwlm/DvcConfig_Config.htm | grep sLabel\.nTmp.\ \=\ mes.174 | sed -r 's/[^"]+//' | sed -r 's/[":; ]//g') fi $sql "update all_printers set serial_nomber='$serial' where ipaddr like '%$host%'" if [ -n "$test" ]; then echo $serial;fi fi if [ "$model" == "hp LaserJet 2420" ] then if [ -n "$test" ]; then echo $model;fi if [ -n "$test" ]; then echo $host;fi serial=$(curl -s http://$host/hp/device/this.LCDispatcher?nav=hp.DeviceInfo | grep span\ \ class\=\"hpPageText\" | tail -n1 | sed -r 's/^[^>]+//' | sed -r 's/<.+//' | sed 's/^\(\)*./\1/') $sql "update all_printers set serial_nomber='$serial' where ipaddr like '%$host%'" if [ -n "$test" ]; then echo $serial;fi fi ## HP LaserJet P3005 if [ "$model" == "HP LaserJet P3005" ] then if [ -n "$test" ]; then echo $model;fi if [ -n "$test" ]; then echo $host;fi serial=$(curl -s http://$host/hp/device/this.LCDispatcher?nav=hp.Config | grep id\=\"Text10\" | sed -r 's/^[^>]+//' | sed -r 's/<.+//' | sed 's/>//g') $sql "update all_printers set serial_nomber='$serial' where ipaddr like '%$host%'" #if [ -n "$test" ]; then echo $serial fi ############################### #OKI if [ "$model" == "C9655" ] || [ "$model" == "MC562" ] || [ "$model" == "C610" ] then if [ -n "$test" ]; then echo $model;fi if [ -n "$test" ]; then echo $host;fi serial=$(curl -s http://$host/status.htm | grep Serial\ Number\< | grep -Eoi '[a-z]{2}[0-9]{8}') $sql "update all_printers set serial_nomber='$serial' where ipaddr like '%$host%'" if [ -n "$test" ]; then echo $serial;fi fi if [ -n "$test" ]; then echo _______________________________________________;fi done exit 0
Четвертый скрипт так-же зная ip-адрес и модель делает соответствующие запросы для поиска информации по количеству отпечатков.
Print.sh
#!/bin/bash sql='mysql -uprinters_user -pVHBCQpcRO1VIeNsz -Dprinters -e' # Имя бызы данных, имя пользователя и пароль для доступа к базе данных ROOT_PATH=$(cd $(dirname $0) && pwd) # Определяем директорию, где сейчас находимся. test="" #test=yes_test # Закоментировать для работы скрипа в режиме отладки for line in $($sql "SELECT ipaddr FROM all_printers WHERE test_ping not like 'error'" | awk 'NR>1') do host=$line; model=""; serial=""; # Kyocera FS-1030MFP model=$($sql "SELECT model FROM all_printers WHERE ipaddr like '%$host%'" | awk 'NR>1') if [ "$model" == "FS-1030MFP" ] || [ "$model" == "FS-1130MFP" ] || [ "$model" == "FS-3920DN" ] || [ "$model" == "FS-1320D" ] || [ "$model" == "ECOSYS M2530dn" ] || [ "$model" == "ECOSYS M2030dn" ] || [ "$model" == "FS-2100DN" ] || [ "$model" == "ECOSYS P6021cdn" ] then if [ -n "$test" ]; then echo $model;fi if [ -n "$test" ]; then echo $host;fi print_all=$(${ROOT_PATH}/kyocera.sh $host | sed -n 1p) print_c=$(${ROOT_PATH}/kyocera.sh $host | sed -n 2p) print_p=$(${ROOT_PATH}/kyocera.sh $host | sed -n 3p) if [ "$(echo -n $print_all | wc -c)" -ge "10" ] then print_all="" fi if [ "$(echo -n $print_c | wc -c)" -ge "10" ] then print_c="" fi if [ "$(echo -n $print_p | wc -c)" -ge "10" ] then print_p="" fi $sql "update all_printers set sum_print_all='$print_all' where ipaddr like '%$host%'" $sql "update all_printers set sum_copy='$print_c' where ipaddr like '%$host%'" $sql "update all_printers set sum_printter='$print_p' where ipaddr like '%$host%'" fi if [ "$model" == "FS-3920DN" ] then if [ -n "$test" ]; then echo $model;fi if [ -n "$test" ]; then echo $host;fi print_all=$(curl -s http://$host/start/start.htm | grep sData\.8.\ \= | sed -r 's!^[^"]+!!' | sed -r 's/;.+//' | sed 's,",,g') $sql "update all_printers set sum_print_all='$print_all' where ipaddr like '%$host%'" fi if [ "$model" == "FS-1320D" ] then if [ -n "$test" ]; then echo $model;fi if [ -n "$test" ]; then echo $host;fi print_all=$(curl -s http://$host/eng/start/start.htm | grep sData'\['7'\]''\ '= | sed -r 's!^[^"]+!!' | sed -r 's/;.+//' | sed 's,",,g') $sql "update all_printers set sum_print_all='$print_all' where ipaddr like '%$host%'" fi if [ "$model" == "MC562" ] then if [ -n "$test" ]; then echo $model;fi if [ -n "$test" ]; then echo $host;fi print_all=$(curl -s http://$host/countsum.htm | grep Tray1 | grep -Eoi '[0-9]+' | tail -n1) $sql "update all_printers set sum_print_all='$print_all' where ipaddr like '%$host%'" fi if [ "$model" == "hp LaserJet 2420" ] then if [ -n "$test" ]; then echo $model;fi if [ -n "$test" ]; then echo $host;fi print_all=$(curl -s http://$host/hp/device/this.LCDispatcher?nav=hp.Usage | grep span\ \ class\=\"hpPageText\" | tail -n1 | sed -r 's/^[^>]+//' | sed -r 's/<.+//' | sed 's/^\(\)*./\1/') $sql "update all_printers set sum_print_all='$print_all' where ipaddr like '%$host%'" fi if [ "$model" == "HP LaserJet P3005" ] then if [ -n "$test" ]; then echo $model;fi if [ -n "$test" ]; then echo $host;fi print_all=$(curl -s http://$host/hp/device/this.LCDispatcher?nav=hp.Usage | grep id\=\"Text212\" | sed -r 's/^[^>]+//' | sed -r 's/<.+//' | sed 's/>//g') $sql "update all_printers set sum_print_all='$print_all' where ipaddr like '%$host%'" fi if [ -n "$test" ]; then echo $print_all;fi if [ -n "$test" ]; then echo $print_c;fi if [ -n "$test" ]; then echo $print_p;fi if [ -n "$test" ]; then echo ______________________________________________;fi done exit 0
Для сбора количества отпечатков с принтеров Kyocera оказалось удобнее использовать дополнительный скрипт kyocera.sh
который я взял вот из этой статьи и немного адаптировал.
kyocera.sh
#!/bin/bash # Доступные параметры: # accounting_print_black_and_white_copy_counter : Количество ч/б страниц, напечатанных с использованием копировального аппарата # accounting_print_black_and_white_printer_counter : Количество ч/б страниц, напечатанных с использованием принтера # accounting_print_black_and_white_fax_counter : Количество ч/б страниц, напечатанных с использованием факса # accounting_print_duplex_1sided_counter : Количество страниц, напечатанных на одной стороне листа # accounting_print_duplex_2sided_counter : Количество страниц, напечатанных с использованием дуплекса ( листов = страниц/2) # accounting_print_combine_none_counter : Общий счётчик напечатанных страниц # accounting_print_combine_2in1_counter : Количество странниц, распечатанных в режиме `2 страницы на листе` ( листов = страниц * 2) # accounting_print_combine_4in1_counter : Количество странниц, распечатанных в режиме `4 страницы на листе` ( листов = страниц * 4) # accounting_scan_fax_counter : Количество страниц, сканированных с использованием факса # accounting_scan_copy_counter : Количество страниц, сканированных с использованием копира # accounting_scan_other_counter : Количество прочих сканированных страниц ( на флешку, в сеть и пр.) ### device_life_counter : (?) Общий счётчик напечатанных страниц за всю жизнь устройства # accounting_print_total_counter : Всего #param=$2; param="accounting_print_total_counter" # Исправил, чтоб не вводить параметр получаемго сообщения param2="accounting_print_black_and_white_copy_counter" param3="accounting_print_black_and_white_printer_counter" host=$1; port=9090; #echo '$0 = ' $0 #if [[ (-z "$1") || (-z "$2") ]] if [[ (-z "$1") || (-z "accounting_print_total_counter") ]] # Исправил, чтоб не вводить параметр получаемого сообщения then echo "Usage: $0 10.16.41.149 device_life_counter"; exit 1; fi while [[ ("$result" -eq "0") && ("$cicle" -ne "100") ]] #while [[ (("$result" -eq "0")) -a (("$cicle" -eq "100")) ]] do xml=`curl -X POST -s -d '\ <?xml version="1.0" encoding="utf-8"?>\ <SOAP-ENV:Envelope \ xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"\ xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding"\ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\ xmlns:xsd="http://www.w3.org/2001/XMLSchema"\ xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"\ xmlns:xop="http://www.w3.org/2004/08/xop/include"\ xmlns:ns1="http://www.kyoceramita.com/ws/km-wsdl/log/counter_information">\ <SOAP-ENV:Header>\ <wsa:Action SOAP-ENV:mustUnderstand="true">\ http://www.kyoceramita.com/ws/km-wsdl/log/counter_information/get_counter\ </wsa:Action>\ </SOAP-ENV:Header>\ <SOAP-ENV:Body>\ <ns1:get_counterRequest>\ <ns1:counter_type>\ ALL_COUNTER\ </ns1:counter_type>\ </ns1:get_counterRequest>\ </SOAP-ENV:Body>\ </SOAP-ENV:Envelope>\ ' $host:$port`; if [[ `echo $xml | grep DEEP_SLEEP_NOW_ERROR` ]] then # echo "Принтер спит, сейчас проснётся"; sleep 3; else echo $xml > test.log result=`echo $xml | sed "s/.*$param\(.*\)$param.*$/\1/g" | sed "s/[^0-9]//g"` result2=`echo $xml | sed "s/.*$param2\(.*\)$param2.*$/\1/g" | sed "s/[^0-9]//g"` result3=`echo $xml | sed "s/.*$param3\(.*\)$param3.*$/\1/g" | sed "s/[^0-9]//g"` ##### result=`echo $xml` fi #let "cicle = cicle + 1" #Считаем кол-во циклов cicle=$(($cicle+1)) #echo "Циклов выполнено - "$cicle done echo $result echo $result2 echo $result3 exit 0
И последний скрипт, который запускает все эти скрипты в нужном порядке
GO_printers.sh
#!/bin/bash ROOT_PATH=$(cd $(dirname $0) && pwd) # Определяем директорию, где сейчас находимся. # Запустим последовательно все скрипты, важен порядок запуска! ${ROOT_PATH}/Ping.sh && ${ROOT_PATH}/Model.sh && ${ROOT_PATH}/Serial.sh && ${ROOT_PATH}/Print.sh exit 0
→ База данных
Возможно кто-то скажет что это костыль или извращение, но именно на этих скриптах я изучал регулярные выражения, grep, awk, sed, tr. Многие заметят что регулярки не совсем красивые, зато это рабочие скрипты, которые более или менее справляются со своими задачами.
Более или менее потому, что не все принтеры отдают серийный номер или мак-адрес. В общем это неплохая заготовка для дальнейшего развития.
P.S. так и не разобрался как авторизовываться в web-интерфейсе принтеров, поэтому выдергивается всё, что можно выдернуть без авторизации.
Сюда просится красивый WEB-интерфейс, в базе есть поля для адреса, этажа и номера комнаты, а так-же пути на сетевой диск с драйверами для каждой модели.
Если кому интересно, присоединяйтесь на гитхабе.
