Merge authors:
  Stéphane Graber (stgraber)
Related merge proposals:
  
https://code.launchpad.net/~stgraber/upstart/upstart-initctl2dot-python3/+merge/136721
  proposed by: Stéphane Graber (stgraber)
  review: Approve - James Hunt (jamesodhunt)
  review: Approve - Barry Warsaw (barry)
------------------------------------------------------------
revno: 1392 [merge]
committer: James Hunt <[email protected]>
branch nick: upstart
timestamp: Fri 2012-11-30 11:04:55 +0000
message:
  Merge of lp:~stgraber/upstart/upstart-initctl2dot-python3.
modified:
  scripts/initctl2dot.py


--
lp:upstart
https://code.launchpad.net/~upstart-devel/upstart/trunk

Your team Upstart Reviewers is subscribed to branch lp:upstart.
To unsubscribe from this branch go to 
https://code.launchpad.net/~upstart-devel/upstart/trunk/+edit-subscription
=== modified file 'scripts/initctl2dot.py'
--- scripts/initctl2dot.py	2011-06-06 12:52:08 +0000
+++ scripts/initctl2dot.py	2012-11-29 16:31:08 +0000
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 # -*- coding: utf-8 -*-
 #---------------------------------------------------------------------
 #
@@ -50,522 +50,472 @@
 import re
 import fnmatch
 import os
-from string import split
 import datetime
-from subprocess import (Popen, PIPE)
-from optparse import OptionParser
+from subprocess import Popen, PIPE
+from argparse import ArgumentParser
 
-jobs   = {}
+options = None
+jobs = {}
 events = {}
 cmd = "initctl --system show-config -e"
-script_name =  os.path.basename(sys.argv[0])
-
-job_events = [ 'starting', 'started', 'stopping', 'stopped' ]
+script_name = os.path.basename(sys.argv[0])
 
 # list of jobs to restict output to
 restrictions_list = []
 
-default_color_emits    = 'green'
+default_color_emits = 'green'
 default_color_start_on = 'blue'
-default_color_stop_on  = 'red'
-default_color_event    = 'thistle'
-default_color_job      = '#DCDCDC' # "Gainsboro"
-default_color_text     = 'black'
-default_color_bg       = 'white'
+default_color_stop_on = 'red'
+default_color_event = 'thistle'
+default_color_job = '#DCDCDC'  # "Gainsboro"
+default_color_text = 'black'
+default_color_bg = 'white'
 
-default_outfile        = 'upstart.dot'
+default_outfile = 'upstart.dot'
 
 
 def header(ofh):
-  global options
-
-  str  = "digraph upstart {\n"
-
-  # make the default node an event to simplify glob code
-  str += "  node [shape=\"diamond\", fontcolor=\"%s\", fillcolor=\"%s\", style=\"filled\"];\n" \
-    % (options.color_event_text, options.color_event)
-  str += "  rankdir=LR;\n"
-  str += "  overlap=false;\n"
-  str += "  bgcolor=\"%s\";\n" % options.color_bg
-  str += "  fontcolor=\"%s\";\n" % options.color_text
-
-  ofh.write(str)
+    ofh.write("""digraph upstart {{
+  node [shape=\"diamond\", fontcolor=\"{options.color_event_text}\", """
+              """fillcolor=\"{options.color_event}\", style=\"filled\"];
+  rankdir=LR;
+  overlap=false;
+  bgcolor=\"{options.color_bg}\";
+  fontcolor=\"{options.color_text}\";
+""".format(options=options))
 
 
 def footer(ofh):
