У Вас в организации много разных принтеров и необходимо со всех собрать количество отпечатков?

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

Вся информация собирается в базу данных, попутно добавляется модель принтера 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

Второй скрипт ищет в базе 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
# Получение различных счётчиков для техники Kyocera на примере Kyocera 2535dn
# 2014 год, Рубцов Эдгар, Управление ИТ
# mailto:imax.bl@gmail.com

# Доступные параметры:
# 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-интерфейс, в базе есть поля для адреса, этажа и номера комнаты, а так-же пути на сетевой диск с драйверами для каждой модели.

Если кому интересно, присоединяйтесь на гитхабе.
Поделиться публикацией

Комментарии 17

    +2
    Для подобных задач есть SNMP, что на порядок удобнее и универсальнее.
    А вообще есть Zabbix и прочие системы мониторинга.
      0
      SNMP дает мининум инфомации. Через web aceсс полная информация.
        0
        Вот и я о том -же! А они нам не верят)
          0
          Фокус в том, что все равно нужна база. Нужны таблицы. К ним графики не помешают (Для наглядности). А там, глядиш, уже не только принтеры мониторить надо, а ещё пол-сети.
          Тут то и приходит понимание того, что уж лучше взять готовый инструмент, а не изобретать велосипед.

          Кстати, тотже Zabbix вполне может дергать все нужные данные через «внешние скрипты». А может и через Web-Monitoring/Scenario (Мониторинг и сценарии / действия) тоже получится. Тогда вообще внешнисе скрипты не нужны.
      +1
      Zabbix (любой другой монитор), принтеры с поддержкой SNMP, шаблон с оидами .1.3.6.1.2.1.43.10.2.1.4.1.1 (общее) и .1.3.6.1.2.1.43.10.2.1.5.1.1 (с момента запуска). Заодно можно статусы снимать.
        0
        Да, Zabbix крутая штука, у нас настроены триггеры на барабаны и тонер. Но не у всех принтеров есть SNMP. Не всегда удобно поднимать zabbix только ради количества отпечатков.
          0
          У какого сетевого принтера нет snpm?
            0
            Я не смогу ответить на этот вопрос, но точно знаю, что по SNMP не всегда можно получить всё, что необходимо, в подтверждение статья с которой всё и началось.
            0
            Вам все равно необходимо мониторить доступность принтеров, тем более если их большое количество. Мониторинг — вещь крайне необходимая в любом хозяйстве.
            Обычно у самых дешевых принтеров этого протокола и нет. Но их и брать-то не стоит.
          0
          Как вариант, если есть домен AD, то настраиваем всю печать через принт-сервер, принтера ставим юзерам через gpo, а всю статистику снимаем с принт-сервера.
            0
            А расскажите ка, как вы снимаете статистику с принт-сервера?
              0
              На принт-сервере (win2012r2) включаем лог «Microsoft-Windows-PrintService/Operational», а далее написан простой скрипт на powershell (60 строкек) который берет из этого лога все события с id=307 и пихает их в БД mysql, потом лог чистится с помощью wevtutil.exe
              Ну и написан простенький веб-интерфейс с авторизацией в AD чтобы руководство могло зайти и посмотреть кто и сколько печатал и на каких принтерах.
            0
            выгружаем список IP принтеров из учетной системы в файл
            далее vbs с такой командой
            strCommand = «snmpget.exe -v 1 -c public -r 3 -t 2 -O aqv -L n » & server & " " & oid

            далее пишем что получилось в базу
              0
              много кабинет
              Это слишком много кабинет?)
                0
                Спасибо, поправил.
                0
                cнимаем статистику с киосер через snmp
                удобно — можно снимать коды состояний с описанием (застряла бумага/где застряла/закончился тонер/закончилась бумага) могу поделиться собранными кодами состояний — в интернете искал — не нашел
                  0
                  Конечно делитесь!

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                Самое читаемое