class Pakfire(object):
repos = Repositories()
ts = Transactionset()
-
+
def __init__(self):
pass
self.filename = filename
self.connection = sqlite.connect(self.filename)
-
+
def add(self, table):
c = self.cursor
c.executescript("CREATE TABLE IF NOT EXISTS %s(id, key, value);" % table)
c.execute("DELETE FROM %s" % table)
c.close()
self.commit()
-
+
def get(self, table, id, key):
ret = None
c = self.cursor
ret += "r"
else:
ret += "-"
-
+
if mode & stat.S_IWUSR:
ret += "w"
else:
ret += "-"
-
+
if mode & stat.S_IXUSR:
ret += "x"
else:
ret += "-"
-
+
return ret
def fmode(mode):
def __init__(self, hdr, archive, offset):
self.archive = archive
self.hdr = hdr
-
+
self.offset = offset + 110 + self.namesize
self.offset += (4 - (self.offset % 4)) % 4
self.current = 0
-
+
self.closed = False
-
+
if len(self.hdr) < 110:
raise CpioError("Header too short.")
-
+
if not self.hdr.startswith("070701") and not self.hdr.startswith("070702"):
raise CpioError("Invalid header: %s" % self.hdr[:6])
-
+
def close(self):
self.closed = True
def seek(self, offset, whence=0):
"""Move to new position within an entry.
-
+
Keyword arguments:
offset -- Byte count
whence -- Describes how offset is used.
@property
def checksum(self):
return int(self.hdr[102:110], 16)
-
+
@property
def devmajor(self):
return int(self.hdr[62:70], 16)
-
+
@property
def devminor(self):
return int(self.hdr[70:78], 16)
@property
def mode(self):
return int(self.hdr[14:22], 16)
-
+
@property
def mtime(self):
return int(self.hdr[46:54], 16)
@property
def namesize(self):
return int(self.hdr[94:102], 16)
-
+
@property
def nlinks(self):
return int(self.hdr[38:46], 16)
@property
def rdevmajor(self):
return int(self.hdr[78:86], 16)
-
+
@property
def rdevminor(self):
return int(self.hdr[86:94], 16)
@property
def size(self):
return int(self.hdr[54:62], 16)
-
+
@property
def uid(self):
return int(self.hdr[22:30], 16)
file = None
def __init__(self, filename):
-
+
self.filename = filename
self.file = open(self.filename, "r")
self.__readfile()
self.closed = False
-
+
def close(self):
if self.closed:
return
self.closed = True
self.file.close()
-
+
def __readfile(self):
if not self.file:
raise CpioError("File was not yet opened.")
hdr = self.file.read(110)
else:
raise CpioError("Premature end of headers.")
-
+
@property
def entries(self):
return sorted(self._entries)
-
+
@property
def size(self):
return os.path.getsize(self.filename)
-
+
def ls(self):
for x in self.entries:
print x.name
-
+
def ll(self):
- for x in self.entries:
+ for x in self.entries:
print "%s %s %s %s %9d %s %s" % \
(fmode(x.mode),
x.nlinks,
x.size,
time.strftime("%Y-%m-%d %H:%M", time.localtime(x.mtime)),
x.name,)
-
+
def get(self, item):
for x in self.entries:
if x.name == item:
return x
raise KeyError("No such file or directory.")
-
+
def __getitem__(self, item):
x = self.get(item)
x.seek(0)
def __init__(self, archive):
self.archive = io.CpioArchive(archive)
-
+
def check(self):
print "Checking package %s..." % self.name
return self.verify()
-
+
def extract(self, root="/"):
if not os.path.exists(root):
os.makedirs(root)
def install(self, root="/"):
print "Installing %s..." % self.name
self.extract(root)
-
+
def print_info(self):
ret = ""
info = (("Name", self.name),
for (key, value) in info:
ret += "%-12s: %s\n" % (key, value,)
-
+
if self.verify:
ret += "%-12s: %s\n" % ("Signature", "OK")
else:
ret += "%-12s: %s\n" % ("Signature", "Broken")
-
+
return ret
-
+
def verify(self):
hash = hashlib.sha1(self.archive["data.img"]).hexdigest()
if hash == self.sha1:
@property
def version(self):
return self.info.get("PKG_VER", None)
-
class Repositories(object):
_repositories = []
-
+
def __init__(self):
for file in os.listdir(REPOS_PATH):
if not file.endswith(".repo"):
@property
def all(self):
return sorted(self._repositories)
-
+
@property
def enabled(self):
ret = []
if r.enabled:
ret.append(r)
return ret
-
+
@property
def repositories(self):
return self.enabled
for (key, value) in items:
config[key] = value
self.config = config
-
+
self.db = database.Database("%s.db" % self.name)
self.servers = Servers(self.db)
-
+
def __cmp__(self, other):
return cmp(self.name, other.name)
-
+
def __str__(self):
return self.name
-
+
def __repr__(self):
return "<Repository %s>" % self.name
-
+
def update_mirrorlist(self, mirrorlist=None):
if not mirrorlist:
mirrorlist = self.mirrorlist
@property
def gpgkey(self):
return self.config.get("gpgkey", None)
-
+
@property
def mirrorlist(self):
return self.config.get("mirrorlist", None)
def __init__(self, db):
self.db = db
self.db.add(self.table)
-
+
def add(self, url):
p = urlparse.urlparse(url)
for server in self.all:
s = Server(self.db, id)
ret.append(s)
return sorted(ret)
-
+
@property
def random(self):
return random.choice(self.all)
if not id:
id = str(uuid.uuid4())
self.id = "%s" % id
-
+
def __str__(self):
return urlparse.urlunparse((self.protocol, \
"%s:%s" % (self.hostname, self.port), self.path, None, None, None))
-
+
def __repr__(self):
return "<Server %s>" % self.id
-
+
def _getHostname(self):
return self.db.get(self.table, self.id, "hostname")
-
+
def _setHostname(self, hostname):
return self.db.set(self.table, self.id, "hostname", hostname)
hostname = property(_getHostname, _setHostname)
-
+
def _getProtocol(self):
return self.db.get(self.table, self.id, "protocol") or SERVER_DEFAULT_PROTOCOL
-
+
def _setProtocol(self, protocol):
return self.db.set(self.table, self.id, "protocol", protocol)
-
+
protocol = property(_getProtocol, _setProtocol)
def _getPort(self):
return self.db.get(self.table, self.id, "port") or SERVER_DEFAULT_PORT
-
+
def _setPort(self, port):
return self.db.set(self.table, self.id, "port", port)
port = property(_getPort, _setPort)
-
+
def _getPath(self):
return self.db.get(self.table, self.id, "path") or SERVER_DEFAULT_PATH
-
+
def _setPath(self, path):
return self.db.set(self.table, self.id, "path", path)
-
+
path = property(_getPath, _setPath)
def addPackage(self, package):
self._packages.append(package)
-
+
def check(self):
print "Checking Transactionset..."
for package in self.packages: