from datetime import datetime,timedelta
import elixir
import traceback
+from elixir.ext.versioned import *
+from pcucontrol import reboot
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)
+ return cls.query.all()
@classmethod
def get_latest_by(cls, **kwargs):
- fbsync = FindbadNodeRecordSync.get_by(hostname="global")
- kwargs['round'] = fbsync.round
- return cls.query.filter_by(**kwargs)
+ return cls.query.filter_by(**kwargs).first()
+
+ @classmethod
+ def get_latest_by(cls, **kwargs):
+ return cls.query.filter_by(**kwargs).first()
@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
+ return cls.query.filter_by(**kwargs)
# ACCOUNTING
date_checked = Field(DateTime,default=datetime.now)
round = Field(Int,default=0)
- hostname = Field(String,default=None)
+ hostname = Field(String,primary_key=True,default=None)
loginbase = Field(String)
# INTERNAL
kernel_version = Field(String,default=None)
bootcd_version = Field(String,default=None)
+ boot_server = Field(String,default=None)
nm_status = Field(String,default=None)
fs_status = Field(String,default=None)
+ iptables_status = Field(String,default=None)
dns_status = Field(String,default=None)
+ external_dns_status = Field(Boolean,default=True)
+ uptime = Field(String,default=None)
+ rpms = 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)
plc_pcuid = Field(Int,default=None)
comon_stats = Field(PickleType,default=None)
port_status = Field(PickleType,default=None)
+ firewall = Field(Boolean,default=False)
ssh_portused = Field(Int,default=22)
ssh_status = Field(Boolean,default=False)
ssh_error = Field(String,default=None) # set if ssh_access == False
+ traceroute = Field(String,default=None)
ping_status = Field(Boolean,default=False)
# INFERRED
observed_category = Field(String,default=None)
observed_status = Field(String,default=None)
+ acts_as_versioned(ignore=['date_checked'])
# NOTE: this is the child relation
- action = ManyToOne('ActionRecord', required=False)
+ #action = ManyToOne('ActionRecord', required=False)
class FindbadPCURecord(Entity):
@classmethod
def get_all_latest(cls):
- fbsync = FindbadPCURecordSync.get_by(plc_pcuid=0)
- print "round: ", fbsync.round
- return cls.query.filter_by(round=fbsync.round)
+ return cls.query.all()
@classmethod
def get_latest_by(cls, **kwargs):
- fbsync = FindbadPCURecordSync.get_by(plc_pcuid=0)
- kwargs['round'] = fbsync.round
- return cls.query.filter_by(**kwargs)
+ return cls.query.filter_by(**kwargs).first()
+
+ def pcu_name(self):
+ if self.plc_pcu_stats['hostname'] is not None and self.plc_pcu_stats['hostname'] is not "":
+ return self.plc_pcu_stats['hostname']
+ elif self.plc_pcu_stats['ip'] is not None and self.plc_pcu_stats['ip'] is not "":
+ return self.plc_pcu_stats['ip']
+ else:
+ return None
+
+ def format_ports(self):
+ retval = []
+ filtered_length=0
+
+ supported_ports=reboot.model_to_object(self.plc_pcu_stats['model']).supported_ports
+ data = self.port_status.copy()
+
+ if data and len(data.keys()) > 0 :
+ for port in supported_ports:
+ try:
+ state = data[str(port)]
+ except:
+ state = "unknown"
+
+ if state == "filtered":
+ filtered_length += 1
+
+ retval.append( (port, state) )
+
+ if retval == []:
+ retval = [( "Closed/Filtered", "" )]
+
+ if filtered_length == len(supported_ports):
+ retval = [( "All Filtered", "" )]
+
+ return retval
+
+ def format_pcu_shortstatus(self):
+ status = "error"
+ if self.reboot_trial_status:
+ if self.reboot_trial_status == str(0):
+ status = "Ok"
+ elif self.reboot_trial_status == "NetDown" or self.reboot_trial_status == "Not_Run":
+ status = self.reboot_trial_status
+ else:
+ status = "error"
+
+ return status
+
+ def test_is_ok(self):
+ if self.reboot_trial_status == str(0):
+ return True
+ else:
+ return False
+
+ def pcu_errors(self):
+ message = "\n"
+ message += "\tModel: %s\n" % self.plc_pcu_stats['model']
+ message += "\tMissing Fields: %s\n" % ( self.entry_complete == "" and "None missing" or self.entry_complete )
+ message += "\tDNS Status: %s\n" % self.dns_status
+ message += "\tPort Status: %s\n" % self.format_ports()
+ message += "\tTest Results: %s\n" % self.format_pcu_shortstatus()
+ return message
+
# ACCOUNTING
date_checked = Field(DateTime)
round = Field(Int,default=0)
- plc_pcuid = Field(Int) #alternateID=True,alternateMethodName='by_pcuid')
+ plc_pcuid = Field(Int)
# EXTERNAL
plc_pcu_stats = Field(PickleType,default=None)
# INTERNAL
# INFERRED
reboot_trial_status = Field(String)
+
+ acts_as_versioned(ignore=['date_checked'])