scraping the xerox printers

This commit is contained in:
Astro 2020-04-03 21:49:33 +02:00
commit 2ec4ac33b2
5 changed files with 310 additions and 0 deletions

5
Gemfile Normal file
View File

@ -0,0 +1,5 @@
source "https://rubygems.org"
gem "mechanize", "~> 2.7"
gem "open4"
gem "influxdb", "~> 0.8"

44
Gemfile.lock Normal file
View File

@ -0,0 +1,44 @@
GEM
remote: https://rubygems.org/
specs:
connection_pool (2.2.2)
domain_name (0.5.20190701)
unf (>= 0.0.5, < 1.0.0)
http-cookie (1.0.3)
domain_name (~> 0.5)
influxdb (0.8.0)
mechanize (2.7.6)
domain_name (~> 0.5, >= 0.5.1)
http-cookie (~> 1.0)
mime-types (>= 1.17.2)
net-http-digest_auth (~> 1.1, >= 1.1.1)
net-http-persistent (>= 2.5.2)
nokogiri (~> 1.6)
ntlm-http (~> 0.1, >= 0.1.1)
webrobots (>= 0.0.9, < 0.2)
mime-types (3.3.1)
mime-types-data (~> 3.2015)
mime-types-data (3.2019.1009)
mini_portile2 (2.4.0)
net-http-digest_auth (1.4.1)
net-http-persistent (3.1.0)
connection_pool (~> 2.2)
nokogiri (1.10.9)
mini_portile2 (~> 2.4.0)
ntlm-http (0.1.1)
open4 (1.3.4)
unf (0.1.4)
unf_ext
unf_ext (0.0.7.7)
webrobots (0.1.2)
PLATFORMS
ruby
DEPENDENCIES
influxdb (~> 0.8)
mechanize (~> 2.7)
open4
BUNDLED WITH
1.17.3

27
default.nix Normal file
View File

@ -0,0 +1,27 @@
{ pkgs ? import <nixpkgs> {} }:
with pkgs;
let
gems = bundlerEnv rec {
name = "scrapers";
inherit ruby;
# expects Gemfile, Gemfile.lock and gemset.nix in the same directory
# > nix-shell -p bundler --run 'bundle lock --update'
# > nix-shell -p bundix --run bundix
gemdir = ./.;
};
wrapScript = name: script:
stdenv.mkDerivation {
inherit name script;
buildInputs = [ gems.wrappedRuby ];
buildCommand = ''
install -D -m755 $script $out/bin/${name}
patchShebangs $out/bin/${name}
'';
};
in {
xerox = wrapScript "xerox" ./xerox/scrape.rb;
}

169
gemset.nix Normal file
View File

