updating with tweaks to live deployment.
authorStephen Soltesz <soltesz@cs.princeton.edu>
Wed, 17 Jun 2009 20:29:40 +0000 (20:29 +0000)
committerStephen Soltesz <soltesz@cs.princeton.edu>
Wed, 17 Jun 2009 20:29:40 +0000 (20:29 +0000)
automate-default.sh
monitor/wrapper/emailTxt.py
monitor/wrapper/mailer.py
statistics/parserpms.py
zabbix/hosts.py

index 2858c63..958d578 100755 (executable)
@@ -60,28 +60,21 @@ fi
 #TODO: should add a call to ssh-add -l to check if the keys are loaded or not.
 source ${MONITOR_SCRIPT_ROOT}/agent.sh
 
 #TODO: should add a call to ssh-add -l to check if the keys are loaded or not.
 source ${MONITOR_SCRIPT_ROOT}/agent.sh
 
+${MONITOR_SCRIPT_ROOT}/checksync.py $DATE || :
 ${MONITOR_SCRIPT_ROOT}/syncwithplc.py $DATE || :
 ${MONITOR_SCRIPT_ROOT}/syncwithplc.py $DATE || :
+service plc restart monitor
 
 echo "Performing FindAll Nodes"
 #########################
 # 1. FINDBAD NODES 
 
 echo "Performing FindAll Nodes"
 #########################
 # 1. FINDBAD NODES 
-${MONITOR_SCRIPT_ROOT}/findall.py --increment $DATE || :
+${MONITOR_SCRIPT_ROOT}/findall.py $DATE || :
 ps ax | grep BatchMode | grep -v grep | awk '{print $1}' | xargs -r kill || :
 # clean up stray 'locfg' processes that hang around inappropriately...
 ps ax | grep locfg | grep -v grep | awk '{print $1}' | xargs -r kill || :
 
 ${MONITOR_SCRIPT_ROOT}/policy.py $DATE
 ps ax | grep BatchMode | grep -v grep | awk '{print $1}' | xargs -r kill || :
 # clean up stray 'locfg' processes that hang around inappropriately...
 ps ax | grep locfg | grep -v grep | awk '{print $1}' | xargs -r kill || :
 
 ${MONITOR_SCRIPT_ROOT}/policy.py $DATE
-
-echo "Archiving pkl files"
-#########################
-# Archive pkl files.
-for f in act_all l_plcnodes site_persistflags node_persistflags pcu_persistflags ; do
-       if [ -f ${MONITOR_DATA_ROOT}/production.$f.pkl ] ; then
-               cp ${MONITOR_DATA_ROOT}/production.$f.pkl ${MONITOR_ARCHIVE_ROOT}/`date +%F-%H:%M`.production.$f.pkl
-       else
-               echo "Warning: It failed to archive ${MONITOR_DATA_ROOT}/production.$f.pkl"
-       fi
-done
+${MONITOR_SCRIPT_ROOT}/checksync.py $DATE || :
+service plc restart monitor
 
 cp ${MONITOR_SCRIPT_ROOT}/monitor.log ${MONITOR_ARCHIVE_ROOT}/`date +%F-%H:%M`.monitor.log
 rm -f $MONITOR_PID
 
 cp ${MONITOR_SCRIPT_ROOT}/monitor.log ${MONITOR_ARCHIVE_ROOT}/`date +%F-%H:%M`.monitor.log
 rm -f $MONITOR_PID
index 9a7fec3..77e8576 100644 (file)
@@ -211,7 +211,7 @@ ERROR-         This is an error state, where there is absolutely no contact
 #############################################################################
 #############################################################################
 
 #############################################################################
 #############################################################################
 