-  global options
-
-  epilog = "overlap=false;\n"
-  epilog += "label=\"Generated on %s by %s\\n" % \
-    (str(datetime.datetime.now()), script_name)
-
-  if options.restrictions:
-    epilog += "(subset, "
-  else:
-    epilog += "("
-
-  if options.infile:
-    epilog += "from file data).\\n"
-  else:
-    epilog += "from '%s' on host %s).\\n" % \
-      (cmd, os.uname()[1])
-
-  epilog += "Boxes of color %s denote jobs.\\n" % options.color_job
-  epilog += "Solid diamonds of color %s denote events.\\n" % options.color_event
-  epilog += "Dotted diamonds denote 'glob' events.\\n"
-  epilog += "Emits denoted by %s lines.\\n" % options.color_emits
-  epilog += "Start on denoted by %s lines.\\n" % options.color_start_on
-  epilog += "Stop on denoted by %s lines.\\n" % options.color_stop_on
-  epilog += "\";\n"
-  epilog += "}\n"
-  ofh.write(epilog)
+    if options.restrictions:
+        details = "(subset, "
+    else:
+        details = "("
+
+    if options.infile:
+        details += "from file data)."
+    else:
+        details += "from '%s' on host %s)." % (cmd, os.uname()[1])
+
+    ofh.write("  overlap=false;\n"
+              "  label=\"Generated on {datenow} by {script_name} {details}\\n"
+              "Boxes of color {options.color_job} denote jobs.\\n"
+              "Solid diamonds of color {options.color_event} denote events.\\n"
+              "Dotted diamons denote 'glob' events.\\n"
+              "Emits denoted by {options.color_emits} lines.\\n"
+              "Start on denoted by {options.color_start_on} lines.\\n"
+              "Stop on denoted by {options.color_stop_on} lines.\\n"
+              "\";\n"
+              "}}\n".format(options=options, datenow=datetime.datetime.now(),
+                            script_name=script_name, details=details))
 
 
 # Map dash to underscore since graphviz node names cannot
 # contain dashes. Also remove dollars and colons
 def sanitise(s):
-  return s.replace('-', '_').replace('$', 'dollar_').replace('[', \
-  'lbracket').replace(']', 'rbracket').replace('!', \
-  'bang').replace(':', '_').replace('*', 'star').replace('?', 'question')
+    return s.replace('-', '_').replace('$', 'dollar_') \
+            .replace('[', 'lbracket').replace(']', 'rbracket') \
+            .replace('!', 'bang').replace(':', 'colon').replace('*', 'star') \
+            .replace('?', 'question').replace('.', '_')
 
 
 # Convert a dollar in @name to a unique-ish new name, based on @job and
 # return it. Used for very rudimentary instance handling.
 def encode_dollar(job, name):
-  if name[0] == '$':
-    name = job + ':' + name
-  return name
-
-
-def mk_node_name(name):
-  return sanitise(name)
+    if name[0] == '$':
+        name = job + ':' + name
+    return name
 
 
 # Jobs and events can have identical names, so prefix them to namespace
 # them off.
 def mk_job_node_name(name):
-  return mk_node_name('job_' + name)
+    return sanitise('job_' + name)
 
 
 def mk_event_node_name(name):
-  return mk_node_name('event_' + name)
+    return sanitise('event_' + name)
 
 
 def show_event(ofh, name):
-    global options
-    str = "%s [label=\"%s\", shape=diamond, fontcolor=\"%s\", fillcolor=\"%s\"," % \
-      (mk_event_node_name(name), name, options.color_event_text, options.color_event)
+    str = "  %s [label=\"%s\", shape=diamond, fontcolor=\"%s\", " \
+          "fillcolor=\"%s\"," % (mk_event_node_name(name), name,
+                                 options.color_event_text, options.color_event)
 
     if '*' in name:
-      str += " style=\"dotted\""
+        str += " style=\"dotted\""
     else:
-      str += " style=\"filled\""
+        str += " style=\"filled\""
 
     str += "];\n"
 
     ofh.write(str)
 
+
 def show_events(ofh):
