setup both monitor and zabbix databases in /etc/plc.d/monitor
[monitor.git] / monitor / database / infovacuum / findbad.py
diff --git a/monitor/database/infovacuum/findbad.py b/monitor/database/infovacuum/findbad.py
new file mode 100644 (file)
index 0000000..f147a92
--- /dev/null
@@ -0,0 +1,103 @@
+from elixir import Entity, Field, OneToMany, ManyToOne, ManyToMany
+from elixir import options_defaults, using_options, setup_all, belongs_to
+from elixir import String, Integer as Int, DateTime, PickleType, Boolean
+from datetime import datetime,timedelta
+import elixir
+import traceback
+
+from monitor.database.dborm import mon_metadata, mon_session
+__metadata__ = mon_metadata
+__session__  = mon_session
+
+
+class FindbadNodeRecordSync(Entity):
+       hostname = Field(String(250),primary_key=True) #,alternateMethodName='by_hostname')
+       round    = Field(Int,default=0)
+       
+class FindbadPCURecordSync(Entity):
+       plc_pcuid = Field(Int,primary_key=True) #,alternateMethodName='by_pcuid')
+       round     = Field(Int,default=0)
+
+class FindbadNodeRecord(Entity):
+       @classmethod
+       def get_all_latest(cls):
+               fbsync = FindbadNodeRecordSync.get_by(hostname="global")
+               return cls.query.filter_by(round=fbsync.round)
+
+       @classmethod
+       def get_latest_by(cls, **kwargs):
+               fbsync = FindbadNodeRecordSync.get_by(hostname="global")
+               kwargs['round'] = fbsync.round
+               return cls.query.filter_by(**kwargs)
+
+       @classmethod
+       def get_latest_n_by(cls, n=3, **kwargs):
+               fbsync = FindbadNodeRecordSync.get_by(hostname="global")
+               kwargs['round'] = fbsync.round
+               ret = []
+               for i in range(0,n):
+                       kwargs['round'] = kwargs['round'] - i
+                       f = cls.query.filter_by(**kwargs).first()
+                       if f:
+                               ret.append(f)
+               return ret
+
+# ACCOUNTING
+       date_checked = Field(DateTime,default=datetime.now)
+       round = Field(Int,default=0)
+       hostname = Field(String,default=None)
+       loginbase = Field(String)
+
+# INTERNAL
+       kernel_version = Field(String,default=None)
+       bootcd_version = Field(String,default=None)
+       nm_status = Field(String,default=None)
+       fs_status = Field(String,default=None)
+       dns_status = Field(String,default=None)
+       princeton_comon_dir = Field(Boolean,default=False)
+       princeton_comon_running = Field(Boolean,default=False)
+       princeton_comon_procs = Field(Int,default=None)
+
+# EXTERNAL
+       plc_node_stats = Field(PickleType,default=None)
+       plc_site_stats = Field(PickleType,default=None)
+       plc_pcuid      = Field(Int,default=None)
+       comon_stats    = Field(PickleType,default=None)
+       port_status    = Field(PickleType,default=None)
+       ssh_portused = Field(Int,default=22)
+       ssh_status = Field(Boolean,default=False)
+       ssh_error = Field(String,default=None)  # set if ssh_access == False
+       ping_status = Field(Boolean,default=False)
+
+# INFERRED
+       observed_category = Field(String,default=None)
+       observed_status = Field(String,default=None)
+
+       # NOTE: this is the child relation
+       action = ManyToOne('ActionRecord', required=False)
+
+class FindbadPCURecord(Entity):
+       @classmethod
+       def get_all_latest(cls):
+               fbsync = cls.get_by(hostname="global")
+               return cls.query.filter_by(round=fbsync.round)
+
+       @classmethod
+       def get_latest_by(cls, **kwargs):
+               fbsync = cls.get_by(hostname="global")
+               kwargs['round'] = fbsync.round
+               return cls.query.filter_by(**kwargs)
+# ACCOUNTING
+       date_checked = Field(DateTime)
+       round = Field(Int,default=0)
+       plc_pcuid = Field(Int) #alternateID=True,alternateMethodName='by_pcuid')
+
+# EXTERNAL
+       plc_pcu_stats = Field(PickleType,default=None)
+       dns_status = Field(String)
+       port_status = Field(PickleType)
+       entry_complete = Field(String)
+
+# INTERNAL
+# INFERRED
+       reboot_trial_status = Field(String)