MINI SHELL

Server : Apache/2.2.2 (Fedora)
System : Linux App1.pathumtani.go.th 2.6.20-1.2320.fc5smp #1 SMP Tue Jun 12 19:40:16 EDT 2007 i686
User : apache ( 48)
PHP Version : 5.2.9
Disable Function : NONE
Directory :  /usr/share/yum-cli/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //usr/share/yum-cli/shell.py
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Library General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
# Copyright 2005 Duke University

import sys
import os.path
import cmd
import string
import shlex

from yum import Errors
from yum.constants import *


class YumShell(cmd.Cmd):
    def __init__(self, base):
        cmd.Cmd.__init__(self)
        self.base = base
        self.prompt = '> '
        self.result = 0
        self.from_file = False # if we're running from a file, set this
        self.resultmsgs = ['Leaving Shell']
        if (len(base.extcmds)) > 0:
            self.file = base.extcmds[0]
        self.shell_specific_commands = ['repo', 'repository', 'exit', 'quit',
                'run', 'ts', 'transaction', 'config']
                
        self.commandlist = self.shell_specific_commands + self.base.yum_cli_commands


    def _shlex_split(self, input_string):
        """split the input using shlex rules, and error or exit accordingly"""
        
        inputs = []
        try:
            inputs = shlex.split(input_string)
        except ValueError, e:
            self.base.errorlog(0, 'Script Error: %s' % e)
            if self.from_file:
                raise Errors.YumBaseError, "Fatal error in script, exiting"
        
        return inputs
        
    def script(self):
        try:
            fd = open(self.file, 'r')
        except IOError, e:
            sys.exit("Error: Cannot open %s for reading")
        lines = fd.readlines()
        fd.close()
        self.from_file = True
        for line in lines:
            self.onecmd(line)
        self.onecmd('EOF')
        return True
            
    def default(self, line):
        if len(line) > 0 and line.strip()[0] == '#':
            pass
        else:
            (cmd, args, line) = self.parseline(line)
            if cmd not in self.commandlist:
                self.do_help('')
                return False
            self.base.cmdstring = line
            self.base.cmdstring = self.base.cmdstring.replace('\n', '')
            self.base.cmds = self._shlex_split(self.base.cmdstring)

            try:
                self.base.parseCommands()
            except Errors.YumBaseError:
                pass
            else:
                self.base.doCommands()
    
    def emptyline(self):
        pass
    
    def do_help(self, arg):
        msg = """
    Shell specific arguments:
      config - set config options
      repository (or repo) - enable/disable repositories
      transaction (or ts) - list, reset or run the transaction set
      run - run the transaction set
      exit or quit - exit the shell
    """
            
        if arg in ['transaction', 'ts']:
            msg = """
    %s arg
      list: lists the contents of the transaction
      reset: reset (zero-out) the transaction
      solve: run the dependency solver on the transaction
      run: run the transaction
                  """ % arg
        elif arg in ['repo', 'repository']:
            msg = """
    %s arg [option]
      list: lists repositories and their status
      enable: enable repositories. option = repository id
      disable: disable repositories. option = repository id
    """ % arg
    
        elif arg == 'config':
            msg = """
    %s arg [value]
      args: debuglevel, errorlevel, obsoletes, gpgcheck, assumeyes, exclude
        If no value is given it prints the current value.
        If value is given it sets that value.
        """ % arg
        
        else:
            self.base.usage()
        
        self.base.log(0, msg)
        
    def do_EOF(self, line):
        self.resultmsgs = ['Leaving Shell']
        return True
    
    def do_quit(self, line):
        self.resultmsgs = ['Leaving Shell']
        return True
    
    def do_exit(self, line):
        self.resultmsgs = ['Leaving Shell']
        return True
    
    def do_ts(self, line):
        self.do_transaction(line)

    def do_transaction(self, line):
        (cmd, args, line) = self.parseline(line)
        if cmd in ['list', None]:
            self.base.log(2,self.base.listTransaction())
        
        elif cmd == 'reset':
            self.base.closeRpmDB()
            self.base.doTsSetup()
            self.base.doRpmDBSetup()
        
        elif cmd == 'solve':
            try:
                (code, msgs) = self.base.buildTransaction()
            except Errors.YumBaseError, e:
                self.base.errorlog(0, 'Error building transaction: %s' % e)
                return False
                
            if code == 1:
                for msg in msgs:
                    self.base.errorlog(0, 'Error: %s' % msg)
            else:
                self.base.log(2, 'Success resolving dependencies')
                
        elif cmd == 'run':
            return self.do_run('')
            
        else:
            self.do_help('transaction')
    
    def do_config(self, line):
        (cmd, args, line) = self.parseline(line)
        # logs
        if cmd in ['debuglevel', 'errorlevel']:
            opts = self._shlex_split(args)
            if not opts:
                self.base.log(2, '%s: %s' % (cmd, getattr(self.base.conf, cmd)))
            else:
                val = opts[0]
                try:
                    val = int(val)
                except ValueError, e:
                    self.base.errorlog(0, 'Value %s for %s cannot be made to an int' % (val, cmd))
                    return
                setattr(self.base.conf, cmd, val)
                if cmd == 'debuglevel':
                    self.base.log.threshold = val
                elif cmd == 'errorlevel':
                    self.base.errorlog.threshold = val
        # bools
        elif cmd in ['gpgcheck', 'obsoletes', 'assumeyes']:
            opts = self._shlex_split(args)
            if not opts:
                self.base.log(2, '%s: %s' % (cmd, getattr(self.base.conf, cmd)))
            else:
                value = opts[0]
                if value.lower() not in BOOLEAN_STATES:
                    self.base.errorlog(0, 'Value %s for %s is not a Boolean' % (value, cmd))
                    return False
                value = BOOLEAN_STATES[value.lower()]
                setattr(self.base.conf, cmd, value)
                if cmd == 'obsoletes':
                    if hasattr(self.base, 'up'): # reset the updates
                        del self.base.up
        
        elif cmd in ['exclude']:
            args = args.replace(',', ' ')
            opts = self._shlex_split(args)
            if not opts:
                msg = '%s: ' % cmd
                msg = msg + string.join(getattr(self.base.conf, cmd))
                self.base.log(2, msg)
                return False
            else:
                setattr(self.base.conf, cmd, opts)
                if hasattr(self.base, 'pkgSack'): # kill the pkgSack
                    del self.base.pkgSack
                    self.base.repos._selectSackType()
                if hasattr(self.base, 'up'): # reset the updates
                    del self.base.up
                # reset the transaction set, we have to or we shall surely die!
                self.base.closeRpmDB() 
                self.base.doTsSetup()
                self.base.doRpmDBSetup()
        else:
            self.do_help('config')

    def do_repository(self, line):
        self.do_repo(line)
        
    def do_repo(self, line):
        (cmd, args, line) = self.parseline(line)
        if cmd in ['list', None]:
            if self.base.repos.repos.values():
                self.base.log(2, '%-20.20s %-40.40s  status' % ('repo id', 'repo name'))
            repos = self.base.repos.repos.values()
            repos.sort()
            for repo in repos:
                if repo in self.base.repos.listEnabled() and args in ('', 'enabled'):
                    self.base.log(2, '%-20.20s %-40.40s  enabled' % (repo, repo.name))
                elif args in ('', 'disabled'):
                    self.base.log(2, '%-20.20s %-40.40s  disabled' % (repo, repo.name))
        
        elif cmd == 'enable':
            repos = self._shlex_split(args)
            for repo in repos:
                try:
                    changed = self.base.repos.enableRepo(repo)
                except Errors.ConfigError, e:
                    self.base.errorlog(0, e)
                except Errors.RepoError, e:
                    self.base.errorlog(0, e)
                    
                else:
                    for repo in changed:
                        try:
                            self.base.doRepoSetup(thisrepo=repo)
                        except Errors.RepoError, e:
                            self.base.errorlog(0, 'Disabling Repository')
                            self.base.repos.disableRepo(repo)
                            return False
                            
                    if hasattr(self.base, 'up'): # reset the updates
                        del self.base.up
            
        elif cmd == 'disable':
            repos = self._shlex_split(args)
            for repo in repos:
                try:
                    self.base.repos.disableRepo(repo)
                except Errors.ConfigError, e:
                    self.base.errorlog(0, e)
                except Errors.RepoError, e:
                    self.base.errorlog(0, e)

                else:
                    if hasattr(self.base, 'pkgSack'): # kill the pkgSack
                        del self.base.pkgSack
                        self.base.repos._selectSackType()
                    if hasattr(self.base, 'up'): # reset the updates
                        del self.base.up
                    # reset the transaction set and refresh everything
                    self.base.closeRpmDB() 
                    self.base.doTsSetup()
                    self.base.doRpmDBSetup()
        
        else:
            self.do_help('repo')
                
    def do_test(self, line):
        (cmd, args, line) = self.parseline(line)
        print cmd
        print args
        print line
        
    def do_run(self, line):
        if len(self.base.tsInfo) > 0:
            try:
                (code, msgs) = self.base.buildTransaction()
                if code == 1:
                    for msg in msgs:
                        self.base.errorlog(0, 'Error: %s' % msg)
                    return False

                returnval = self.base.doTransaction()
            except Errors.YumBaseError, e:
                self.base.errorlog(0, 'Error: %s' % e)
            except KeyboardInterrupt, e:
                self.base.errorlog(0, '\n\nExiting on user cancel')
            except IOError, e:
                if e.errno == 32:
                    self.base.errorlog(0, '\n\nExiting on Broken Pipe')
            else:
                if returnval != 0:
                    self.base.log(0, 'Transaction did not run.')
                else:
                    self.base.log(2, 'Finished Transaction')
                    self.base.closeRpmDB()
                    self.base.doTsSetup()
                    self.base.doRpmDBSetup()


Anon7 - 2021