aboutsummaryrefslogtreecommitdiff
path: root/rcynic
diff options
context:
space:
mode:
Diffstat (limited to 'rcynic')
-rw-r--r--rcynic/rcynic-html.py153
-rw-r--r--rcynic/rpki-torrent.py55
2 files changed, 83 insertions, 125 deletions
diff --git a/rcynic/rcynic-html.py b/rcynic/rcynic-html.py
index c7dfcfe2..58e65dde 100644
--- a/rcynic/rcynic-html.py
+++ b/rcynic/rcynic-html.py
@@ -17,13 +17,13 @@
# PERFORMANCE OF THIS SOFTWARE.
"""
-Render rcynic's XML output to basic (X)HTML with some rrdtool graphis.
+Render rcynic's XML output to basic (X)HTML with some rrdtool graphics.
"""
import sys
import urlparse
import os
-import getopt
+import argparse
import time
import subprocess
import copy
@@ -34,81 +34,47 @@ except ImportError:
from xml.etree.ElementTree import (ElementTree, Element, SubElement, Comment)
session = None
-
-opt = {
- "refresh" : 1800,
- "show-problems" : True,
- "show-graphs" : True,
- "show-object-counts" : True,
- "update-rrds" : True,
- "png-height" : 190,
- "png-width" : 1350,
- "svg-height" : 600,
- "svg-width" : 1200,
- "eps-height" : 0,
- "eps-width" : 0 }
-
-try:
- # Set from autoconf
- opt["rrdtool-binary"] = ac_rrdtool_binary
-except NameError:
- # Not set at all
- opt["rrdtool-binary"] = "rrdtool"
-
-def usage(msg = 0):
- f = sys.stderr if msg else sys.stdout
- f.write("Usage: %s %s [options] input_file output_directory\n" % (sys.executable, sys.argv[0]))
- f.write("Options:\n")
- for i in sorted(opt):
- if "_" not in i and not isinstance(opt[i], bool):
- f.write(" --%-30s (%s)\n" % (i + " <value>", opt[i]))
- for i in sorted(opt):
- if "_" not in i and isinstance(opt[i], bool):
- f.write(" --[no-]%-25s (--%s%s)\n" % (i, "" if opt[i] else "no-", i))
- if msg:
- f.write("\n")
- sys.exit(msg)
+args = None
def parse_options():
- opts = ["help"]
- for i in opt:
- if isinstance(opt[i], bool):
- opts.append(i)
- opts.append("no-" + i)
- else:
- opts.append(i + "=")
-
- try:
- opts, argv = getopt.getopt(sys.argv[1:], "h?", opts)
- for o, a in opts:
- if o in ("-?", "-h", "--help"):
- usage(0)
- negated = o.startswith("--no-")
- o = o[5:] if negated else o[2:]
- if isinstance(opt[o], bool):
- opt[o] = not negated
- elif isinstance(opt[o], int):
- opt[o] = int(a)
- else:
- opt[o] = a
- except Exception, e:
- usage("%s: %s" % (e.__class__.__name__, str(e)))
-
- if len(argv) > 2:
- usage("Unexpected arguments")
+ global args
try:
- opt["input_file"] = argv[0]
- opt["output_directory"] = argv[1]
- except IndexError:
- usage("Missing required arguments")
-
- if not os.path.isdir(opt["output_directory"]):
- try:
- os.makedirs(opt["output_directory"])
- except OSError, e:
- sys.exit("Couldn't create output directory: %s" % e)
+ default_rrdtool_binary = ac_rrdtool_binary
+ except NameError:
+ default_rrdtool_binary = "rrdtool"
+
+ parser = argparse.ArgumentParser(description = __doc__)
+ parser.add_argument("--refresh", type = int, default = 1800,
+ help = "refresh interval for generated HTML")
+ parser.add_argument("--hide-problems", action = "store_true",
+ help = "don't generate \"problems\" page")
+ parser.add_argument("--hide-graphs", action = "store_true",
+ help = "don't generate graphs")
+ parser.add_argument("--hide-object-counts", action = "store_true",
+ help = "don't display object counts")
+ parser.add_argument("--dont-update-rrds", action = "store_true",
+ help = "don't add new data to RRD databases")
+ parser.add_argument("--png-height", type = int, default = 190,
+ help = "height of PNG images")
+ parser.add_argument("--png-width", type = int, default = 1350,
+ help = "width of PNG images")
+ parser.add_argument("--svg-height", type = int, default = 600,
+ help = "height of SVG images")
+ parser.add_argument("--svg-width", type = int, default = 1200,
+ help = "width of SVG images")
+ parser.add_argument("--eps-height", type = int, default = 0,
+ help = "height of EPS images")
+ parser.add_argument("--eps-width", type = int, default = 0,
+ help = "width of EPS images")
+ parser.add_argument("--rrdtool-binary", default = default_rrdtool_binary,
+ help = "location of rrdtool binary")
+ parser.add_argument("input_file", type = argparse.FileType("r"),
+ help = "XML input file")
+ parser.add_argument("output_directory",
+ help = "output directory")
+ args = parser.parse_args()
def parse_utc(s):
@@ -321,17 +287,15 @@ class Host(Problem_Mixin):
def rrd_run(self, cmd):
try:
cmd = [str(i) for i in cmd]
- cmd.insert(0, opt["rrdtool-binary"])
+ cmd.insert(0, args.rrdtool_binary)
subprocess.check_call(cmd, stdout = open("/dev/null", "w"))
except OSError, e:
- usage("Problem running %s, perhaps you need to set --rrdtool-binary? (%s)" % (
- opt["rrdtool-binary"], e))
+ sys.exit("Problem running %s, perhaps you need to set --rrdtool-binary? (%s)" % (args.rrdtool_binary, e))
except subprocess.CalledProcessError, e:
- sys.exit("Failure running %s: %s" % (
- opt["rrdtool-binary"], e))
+ sys.exit("Failure running %s: %s" % (args.rrdtool_binary, e))
def rrd_update(self):
- filename = os.path.join(opt["output_directory"], self.hostname) + ".rrd"
+ filename = os.path.join(args.output_directory, self.hostname) + ".rrd"
if not os.path.exists(filename):
cmd = ["create", filename, "--start", self.timestamp - 1, "--step", "3600"]
cmd.extend(self.field_ds_specifiers())
@@ -341,24 +305,24 @@ class Host(Problem_Mixin):
"%s:%s" % (self.timestamp, ":".join(str(v) for v in self.field_values))])
def rrd_graph(self, html):
- filebase = os.path.join(opt["output_directory"], self.hostname)
+ filebase = os.path.join(args.output_directory, self.hostname)
formats = [format for format in ("png", "svg", "eps")
- if opt[format + "-width"] and opt[format + "-height"]]
+ if getattr(args, format + "_width") and getattr(args, format + "_height")]
for period, start in self.graph_periods:
for format in formats:
cmds = [ "graph", "%s_%s.%s" % (filebase, period, format),
"--title", "%s last %s" % (self.hostname, period),
"--start", start,
- "--width", opt[format + "-width"],
- "--height", opt[format + "-height"],
+ "--width", getattr(args, format + "_width"),
+ "--height", getattr(args, format + "_height"),
"--imgformat", format.upper() ]
cmds.extend(self.graph_opts)
cmds.extend(self.field_defs(filebase))
cmds.extend(self.graph_cmds)
self.rrd_run(cmds)
img = Element("img", src = "%s_%s.png" % (self.hostname, period),
- width = str(opt["png-width"]),
- height = str(opt["png-height"]))
+ width = str(args.png_width),
+ height = str(args.png_height))
if self.graph is None:
self.graph = copy.copy(img)
html.BodyElement("h2").text = "%s over last %s" % (self.hostname, period)
@@ -375,10 +339,7 @@ class Session(Problem_Mixin):
def __init__(self):
self.hosts = {}
- if opt["input_file"] == "-":
- self.root = ElementTree(file = sys.stdin).getroot()
- else:
- self.root = ElementTree(file = opt["input_file"]).getroot()
+ self.root = ElementTree(file = args.input_file).getroot()
self.rcynic_version = self.root.get("rcynic-version")
self.rcynic_date = self.root.get("date")
@@ -424,7 +385,7 @@ class Session(Problem_Mixin):
for h in self.hosts.itervalues())
def rrd_update(self):
- if opt["update-rrds"]:
+ if not args.dont_update_rrds:
for h in self.hosts.itervalues():
h.rrd_update()
@@ -517,7 +478,7 @@ class HTML(object):
def __init__(self, title, filebase):
- self.filename = os.path.join(opt["output_directory"], filebase + ".html")
+ self.filename = os.path.join(args.output_directory, filebase + ".html")
self.html = Element("html")
self.html.append(Comment(" Generators:\n" +
@@ -531,8 +492,8 @@ class HTML(object):
SubElement(self.body, "h1").text = title
SubElement(self.head, "style", type = "text/css").text = css
- if opt["refresh"]:
- SubElement(self.head, "meta", { "http-equiv" : "Refresh", "content" : str(opt["refresh"]) })
+ if args.refresh:
+ SubElement(self.head, "meta", { "http-equiv" : "Refresh", "content" : str(args.refresh) })
hostwidth = max(len(hostname) for hostname in session.hostnames)
@@ -648,9 +609,9 @@ def main():
for hostname in session.hostnames:
html = HTML("Repository details for %s" % hostname, hostname)
html.counter_table(session.hosts[hostname].get_counter, session.hosts[hostname].get_total)
- if opt["show-graphs"]:
+ if not args.hide_graphs:
session.hosts[hostname].rrd_graph(html)
- if opt["show-problems"]:
+ if not args.hide_problems:
html.BodyElement("h2").text = "Connection Problems"
html.detail_table(session.hosts[hostname].connection_problems)
html.BodyElement("h2").text = "Object Problems"
@@ -660,7 +621,7 @@ def main():
html = HTML("rcynic summary", "index")
html.BodyElement("h2").text = "Grand totals for all repositories"
html.counter_table(session.get_sum, Label.get_count)
- if opt["show-object-counts"]:
+ if not args.hide_object_counts:
html.BodyElement("br")
html.BodyElement("hr")
html.BodyElement("br")
@@ -672,7 +633,7 @@ def main():
html.BodyElement("br")
html.BodyElement("h2").text = "Overview for repository %s" % hostname
html.counter_table(session.hosts[hostname].get_counter, session.hosts[hostname].get_total)
- if opt["show-graphs"]:
+ if not args.hide_graphs:
html.BodyElement("br")
html.BodyElement("a", href = "%s.html" % hostname).append(session.hosts[hostname].graph)
html.close()
diff --git a/rcynic/rpki-torrent.py b/rcynic/rpki-torrent.py
index 6068d642..9b97f298 100644
--- a/rcynic/rpki-torrent.py
+++ b/rcynic/rpki-torrent.py
@@ -1,22 +1,22 @@
#!/usr/local/bin/python
-"""
-$Id$
-
-Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC")
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
-REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
-INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
-OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-"""
+# $Id$
+#
+# Copyright (C) 2013--2014 Dragon Research Labs ("DRL")
+# Portions copyright (C) 2012 Internet Systems Consortium ("ISC")
+#
+# Permission to use, copy, modify, and distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notices and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND DRL AND ISC DISCLAIM ALL
+# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DRL OR
+# ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+# DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
+# OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+# PERFORMANCE OF THIS SOFTWARE.
import urllib2
import httplib
@@ -37,7 +37,7 @@ import stat
import time
import errno
import fcntl
-import getopt
+import argparse
import smtplib
import email.mime.text
@@ -82,20 +82,17 @@ def main():
syslog_flags |= syslog.LOG_PERROR
syslog.openlog("rpki-torrent", syslog_flags)
- cfg_file = [os.path.join(dn, fn)
- for fn in ("rcynic.conf", "rpki.conf")
- for dn in ("/var/rcynic/etc", "/usr/local/etc", "/etc")]
-
- opts, argv = getopt.getopt(sys.argv[1:], "c:h?", ["config=", "help"])
- for o, a in opts:
- if o in ("-h", "--help", "-?"):
- raise UseTheSourceLuke
- elif o in ("-c", "--config"):
- cfg_file = a
+ parser = argparse.ArgumentParser(description = __doc__)
+ parser.add_argument("-c", "--config",
+ help = "configuration file")
+ args = parser.parse_args()
global cfg
cfg = MyConfigParser()
- cfg.read(cfg_file)
+ cfg.read(args.config or
+ [os.path.join(dn, fn)
+ for fn in ("rcynic.conf", "rpki.conf")
+ for dn in ("/var/rcynic/etc", "/usr/local/etc", "/etc")])
if cfg.act_as_generator:
if len(argv) == 1 and argv[0] == "generate":