diff --git a/opkg.py b/opkg.py index e5a65dd..3090e44 100644 --- a/opkg.py +++ b/opkg.py @@ -38,14 +38,12 @@ from __future__ import print_function import tempfile import os import sys -import glob import hashlib import re import subprocess from stat import ST_SIZE import arfile import tarfile -import textwrap import collections @@ -64,6 +62,7 @@ def order(x): class Version(object): """A class for holding parsed package version information.""" + def __init__(self, epoch, version): self.epoch = epoch self.version = version @@ -77,8 +76,10 @@ class Version(object): One slight modification, the original version can return any value, whereas this one is limited to -1, 0, +1 """ - if not selfversion: selfversion = "" - if not refversion: refversion = "" + if not selfversion: + selfversion = "" + if not refversion: + refversion = "" value = list(selfversion) ref = list(refversion) @@ -125,17 +126,15 @@ class Version(object): else: self_ver_comps = re.match(r"(.+?)(-r.+)?$", self.version) ref_ver_comps = re.match(r"(.+?)(-r.+)?$", ref.version) - #print((self_ver_comps.group(1), self_ver_comps.group(2))) - #print((ref_ver_comps.group(1), ref_ver_comps.group(2))) r = self._versioncompare(self_ver_comps.group(1), ref_ver_comps.group(1)) if r == 0: r = self._versioncompare(self_ver_comps.group(2), ref_ver_comps.group(2)) - #print("compare: %s vs %s = %d" % (self, ref, r)) return r def __str__(self): return str(self.epoch) + ":" + self.version + def parse_version(versionstr): epoch = 0 # check for epoch @@ -145,6 +144,7 @@ def parse_version(versionstr): epoch = int(epochstr) return Version(epoch, versionstr) + class Package(object): """A class for creating objects to manipulate (e.g. create) opkg packages.""" @@ -170,9 +170,6 @@ class Package(object): self.section = None self.filename_header = None self.file_list = [] - # md5 and size is lazy attribute, computed on demand - #self.md5 = None - #self.size = None self.installed_size = None self.filename = None self.file_ext_opk = "ipk" @@ -193,8 +190,6 @@ class Package(object): else: self.filename = os.path.basename(fn) - ## sys.stderr.write(" extracting control.tar.gz from %s\n"% (fn,)) - if tarfile.is_tarfile(fn): tar = tarfile.open(fn, "r", f) tarStream = tar.extractfile("./control.tar.gz") @@ -235,9 +230,10 @@ class Package(object): f = open(self.fn, "rb") sum = hashlib.md5() while True: - data = f.read(1024) - if not data: break - sum.update(data) + data = f.read(1024) + if not data: + break + sum.update(data) f.close() self.md5 = sum.hexdigest() @@ -249,26 +245,26 @@ class Package(object): f = open(self.fn, "rb") sum = hashlib.sha256() while True: - data = f.read(1024) - if not data: break - sum.update(data) + data = f.read(1024) + if not data: + break + sum.update(data) f.close() self.sha256 = sum.hexdigest() def _get_file_size(self): if not self.fn: - self.size = 0; + self.size = 0 else: stat = os.stat(self.fn) self.size = stat[ST_SIZE] return int(self.size) def read_control(self, control, all_fields=None): - import os - line = control.readline() while 1: - if not line: break + if not line: + break # Decode if stream has byte strings if not isinstance(line, str): line = line.decode() @@ -280,8 +276,11 @@ class Package(object): value = lineparts.group(2) while 1: line = control.readline().rstrip() - if not line: break - if line[0] != ' ': break + if not line: + break + if line[0] != ' ': + break + value = value + '\n' + line if name_lowercase == 'size': self.size = int(value) @@ -298,15 +297,14 @@ class Package(object): pass if line and line[0] == '\n': - return # consumes one blank line at end of package descriptoin + return # consumes one blank line at end of package description else: line = control.readline() pass - return + return def _setup_scratch_area(self): - self.scratch_dir = "%s/%sopkg" % (tempfile.gettempdir(), - tempfile.gettempprefix()) + self.scratch_dir = "%s/%sopkg" % (tempfile.gettempdir(), tempfile.gettempprefix()) self.file_dir = "%s/files" % (self.scratch_dir) self.meta_dir = "%s/meta" % (self.scratch_dir) @@ -429,7 +427,6 @@ class Package(object): sys.stderr.write("Cannot find current fn for package '%s' filename '%s' in dir '%s'\n(%s)\n" % (self.package, self.filename, directory, e)) return self.get_file_list() - def get_file_list(self): if not self.fn: sys.stderr.write("Package '%s' has empty fn, returning empty filelist\n" % (self.package)) @@ -460,11 +457,10 @@ class Package(object): file.write(str(self)) file.close() - cmd = "cd %s ; tar cvz --format=gnu -f %s/control.tar.gz control" % (self.meta_dir, - self.scratch_dir) + cmd = "cd %s ; tar cvz --format=gnu -f %s/control.tar.gz control" % (self.meta_dir, self.scratch_dir) cmd_out, cmd_in, cmd_err = os.popen3(cmd) - + while cmd_err.readline() != "": pass @@ -475,25 +471,20 @@ class Package(object): bits = "control.tar.gz" if self.file_list: - cmd = "cd %s ; tar cvz --format=gnu -f %s/data.tar.gz" % (self.file_dir, - self.scratch_dir) + cmd = "cd %s ; tar cvz --format=gnu -f %s/data.tar.gz" % (self.file_dir, self.scratch_dir) + cmd_out, cmd_in, cmd_err = os.popen3(cmd) - cmd_out, cmd_in, cmd_err = os.popen3(cmd) + while cmd_err.readline() != "": + pass - while cmd_err.readline() != "": - pass + cmd_out.close() + cmd_in.close() + cmd_err.close() - cmd_out.close() - cmd_in.close() - cmd_err.close() - - bits = bits + " data.tar.gz" + bits = bits + " data.tar.gz" file = "%s_%s_%s.%s" % (self.package, self.version, self.architecture, self.get_package_extension()) - cmd = "cd %s ; tar cvz --format=gnu -f %s/%s %s" % (self.scratch_dir, - dirname, - file, - bits) + cmd = "cd %s ; tar cvz --format=gnu -f %s/%s %s" % (self.scratch_dir, dirname, file, bits) cmd_out, cmd_in, cmd_err = os.popen3(cmd) @@ -522,31 +513,54 @@ class Package(object): # XXX - Some checks need to be made, and some exceptions # need to be thrown. -- a7r - if self.package: out = out + "Package: %s\n" % (self.package) - if self.version: out = out + "Version: %s\n" % (self.version) - if self.depends: out = out + "Depends: %s\n" % (self.depends) - if self.provides: out = out + "Provides: %s\n" % (self.provides) - if self.replaces: out = out + "Replaces: %s\n" % (self.replaces) - if self.conflicts: out = out + "Conflicts: %s\n" % (self.conflicts) - if self.suggests: out = out + "Suggests: %s\n" % (self.suggests) - if self.recommends: out = out + "Recommends: %s\n" % (self.recommends) - if self.section: out = out + "Section: %s\n" % (self.section) - if self.architecture: out = out + "Architecture: %s\n" % (self.architecture) - if self.maintainer: out = out + "Maintainer: %s\n" % (self.maintainer) + if self.package: + out = out + "Package: %s\n" % (self.package) + if self.version: + out = out + "Version: %s\n" % (self.version) + if self.depends: + out = out + "Depends: %s\n" % (self.depends) + if self.provides: + out = out + "Provides: %s\n" % (self.provides) + if self.replaces: + out = out + "Replaces: %s\n" % (self.replaces) + if self.conflicts: + out = out + "Conflicts: %s\n" % (self.conflicts) + if self.suggests: + out = out + "Suggests: %s\n" % (self.suggests) + if self.recommends: + out = out + "Recommends: %s\n" % (self.recommends) + if self.section: + out = out + "Section: %s\n" % (self.section) + if self.architecture: + out = out + "Architecture: %s\n" % (self.architecture) + if self.maintainer: + out = out + "Maintainer: %s\n" % (self.maintainer) if 'md5' in checksum: - if self.md5: out = out + "MD5Sum: %s\n" % (self.md5) + if self.md5: + out = out + "MD5Sum: %s\n" % (self.md5) if 'sha256' in checksum: - if self.sha256: out = out + "SHA256sum: %s\n" % (self.sha256) - if self.size: out = out + "Size: %d\n" % int(self.size) - if self.installed_size: out = out + "InstalledSize: %d\n" % int(self.installed_size) - if self.filename: out = out + "Filename: %s\n" % (self.filename) - if self.source: out = out + "Source: %s\n" % (self.source) - if self.description: out = out + "Description: %s\n" % (self.description) - if self.oe: out = out + "OE: %s\n" % (self.oe) - if self.homepage: out = out + "HomePage: %s\n" % (self.homepage) - if self.license: out = out + "License: %s\n" % (self.license) - if self.priority: out = out + "Priority: %s\n" % (self.priority) - if self.tags: out = out + "Tags: %s\n" % (self.tags) + if self.sha256: + out = out + "SHA256sum: %s\n" % (self.sha256) + if self.size: + out = out + "Size: %d\n" % int(self.size) + if self.installed_size: + out = out + "InstalledSize: %d\n" % int(self.installed_size) + if self.filename: + out = out + "Filename: %s\n" % (self.filename) + if self.source: + out = out + "Source: %s\n" % (self.source) + if self.description: + out = out + "Description: %s\n" % (self.description) + if self.oe: + out = out + "OE: %s\n" % (self.oe) + if self.homepage: + out = out + "HomePage: %s\n" % (self.homepage) + if self.license: + out = out + "License: %s\n" % (self.license) + if self.priority: + out = out + "Priority: %s\n" % (self.priority) + if self.tags: + out = out + "Tags: %s\n" % (self.tags) if self.user_defined_fields: for k, v in self.user_defined_fields.items(): out = out + "%s: %s\n" % (k, v) @@ -559,8 +573,10 @@ class Package(object): # are being destroyed? -- a7r pass + class Packages(object): """A currently unimplemented wrapper around the opkg utility.""" + def __init__(self): self.packages = {} return @@ -576,7 +592,7 @@ class Packages(object): if (name not in self.packages): self.packages[name] = pkg - + if pkg.compare_version(self.packages[name]) >= 0: self.packages[name] = pkg return 0 @@ -596,7 +612,7 @@ class Packages(object): self.add_package(pkg) else: break - f.close() + f.close() return def write_packages_file(self, fn): @@ -605,7 +621,7 @@ class Packages(object): names.sort() for name in names: f.write(self.packages[name].__str__()) - return + return def keys(self): return list(self.packages.keys()) @@ -613,8 +629,8 @@ class Packages(object): def __getitem__(self, key): return self.packages[key] -if __name__ == "__main__": +def main(): assert Version(0, "1.2.2-r1").compare(Version(0, "1.2.3-r0")) == -1 assert Version(0, "1.2.2-r0").compare(Version(0, "1.2.2+cvs20070308-r0")) == -1 assert Version(0, "1.2.2+cvs20070308").compare(Version(0, "1.2.2-r0")) == 1 @@ -647,3 +663,6 @@ if __name__ == "__main__": package.write_package("/tmp") + +if __name__ == "__main__": + main()