Beispiel #1
0
 def search(self, *args, **kw):
     errors = []
     
     if self.cli_opts.full_package:
         # FIX ME: This regex is weak sauce, needs improvement
         m = re.match('(^[a-zA-Z].*)-([\d].*)-(.*)-(.*)', 
                      self.cli_opts.full_package)
         if m:
             name = m.group(1)
             version = m.group(2)
             release = m.group(3)
             arch = m.group(4)   
         else:
             errors.append(('SatCLIArgumentError',
                 "invalid --pkg, need form 'name-version-release-arch'"))
             abort_on_error(errors)
         packages = g.proxy.query(model.Package, name=name, 
                                  version=version, release=release, arch=arch)
     elif self.cli_opts.query:
         packages = g.proxy.query(model.Package, regex=self.cli_opts.query)
     else:
         # explicit search
         packages = g.proxy.query(model.Package,
                                  name=self.cli_opts.name, 
                                  version=self.cli_opts.version, 
                                  release=self.cli_opts.release, 
                                  arch=self.cli_opts.arch,
                                  epoch=self.cli_opts.epoch,
                                  description=self.cli_opts.description,
                                  summary=self.cli_opts.summary)
     for p in packages:
         print "%s-%s-%s-%s" % (p.name, p.version, p.release, p.arch)
     return dict(packages=packages)
Beispiel #2
0
 def _get_package(self, full_package):
     """
     Get a package object based on a full package name.
     
     Required Arguments:
     
         full_package
             RPM package name in the format name-version-release-arch.
     """
     errors = []
     # FIX ME: This regex is weak sauce, needs improvement
     m = re.match('(^[a-zA-Z].*)-([\d].*)-(.*)-(.*)', full_package)
     if m:
         name = m.group(1)
         version = m.group(2)
         release = m.group(3)
         arch = m.group(4)   
     else:
         errors.append(('SatCLIArgumentError',
             "invalid --pkg, need form 'name-version-release-arch'"))
         abort_on_error(errors)
     package = g.proxy.query(model.Package, just_one=True, all_data=True,
                             name=name, version=version, release=release, 
                             arch=arch)
     return package
Beispiel #3
0
    def publish(self, *args, **kw):
        errors = []
        channels = []
        if not self.cli_opts.advisory:
            if len(sys.argv) >= 4:
                self.cli_opts.advisory = sys.argv[3]
            else:
                errors.append(('SatCLIArgumentError', 
                               'errata -a/--advisory required.'))

        if not self.cli_opts.channel and not self.cli_opts.channels_file:
            errors.append(('SatCLIArgumentError', 
                           'errata -c/--channel or --channels-file required.')) 
                                                  
        if self.cli_opts.channel:
            _channels = self.cli_opts.channel.split(',')
            for _c in _channels:
                channels.append(_c)
        
        if self.cli_opts.channels_file:
            if os.path.exists(self.cli_opts.channels_file):
                f = open(self.cli_opts.channels_file, 'r')
                for line in f.readlines():
                    channels.append(line.strip('\n'))
            else:
                log.warn("channels file '%s' doesn't exist!" % \
                         self.cli_opts.channels_file)
                                                
        abort_on_error(errors)
        errata = g.proxy.call('errata.publish', self.cli_opts.advisory, channels)
        return dict()    
Beispiel #4
0
    def list(self, *args, **kw):
        errors = []
        all_errata = [] # list of tuples, 0 is the errata data, 1 is the errata dict

        if self.cli_opts.channel:
            channels = []
            labels = self.cli_opts.channel.split(',')
            for label in labels:
                channels.append(g.proxy.query(model.Channel, label=label, 
                                just_one=True))
        else:
            channels = g.proxy.query(model.Channel)
                           
        abort_on_error(errors)
        for c in channels:
            if self.cli_opts.all:
                errata = c.errata
            else:
                errata = c.recent_errata
            for e in errata:
                all_errata.append((e.issue_date, e))

        all_errata.sort()
        all_errata.reverse()
        
        return dict(errata=all_errata)
Beispiel #5
0
 def show(self, *args, **kw):
     errors = []
     if not self.cli_opts.full_package:
         if len(sys.argv) >= 4:
             self.cli_opts.full_package = sys.argv[3]
         else:
             errors.append(('SatCLIArgumentError', 
                            'package -p/--pkg required.'))
     abort_on_error(errors)
     package = self._get_package(self.cli_opts.full_package)
     return dict(package=package)
