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)
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()
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
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)
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
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)
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)