Tittelen er om mulig dårlig.

MoinMoin burde ha hatt en kobling mot et repository, à la Trac, som vist http://projects.edgewall.com/trac/wiki/TracLinks

når start.py kjøres så gir den følgende feil:

./start.py 
Traceback (most recent call last):
  File "./start.py", line 193, in ?
    s.start()
  File "./start.py", line 22, in start
    if self.kanSendeMeldinger():
  File "./start.py", line 39, in kanSendeMeldinger
    if res[0][0] > dt2:
TypeError: can't compare datetime.datetime to DateTime

Får se på dette senere.

   1 #!/opt/csw/bin/python
   2 # -*- coding: iso-8859-1 -*-
   3 
   4 import start
   5 import time
   6 import datetime
   7 
   8 while True:
   9         print "Kjører oppdatering: " + datetime.datetime(1, 1, 1).now().strftime("%Y-%m-%d %H:%M:%S")
  10         print "----------------------------------------------"
  11         st = start.Start()
  12         st.start()
  13         print "Ferdig"
  14         print
  15         time.sleep(300)
cron.py

   1 #!/opt/csw/bin/python
   2 # -*- coding: iso-8859-1 -*-
   3 
   4 import sys
   5 sys.path.append("/home/a/4/syscron/python/lib/mysql")
   6 import MySQLdb
   7 
   8 class Database:
   9         def kobleTil(self, dbTjener, dbBruker, dbPassord, dbNavn):
  10                 self.db = MySQLdb.connect(host=dbTjener, user=dbBruker, passwd=dbPassord, db=dbNavn)
  11                 self.markor = self.db.cursor()
  12 
  13         def sporring(self, sporring):
  14                 self.markor.execute(sporring)
  15                 resultat = self.markor.fetchall()
  16                 return resultat
  17 
  18         def close(self):
  19                 self.db.close()
database.py

   1 #!/opt/csw/bin/python
   2 # -*- coding: iso-8859-1 -*-
   3 
   4 import datetime
   5 
   6 class Konstanter:
   7         # Variabler som kan og bør justeres
   8         # ---------------------------------
   9 
  10         #Konstanter som har med databasen å gjøre
  11         dbTjener = "gran.idi.ntnu.no"
  12         dbBruker = "inventory"
  13         dbPassord = "MoldJos98"
  14         dbNavn = "skriversystem"
  15 
  16         # Sti til diverse eksterne programmer skriptet bruker
  17         lpstatCmd = "/opt/csw/bin/lpstat"
  18         snmpgetCmd = "/opt/csw/bin/snmpget"
  19         envCmd = "/store/gnu/bin/env"
  20 
  21         # Diverse variabler som har med sending av e-post å gjøre
  22         mailFraAdresse = "skriverfeil@idi.ntnu.no"
  23         mailTilAdresse = "skriverfeil@idi.ntnu.no"
  24         mailSubject = "Skriverstatus"
  25         mailTjener = "mail.idi.ntnu.no"
  26 
  27         # Maskinnavn til skriverserveren som har lista over skriverne. Maskina kjører CUPS.
  28         cupsServer = "printhost.idi.ntnu.no"
  29 
  30         # Liste med skrivere som ikke skal sjekkes
  31         skriverUnntak = ["lp10.idi.ntnu.no", \
                         "lp19.idi.ntnu.no", \
                         "lp18.idi.ntnu.no", \
                         "lp16.idi.ntnu.no"]
  32 
  33         # Angir når på døgnet skriptet kan sende feilmeldinger
  34         feilMeldingStart = datetime.time(8, 0)
  35         feilMeldingStopp = datetime.time(17, 0)
  36 
  37         # Angir en liste med fri- og helligdager
  38         fridager = [\
                datetime.date(2005, 3, 20),\
                datetime.date(2005, 3, 24),\
                datetime.date(2005, 3, 25),\
                datetime.date(2005, 3, 27),\
                datetime.date(2005, 3, 28),\
                datetime.date(2005, 5, 1),\
                datetime.date(2005, 5, 5),\
                datetime.date(2005, 5, 8),\
                datetime.date(2005, 5, 15),\
                datetime.date(2005, 5, 16),\
                datetime.date(2005, 5, 17),\
                datetime.date(2005, 12, 24),\
                datetime.date(2005, 12, 25),\
                datetime.date(2005, 12, 26)]
  39 
  40         # Variabler som ikke bør endres
  41         # -----------------------------
  42 
  43         # Standard og RFC 1459 feilmeldinger
  44         feil = {\
                0 : "lowPaper",\
                1 : "noPaper",\
                2 : "lowToner",\
                3 : "noToner",\
                4 : "doorOpen",\
                5 : "jammed",\
                6 : "offline",\
                7 : "serviceRequested",\
                1000 : "technicalError",\
                1001 : "notRFC1759compliant",\
                1002 : "unknownReply",\
                1003 : "timeout"}
  45 
  46 
  47         # Diverse timedelta
  48         td0m    = datetime.timedelta(0, 0, 0, 0, 0, 0, 0) # 0 min
  49         td5m    = datetime.timedelta(0, 0, 0, 0, 5, 0, 0) # 5 min
  50         td15m   = datetime.timedelta(0, 0, 0, 0, 15, 0, 0) # 15 min
  51         td30m   = datetime.timedelta(0, 0, 0, 0, 30, 0, 0) # 30 min
  52         td45m   = datetime.timedelta(0, 0, 0, 0, 45, 0, 0) # 45 min
  53         td1t    = datetime.timedelta(0, 0, 0, 0, 0, 1, 0) # 1 time
  54         td1t15m = datetime.timedelta(0, 0, 0, 0, 15, 1, 0) # 1 time 15 min
  55         td1t30m = datetime.timedelta(0, 0, 0, 0, 30, 1, 0) # 1 time 30 min
  56         td1t45m = datetime.timedelta(0, 0, 0, 0, 45, 1, 0) # 1 time 45 min
  57         td2t    = datetime.timedelta(0, 0, 0, 0, 0, 2, 0) # 2 timer