-  global events
-  global options
-  global restrictions_list
-
-  events_to_show = []
-
-  if restrictions_list:
-    for job in restrictions_list:
-
-      # We want all events emitted by the jobs in the restrictions_list.
-      events_to_show += jobs[job]['emits']
-
-      # We also want all events that jobs in restrictions_list start/stop
-      # on.
-      events_to_show += jobs[job]['start on']['event']
-      events_to_show += jobs[job]['stop on']['event']
-
-      # We also want all events emitted by all jobs that jobs in the
-      # restrictions_list start/stop on. Finally, we want all events
-      # emmitted by those jobs in the restrictions_list that we
-      # start/stop on.
-      for j in jobs[job]['start on']['job']:
-        if jobs.has_key(j) and jobs[j].has_key('emits'):
-          events_to_show += jobs[j]['emits']
-
-      for j in jobs[job]['stop on']['job']:
-        if jobs.has_key(j) and jobs[j].has_key('emits'):
-          events_to_show += jobs[j]['emits']
-  else:
-    events_to_show = events
-
-  for e in events_to_show:
-    show_event(ofh, e)
+    events_to_show = []
+
+    if restrictions_list:
+        for job in restrictions_list:
+
+            # We want all events emitted by the jobs in the restrictions_list.
+            events_to_show += jobs[job]['emits']
+
+            # We also want all events that jobs in restrictions_list start/stop
+            # on.
+            events_to_show += jobs[job]['start on']['event']
+            events_to_show += jobs[job]['stop on']['event']
+
+            # We also want all events emitted by all jobs that jobs in the
+            # restrictions_list start/stop on. Finally, we want all events
+            # emmitted by those jobs in the restrictions_list that we
+            # start/stop on.
+            for j in jobs[job]['start on']['job']:
+                if j in jobs and 'emits' in jobs[j]:
+                    events_to_show += jobs[j]['emits']
+
+            for j in jobs[job]['stop on']['job']:
+                if j in jobs and 'emits' in jobs[j]:
+                    events_to_show += jobs[j]['emits']
+    else:
+        events_to_show = events
+
+    for e in events_to_show:
+        show_event(ofh, e)
 
 
 def show_job(ofh, name):
-  global options
-
-  ofh.write("""
-    %s [shape=\"record\", label=\"<job> %s | { <start> start on | <stop> stop on }\", fontcolor=\"%s\", style=\"filled\", fillcolor=\"%s\"];
-    """ % (mk_job_node_name(name), name, options.color_job_text, options.color_job))
+    ofh.write("  %s [shape=\"record\", label=\"<job> %s | { <start> start on |"
+              " <stop> stop on }\", fontcolor=\"%s\", style=\"filled\", "
+              " fillcolor=\"%s\"];\n" % (mk_job_node_name(name), name,
+                                         options.color_job_text,
+                                         options.color_job))
 
 
 def show_jobs(ofh):
-  global jobs
-  global options
-  global restrictions_list
-
-  if restrictions_list:
-    jobs_to_show = restrictions_list
-  else:
-    jobs_to_show = jobs
-
-  for j in jobs_to_show:
-    show_job(ofh, j)
-    # add those jobs which are referenced by existing jobs, but which
-    # might not be available as .conf files. For example, plymouth.conf
-    # references gdm *or* kdm, but you are unlikely to have both
-    # installed.
-    for s in jobs[j]['start on']['job']:
-      if s not in jobs_to_show:
-        show_job(ofh, s)
-
-    for s in jobs[j]['stop on']['job']:
-      if s not in jobs_to_show:
-        show_job(ofh, s)
-
-  if not restrictions_list:
-    return
-
-  # Having displayed the jobs in restrictions_list,
-  # we now need to display all jobs that *those* jobs
-  # start on/stop on.
-  for j in restrictions_list:
-    for job in jobs[j]['start on']['job']:
-      show_job(ofh, job)
-    for job in jobs[j]['stop on']['job']:
-      show_job(ofh, job)
-
-  # Finally, show all jobs which emit events that jobs in the
-  # restrictions_list care about.
-  for j in restrictions_list:
-
-    for e in jobs[j]['start on']['event']:
-      for k in jobs:
-        if e in jobs[k]['emits']:
-          show_job(ofh, k)
-
-    for e in jobs[j]['stop on']['event']:
-      for k in jobs:
-        if e in jobs[k]['emits']:
-          show_job(ofh, k)
+    if restrictions_list:
+        jobs_to_show = restrictions_list
+    else:
+        jobs_to_show = jobs
+
+    for j in jobs_to_show:
+        show_job(ofh, j)
+        # add those jobs which are referenced by existing jobs, but which
+        # might not be available as .conf files. For example, plymouth.conf
+        # references gdm *or* kdm, but you are unlikely to have both
+        # installed.
+        for s in jobs[j]['start on']['job']:
+            if s not in jobs_to_show:
+                show_job(ofh, s)
+
+        for s in jobs[j]['stop on']['job']:
+            if s not in jobs_to_show:
+                show_job(ofh, s)
+
+    # Having displayed the jobs in restrictions_list,
+    # we now need to display all jobs that *those* jobs
+    # start on/stop on.
+    for j in restrictions_list:
+        for job in jobs[j]['start on']['job']:
+            show_job(ofh, job)
+        for job in jobs[j]['stop on']['job']:
+            show_job(ofh, job)
+
+    # Finally, show all jobs which emit events that jobs in the
+    # restrictions_list care about.
+    for j in restrictions_list:
+        for e in jobs[j]['start on']['event']:
+            for k in jobs:
+                if e in jobs[k]['emits']:
+                    show_job(ofh, k)
+
+        for e in jobs[j]['stop on']['event']:
+            for k in jobs:
+                if e in jobs[k]['emits']:
+                    show_job(ofh, k)
 
 
 def show_edge(ofh, from_node, to_node, color):
