]>
Commit | Line | Data |
---|---|---|
3db0947c MT |
1 | #!/usr/bin/python |
2 | ||
3 | import hashlib | |
4 | import os | |
5 | import subprocess | |
6 | ||
7 | import io | |
8 | ||
9 | class Package(object): | |
10 | _info = {} | |
11 | ||
12 | def __init__(self, archive): | |
13 | self.archive = io.CpioArchive(archive) | |
50f96b4d | 14 | |
3db0947c MT |
15 | def check(self): |
16 | print "Checking package %s..." % self.name | |
17 | return self.verify() | |
50f96b4d | 18 | |
3db0947c MT |
19 | def extract(self, root="/"): |
20 | if not os.path.exists(root): | |
21 | os.makedirs(root) | |
22 | ||
23 | lzma = subprocess.Popen(["lzma", "-dc"], | |
24 | stdin=subprocess.PIPE, | |
25 | stdout=subprocess.PIPE, | |
26 | stderr=subprocess.PIPE,) | |
27 | ||
28 | cpio = subprocess.Popen(["cpio", | |
29 | "--quiet", | |
30 | "--extract", | |
31 | "--unconditional", | |
32 | "--make-directories", | |
33 | "--no-absolute-filenames",], | |
34 | stdin=subprocess.PIPE, | |
35 | stdout=subprocess.PIPE, | |
36 | stderr=subprocess.PIPE, | |
37 | cwd=root) | |
38 | ||
39 | BUF = 1024 | |
40 | file = self.archive["data.img"] | |
41 | ||
42 | # Decompress in one big swoop. | |
43 | lzma.stdin.write(file) | |
44 | lzma.stdin.close() | |
45 | ||
46 | lzmaerr = lzma.stderr.read() | |
47 | if lzmaerr: | |
48 | raise Exception("Decompression error: %s" % lzmaerr) | |
49 | ||
50 | while True: | |
51 | buf = lzma.stdout.read(BUF) | |
52 | if not buf: | |
53 | break | |
54 | cpio.stdin.write(buf) | |
55 | lzma.stdout.close() | |
56 | ||
57 | cpioerr = cpio.stderr.read() | |
58 | if cpioerr: | |
59 | raise Exception("Archiving error: %s" % cpioerr) | |
60 | ||
61 | def install(self, root="/"): | |
62 | print "Installing %s..." % self.name | |
63 | self.extract(root) | |
50f96b4d | 64 | |
3db0947c MT |
65 | def print_info(self): |
66 | ret = "" | |
67 | info = (("Name", self.name), | |
68 | ("Version", self.version), | |
69 | ("Arch", self.arch), | |
70 | ("Release", self.release), | |
71 | ("Size", self.size), | |
72 | ("Summary", self.summary), | |
73 | ("URL", self.url), | |
74 | ("License", self.license), | |
75 | ("Description", self.description)) | |
76 | ||
77 | for (key, value) in info: | |
78 | ret += "%-12s: %s\n" % (key, value,) | |
50f96b4d | 79 | |
3db0947c MT |
80 | if self.verify: |
81 | ret += "%-12s: %s\n" % ("Signature", "OK") | |
82 | else: | |
83 | ret += "%-12s: %s\n" % ("Signature", "Broken") | |
50f96b4d | 84 | |
3db0947c | 85 | return ret |
50f96b4d | 86 | |
3db0947c MT |
87 | def verify(self): |
88 | hash = hashlib.sha1(self.archive["data.img"]).hexdigest() | |
89 | if hash == self.sha1: | |
90 | return True | |
91 | return False | |
92 | ||
93 | @property | |
94 | def arch(self): | |
95 | return self.info.get("PKG_ARCH", None) | |
96 | ||
97 | @property | |
98 | def deps(self): | |
99 | return self.info.get("PKG_DEPS", None) | |
100 | ||
101 | @property | |
102 | def description(self): | |
103 | return self.info.get("PKG_DESC", None) | |
104 | ||
105 | @property | |
106 | def group(self): | |
107 | return self.info.get("PKG_GROUP", None) | |
108 | ||
109 | @property | |
110 | def license(self): | |
111 | return self.info.get("PKG_LICENSE", None) | |
112 | ||
113 | @property | |
114 | def name(self): | |
115 | return self.info.get("PKG_NAME", None) | |
116 | ||
117 | @property | |
118 | def info(self): | |
119 | if not self._info: | |
120 | self._info = {} | |
121 | for line in self.archive["info"].split("\n"): | |
122 | if not line or line.startswith("#"): | |
123 | continue | |
124 | (key, value) = line.split("=") | |
125 | self._info[key] = value.strip("\"") | |
126 | return self._info | |
127 | ||
128 | @property | |
129 | def release(self): | |
130 | return self.info.get("PKG_REL", None) | |
131 | ||
132 | @property | |
133 | def sha1(self): | |
134 | return self.info.get("PKG_DATA_SHA1", None) | |
135 | ||
136 | @property | |
137 | def size(self): | |
138 | return self.archive.size | |
139 | ||
140 | @property | |
141 | def summary(self): | |
142 | return self.info.get("PKG_SUMMARY", None) | |
143 | ||
144 | @property | |
145 | def url(self): | |
146 | return self.info.get("PKG_URL", None) | |
147 | ||
148 | @property | |
149 | def version(self): | |
150 | return self.info.get("PKG_VER", None) |