konstanter.py

   1 #!/opt/csw/bin/python
   2 # -*- coding: iso-8859-1 -*-
   3 
   4 import skrivere
   5 
   6 sk = skrivere.Skrivere()
   7 skrivere = sk.finnSkrivere()
   8 
   9 for s in skrivere:
  10         sKode = sk.finnSkriverStatus(s[0])
  11         sStreng = sk.dekodStatus(sKode[0])
  12         print s[0] + "(" + s[1] + ")" + ": " + str(sStreng)
pstatus.py

   1 #!/opt/csw/bin/python
   2 # -*- coding: iso-8859-1 -*-
   3 
   4 import sys
   5 import os
   6 import re
   7 import snmp
   8 import konstanter
   9 
  10 class Skrivere:
  11         def finnSkrivere(self):
  12                 kommando = konstanter.Konstanter.envCmd + " CUPS_SERVER=" + konstanter.Konstanter.cupsServer + " " + konstanter.Konstanter.lpstatCmd + " -v"
  13                 pInn, pUt = os.popen4(kommando)
  14                 data = pUt.read()
  15                 pInn.close()
  16                 pUt.close()
  17 
  18                 if re.search("server-error-service-unavailable", data):
  19                         raise UserWarning, "Tjenesten er utilgjengelig"
  20                 elif re.search("Connection refused", data):
  21                         raise UserWarning, "Forbindelse til tjener " + konstanter.Konstanter.cupsServer + " nektes"
  22                 elif re.search("Unable to connect to server", data):
  23                         raise UserWarning, "Kan ikke koble til tjener " + konstanter.Konstanter.cupsServer
  24 
  25                 x = data.strip().split("\n")
  26                 skrivere = []
  27 
  28                 for y in x:
  29                         sk = []
  30 
  31                         treff = re.search("socket://([0-9a-zA-Z\.\-]*)", y)
  32                         sk.append(treff.group(1))
  33 
  34                         treff = re.search("^device for (.*): socket", y)
  35                         sk.append(treff.group(1))
  36 
  37                         skrivere.append(sk)
  38 
  39                 return skrivere
  40 
  41         def finnSkriverStatus(self, skriver):
  42                 status = []
  43                 snmpObj = snmp.Snmp()
  44 
  45                 try:
  46                         hrPrinterDetectedErrorState = snmpObj.snmpSporring(skriver, "1.3.6.1.2.1.25.3.5.1.2.1")
  47                         treff = re.search("(^..)", hrPrinterDetectedErrorState)
  48                         hrPrinterDetectedErrorState = int(treff.group(1), 16)
  49 
  50                         prtMarkerLifeCount = snmpObj.snmpSporring(skriver, "1.3.6.1.2.1.43.10.2.1.4.1.1")
  51                 except LookupError, e:
  52                         hrPrinterDetectedErrorState = 1001
  53                         prtMarkerLifeCount = "NULL"
  54                 except IOError, e:
  55                         hrPrinterDetectedErrorState = 1003
  56                         prtMarkerLifeCount = "NULL"
  57 
  58                 status.append(hrPrinterDetectedErrorState)
  59                 status.append(prtMarkerLifeCount)
  60                 return status
  61 
  62         def dekodStatus(self, status):
  63                 returKode = []
  64 
  65                 if status >= 1000:
  66                         returKode = konstanter.Konstanter.feil[status]
  67                 else:
  68                         if status & int("10000000", 2) != 0:
  69                                 returKode.append(konstanter.Konstanter.feil[0])
  70 
  71                         if status & int("01000000", 2) != 0:
  72                                 returKode.append(konstanter.Konstanter.feil[1])
  73 
  74                         if status & int("00100000", 2) != 0:
  75                                 returKode.append(konstanter.Konstanter.feil[2])
  76 
  77                         if status & int("00010000", 2) != 0:
  78                                 returKode.append(konstanter.Konstanter.feil[3])
  79 
  80                         if status & int("00001000", 2) != 0:
  81                                 returKode.append(konstanter.Konstanter.feil[4])
  82 
  83                         if status & int("00000100", 2) != 0:
  84                                 returKode.append(konstanter.Konstanter.feil[5])
  85 
  86                         if status & int("00000010", 2) != 0:
  87                                 returKode.append(konstanter.Konstanter.feil[6])
  88 
  89                         if status & int("00000001", 2) != 0:
  90                                 returKode.append(konstanter.Konstanter.feil[7])
  91 
  92                 return returKode