-  ofh.write("%s -> %s [color=\"%s\"];\n" % (from_node, to_node, color))
+    ofh.write("  %s -> %s [color=\"%s\"];\n" % (from_node, to_node, color))
 
 
 def show_start_on_job_edge(ofh, from_job, to_job):
-  global options
-  show_edge(ofh, "%s:start" % mk_job_node_name(from_job),
-    "%s:job" % mk_job_node_name(to_job), options.color_start_on)
+    show_edge(ofh, "%s:start" % mk_job_node_name(from_job),
+              "%s:job" % mk_job_node_name(to_job), options.color_start_on)
 
 
 def show_start_on_event_edge(ofh, from_job, to_event):
-  global options
-  show_edge(ofh, "%s:start" % mk_job_node_name(from_job),
-    mk_event_node_name(to_event), options.color_start_on)
+    show_edge(ofh, "%s:start" % mk_job_node_name(from_job),
+              mk_event_node_name(to_event), options.color_start_on)
 
 
 def show_stop_on_job_edge(ofh, from_job, to_job):
-  global options
-  show_edge(ofh, "%s:stop" % mk_job_node_name(from_job),
-    "%s:job" % mk_job_node_name(to_job), options.color_stop_on)
+    show_edge(ofh, "%s:stop" % mk_job_node_name(from_job),
+              "%s:job" % mk_job_node_name(to_job), options.color_stop_on)
 
 
 def show_stop_on_event_edge(ofh, from_job, to_event):
-  global options
-  show_edge(ofh, "%s:stop" % mk_job_node_name(from_job),
-    mk_event_node_name(to_event), options.color_stop_on)
+    show_edge(ofh, "%s:stop" % mk_job_node_name(from_job),
+              mk_event_node_name(to_event), options.color_stop_on)
 
 
 def show_job_emits_edge(ofh, from_job, to_event):
-  global options
-  show_edge(ofh, "%s:job" % mk_job_node_name(from_job),
-    mk_event_node_name(to_event), options.color_emits)
+    show_edge(ofh, "%s:job" % mk_job_node_name(from_job),
+              mk_event_node_name(to_event), options.color_emits)
 
 
 def show_edges(ofh):
