]> git.ipfire.org Git - people/ms/ipfire-3.x.git/blame - pkgs/pakfire/src/python/package.py
Move packages to pkgs subdirectory.
[people/ms/ipfire-3.x.git] / pkgs / pakfire / src / python / package.py
CommitLineData
3db0947c
MT
1#!/usr/bin/python
2
3import hashlib
4import os
5import subprocess
6
7import io
8
9class 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)