-       pcumissing_notice =("""MONTEST: There is no PCU available to reboot %(hostname)s""",
+       pcumissing_notice =("""There is no PCU available to reboot %(hostname)s""",
 """We've noticed that there is no PCU associated with %(hostname)s, so we could 
 not reboot it ourselves.
 
 """We've noticed that there is no PCU associated with %(hostname)s, so we could 
 not reboot it ourselves.
 
@@ -229,26 +229,26 @@ Thank you very much for your help,
   -- PlanetLab Central (support@planet-lab.org)
 """)
 
   -- PlanetLab Central (support@planet-lab.org)
 """)
 
-       pcufailed_notice =("""MONTEST: Could not use PCU to reboot %(hostname)s""",
+       pcufailed_notice =("""Could not use PCU to reboot %(hostname)s""",
 
 """We tried to use the PCU registered for %(hostname)s, but for some reason 
 the host did not come back online.  You may be able to learn more by visiting
 this link:
 
 
 """We tried to use the PCU registered for %(hostname)s, but for some reason 
 the host did not come back online.  You may be able to learn more by visiting
 this link:
 
-       https://monitor.planet-lab.org/monitor/pcuview?loginbase=%(loginbase)s
+    https://monitor.planet-lab.org/monitor/pcuview?loginbase=%(loginbase)s
 
 We need your help resolving this issue in a few ways:  
 
  1. First, we need your help rebooting %(hostname)s.  Because the above PCU does 
     not appear to work, please manually reboot this machine.  If it turns out 
 
 We need your help resolving this issue in a few ways:  
 
  1. First, we need your help rebooting %(hostname)s.  Because the above PCU does 
     not appear to work, please manually reboot this machine.  If it turns out 
-       that there is a problem with the PCU configuration, we can help you
+    that there is a problem with the PCU configuration, we can help you
     resolve that independently.
 
  2. If it is possible, please correcct the above PCU problem, or let us know
     resolve that independently.
 
  2. If it is possible, please correcct the above PCU problem, or let us know
-       what steps you are taking.  By enabling us to take administrative actions
-       automatically without your intervention, you will save time in the future 
-       the next time we need to reboot this machine, because we will be able to 
-       do so without disturbing you.
+    what steps you are taking.  By enabling us to take administrative actions
+    automatically without your intervention, you will save time in the future 
+    the next time we need to reboot this machine, because we will be able to 
+    do so without disturbing you.
 
  3. If there is nothing apparently wrong with the PCU, or the mapping between
     the PCU and the host, then there is likely a problem with our bootstrap
 
  3. If there is nothing apparently wrong with the PCU, or the mapping between
     the PCU and the host, then there is likely a problem with our bootstrap
@@ -265,7 +265,7 @@ Thank you very much for your help,
   -- PlanetLab Central (support@planet-lab.org)
 """)
 
   -- PlanetLab Central (support@planet-lab.org)
 """)
 
-       online_notice=("""MONTEST: Host %(hostname)s is online""",
+       online_notice=("""Host %(hostname)s is online""",
        """
 This notice is simply to let you know that:
     %(hostname)s
        """
 This notice is simply to let you know that:
     %(hostname)s
@@ -277,14 +277,14 @@ is online and operational.
 Thank you very much for your help!
   -- PlanetLab Central (support@planet-lab.org)
        """)
 Thank you very much for your help!
   -- PlanetLab Central (support@planet-lab.org)
        """)
-       test_notice=("""MONTEST: Host %(hostname)s is testing""",
+       test_notice=("""Host %(hostname)s is testing""",
        """
 This notice is simply to test whether notices work.
     %(hostname)s
 
 Thank you very much for your help!
        """)
        """
 This notice is simply to test whether notices work.
     %(hostname)s
 
 Thank you very much for your help!
        """)
-       retry_bootman=("""MONTEST: Running BootManager on %(hostname)s""",
+       retry_bootman=("""Running BootManager on %(hostname)s""",
        """
 This notice is simply to let you know that:
     %(hostname)s
        """
 This notice is simply to let you know that:
     %(hostname)s
@@ -292,7 +292,7 @@ This notice is simply to let you know that:
 appears stuck in a debug mode.  To try to correct this, we're trying to rerun BootManager.py.  
 If any action is needed from you, you will recieve additional notices.  Thank you!
        """)
 appears stuck in a debug mode.  To try to correct this, we're trying to rerun BootManager.py.  
 If any action is needed from you, you will recieve additional notices.  Thank you!
        """)
-       down_notice=("""MONTEST: Host %(hostname)s is down""",
+       down_notice=("""Host %(hostname)s is down""",
        """
 This notice is simply to let you know that:
     %(hostname)s
        """
 This notice is simply to let you know that:
     %(hostname)s
@@ -309,7 +309,7 @@ Thank you very much for your help,
   -- PlanetLab Central (support@planet-lab.org)
        """)
 
   -- PlanetLab Central (support@planet-lab.org)
        """)
 
-       clear_penalty=("""MONTEST: All privileges restored to site %(loginbase)s""",
+       clear_penalty=("""All privileges restored to site %(loginbase)s""",
        """
 This notice is to let you know that any privileges previously reduced at your 
 site have been restored: %(penalty_level)s.
        """
 This notice is to let you know that any privileges previously reduced at your 
 site have been restored: %(penalty_level)s.
@@ -330,7 +330,7 @@ Legend:
   2+ - all existing slices will be disabled.
        """)
 
   2+ - all existing slices will be disabled.
        """)
 
-       increase_penalty=("""MONTEST: Privilege reduced for site %(loginbase)s""",
+       increase_penalty=("""Privilege reduced for site %(loginbase)s""",
        """
 This notice is to let you know that the privileges granted to your site as
 a participating member of Planetlab have reduced: %(penalty_level)s.
        """
 This notice is to let you know that the privileges granted to your site as
 a participating member of Planetlab have reduced: %(penalty_level)s.
@@ -351,7 +351,7 @@ Legend:
   2+ - all existing slices will be disabled.
        """)
 
   2+ - all existing slices will be disabled.
        """)
 
-       newbootcd_notice=("""MONTEST: Host %(hostname)s needs a new BootImage""", """
+       newbootcd_notice=("""Host %(hostname)s needs a new BootImage""", """
 We noticed the following node has an out-dated BootImage: 
 
     %(hostname)s  
 We noticed the following node has an out-dated BootImage: 
 
     %(hostname)s  
@@ -453,7 +453,7 @@ Thank you very much for your help,
   -- PlanetLab Central (support@planet-lab.org)
 """)
 
   -- PlanetLab Central (support@planet-lab.org)
 """)
 
-       newalphacd_notice=("""MONTEST: New Boot Images for %(hostname)s""", 
+       newalphacd_notice=("""New Boot Images for %(hostname)s""", 
 """As part of PlanetLab node monitoring, we noticed that we were not able to recognize all the hardware in your machine.  This means that it is so new that it needs a new BootCD, or that it is so old that it is no longer supported.
 
     %(hostname)s  
 """As part of PlanetLab node monitoring, we noticed that we were not able to recognize all the hardware in your machine.  This means that it is so new that it needs a new BootCD, or that it is so old that it is no longer supported.
 
     %(hostname)s  
@@ -483,7 +483,7 @@ Thank you for your help,
        pcutonodemapping=[pcutonodemapping_one, pcutonodemapping_one, pcutonodemapping_one]
        pcudown=[pcudown_one, pcudown_one, pcudown_one]
 
        pcutonodemapping=[pcutonodemapping_one, pcutonodemapping_one, pcutonodemapping_one]
        pcudown=[pcudown_one, pcudown_one, pcudown_one]
 
-       unknownsequence_notice = ("""MONTEST: Unrecognized Error on PlanetLab host %(hostname)s""", 
+       unknownsequence_notice = ("""Unrecognized Error on PlanetLab host %(hostname)s""", 
                                           """
 While trying to automatically recover this machine:
 
                                           """
 While trying to automatically recover this machine:
 
@@ -569,7 +569,7 @@ Thank you for your help,
        donation_down = [ donation_down_one, donation_down_one, donation_down_one ]
 
 
        donation_down = [ donation_down_one, donation_down_one, donation_down_one ]
 
 
-       minimalhardware_notice = ("""MONTEST: Hardware requirements not met on PlanetLab host %(hostname)s""", 
+       minimalhardware_notice = ("""Hardware requirements not met on PlanetLab host %(hostname)s""", 
                                           """
 While trying to automatically recover this machine:
 
                                           """
 While trying to automatically recover this machine:
 
@@ -589,7 +589,7 @@ BootManager.log output follows:
 %(bmlog)s
 """      )
 
 %(bmlog)s
 """      )
 
-       baddisk_notice = ("""MONTEST: Bad Disk on PlanetLab node %(hostname)s""", 
+       baddisk_notice = ("""Bad Disk on PlanetLab node %(hostname)s""", 
                           """As part of PlanetLab node monitoring, we noticed %(hostname)s has a number of disk or media related I/O errors, that prevent it from either booting or reliably running as a PlanetLab node.
 
 Please verify the integrity of the disk, and order a replacement if needed.  If you need to schedule downtime for the node, please let us know at support@planet-lab.org. 
                           """As part of PlanetLab node monitoring, we noticed %(hostname)s has a number of disk or media related I/O errors, that prevent it from either booting or reliably running as a PlanetLab node.
 
 Please verify the integrity of the disk, and order a replacement if needed.  If you need to schedule downtime for the node, please let us know at support@planet-lab.org. 
@@ -655,7 +655,7 @@ BootManager.log output follows:
 %(bmlog)s
 """)
 
 %(bmlog)s
 """)
 
-       nodeconfig_notice=("""MONTEST:  Please Update Configuration file for PlanetLab node %(hostname)s""", 
+       nodeconfig_notice=(""" Please Update Configuration file for PlanetLab node %(hostname)s""", 
 """As part of PlanetLab node monitoring, we noticed %(hostname)s has an out-dated plnode.txt file with no NODE_ID or a mis-matched HOSTNAME.  This can happen either due to an initial configuration failure at your site, with information entered into our database, or after a software upgrade.  To resolve the issue we require your assistance.  All that is needed is to visit:
 
        https://www.planet-lab.org/db/nodes/index.php?nodepattern=%(hostname)s
 """As part of PlanetLab node monitoring, we noticed %(hostname)s has an out-dated plnode.txt file with no NODE_ID or a mis-matched HOSTNAME.  This can happen either due to an initial configuration failure at your site, with information entered into our database, or after a software upgrade.  To resolve the issue we require your assistance.  All that is needed is to visit:
 
        https://www.planet-lab.org/db/nodes/index.php?nodepattern=%(hostname)s
@@ -695,7 +695,7 @@ Thanks.
 """)
 
 
 """)
 
 
-       baddns_notice=("""MONTEST: Planetlab node down: broken DNS configuration for %(hostname)s""", 
+       baddns_notice=("""Planetlab node down: broken DNS configuration for %(hostname)s""", 
 """As part of PlanetLab node monitoring, we noticed the DNS servers used by the following machine(s) are not responding to queries.
 
     %(hostname)s 
 """As part of PlanetLab node monitoring, we noticed the DNS servers used by the following machine(s) are not responding to queries.
 
     %(hostname)s 
index d3f5df4..4a0d661 100755 (executable)
@@ -28,7 +28,7 @@ def reformat_for_rt(text):
                
 
 def _setupRTenvironment():
                
 
 def _setupRTenvironment():
-       os.environ['PATH'] = os.environ['PATH'] + ":" + config.RT_WEB_TOOLS_PATH
+       os.environ['PATH'] = config.RT_WEB_TOOLS_PATH + ":" + os.environ['PATH']
        os.environ['RTSERVER'] = config.RT_WEB_SERVER
        os.environ['RTUSER']   = config.RT_WEB_USER
        os.environ['RTPASSWD'] = config.RT_WEB_PASSWORD
        os.environ['RTSERVER'] = config.RT_WEB_SERVER
        os.environ['RTUSER']   = config.RT_WEB_USER
        os.environ['RTPASSWD'] = config.RT_WEB_PASSWORD
@@ -41,6 +41,7 @@ def setTicketStatus(ticket_id, status):
                return {}
 
        cmd = "rt edit ticket/%s set status=%s" % (ticket_id, status)
                return {}
 
        cmd = "rt edit ticket/%s set status=%s" % (ticket_id, status)
+       print cmd
        (f_in, f_out, f_err) = os.popen3(cmd)
        value = f_out.read()
        l_values = value.split('\n')
        (f_in, f_out, f_err) = os.popen3(cmd)
        value = f_out.read()
        l_values = value.split('\n')
@@ -52,6 +53,7 @@ def getTicketStatus(ticket_id):
                return {}
 
        cmd = "rt show -t ticket -f id,subject,status,queue,created %s" % (ticket_id)
                return {}
 
        cmd = "rt show -t ticket -f id,subject,status,queue,created %s" % (ticket_id)
+       print cmd
        (f_in, f_out, f_err) = os.popen3(cmd)
        value = f_out.read()
        l_values = value.split('\n')
        (f_in, f_out, f_err) = os.popen3(cmd)
        value = f_out.read()
        l_values = value.split('\n')
@@ -78,6 +80,7 @@ def setAdminCCViaRT(ticket_id, to):
        # create a comma-separated list
        s_to = ",".join(to)
        cmd = "rt edit ticket/%s set admincc='%s'" % (ticket_id, s_to)
        # create a comma-separated list
        s_to = ",".join(to)
        cmd = "rt edit ticket/%s set admincc='%s'" % (ticket_id, s_to)
+       print cmd
        (f_in, f_out, f_err) = os.popen3(cmd)
        value = f_out.read()
        l_values = value.split()
        (f_in, f_out, f_err) = os.popen3(cmd)
        value = f_out.read()
        l_values = value.split()
@@ -101,6 +104,7 @@ def setSubjectViaRT(ticket_id, subject):
        i_ticket_id = int(ticket_id)
 
        cmd = "rt edit ticket/%s set subject='%s'" % (ticket_id, subject)
        i_ticket_id = int(ticket_id)
 
        cmd = "rt edit ticket/%s set subject='%s'" % (ticket_id, subject)
+       print cmd
        (f_in, f_out, f_err) = os.popen3(cmd)
        value = f_out.read()
        l_values = value.split()
        (f_in, f_out, f_err) = os.popen3(cmd)
        value = f_out.read()
        l_values = value.split()
@@ -125,9 +129,11 @@ def addCommentViaRT(ticket_id, comment):
        i_ticket_id = int(ticket_id)
 
        cmd = "rt comment -m '%s' ticket/%s" % (comment, i_ticket_id)
        i_ticket_id = int(ticket_id)
 
        cmd = "rt comment -m '%s' ticket/%s" % (comment, i_ticket_id)
+       print cmd
        (f_in, f_out, f_err) = os.popen3(cmd)
        value = f_out.read()
        l_values = value.split()
        (f_in, f_out, f_err) = os.popen3(cmd)
        value = f_out.read()
        l_values = value.split()
+       l_err = f_err.read()
        f_in.close() ; f_out.close() ; f_err.close()
        if len(l_values) > 1 and "recorded" in l_values[1]:
                # Success
        f_in.close() ; f_out.close() ; f_err.close()
        if len(l_values) > 1 and "recorded" in l_values[1]:
                # Success
@@ -136,6 +142,7 @@ def addCommentViaRT(ticket_id, comment):
                # Error
                f_in.close() ; f_out.close() ; f_err.close()
                print "ERROR: RT failed to add comment to id %s" % ticket_id
                # Error
                f_in.close() ; f_out.close() ; f_err.close()
                print "ERROR: RT failed to add comment to id %s" % ticket_id
+               print "ERROR: %s" % l_err
 
        return
 
 
        return
 
@@ -153,6 +160,7 @@ def closeTicketViaRT(ticket_id, comment):
 
        if not config.debug:
                cmd = "rt edit ticket/%s set status=resolved" % i_ticket_id
 
        if not config.debug:
                cmd = "rt edit ticket/%s set status=resolved" % i_ticket_id
+               print cmd
                (f_in, f_out, f_err) = os.popen3(cmd)
                f_in.close()
                value = f_out.read()
                (f_in, f_out, f_err) = os.popen3(cmd)
                f_in.close()
                value = f_out.read()
@@ -184,6 +192,7 @@ def emailViaRT(subject, text, to, ticket_id=None):
                setAdminCCViaRT(ticket_id, to)
 
                cmd = "rt correspond -m - %s" % ticket_id
                setAdminCCViaRT(ticket_id, to)
 
                cmd = "rt correspond -m - %s" % ticket_id
+               print cmd
                (f_in, f_out, f_err) = os.popen3(cmd)
                f_in.write(text)
                f_in.flush()
                (f_in, f_out, f_err) = os.popen3(cmd)
                f_in.write(text)
                f_in.flush()
@@ -229,6 +238,7 @@ def emailViaRT_NoTicket(subject, text, to):
 
        if config.mail and not config.debug:
                cmd = "rt create -i -t ticket"
 
        if config.mail and not config.debug:
                cmd = "rt create -i -t ticket"
+               print cmd
                (f_in, f_out, f_err) = os.popen3(cmd)
                f_in.write(input_text % (subject, spaced_text))
                f_in.flush()
                (f_in, f_out, f_err) = os.popen3(cmd)
                f_in.write(input_text % (subject, spaced_text))
                f_in.flush()
index 6ca34b2..64144d7 100755 (executable)
 import sys
 import os
 import md5
 import sys
 import os
 import md5
+import re
+from monitor.util import file as fileutil
+
+purpose_message="""
+  This utility is designed to simplify the task of parsing and generating
+  statistics for the number of packages on PlanetLab nodes.
+"""
 
 def list_to_md5(strlist):
 
 def list_to_md5(strlist):
-       digest = md5.new()
-       for f in strlist:
-               digest.update(f)
-
-       return digest.hexdigest()
-
-while True:
-       line = sys.stdin.readline()
-       if not line:
-               break
-       line = line.strip()
-       fields = line.split()
-       host = fields[1]
-       rpms = fields[2:]
-       rpms.sort()
-       if len(rpms) != 0:
-               sum = list_to_md5(rpms)
-               print sum, host
+    digest = md5.new()
+    for f in strlist:
+        digest.update(f)
+
+    return digest.hexdigest()
+
+def pick_some_rpms(pattern, rpmlist):
+    l = []
+    cpatt = re.compile(pattern)
+    for rpm in rpmlist:
+        if cpatt.search(rpm):
+            l.append(rpm)
+    return l
+
+def main():
+    global api
+    global config
+
+    from optparse import OptionParser
+    parser = OptionParser()
+
+    parser.set_defaults( select=None,
+                         input=None,
+                         frequency=False,
+                         package=False,
+                        )
+
+    parser.add_option("", "--input", dest="input", 
+                        help="the input file")
+    parser.add_option("", "--select", dest="select", 
+                        help="the pattern to pull out from rpm list")
+    parser.add_option("", "--frequency", dest="frequency", action="store_true",
+                        help="print the frequency of packages matched by select")
+    parser.add_option("", "--package", dest="package", action="store_true",
+                        help="print the frequency of each pl package")
+    (config, args) = parser.parse_args()
+    if len(sys.argv) == 1 or config.input is None:
+        print purpose_message
+        parser.print_help()
+        sys.exit(1)
+
+    rpmlist = fileutil.getListFromFile(config.input)
+
+    current_packages = ['NodeManager-1.8-5.planetlab',
+                'NodeUpdate-0.5-4.planetlab', 'codemux-0.1-13.planetlab',
+                'fprobe-ulog-1.1.3-0.planetlab', 'ipod-2.2-1.planetlab',
+                'iproute-2.6.16-2.planetlab', 'iptables-1.3.8-9.planetlab',
+                'kernel-2.6.22.19-vs2.3.0.34.28.planetlab',
+                'madwifi-0.9.4-2.6.22.19.3.planetlab', 'monitor-1.0-7.planetlab',
+                'monitor-client-3.0-10.planetlab',
+                'monitor-runlevelagent-3.0-10.planetlab', 'pl_mom-2.3-1.planetlab',
+                'pl_sshd-1.0-11.planetlab', 'pyplnet-4.3-2.planetlab',
+                'util-vserver-pl-0.3-16.planetlab',
+                'vserver-planetlab-f8-i386-4.2-12.2009.05.27',
+                'vserver-systemslices-planetlab-f8-i386-4.2-12.2009.05.27',
+                'vsys-0.9-3.planetlab', 'vsys-scripts-0.95-3.planetlab']
+
+    # PL RPMS
+    if config.package:
+        all_patterns = map(lambda x: ".*" + x + ".*", [ 'NodeManager', 
+                'NodeUpdate', 'codemux', 'fprobe', 'ipod',
+                'iproute', 'iptables', 'kernel', 'madwifi', 'monitor-client', 
+                'monitor-runlevelagent', 'monitor', 'oombailout', 'pl_mom', 
+                'pl_sshd', 'pyplnet', 'util-vserver-pl', 'vserver-planetlab-f8-i386', 
+                'vserver-systemslices-planetlab-f8-i386', 'vsys-scripts', 'vsys'])
+    else:
+        all_patterns = [config.select]
+    
+    for pattern in all_patterns:
+        return_sums = {}
+        for line in rpmlist:
+            line = line.strip()
+            fields = line.split()
+            host = fields[1]
+            rpms = fields[2:]
+            rpms.sort()
+            rpms = pick_some_rpms(pattern, rpms)
+            if len(rpms) != 0:
+                sum = list_to_md5(rpms)
+                try:
+                    return_sums[sum]['hosts'].append(host)
+                except:
+                    return_sums[sum] = {'hosts' : [], 'diff' : []}
+                    return_sums[sum]['hosts'].append(host)
+
+                return_sums[sum]['diff'] = set(rpms) - set(current_packages) 
+
+        if config.frequency:
+            print "Frequency for packages that matched: %s" % pattern
+            sum_list = []
+            for sum in return_sums:
+                sum_list.append((len(return_sums[sum]['hosts']), sum))
+
+            sum_list.sort(lambda a,b: cmp(b[0], a[0]))
+            for sum in sum_list:
+                print sum[0], sum[1], map(lambda x: x.replace('.planetlab', ''), return_sums[sum[1]]['diff'])
+
+if __name__ == "__main__":
+    main()
index c2dbde7..35b10f3 100755 (executable)
@@ -16,7 +16,7 @@ def is_in_file(filename, pattern):
                return False
 def add_to_file(filename, data):
        os.system("echo '%s' >> %s" % (data, filename))
                return False
 def add_to_file(filename, data):
        os.system("echo '%s' >> %s" % (data, filename))
-       print "echo '%s' >> %s" % (data, filename)
+       #print "echo '%s' >> %s" % (data, filename)
 
 sites = api.GetSites({'login_base' : 'mlab*'}, ['node_ids'])
 for s in sites:
 
 sites = api.GetSites({'login_base' : 'mlab*'}, ['node_ids'])
 for s in sites:
@@ -24,9 +24,9 @@ for s in sites:
        for node in nodes:
                try:
                        i = api.GetInterfaces({ 'interface_id' :  node['interface_ids'], 'is_primary' : True})
        for node in nodes:
                try:
                        i = api.GetInterfaces({ 'interface_id' :  node['interface_ids'], 'is_primary' : True})
-                       print len(i), i
-                       print "%s %s" % (i[0]['ip'], node['hostname'])
-                       #if not is_in_file(HOSTS_FILE, node['hostname']):
-                       #       add_to_file(HOSTS_FILE, "%s %s" % (i[0]['ip'], node['hostname']))
+                       #print len(i), i
+                       #print "%s %s" % (i[0]['ip'], node['hostname'])
+                       if not is_in_file(HOSTS_FILE, node['hostname']):
+                               add_to_file(HOSTS_FILE, "%s %s" % (i[0]['ip'], node['hostname']))
                except:
                        pass
                except:
                        pass