]>
Commit | Line | Data |
---|---|---|
f56d33c5 ER |
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 | |
89b8ea8d | 7 | import getpass |
f56d33c5 ER |
8 | from common import checkdir |
9 | import ftpio | |
55bd5397 | 10 | from config import sign_key |
42c96205 | 11 | from sign import is_signed, signpkgs |
f56d33c5 ER |
12 | |
13 | if len(sys.argv) < 3: | |
55bd5397 ER |
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" | |
f56d33c5 ER |
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): | |
4e83e214 | 27 | print >>sys.stderr, "ERR: %s tree already locked" % sys.argv[1] |
f56d33c5 ER |
28 | sys.exit(1) |
29 | ||
42c96205 | 30 | files = [] |
f56d33c5 | 31 | try: |
42c96205 | 32 | tree = ftptree.FtpTree(sys.argv[1]) |
55bd5397 ER |
33 | tree.mark4moving(sys.argv[2:]) |
34 | files = tree.rpmfiles() | |
35 | ||
f56d33c5 ER |
36 | except ftptree.SomeError: |
37 | # In case of problems we need to unlock the tree before exiting | |
38 | ftpio.unlock(sys.argv[1]) | |
39 | sys.exit(1) | |
40 | ||
41 | ftpio.unlock(sys.argv[1]) | |
42c96205 ER |
42 | |
43 | print "Checking signatures of %d files from %d packages" % (len(files), len(tree.loadedpkgs)) | |
44 | sign = [] | |
95843bd6 | 45 | n = c = 0 |
42c96205 ER |
46 | for file in files: |
47 | if not is_signed(file): | |
48 | sign.append(file) | |
95843bd6 ER |
49 | c += 1 |
50 | n += 1 | |
2000899b | 51 | print "\r%d/%d %s\033[0K" % (n, c, file), |
95843bd6 ER |
52 | |
53 | print "" | |
42c96205 ER |
54 | |
55 | if len(sign) == 0: | |
4e15eddf | 56 | print "No files to sign" |
42c96205 ER |
57 | sys.exit(0) |
58 | ||
95843bd6 ER |
59 | # http://mail.python.org/pipermail/python-list/2009-February/700658.html |
60 | def chunk(seq, size, pad=None): | |
61 | ''' | |
62 | Slice a list into consecutive disjoint 'chunks' of | |
63 | length equal to size. The last chunk is padded if necessary. | |
64 | ||
65 | >>> list(chunk(range(1,10),3)) | |
66 | [[1, 2, 3], [4, 5, 6], [7, 8, 9]] | |
67 | >>> list(chunk(range(1,9),3)) | |
68 | [[1, 2, 3], [4, 5, 6], [7, 8, None]] | |
69 | >>> list(chunk(range(1,8),3)) | |
70 | [[1, 2, 3], [4, 5, 6], [7, None, None]] | |
71 | >>> list(chunk(range(1,10),1)) | |
72 | [[1], [2], [3], [4], [5], [6], [7], [8], [9]] | |
73 | >>> list(chunk(range(1,10),9)) | |
74 | [[1, 2, 3, 4, 5, 6, 7, 8, 9]] | |
75 | >>> for X in chunk([],3): print X | |
76 | >>> | |
77 | ''' | |
78 | n = len(seq) | |
79 | mod = n % size | |
80 | for i in xrange(0, n - mod, size): | |
81 | yield seq[i : i + size] | |
82 | if mod: | |
83 | yield seq[-mod:] | |
84 | ||
85 | print "Total %d files to sign" % len(sign) | |
89b8ea8d | 86 | password = getpass.getpass("Enter signing password: ") |
4e83e214 | 87 | try: |
95843bd6 ER |
88 | for x in chunk(sign, 512): |
89 | print "Signing %d files" % len(x) | |
89b8ea8d | 90 | signpkgs(x, password) |
4e83e214 ER |
91 | except OSError, e: |
92 | print >>sys.stderr, "ERR: %s" % e | |
93 | exit(1) |