skrivere.py

   1 #!/opt/csw/bin/python
   2 # -*- coding: iso-8859-1 -*-
   3 
   4 import os
   5 import re
   6 import konstanter
   7 
   8 class Snmp:
   9         def snmpSporring(self, agent, sporring):
  10                 kommando = konstanter.Konstanter.snmpgetCmd + " -Ox -Of -c public " + agent + " " + sporring
  11                 pInn, pUt = os.popen4(kommando)
  12                 data = pUt.read().strip()
  13                 pInn.close()
  14                 pUt.close()
  15 
  16                 if re.search("\(noSuchName\)", data):
  17                         raise LookupError, "Fant ikke SNMP-objektet"
  18                 elif re.search("Timeout", data):
  19                         raise IOError, "Tidsavbrudd"
  20                 else:
  21                         treff = re.search(": (.*)", data)
  22                         return treff.group(1)
snmp.py

   1 #!/opt/csw/bin/python
   2 # -*- coding: iso-8859-1 -*-
   3 
   4 import sys
   5 import skrivere
   6 import database
   7 import debug
   8 import datetime
   9 import smtplib
  10 import konstanter
  11 
  12 class Start:
  13         def __init__(self):
  14                 self.db = database.Database()
  15                 self.db.kobleTil(konstanter.Konstanter.dbTjener, konstanter.Konstanter.dbBruker, konstanter.Konstanter.dbPassord, konstanter.Konstanter.dbNavn)
  16                 self.sk = skrivere.Skrivere()
  17 
  18         def start(self):
  19                 self.skriverListe = self.sk.finnSkrivere()
  20                 self.oppdaterDb()
  21 
  22                 if self.kanSendeMeldinger():
  23                         self.analyserData()
  24 
  25                 self.db.close()
  26 
  27         def kanSendeMeldinger(self):
  28                 t1 = datetime.datetime(1, 1, 1).now().time()
  29                 d1 = datetime.date(1, 1, 1).today()
  30 
  31                 # Sender ikke om det er kort tid siden siste melding ble sendt
  32                 sporring = "SELECT tidsstempel FROM meldinger ORDER BY tidsstempel DESC LIMIT 1"
  33                 res = self.db.sporring(sporring)
  34 
  35                 if len(res) == 1:
  36                         dt1 = datetime.datetime(1, 1, 1).now()
  37                         dt2 = dt1 - konstanter.Konstanter.td45m
  38 
  39                         if res[0][0] > dt2:
  40                                 send = False
  41                         else:
  42                                 send = True
  43                 else:
  44                         send = True
  45 
  46                 return  t1 > konstanter.Konstanter.feilMeldingStart and\
                        t1 < konstanter.Konstanter.feilMeldingStopp and\
                        konstanter.Konstanter.fridager.count(d1) == 0 and\
                        d1.weekday() != 5 and\
                        d1.weekday() != 6 and\
                                send
  47 
  48         def sendMelding(self, feilMelding):
  49                 mail = smtplib.SMTP()
  50 
  51                 melding = ""
  52                 melding = melding + "From: %s" % konstanter.Konstanter.mailFraAdresse + "\n"
  53                 melding = melding + "To: %s" % konstanter.Konstanter.mailTilAdresse + "\n"
  54                 melding = melding + "Subject: %s" % konstanter.Konstanter.mailSubject + "\n\n"
  55                 melding = melding + feilMelding
  56 
  57                 mail.connect(konstanter.Konstanter.mailTjener)
  58                 mail.sendmail(konstanter.Konstanter.mailFraAdresse, konstanter.Konstanter.mailTilAdresse, melding)
  59                 mail.quit()
  60 
  61                 naa = datetime.datetime(1, 1, 1).now().strftime("%Y-%m-%d %H:%M:%S")
  62                 sporring = "INSERT INTO meldinger(tidsstempel) VALUES('%s')" % (naa)
  63                 self.db.sporring(sporring)
  64 
  65         def analyserData(self):
  66                 feilMelding = ""
  67 
  68                 for skriver in self.skriverListe:
  69                         if konstanter.Konstanter.skriverUnntak.count(skriver[0]) == 1:
  70                                 continue;
  71 
  72                         skriverId = self.finnSkriverId(skriver[0])
  73                         m = skriver[1] + "="
  74                         feil = False
  75 
  76                         # Sjekker om skriveren har gått tom for toner
  77                         if self.feilOverTid(skriverId, 3, konstanter.Konstanter.td5m):
  78                                 m = m + konstanter.Konstanter.feil[3] + ","
  79                                 feil = True
  80 
  81                         # Sjekker om skriveren har satt flagget service requested
  82                         if self.feilOverTid(skriverId, 7, konstanter.Konstanter.td5m):
  83                                 m = m + konstanter.Konstanter.feil[7] + ","
  84                                 feil = True
  85 
  86                         # Sjekker om skriveren har vært nede
  87                         if self.feilOverTid(skriverId, 1003, konstanter.Konstanter.td15m):
  88                                 m = m + konstanter.Konstanter.feil[1003] + ","
  89                                 feil = True
  90 
  91                         # Sjekker om skriveren er offline
  92                         if self.feilOverTid(skriverId, 6, konstanter.Konstanter.td1t):
  93                                 m = m + konstanter.Konstanter.feil[6] + ","
  94                                 feil = True
  95 
  96                         # Sjekker om skriveren mangler papir
  97                         if self.feilOverTid(skriverId, 1, konstanter.Konstanter.td2t):
  98                                 m = m + konstanter.Konstanter.feil[1] + ","
  99                                 feil = True
 100 
 101                         # Sjekker om skriveren har paperjam
 102                         if self.feilOverTid(skriverId, 5, konstanter.Konstanter.td1t):
 103                                 m = m + konstanter.Konstanter.feil[5] + ","
 104                                 feil = True
 105 
 106                         if feil:
 107                                 m = m.rstrip(",")
 108                                 m = m + " "
 109                                 feilMelding = feilMelding + m
 110                                 self.feilMerk(skriverId)
 111                         elif not feil and self.feilMerket(skriverId):
 112                                 m = m + "avklart" + " "
 113                                 feilMelding = feilMelding + m
 114                                 self.fjernFeilmerking(skriverId)
 115 
 116                 if len(feilMelding) != 0:
 117                         feilMelding = feilMelding + "ignorert="
 118 
 119                         for s in konstanter.Konstanter.skriverUnntak:
 120                                 sporring = "SELECT navn FROM skrivere WHERE hostnavn='%s'" % s
 121                                 res = self.db.sporring(sporring)
 122 
 123                                 feilMelding = feilMelding + res[0][0] + ","
 124 
 125                         feilMelding = feilMelding.rstrip(",")
 126                         self.sendMelding(feilMelding)
 127 
 128         def feilMerk(self, skriverId):
 129                 sporring = "UPDATE skrivere SET feilsituasjon=1 WHERE id=%s" % skriverId
 130                 self.db.sporring(sporring)
 131 
 132         def fjernFeilmerking(self, skriverId):
 133                 sporring = "UPDATE skrivere SET feilsituasjon=0 WHERE id=%s" % skriverId
 134                 self.db.sporring(sporring)
 135 
 136         def feilMerket(self, skriverId):
 137                 sporring = "SELECT feilsituasjon FROM skrivere WHERE id=%s" % skriverId
 138                 res = self.db.sporring(sporring)
 139 
 140                 return res[0][0]
 141 
 142         def feilOverTid(self, skriverId, feilId, periode):
 143                 naa = datetime.datetime(1, 1, 1).now()
 144                 d1 = naa - periode
 145                 dato = d1.strftime("%Y-%m-%d %H:%M:%S")
 146 
 147                 sporring = "SELECT statuskode FROM skriverstatus WHERE skriver=%s && tidsstempel >= '%s'" % (skriverId, dato)
 148                 res = self.db.sporring(sporring)
 149 
 150                 if len(res) == 0:
 151                         return False
 152 
 153                 feil = True
 154 
 155                 for x in range(len(res)):
 156                         status = self.sk.dekodStatus(res[x][0])
 157 
 158                         if status.count(konstanter.Konstanter.feil[feilId]) == 0:
 159                                 feil = False
 160                                 break
 161 
 162                 return feil
 163 
 164         def oppdaterDb(self):
 165                 for skriver in self.skriverListe:
 166                         if self.finnSkriverId(skriver[0]) == 0:
 167                                 sporring = "INSERT INTO skrivere(hostnavn, navn) VALUES('%s', '%s')" % (skriver[0], skriver[1])
 168                                 self.db.sporring(sporring)
 169 
 170                         id = self.finnSkriverId(skriver[0])
 171                         naa = datetime.datetime(1, 1, 1).now().strftime("%Y-%m-%d %H:%M:%S")
 172                         status = self.sk.finnSkriverStatus(skriver[0])
 173                         sporring = "INSERT INTO skriverstatus(skriver, statuskode, papirteller, tidsstempel) values(%s, %s, %s, '%s')" % (id, status[0], status[1], naa)
 174                         self.db.sporring(sporring)
 175 
 176         def finnSkriverId(self, skriverNavn):
 177                 sporring = "SELECT id FROM skrivere WHERE hostnavn='%s'" % skriverNavn
 178                 res = self.db.sporring(sporring)
 179 
 180                 if len(res) == 1:
 181                         return res[0][0]
 182                 else:
 183                         return 0
 184 
 185 if __name__ == "__main__":
 186         try:
 187                 s = Start()
 188                 s.start()
 189         except UserWarning, e:
 190                 print "Unntak: " + str(e)
 191         except database.MySQLdb.DatabaseError, e:
 192                 print "Unntak: " + str(e)
start.py

SystemForSkriverovervåkning (last edited 2005-02-22 11:33:59 by AslakRaanes)