Loading bin/is +10 −2 Original line number Diff line number Diff line Loading @@ -154,9 +154,12 @@ def c_extract(parser, args): def c_get(parser, args): ''' Get a remove image in current directory Download a remote image in current directory ''' raise NotImplementedError("Not yet implemented") repoman = load_repositories(args) for image in args.image: img, repo = select_image(image, repoman) img.download(".", payload=args.payload, force=args.force) def c_help(parser, args): ''' Loading Loading @@ -345,6 +348,11 @@ p_extract.set_defaults(func=c_extract) # get command parser p_get = subparsers.add_parser("get", help=c_get.__doc__.lower()) p_get.add_argument("-p", action="store_true", dest="payload", default=False, help="extract payload") p_get.add_argument("-f", "--force", action="store_true", default=False, help="overwrite existing image") p_get.add_argument("image", nargs="+", help="image to extract") p_get.set_defaults(func=c_get) # help command parser Loading installsystems/image.py +59 −1 Original line number Diff line number Diff line Loading @@ -461,6 +461,30 @@ class PackageImage(Image): arrow(filename) out(self._tarball.get_str(filename)) def download(self, directory, force=False, payload=False): ''' Download image in directory ''' # check if destination exists directory = os.path.abspath(directory) dest = os.path.join(directory, self.filename) if not force and os.path.exists(dest): raise Exception("Image destination already exists: %s" % dest) # download arrow("Downloading image in %s" % directory) fs = istools.uopen(self.path) fd = open(self.filename, "wb") slen, smd5 = istools.copyfileobj(fs, fd) fs.close() fd.close() if self.md5 != smd5: raise Exception("Download image %s failed: Invalid MD5" % self.name) if payload: for payname in self.payload: arrow("Downloading payload %s in %s" % (payname, directory)) self.payload[payname].info self.payload[payname].download(directory, force=force) def extract(self, directory, force=False, payload=False): ''' Extract content of the image inside a repository Loading Loading @@ -620,6 +644,13 @@ class Payload(object): os.umask(umask) return 0666 & ~umask @property def filename(self): ''' Return the filename of the original payload ''' return "%s%s" % (self.name, self.extension) @property def mtime(self): ''' Loading @@ -632,7 +663,9 @@ class Payload(object): ''' Return a dict of info about current payload ''' return {"md5": self.md5, return {"name": self.name, "filename": self.filename, "md5": self.md5, "size": self.size, "isdir": self.isdir, "uid": self.uid, Loading @@ -654,6 +687,31 @@ class Payload(object): if self._md5 != md5: raise Exception("Invalid MD5 of payload %s" % self._md5) def download(self, dest, force=False): ''' Download payload in directory ''' # if dest is a directory try to create file inside if os.path.isdir(dest): dest = os.path.join(dest, self.filename) # try to create leading directories elif not os.path.exists(os.path.dirname(dest)): istools.mkdir(os.path.dirname(dest)) # check validity of dest if os.path.exists(dest): if os.path.isdir(dest): raise Exception("Destination %s is a directory" % dest) if not force: raise Exception("File %s already exists" % dest) # download fs = istools.uopen(self.path) fd = open(dest, "wb") slen, smd5 = istools.copyfileobj(fs, fd) fs.close() fd.close() if self.md5 != smd5: raise Exception("Downloading payload %s failed: Invalid MD5" % self.name) def extract(self, dest, force=False, filelist=None): ''' Extract payload into dest Loading Loading
bin/is +10 −2 Original line number Diff line number Diff line Loading @@ -154,9 +154,12 @@ def c_extract(parser, args): def c_get(parser, args): ''' Get a remove image in current directory Download a remote image in current directory ''' raise NotImplementedError("Not yet implemented") repoman = load_repositories(args) for image in args.image: img, repo = select_image(image, repoman) img.download(".", payload=args.payload, force=args.force) def c_help(parser, args): ''' Loading Loading @@ -345,6 +348,11 @@ p_extract.set_defaults(func=c_extract) # get command parser p_get = subparsers.add_parser("get", help=c_get.__doc__.lower()) p_get.add_argument("-p", action="store_true", dest="payload", default=False, help="extract payload") p_get.add_argument("-f", "--force", action="store_true", default=False, help="overwrite existing image") p_get.add_argument("image", nargs="+", help="image to extract") p_get.set_defaults(func=c_get) # help command parser Loading
installsystems/image.py +59 −1 Original line number Diff line number Diff line Loading @@ -461,6 +461,30 @@ class PackageImage(Image): arrow(filename) out(self._tarball.get_str(filename)) def download(self, directory, force=False, payload=False): ''' Download image in directory ''' # check if destination exists directory = os.path.abspath(directory) dest = os.path.join(directory, self.filename) if not force and os.path.exists(dest): raise Exception("Image destination already exists: %s" % dest) # download arrow("Downloading image in %s" % directory) fs = istools.uopen(self.path) fd = open(self.filename, "wb") slen, smd5 = istools.copyfileobj(fs, fd) fs.close() fd.close() if self.md5 != smd5: raise Exception("Download image %s failed: Invalid MD5" % self.name) if payload: for payname in self.payload: arrow("Downloading payload %s in %s" % (payname, directory)) self.payload[payname].info self.payload[payname].download(directory, force=force) def extract(self, directory, force=False, payload=False): ''' Extract content of the image inside a repository Loading Loading @@ -620,6 +644,13 @@ class Payload(object): os.umask(umask) return 0666 & ~umask @property def filename(self): ''' Return the filename of the original payload ''' return "%s%s" % (self.name, self.extension) @property def mtime(self): ''' Loading @@ -632,7 +663,9 @@ class Payload(object): ''' Return a dict of info about current payload ''' return {"md5": self.md5, return {"name": self.name, "filename": self.filename, "md5": self.md5, "size": self.size, "isdir": self.isdir, "uid": self.uid, Loading @@ -654,6 +687,31 @@ class Payload(object): if self._md5 != md5: raise Exception("Invalid MD5 of payload %s" % self._md5) def download(self, dest, force=False): ''' Download payload in directory ''' # if dest is a directory try to create file inside if os.path.isdir(dest): dest = os.path.join(dest, self.filename) # try to create leading directories elif not os.path.exists(os.path.dirname(dest)): istools.mkdir(os.path.dirname(dest)) # check validity of dest if os.path.exists(dest): if os.path.isdir(dest): raise Exception("Destination %s is a directory" % dest) if not force: raise Exception("File %s already exists" % dest) # download fs = istools.uopen(self.path) fd = open(dest, "wb") slen, smd5 = istools.copyfileobj(fs, fd) fs.close() fd.close() if self.md5 != smd5: raise Exception("Downloading payload %s failed: Invalid MD5" % self.name) def extract(self, dest, force=False, filelist=None): ''' Extract payload into dest Loading