-  global events
-  global jobs
-  global options
-  global restrictions_list
-
-  glob_jobs = {}
-
-  if restrictions_list:
-    jobs_list = restrictions_list
-  else:
-    jobs_list = jobs
-
-  for job in jobs_list:
-
-    for s in jobs[job]['start on']['job']:
-      show_start_on_job_edge(ofh, job, s)
-
-    for s in jobs[job]['start on']['event']:
-      show_start_on_event_edge(ofh, job, s)
-
-    for s in jobs[job]['stop on']['job']:
-      show_stop_on_job_edge(ofh, job, s)
-
-    for s in jobs[job]['stop on']['event']:
-      show_stop_on_event_edge(ofh, job, s)
-
-    for e in jobs[job]['emits']:
-      if '*' in e:
-        # handle glob patterns in 'emits'
-        glob_events = []
-        for _e in events:
-          if e != _e and fnmatch.fnmatch(_e, e):
-            glob_events.append(_e)
-        glob_jobs[job] = glob_events
-
-      show_job_emits_edge(ofh, job, e)
+    glob_jobs = {}
+
+    if restrictions_list:
+        jobs_list = restrictions_list
+    else:
+        jobs_list = jobs
+
+    for job in jobs_list:
+        for s in jobs[job]['start on']['job']:
+            show_start_on_job_edge(ofh, job, s)
+
+        for s in jobs[job]['start on']['event']:
+            show_start_on_event_edge(ofh, job, s)
+
+        for s in jobs[job]['stop on']['job']:
+            show_stop_on_job_edge(ofh, job, s)
+
+        for s in jobs[job]['stop on']['event']:
+            show_stop_on_event_edge(ofh, job, s)
+
+        for e in jobs[job]['emits']:
+            if '*' in e:
+                # handle glob patterns in 'emits'
+                glob_events = []
+                for _e in events:
+                    if e != _e and fnmatch.fnmatch(_e, e):
+                        glob_events.append(_e)
+                glob_jobs[job] = glob_events
+
+            show_job_emits_edge(ofh, job, e)
+
+        if not restrictions_list:
+            continue
+
+        # Add links to events emitted by all jobs which current job
+        # start/stops on
+        for j in jobs[job]['start on']['job']:
+            if j not in jobs:
+                continue
+            for e in jobs[j]['emits']:
+                show_job_emits_edge(ofh, j, e)
+
+        for j in jobs[job]['stop on']['job']:
+            for e in jobs[j]['emits']:
+                show_job_emits_edge(ofh, j, e)
+
+    # Create links from jobs (which advertise they emits a class of
+    # events, via the glob syntax) to all the events they create.
+    for g in glob_jobs:
+        for ge in glob_jobs[g]:
+            show_job_emits_edge(ofh, g, ge)
 
     if not restrictions_list:
-      continue
-
-    # Add links to events emitted by all jobs which current job
-    # start/stops on
-    for j in jobs[job]['start on']['job']:
-      if not jobs.has_key(j):
-        continue
-      for e in jobs[j]['emits']:
-        show_job_emits_edge(ofh, j, e)
-
-    for j in jobs[job]['stop on']['job']:
-      for e in jobs[j]['emits']:
-        show_job_emits_edge(ofh, j, e)
-
-  # Create links from jobs (which advertise they emits a class of
-  # events, via the glob syntax) to all the events they create.
-  for g in glob_jobs:
-    for ge in glob_jobs[g]:
-      show_job_emits_edge(ofh, g, ge)
-
-  if not restrictions_list:
-    return
-
-  # Add jobs->event links to jobs which emit events that current job
-  # start/stops on.
-  for j in restrictions_list:
-
-    for e in jobs[j]['start on']['event']:
-      for k in jobs:
-        if e in jobs[k]['emits'] and e not in restrictions_list:
-          show_job_emits_edge(ofh, k, e)
-
-    for e in jobs[j]['stop on']['event']:
-      for k in jobs:
-        if e in jobs[k]['emits'] and e not in restrictions_list:
-          show_job_emits_edge(ofh, k, e)
+        return
+
+    # Add jobs->event links to jobs which emit events that current job
+    # start/stops on.
+    for j in restrictions_list:
+        for e in jobs[j]['start on']['event']:
+            for k in jobs:
+                if e in jobs[k]['emits'] and e not in restrictions_list:
+                    show_job_emits_edge(ofh, k, e)
+
+        for e in jobs[j]['stop on']['event']:
+            for k in jobs:
+                if e in jobs[k]['emits'] and e not in restrictions_list:
+                    show_job_emits_edge(ofh, k, e)
 
 
 def read_data():
