Fix for session.clear for newer versions of SQLAlchemy.
[monitor.git] / web / MonitorWeb / monitorweb / controllers.py
index 7915ca1..c540888 100644 (file)
@@ -11,15 +11,26 @@ import os
 from monitor.database.info.model import *
 #from monitor.database.zabbixapi.model import *
 from monitor_xmlrpc import MonitorXmlrpcServer
+from controllers_local import LocalExtensions
 
+from monitor import util
 from monitor import reboot
+from monitor import bootman
 from monitor import scanapi
+from monitor import config
 import time
 
 from monitor.wrapper.plccache import plcdb_hn2lb as site_hn2lb
 
 from monitorweb.templates.links import *
 
+def session_clear_all():
+    session.flush()
+    try: 
+        session.expunge_all() 
+    except AttributeError: # SQLAlchemy < 0.5.1 
+        session.clear() 
+
 class ObjectQueryFields(widgets.WidgetsList):
        """The WidgetsList defines the fields of the form."""
        pass
@@ -38,9 +49,11 @@ class NodeQueryFields(widgets.WidgetsList):
 
        hostname = widgets.CheckBox(label="Hostname")
        firewall = widgets.CheckBox(label="Firewall?")
+       fs_status = widgets.CheckBox(label="Filesystem Status")
        ssh_status = widgets.CheckBox(label="SSH Status")
        ssh_error = widgets.CheckBox(label="SSH Errors")
        dns_status = widgets.CheckBox(label="DNS Status")
+       iptables_status = widgets.CheckBox(label="IP Tables Status")
        nm_status = widgets.CheckBox(label="NM Status")
        princeton_comon_dir = widgets.CheckBox(label="CoMon Dir")
        princeton_comon_running = widgets.CheckBox(label="CoMon Running")
@@ -48,14 +61,20 @@ class NodeQueryFields(widgets.WidgetsList):
        external_dns_status = widgets.CheckBox(label="Hostname Resolves?")
        kernel_version = widgets.CheckBox(label="Kernel")
        bootcd_version = widgets.CheckBox(label="BootCD")
+       boot_server = widgets.CheckBox(label="Boot Server")
+       install_date = widgets.CheckBox(label="Installation Date")
        observed_status = widgets.CheckBox(label="Observed Status")
+       uptime = widgets.CheckBox(label="Uptime")
+       traceroute = widgets.CheckBox(label="Traceroute")
        port_status = widgets.CheckBox(label="Port Status")
