- remove shebang line to make rpmlint happy
[opensuse:osc.git] / osc / checker.py
1 from tempfile import mkdtemp
2 import os
3 from shutil import rmtree
4 import rpm
5 import base64
6
7 class KeyError(Exception):
8     def __init__(self, key, *args):
9         Exception.__init__(self)
10         self.args = args
11         self.key = key
12     def __str__(self):
13         return ''+self.key+' :'+' '.join(self.args)
14
15 class Checker:
16     def __init__(self):
17         self.dbdir = mkdtemp(prefix='oscrpmdb')
18         self.imported = {}
19         rpm.addMacro('_dbpath', self.dbdir)
20         self.ts = rpm.TransactionSet()
21         self.ts.initDB()
22         self.ts.openDB()
23         self.ts.setVSFlags(0)
24         #self.ts.Debug(1)
25
26     def readkeys(self, keys=[]):
27         rpm.addMacro('_dbpath', self.dbdir)
28         for key in keys:
29             self.readkey(key)
30
31         rpm.delMacro("_dbpath")
32
33 # python is an idiot
34 #    def __del__(self):
35 #        self.cleanup()
36
37     def cleanup(self):
38         self.ts.closeDB()
39         rmtree(self.dbdir)
40
41     def readkey(self, file):
42         if file in self.imported:
43             return
44
45         fd = open(file, "r")
46         line = fd.readline()
47         if line and line[0:14] == "-----BEGIN PGP":
48             line = fd.readline()
49             while line and line != "\n":
50                 line = fd.readline()
51             if not line:
52                 raise KeyError(file, "not a pgp public key")
53         else:
54             raise KeyError(file, "not a pgp public key")
55
56         key = ''
57         line = fd.readline()
58         while line:
59             if line[0:12] == "-----END PGP":
60                 break
61             line = line.rstrip()
62             key += line
63             line = fd.readline()
64         fd.close()
65         if not line or line[0:12] != "-----END PGP":
66             raise KeyError(file, "not a pgp public key")
67
68         bkey = base64.b64decode(key)
69
70         r = self.ts.pgpImportPubkey(bkey)
71         if r != 0:
72             raise KeyError(file, "failed to import pubkey")
73         self.imported[file] = 1
74
75     def check(self, pkg):
76         fd = os.open(pkg, os.O_RDONLY)
77         hdr = self.ts.hdrFromFdno(fd)
78         os.close(fd)
79
80 if __name__ == "__main__":
81     import sys
82     keyfiles = []
83     pkgs = []
84     for arg in sys.argv[1:]:
85         if arg[-4:] == '.rpm':
86             pkgs.append(arg)
87         else:
88             keyfiles.append(arg)
89
90     checker = Checker()
91     try:
92         checker.readkeys(keyfiles)
93         for pkg in pkgs:
94             checker.check(pkg)
95     except Exception, e:
96         checker.cleanup()
97         raise e
98
99 # vim: sw=4 et