Beispiel #6
0
 def show(self, *args, **kw):
     errors = []
     if not self.cli_opts.label:
         if len(sys.argv) >= 4:
             self.cli_opts.label = sys.argv[3]
         else:
             errors.append(('SatCLIArgumentError', 
                            'channel -l/--label required.'))
     abort_on_error(errors)
     channel = g.proxy.query(model.Channel, just_one=True, all_data=True,
                                label=self.cli_opts.label)
     return dict(channel=channel)
Beispiel #7
0
 def show(self, *args, **kw):
     errors = []
     if not self.cli_opts.advisory:
         if len(sys.argv) >= 4:
             self.cli_opts.advisory = sys.argv[3]
         else:
             errors.append(('SatCLIArgumentError', 
                            'errata -a/--advisory required.'))
     abort_on_error(errors)
     errata = g.proxy.query(model.Errata, just_one=True, 
                            advisory=self.cli_opts.advisory)
     return dict(errata=errata)
Beispiel #8
0
 def search(self, *args, **kw):
     errors = []
     if not self.cli_opts.regex:
         if len(sys.argv) >= 4:
             self.cli_opts.regex = sys.argv[3]
         else:
             errors.append(('SatCLIArgumentError',
                            "A search string (-r/--regex) is required for query."))
     abort_on_error(errors)
             
     channels = g.proxy.query(model.Channel, self.cli_opts.regex, all_data=False)
     for channel in channels:
         print channel.label        
     return dict(channels=channels)
Beispiel #9
0
 def get(self, *args, **kw):
     errors = []
     if not self.cli_opts.full_package:
         if len(sys.argv) >= 4:
             self.cli_opts.full_package = sys.argv[3]
         else:
             errors.append(('SatCLIArgumentError', 
                            'package -p/--pkg required.'))
     abort_on_error(errors)
     package = self._get_package(self.cli_opts.full_package)
     
     print 'downloading %s ... ' % package.file,
     f = open(package.file, 'w')
     data = urlopen(package.url).read()
     f.write(data)
     f.close()
     print 'ok'
     return dict()
Beispiel #10
0
    def delete(self, *args, **kw):            
        errors = []
        if not self.cli_opts.label:
            if len(sys.argv) >= 4:
                self.cli_opts.label = sys.argv[3]
            else:
                errors.append(('SatCLIArgumentError', 
                               'channel -l/--label required.'))
        abort_on_error(errors)
        res = raw_input("Permanantly delete channel '%s'? [y/N] " % \
                        self.cli_opts.label)
        if not res.lower() in ['y', 'yes']:
            sys.exit(1)

        channel = g.proxy.query(model.Channel, just_one=True, 
                                label=self.cli_opts.label)
        g.proxy.delete(channel)
        return dict()
Beispiel #11
0
    def delete(self, *args, **kw):            
        errors = []
        if not self.cli_opts.advisory:
            if len(sys.argv) >= 4:
                self.cli_opts.advisory = sys.argv[3]
            else:
                errors.append(('SatCLIArgumentError', 
                               'errata -a/--advisory required.'))
        abort_on_error(errors)
        res = raw_input("Permanantly delete advisory '%s'? [y/N] " % \
                        self.cli_opts.advisory)
        if not res.lower() in ['y', 'yes']:
            sys.exit(1)

        errata = g.proxy.query(model.Errata, just_one=True, all_data=True,
                               advisory=self.cli_opts.advisory)
        g.proxy.delete(errata)
        return dict()
