Skip to content
Snippets Groups Projects
Commit a8f93251 authored by Seblu's avatar Seblu
Browse files

Add command get

parent 21f5789f
No related branches found
No related tags found
No related merge requests found
......@@ -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):
'''
......@@ -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
......
......@@ -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
......@@ -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):
'''
......@@ -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,
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment