]> git.pld-linux.org Git - projects/pld-ftp-admin.git/blob - bin/pfa-signpkg
- sign pkgs using external rpm binary
[projects/pld-ftp-admin.git] / bin / pfa-signpkg
1 #!/usr/bin/env python
2 # vi: encoding=utf-8 ts=8 sts=4 sw=4 et
3
4 import sys, os
5 sys.path.insert(0, os.environ['HOME']+'/pld-ftp-admin/modules')
6 import ftptree
7 from common import checkdir
8 import ftpio
9 from config import sign_key
10 import rpm
11 import subprocess
12
13 if len(sys.argv) < 3:
14     print >>sys.stderr, "ERR: not enough parameters given"
15     print >>sys.stderr, "sign.py tree package1 [package2...]"
16     sys.exit(1)
17
18 if sign_key == None:
19     print >>sys.stderr, "ERR: sign_key not defined in config"
20     sys.exit(1)
21
22 checkdir(sys.argv[1])
23
24 ftpio.connect('sign')
25
26 if not ftpio.lock(sys.argv[1], True):
27     print "ERR: %s tree already locked" % sys.argv[1]
28     sys.exit(1)
29
30 def getSigInfo(hdr):
31     """checks signature from an hdr hand back signature information and/or
32        an error code"""
33     # yum-3.2.22/rpmUtils/miscutils.py
34
35     string = '%|DSAHEADER?{%{DSAHEADER:pgpsig}}:{%|RSAHEADER?{%{RSAHEADER:pgpsig}}:{%|SIGGPG?{%{SIGGPG:pgpsig}}:{%|SIGPGP?{%{SIGPGP:pgpsig}}:{(none)}|}|}|}|'
36     siginfo = hdr.sprintf(string)
37     if siginfo == '(none)':
38         return None
39    
40     return siginfo.split(',')[2].lstrip()
41
42
43 def is_signed(rpm_file, key):
44     """Returns rpm information is package signed by the same key"""
45     # http://code.activestate.com/recipes/306705/
46     ts = rpm.ts()
47     ts.setVSFlags(rpm._RPMVSF_NOSIGNATURES)
48     fdno = os.open(rpm_file, os.O_RDONLY)
49     hdr = ts.hdrFromFdno(fdno)
50     os.close(fdno)
51
52     sigid = getSigInfo(hdr)
53     if sigid == None:
54         return None
55
56     return key == sigid[-len(key):]
57
58 def signpkgs(files):
59     if not os.path.isfile('/usr/bin/gpg'):
60         raise OSError, 'Missing gnupg binary'
61     if not os.path.isfile('/bin/rpm'):
62         raise OSError, 'Missing rpm binary'
63
64     cmd = ['/bin/rpm', '--resign']
65     cmd += files
66     rc = subprocess.call(cmd, stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE, close_fds = True)
67     if rc != 0:
68         print >>sys.stderr, "package signing failed"
69         sys.exit(rc)
70
71 try:
72     tree = ftptree.FtpTree(sys.argv[1]) #, loadall=True)
73     tree.mark4moving(sys.argv[2:])
74     files = tree.rpmfiles()
75
76     print "Checking signatures of %d files from %d packages" % (len(files), len(tree.loadedpkgs))
77     sign = []
78     for file in files:
79         if not is_signed(file, sign_key):
80             sign.append(file)
81
82     if len(sign) > 0:
83         print "Signing %d packages" % len(sign)
84         signpkgs(sign)
85     else:
86         print "No packages to sign"
87
88 except ftptree.SomeError:
89     # In case of problems we need to unlock the tree before exiting
90     ftpio.unlock(sys.argv[1])
91     sys.exit(1)
92
93 ftpio.unlock(sys.argv[1])
This page took 0.151219 seconds and 3 git commands to generate.