Beispiel #12
0
    def create(self, *args, **kw):
        config = get_config()
        
        errors = []
        channels = []
        if not self.cli_opts.advisory:
            errors.append(('SatCLIArgumentError', 
                           'errata -a/--advisory required.'))
        
        if not self.cli_opts.rpms:
            errors.append(('SatCLIArgumentError', 
                           'errata --rpms required.'))                   
        
        if not self.cli_opts.channel and not self.cli_opts.channels_file:
            errors.append(('SatCLIArgumentError', 
                           'errata -c/--channel or --channels-file required.'))                   
        
        if self.cli_opts.channel:
            _channels = self.cli_opts.channel.split(',')
            for _c in _channels:
                channels.append(_c)
        
        if self.cli_opts.channels_file:
            if os.path.exists(self.cli_opts.channels_file):
                f = open(self.cli_opts.channels_file, 'r')
                for line in f.readlines():
                    channels.append(line.strip('\n'))
            else:
                log.warn("channels file '%s' doesn't exist!" % \
                         self.cli_opts.channels_file)
        
        if not self.cli_opts.synopsis:
            errors.append(('SatCLIArgumentError', 
                           'errata --synopsis required.'))
        
        if not self.cli_opts.product:
            errors.append(('SatCLIArgumentError', 
                           'errata --product required.'))
        
        if not self.cli_opts.advisory_type:
            errors.append(('SatCLIArgumentError', 
                           'errata --type required.'))
        
        if not self.cli_opts.advisory_type in ['bug', 'enhancement', 'security']:
            errors.append(('SatCLIArgumentError',
                       'errata --type must be one of bug, enhancement, security.'))                   

        if not self.cli_opts.description:
            errors.append(('SatCLIArgumentError', 
                           'errata --description required.'))
                           
        abort_on_error(errors)
                
        if not self.cli_opts.topic:
            self.cli_opts.topic = "%s update." % self.cli_opts.advisory_type.capitalize()
        
        if not self.cli_opts.solution:
            self.cli_opts.solution = config['errata']['solution']
        
        if self.cli_opts.keywords:
            self.cli_opts.keywords = self.cli_opts.keywords.split(',')
        else:
            self.cli_opts.keywords = []


        rpms = glob(str(self.cli_opts.rpms))
        rpms_data = []
        package_ids = []
        for r in rpms:
            nosig_txt = ''
            if config['allow_nosig']:
                nosig_txt = '--nosig'
            cmd = "%s %s -u %s -p %s --server %s %s" % \
                (config['cmd_rhnpush'], r, config['user'], 
                 config['password'], 
                 config['server'], nosig_txt)
            gso(cmd)
            rpm = RPM(file(r))  
            package = g.proxy.query(model.Package, just_one=True,
                                name=rpm[rpmdefs.RPMTAG_NAME], 
                                version=rpm[rpmdefs.RPMTAG_VERSION], 
                                release=rpm[rpmdefs.RPMTAG_RELEASE], 
                                arch=rpm[rpmdefs.RPMTAG_ARCH])
            rpms_data.append(package)
        if self.cli_opts.srpm:
            if os.path.exists(self.cli_opts.srpm):
                rpm = RPM(file(self.cli_opts.srpm))  
                nosig_txt = ''
                if config['allow_nosig']:
                    nosig_txt = '--nosig'
                cmd = "%s %s --source -u %s -p %s --server %s %s" % \
                    (config['cmd_rhnpush'], self.cli_opts.srpm, 
                     config['user'], config['password'], 
                     config['server'], nosig_txt)
                gso(cmd)
            else:
                log.warn("SRPM '%s' doesn't exist!" % self.cli_opts.srpm)    

        for p in rpms_data:
            package_ids.append(p.id)
        
        if self.cli_opts.advisory_type == 'bug':
            self.cli_opts.advisory_type = 'Bug Fix Advisory'
        elif self.cli_opts.advisory_type == 'enhancement':
            self.cli_opts.advisory_type = 'Product Enhancement Advisory'
        elif self.cli_opts.advisory_type == 'security':
            self.cli_opts.advisory_type = 'Security Advisory'        
            
            
        e = model.Errata()
        e.synopsis = self.cli_opts.synopsis
        e.advisory_name = self.cli_opts.advisory
        e.advisory_release = 1
        e.advisory_type = self.cli_opts.advisory_type
        e.product = self.cli_opts.product
        e.topic = self.cli_opts.topic
        e.description = self.cli_opts.description
        e.references = self.cli_opts.references or ''
        e.notes = self.cli_opts.notes or ''
        e.solution = self.cli_opts.solution
        e.bug_ids = []
        e.keywords = self.cli_opts.keywords or []
        e.package_ids = package_ids
        e.publish = self.cli_opts.publish
        e.channels = channels       
        g.proxy.create(e)
        res = g.proxy.query(model.Errata, just_one=True, all_data=True,
                            advisory=self.cli_opts.advisory)     
        return dict(errata=res)