-  global jobs
-  global events
-  global options
-  global cmd
-  global job_events
-
-  if options.infile:
-    try:
-      ifh = open(options.infile, 'r')
-    except:
-      sys.exit("ERROR: cannot read file '%s'" % options.infile)
-  else:
-    try:
-      ifh = Popen(split(cmd), stdout=PIPE).stdout
-    except:
-      sys.exit("ERROR: cannot run '%s'" % cmd)
-
-  for line in ifh.readlines():
-      record = {}
-      line = line.rstrip()
-
-      result = re.match('^\s+start on ([^,]+) \(job:\s*([^,]*), env:', line)
-      if result:
-        _event = encode_dollar(job, result.group(1))
-        _job   = result.group(2)
-        if _job:
-          jobs[job]['start on']['job'][_job] = 1
-        else:
-          jobs[job]['start on']['event'][_event] = 1
-          events[_event] = 1
-        continue
-
-      result = re.match('^\s+stop on ([^,]+) \(job:\s*([^,]*), env:', line)
-      if result:
-        _event = encode_dollar(job, result.group(1))
-        _job   = result.group(2)
-        if _job:
-          jobs[job]['stop on']['job'][_job] = 1
-        else:
-          jobs[job]['stop on']['event'][_event] = 1
-          events[_event] = 1
-        continue
-
-      if re.match('^\s+emits', line):
-        event = (line.lstrip().split())[1]
-        event = encode_dollar(job, event)
-        events[event] = 1
-        jobs[job]['emits'][event] = 1
-      else:
-        tokens = (line.lstrip().split())
-
-        if len(tokens) != 1:
-          sys.exit("ERROR: invalid line: %s" % line.lstrip())
-
-        job_record      = {}
-
-        start_on        = {}
-        start_on_jobs   = {}
-        start_on_events = {}
-
-        stop_on         = {}
-        stop_on_jobs    = {}
-        stop_on_events  = {}
-
-        emits           = {}
-
-        start_on['job']    = start_on_jobs
-        start_on['event']  = start_on_events
-
-        stop_on['job']     = stop_on_jobs
-        stop_on['event']   = stop_on_events
-
-        job_record['start on'] = start_on
-        job_record['stop on']  = stop_on
-        job_record['emits']    = emits
-
-        job = (tokens)[0]
-        jobs[job] = job_record
+    if options.infile:
+        try:
+            ifh = open(options.infile, 'r')
+        except:
+            sys.exit("ERROR: cannot read file '%s'" % options.infile)
+    else:
+        try:
+            ifh = Popen(cmd.split(), stdout=PIPE,
+                        universal_newlines=True).stdout
+        except:
+            sys.exit("ERROR: cannot run '%s'" % cmd)
+
+    job = None
+    for line in ifh:
+        line = line.rstrip()
+
+        result = re.match('^\s+start on ([^,]+) \(job:\s*([^,]*), env:', line)
+        if result:
+            _event = encode_dollar(job, result.group(1))
+            _job = result.group(2)
+            if _job:
+                jobs[job]['start on']['job'][_job] = 1
+            else:
+                jobs[job]['start on']['event'][_event] = 1
+                events[_event] = 1
+            continue
+
+        result = re.match('^\s+stop on ([^,]+) \(job:\s*([^,]*), env:', line)
+        if result:
+            _event = encode_dollar(job, result.group(1))
+            _job = result.group(2)
+            if _job:
+                jobs[job]['stop on']['job'][_job] = 1
+            else:
+                jobs[job]['stop on']['event'][_event] = 1
+                events[_event] = 1
+            continue
+
+        if re.match('^\s+emits', line):
+            event = line.lstrip().split()[1]
+            event = encode_dollar(job, event)
+            events[event] = 1
+            jobs[job]['emits'][event] = 1
+        else:
+            tokens = line.lstrip().split()
+
+            if len(tokens) != 1:
+                sys.exit("ERROR: invalid line: %s" % line.lstrip())
+
+            job_record = {}
+
+            start_on = {}
+            start_on_jobs = {}
+            start_on_events = {}
+
+            stop_on = {}
+            stop_on_jobs = {}
+            stop_on_events = {}
+
+            emits = {}
+
+            start_on['job'] = start_on_jobs
+            start_on['event'] = start_on_events
+
+            stop_on['job'] = stop_on_jobs
+            stop_on['event'] = stop_on_events
+
+            job_record['start on'] = start_on
+            job_record['stop on'] = stop_on
+            job_record['emits'] = emits
+
+            job = (tokens)[0]
+            jobs[job] = job_record
 
 
 def main():
