X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=monitor%2Fdatabase%2Finfo%2Ffindbad.py;h=d92e7e59b0ca52f1b3450b947c438aa679b5c7a6;hb=6c38b5cef7bf12fa4ade23ae1c54b3491797fb1d;hp=566c2aefb5822fb5dd432165c4125096f6a6c7d0;hpb=f9da3f16b608452f4166050e93044fbb20fc5e6d;p=monitor.git diff --git a/monitor/database/info/findbad.py b/monitor/database/info/findbad.py index 566c2ae..d92e7e5 100644 --- a/monitor/database/info/findbad.py +++ b/monitor/database/info/findbad.py @@ -4,62 +4,48 @@ from elixir import String, Integer as Int, DateTime, PickleType, Boolean 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") - if fbsync: - return cls.query.filter_by(round=fbsync.round) - else: - return [] + return cls.query.all() @classmethod def get_latest_by(cls, **kwargs): - fbsync = FindbadNodeRecordSync.get_by(hostname="global") - if fbsync: - kwargs['round'] = fbsync.round - return cls.query.filter_by(**kwargs) - else: - return [] + 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) @@ -70,36 +56,96 @@ class FindbadNodeRecord(Entity): 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) - if fbsync: - return cls.query.filter_by(round=fbsync.round) - else: - return [] + 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) @@ -110,3 +156,5 @@ class FindbadPCURecord(Entity): # INTERNAL # INFERRED reboot_trial_status = Field(String) + + acts_as_versioned(ignore=['date_checked'])