+       plc_pcuid = widgets.CheckBox(label="PCU ID")
        rpms = widgets.CheckBox(label="RPM")
        rpmvalue = widgets.TextField(label="RPM Pattern")
 
 class QueryForm(widgets.TableForm):
     template = """
     <form xmlns:py="http://purl.org/kid/ns#"
+        id="queryform"
         name="${name}"
         action="${action}"
         method="${method}"
@@ -174,6 +193,9 @@ def prep_pcu_for_display(pcu):
                agg.dns_short_status = 'Mismatch'
        return agg
 
+class ActionListWidget(widgets.Widget):
+       pass
+
 class NodeWidget(widgets.Widget):
        pass
 
@@ -251,7 +273,7 @@ def prep_node_for_display(node, pcuhash=None, preppcu=True, asofdate=None):
        return agg
 
 
-class Root(controllers.RootController, MonitorXmlrpcServer):
+class Root(controllers.RootController, MonitorXmlrpcServer, LocalExtensions):
        @expose(template="monitorweb.templates.welcome")
        def index(self):
                # log.debug("Happy TurboGears Controller Responding For Duty")
@@ -327,13 +349,19 @@ class Root(controllers.RootController, MonitorXmlrpcServer):
                                        agg = node.__dict__.copy()
                                else:
                                        agg = node.to_dict()
-                               agg.update(agg['plc_node_stats'])
+                                if agg['plc_node_stats']:
+                                        agg.update(agg['plc_node_stats'])
+                               if agg['install_date']:
+                                       agg['install_date'] = time.mktime(time.strptime(agg['install_date'], "%a %b %d %H:%M:%S %Y"))
                                if agg['kernel_version']:
                                        agg['kernel_version'] = agg['kernel_version'].split()[2]
+                               if 'traceroute' in data and agg['traceroute']:
+                                       agg['traceroute'] = "<pre>" + agg['traceroute'] + "</pre>"
                                if 'rpmvalue' in data and 'rpms' in data:
                                        if agg['rpms']:
                                                rpm_list = agg['rpms'].split()
-                                               rpm_list = filter(lambda x: data['rpmvalue'] in x, rpm_list)
+                                               rpm_list = filter(lambda x: re.match(data['rpmvalue'], x, re.I),
+                                                                  rpm_list)
                                                agg['rpms'] = " ".join(rpm_list)
 
                                query.append(agg)
@@ -366,7 +394,7 @@ class Root(controllers.RootController, MonitorXmlrpcServer):
        def nodeslow(self, filter='boot'):
                print "NODE------------------"
                print "befor-len: ", len( [ i for i in session] )
-               session.flush(); session.clear()
+        session_clear_all()
                print "after-len: ", len( [ i for i in session] )
                fbquery = FindbadNodeRecord.get_all_latest()
                query = []
@@ -480,12 +508,17 @@ class Root(controllers.RootController, MonitorXmlrpcServer):
        def simpleview(self, **data):
                return self.pre_view(**data)
 
+       @expose(template="monitorweb.templates.simpleview")
+       def pcuview(self, **data):
+               return self.pre_view(**data)
+
        @expose(template="monitorweb.templates.detailview")
        def detailview(self, **data):
                return self.pre_view(**data)
 
+
        def pre_view(self, **data):
-               session.flush(); session.clear()
+        session_clear_all()
 
                loginbase=None
                loginbase_list=[]
@@ -578,14 +611,15 @@ class Root(controllers.RootController, MonitorXmlrpcServer):
                                for pcuid_key in pcus:
                                        pcuquery += [pcus[pcuid_key]]
 
-               return dict(sitequery=sitequery, pcuquery=pcuquery, nodequery=nodequery, actions=actions_list, since=since, exceptions=exceptions)
+               actionlist_widget = ActionListWidget(template='monitorweb.templates.actionlist_template')
+               return dict(sitequery=sitequery, pcuquery=pcuquery, nodequery=nodequery, actions=actions_list, actionlist_widget=actionlist_widget, since=since, exceptions=exceptions)
 
 
        # TODO: add form validation
        @expose(template="monitorweb.templates.pcuview")
        @exception_handler(nodeaction_handler,"isinstance(tg_exceptions,RuntimeError)")
-       def pcuview(self, loginbase=None, pcuid=None, hostname=None, since=20, **data):
-               session.flush(); session.clear()
+       def pcuviewold(self, loginbase=None, pcuid=None, hostname=None, since=20, **data):
+        session_clear_all()
                sitequery=[]
                pcuquery=[]
                nodequery=[]
@@ -644,7 +678,7 @@ class Root(controllers.RootController, MonitorXmlrpcServer):
                query = []
                if pcu_id:
                        fbnode = HistoryPCURecord.get_by(plc_pcuid=pcu_id)
-                       l = fbnode.versions[-100:]
+                       l = fbnode.versions[-1000:]
                        l.reverse()
                        for pcu in l:
                                #prep_node_for_display(node)
@@ -689,18 +723,20 @@ class Root(controllers.RootController, MonitorXmlrpcServer):
                if loginbase:
                        fbsite = HistorySiteRecord.get_by(loginbase=loginbase)
                        # TODO: add links for earlier history if desired.
-                       l = fbsite.versions[-100:]
+                       l = fbsite.versions[-1000:]
                        l.reverse()
                        for site in l:
                                query.append(site)
                return dict(query=query, loginbase=loginbase)
 
 
+       @expose("cheetah:monitorweb.templates.pculist_plain", as_format="plain", 
+               accept_format="text/plain", content_type="text/plain")
        @expose(template="monitorweb.templates.pculist")
        def pcu(self, filter='all'):
                print "PCUVIEW------------------"
                print "befor-len: ", len( [ i for i in session] )
-               session.flush(); session.clear()
+        session_clear_all()
                print "after-len: ", len( [ i for i in session] )
                fbquery = FindbadPCURecord.get_all_latest()
                query = []
@@ -738,7 +774,7 @@ class Root(controllers.RootController, MonitorXmlrpcServer):
        def site(self, filter='all'):
                print "SITE------------------"
                print "befor-len: ", len( [ i for i in session] )
-               session.flush(); session.clear()
+        session_clear_all()
                print "after-len: ", len( [ i for i in session] )
                filtercount = {'good' : 0, 'down': 0, 'online':0, 'offline' : 0, 'new' : 0, 'pending' : 0, 'all' : 0}
                fbquery = HistorySiteRecord.query.all()
@@ -829,40 +865,48 @@ class Root(controllers.RootController, MonitorXmlrpcServer):
                return dict(results=results)
 
        @expose(template="monitorweb.templates.actionlist")
-       def actionlist(self, action_type='down_notice', since=7, loginbase=None):
+       def actionlist(self, since=7, action_type=None, loginbase=None):
 
                try: since = int(since)
                except: since = 7
 
+               acts_query = ActionRecord.query.filter(
+                                         ActionRecord.date_created >= datetime.now() - timedelta(since)
+                                        )
                if loginbase:
-                       acts = ActionRecord.query.filter_by(loginbase=loginbase
-                               ).filter(ActionRecord.date_created >= datetime.now() - timedelta(since)
-                               ).order_by(ActionRecord.date_created.desc())
-               else:
-                       acts = ActionRecord.query.filter(ActionRecord.action_type==action_type
-                               ).filter(ActionRecord.date_created >= datetime.now() - timedelta(since)
-                               ).order_by(ActionRecord.date_created.desc())
+                       acts_query = acts_query.filter_by(loginbase=loginbase)
+
+               if action_type:
+                       acts_query = acts_query.filter(ActionRecord.action_type==action_type)
+
+               acts = acts_query.order_by(ActionRecord.date_created.desc())
+
                query = [ a for a in acts ]
                
                return dict(actions=query, action_type=action_type, since=since)
 
        @cherrypy.expose()
        def upload(self, log, **keywords):
-               print "got data"
-               data = log.file.read()
-               target_file_name = os.path.join(os.getcwd(), log.filename)
-               # open file in binary mode for writing
-
-               f = open(target_file_name, 'wb')
-               print "write data"
-               f.write(data)
-               f.close()
-
-               #flash("File uploaded successfully: %s saved as: %s" \
-               #               % (upload_file.filename, target_file_name))
-               #u = UploadedFile(filename=upload_file.filename,
-               #  abspath=target_file_name, size=0)
-               print "redirecting "
-
-               #redirect("monitor")
+               hostname = None
+               logtype = None
+               logtype_list = ['bm.log', ]
+
+               if 'hostname' in keywords:
+                       hostname = keywords['hostname']
+               if 'type' in keywords and keywords['type'] in logtype_list:
+                       logtype = keywords['type']
+
+               if not hostname: return ""
+               if not logtype: return "unknown logtype: %s" % logtype 
+
+               short_target_filename = bootman.bootmanager_log_name(hostname)
+               abs_target_filename = os.path.join(config.MONITOR_BOOTMANAGER_LOG, short_target_filename)
+               print "write data: %s" % abs_target_filename
+               util.file.dumpFile(abs_target_filename, log.file.read())
+               bootman.bootmanager_log_action(hostname, short_target_filename, logtype)
+               session.flush()
+
+               print "redirecting 3"
+
                return dict()
+