Commit 7a0a1e03 authored by Sebastien Luttringer's avatar Sebastien Luttringer
Browse files

add payload command

parent df255c18
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -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())
+4 −1
Original line number Diff line number Diff line
@@ -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
+69 −0
Original line number Diff line number Diff line
@@ -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