@ -0,0 +1,169 @@
{
connection_pool = {
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "0lflx29mlznf1hn0nihkgllzbj8xp5qasn8j7h838465pi399k68";
type = "gem";
};
version = "2.2.2";
};
domain_name = {
dependencies = ["unf"];
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "0lcqjsmixjp52bnlgzh4lg9ppsk52x9hpwdjd53k8jnbah2602h0";
type = "gem";
};
version = "0.5.20190701";
};
http-cookie = {
dependencies = ["domain_name"];
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "004cgs4xg5n6byjs7qld0xhsjq3n6ydfh897myr2mibvh6fjc49g";
type = "gem";
};
version = "1.0.3";
};
influxdb = {
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "11q5pys13cp9rxhg1gihblqi597b6nfsfz3ghdij0zdf713pwwc3";
type = "gem";
};
version = "0.8.0";
};
mechanize = {
dependencies = ["domain_name" "http-cookie" "mime-types" "net-http-digest_auth" "net-http-persistent" "nokogiri" "ntlm-http" "webrobots"];
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "00834zv6s68g3x00s4kcgdry51s88qj0kjygnwhpg8k67kdihcrx";
type = "gem";
};
version = "2.7.6";
};
mime-types = {
dependencies = ["mime-types-data"];
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "1zj12l9qk62anvk9bjvandpa6vy4xslil15wl6wlivyf51z773vh";
type = "gem";
};
version = "3.3.1";
};
mime-types-data = {
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "18x61fc36951vw7f74gq8cyybdpxvyg5d0azvqhrs82ddw3v16xh";
type = "gem";
};
version = "3.2019.1009";
};
mini_portile2 = {
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "15zplpfw3knqifj9bpf604rb3wc1vhq6363pd6lvhayng8wql5vy";
type = "gem";
};
version = "2.4.0";
};
net-http-digest_auth = {
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "1nq859b0gh2vjhvl1qh1zrk09pc7p54r9i6nnn6sb06iv07db2jb";
type = "gem";
};
version = "1.4.1";
};
net-http-persistent = {
dependencies = ["connection_pool"];
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "1bink2g0a94zh9kmb96rrh48rkbkdpimljy2370z5liixvy3gdpa";
type = "gem";
};
version = "3.1.0";
};
nokogiri = {
dependencies = ["mini_portile2"];
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "12j76d0bp608932xkzmfi638c7aqah57l437q8494znzbj610qnm";
type = "gem";
};
version = "1.10.9";
};
ntlm-http = {
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "0yx01ffrw87wya1syivqzf8hz02axk7jdpw6aw221xwvib767d36";
type = "gem";
};
version = "0.1.1";
};
open4 = {
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "1cgls3f9dlrpil846q0w7h66vsc33jqn84nql4gcqkk221rh7px1";
type = "gem";
};
version = "1.3.4";
};
unf = {
dependencies = ["unf_ext"];
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "0bh2cf73i2ffh4fcpdn9ir4mhq8zi50ik0zqa1braahzadx536a9";
type = "gem";
};
version = "0.1.4";
};
unf_ext = {
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "0wc47r23h063l8ysws8sy24gzh74mks81cak3lkzlrw4qkqb3sg4";
type = "gem";
};
version = "0.0.7.7";
};
webrobots = {
groups = ["default"];
platforms = [];
source = {
remotes = ["https://rubygems.org"];
sha256 = "19ndcbba8s8m62hhxxfwn83nax34rg2k5x066awa23wknhnamg7b";
type = "gem";
};
version = "0.1.2";
};
}

65
xerox/scrape.rb Normal file
View File

@ -0,0 +1,65 @@
#!/usr/bin/env ruby
require 'open-uri'
require 'influxdb'
HOST = ARGV[0]
USER = ARGV[1]
PASSWORD = ARGV[2]
def scrape_paper_supply
results = {}
open("http://#{HOST}/sttray.htm", :http_basic_authentication => [USER, PASSWORD])
.read()
.scan(/\['Tray (.+?)',\d+,(\d+),/) do |m|
results[m[0]] = m[1].to_i
end
results
end
def scrape_consumables
results = {}
doc = open("http://#{HOST}/stsply.htm", :http_basic_authentication => [USER, PASSWORD])
.read()
.force_encoding("ISO-8859-1")
.encode("utf-8", replace: nil)
doc.scan(/info.concat\(\[\[(.+?)\);/) do |m|
m[0].scan(/\['(.+?)',(\d+),(\d+)\]/) do |m|
results[m[0]] = {
:status => m[1].to_i,
:life => m[2].to_i,
}
end
end
results
end
paper_supply = scrape_paper_supply
consumables = scrape_consumables
db = InfluxDB::Client.new(url: "http://grafana.hq.c3d2.de:8086/drucker")
db.write_points [ {
series: "paper_supply",
tags: { host: HOST },
values: paper_supply,
}, {
series: "consumables_status",
tags: { host: HOST },
values: consumables.inject({}) do |status, consumable|
status[consumable[0]] = consumable[1][:status]
status
end,
}, {
series: "consumables_life",
tags: { host: HOST },
values: consumables.inject({}) do |life, consumable|
life[consumable[0]] = consumable[1][:life]
life
end,
} ], 'm'