Skip to content
Snippets Groups Projects
Commit 7a0a1e03 authored by Sebastien Luttringer's avatar Sebastien Luttringer
Browse files

add payload command

parent df255c18
No related branches found
No related tags found
No related merge requests found
......@@ -358,6 +358,13 @@ def c_new(args):
'''
SourceImage.create(args.path, args.force)
def c_payload(args):
'''
List payloads
'''
repoman = load_repositories(args)
repoman.show_payloads(args.payload, o_images=args.images, o_json=args.json)
def c_prepare_chroot(args):
'''
Helper to prepare a path to be chrooted
......@@ -603,6 +610,15 @@ def arg_parser_init():
help="overwrite existing source image")
p.add_argument("path", help="new image directory path")
p.set_defaults(func=c_new)
# payload command parser
p = subparser.add_parser("payload", help=c_payload.__doc__.lower())
p.add_argument("-j", "--json", action="store_true",
help="output is formated in json")
p.add_argument("-i", "--images", action="store_true",
help="list images using payload")
p.add_argument("payload", nargs='*', default=[""],
help="payload md5 pattern")
p.set_defaults(func=c_payload)
# prepare_chroot command parser
p = subparser.add_parser("prepare_chroot",
help=c_prepare_chroot.__doc__.lower())
......
......@@ -40,7 +40,7 @@ _is() {
_get_first_arg
cmds=('add' 'build' 'cat' 'changelog' 'check' 'chroot' 'clean' 'copy' 'del'
'extract' 'get' 'help' 'info' 'init' 'install' 'list' 'move' 'new' 'repo'
'search' 'version' 'diff' 'prepare_chroot' 'unprepare_chroot')
'search' 'version' 'diff' 'payload' 'prepare_chroot' 'unprepare_chroot')
opts=('-h' '--help'
'-V' '--version'
'-v' '--verbosity'
......@@ -152,6 +152,9 @@ _is() {
[[ "$cur" == -* ]] && _opt '-h --help -f --force' && return 0
_filedir -d
;;
payload)
[[ "$cur" == -* ]] && _opt '-h --help -j --json -i --images' && return 0
;;
prepare_chroot)
[[ "$cur" == -* ]] && _opt '-h --help -m --no-mount' && return 0
_filedir -d
......
......@@ -376,6 +376,25 @@ class Repository(object):
images.append(d)
return images
def payloads(self):
'''
Return a dict of informations on payloads
'''
db_payloads = self.db.ask("SELECT payload.md5,payload.size,payload.isdir,image.name,image.version,payload.name FROM payload inner join image on payload.image_md5 = image.md5").fetchall()
res = {}
for payload in db_payloads:
md5 = payload[0]
# create entry if not exists
if md5 not in res:
res[md5] = {"size": payload[1], "isdir": payload[2], "images": {}}
# add image to list
imgpath = "%s/%s:%s" % (self.config.name, payload[3], payload[4])
res[md5]["images"][imgpath] = {"repo": self.config.name,
"imgname": payload[3],
"imgver": payload[4],
"payname": payload[5]}
return res
def search(self, pattern):
'''
Search pattern in a repository
......@@ -742,6 +761,56 @@ class RepositoryManager(object):
if len(s) > 0:
out(s)
def select_payloads(self, pattern):
'''
Return a list of available payloads
'''
if len(self.onlines) == 0:
raise Exception("No online repository")
# building payload list
paylist = {}
for reponame in self.onlines:
for md5, info in self[reponame].payloads().items():
if md5 not in paylist:
paylist[md5] = info
else:
paylist[md5]["images"].update(info["images"])
# check if pattern is md5 startpath
if pattern is not None:
for md5 in paylist.keys():
if not md5.startswith(pattern):
del paylist[md5]
return paylist
def show_payloads(self, patterns, o_images=False, o_json=False):
'''
Show payloads inside manager
'''
# get payload list
payloads = {}
for pattern in patterns:
payloads.update(self.select_payloads(pattern))
# display result
if o_json:
s = json.dumps(payloads)
else:
l = []
for payname in sorted(payloads.keys()):
pay = payloads[payname]
l.append(u"#l##y#%s#R#" % payname)
l.append(u" size: %s" % istools.human_size(pay["size"]))
l.append(u" directory: %s" % bool(pay["isdir"]))
l.append(u" image count: %d" % len(pay["images"]))
l.append(u" names: %s" % ", ".join(set((v["payname"] for v in pay["images"].values()))))
if o_images:
l.append(u" images:")
for path, obj in pay["images"].items():
l.append(u" %s#R#/#l##b#%s#R#:#p#%s#R# (%s)" % (
obj["repo"], obj["imgname"], obj["imgver"], obj["payname"]))
s = os.linesep.join(l)
if len(s) > 0:
out(s)
def purge_cache(self, pattern):
'''
Remove local cached repository files
......
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