-  global jobs
-  global options
-  global cmd
-  global default_color_emits
-  global default_color_start_on
-  global default_color_stop_on
-  global default_color_event
-  global default_color_job
-  global default_color_text
-  global default_color_bg
-  global restrictions_list
-
-  description = "Convert initctl(8) output to GraphViz dot(1) format."
-  epilog = \
-    "See http://www.graphviz.org/doc/info/colors.html for available colours."
-
-  parser = OptionParser(description=description, epilog=epilog)
-
-  parser.add_option("-r", "--restrict-to-jobs",
-      dest="restrictions",
-      help="Limit display of 'start on' and 'stop on' conditions to " +
-      "specified jobs (comma-separated list).")
-
-  parser.add_option("-f", "--infile",
-      dest="infile",
-      help="File to read '%s' output from. If not specified, " \
-      "initctl will be run automatically." % cmd)
-
-  parser.add_option("-o", "--outfile",
-      dest="outfile",
-      help="File to write output to (default=%s)" % default_outfile)
-
-  parser.add_option("--color-emits",
-      dest="color_emits",
-      help="Specify color for 'emits' lines (default=%s)." %
-      default_color_emits)
-
-  parser.add_option("--color-start-on",
-      dest="color_start_on",
-      help="Specify color for 'start on' lines (default=%s)." %
-      default_color_start_on)
-
-  parser.add_option("--color-stop-on",
-      dest="color_stop_on",
-      help="Specify color for 'stop on' lines (default=%s)." %
-      default_color_stop_on)
-
-  parser.add_option("--color-event",
-      dest="color_event",
-      help="Specify color for event boxes (default=%s)." %
-      default_color_event)
-
-  parser.add_option("--color-text",
-      dest="color_text",
-      help="Specify color for summary text (default=%s)." %
-      default_color_text)
-
-  parser.add_option("--color-bg",
-      dest="color_bg",
-      help="Specify background color for diagram (default=%s)." %
-      default_color_bg)
-
-  parser.add_option("--color-event-text",
-      dest="color_event_text",
-      help="Specify color for text in event boxes (default=%s)." %
-      default_color_text)
-
-  parser.add_option("--color-job-text",
-      dest="color_job_text",
-      help="Specify color for text in job boxes (default=%s)." %
-      default_color_text)
-
-  parser.add_option("--color-job",
-      dest="color_job",
-      help="Specify color for job boxes (default=%s)." %
-      default_color_job)
-
-  parser.set_defaults(color_emits=default_color_emits,
-  color_start_on=default_color_start_on,
-  color_stop_on=default_color_stop_on,
-  color_event=default_color_event,
-  color_job=default_color_job,
-  color_job_text=default_color_text,
-  color_event_text=default_color_text,
-  color_text=default_color_text,
-  color_bg=default_color_bg,
-  outfile=default_outfile)
-
-  (options, args) = parser.parse_args()
-
-  if options.outfile == '-':
-    ofh = sys.stdout
-  else:
-    try:
-      ofh = open(options.outfile, "w")
-    except:
-      sys.exit("ERROR: cannot open file %s for writing" % options.outfile)
-
-  if options.restrictions:
-    restrictions_list = options.restrictions.split(",")
-
-  read_data()
-
-  for job in restrictions_list:
-    if not job in jobs:
-      sys.exit("ERROR: unknown job %s" % job)
-
-  header(ofh)
-  show_events(ofh)
-  show_jobs(ofh)
-  show_edges(ofh)
-  footer(ofh)
+    global options
+    global restrictions_list
+
+    description = "Convert initctl(8) output to GraphViz dot(1) format."
+    epilog = "See http://www.graphviz.org/doc/info/colors.html " \
+             "for available colours."
+
+    parser = ArgumentParser(description=description, epilog=epilog)
+
+    parser.add_argument("-r", "--restrict-to-jobs",
+                        dest="restrictions",
+                        help="Limit display of 'start on' and 'stop on' "
+                        "conditions to specified jobs (comma-separated list).")
+
+    parser.add_argument("-f", "--infile",
+                        dest="infile",
+                        help="File to read '%s' output from. If not specified"
+                        ", initctl will be run automatically." % cmd)
+
+    parser.add_argument("-o", "--outfile",
+                        dest="outfile",
+                        help="File to write output to (default=%s)" %
+                             default_outfile)
+
+    parser.add_argument("--color-emits",
+                        dest="color_emits",
+                        help="Specify color for 'emits' lines (default=%s)." %
+                             default_color_emits)
+
+    parser.add_argument("--color-start-on",
+                        dest="color_start_on",
+                        help="Specify color for 'start on' lines "
+                             "(default=%s)." % default_color_start_on)
+
+    parser.add_argument("--color-stop-on",
+                        dest="color_stop_on",
+                        help="Specify color for 'stop on' lines "
+                             "(default=%s)." % default_color_stop_on)
+
+    parser.add_argument("--color-event",
+                        dest="color_event",
+                        help="Specify color for event boxes (default=%s)." %
+                             default_color_event)
+
+    parser.add_argument("--color-text",
+                        dest="color_text",
+                        help="Specify color for summary text (default=%s)." %
+                             default_color_text)
+
+    parser.add_argument("--color-bg",
+                        dest="color_bg",
+                        help="Specify background color for diagram "
+                             "(default=%s)." % default_color_bg)
+
+    parser.add_argument("--color-event-text",
+                        dest="color_event_text",
+                        help="Specify color for text in event boxes "
+                             "(default=%s)." % default_color_text)
+
+    parser.add_argument("--color-job-text",
+                        dest="color_job_text",
+                        help="Specify color for text in job boxes "
+                             "(default=%s)." % default_color_text)
+
+    parser.add_argument("--color-job",
+                        dest="color_job",
+                        help="Specify color for job boxes (default=%s)." %
+                             default_color_job)
+
+    parser.set_defaults(color_emits=default_color_emits,
+                        color_start_on=default_color_start_on,
+                        color_stop_on=default_color_stop_on,
+                        color_event=default_color_event,
+                        color_job=default_color_job,
+                        color_job_text=default_color_text,
+                        color_event_text=default_color_text,
+                        color_text=default_color_text,
+                        color_bg=default_color_bg,
+                        outfile=default_outfile)
+
+    options = parser.parse_args()
+
+    if options.outfile == '-':
+        ofh = sys.stdout
+    else:
+        try:
+            ofh = open(options.outfile, "w")
+        except:
+            sys.exit("ERROR: cannot open file %s for writing" %
+                     options.outfile)
+
+    if options.restrictions:
+        restrictions_list = options.restrictions.split(",")
+
+    read_data()
+
+    for job in restrictions_list:
+        if not job in jobs:
+            sys.exit("ERROR: unknown job %s" % job)
+
+    header(ofh)
+    show_events(ofh)
+    show_jobs(ofh)
+    show_edges(ofh)
+    footer(ofh)
 
 
 if __name__ == "__main__":
-  main()
+    main()

-- 
upstart-devel mailing list
[email protected]
Modify settings or unsubscribe at: 
https://lists.ubuntu.com/mailman/listinfo/upstart-devel

Reply via email to