示例#1
0
 def try_format(devn, id_):
     # Wait for device block appear.
     fblk = False
     time.sleep(1)
     # We attemp to detect device file whether exists
     for trycnt in range(10):
         # os.path.exists cannot detect file exists real time
         #if os.path.exists(devn):
         if os.system('ls %s' % devn) == 0:
             fblk = True
             break
         else:
             time.sleep(1)
             
     if not fblk:
         msg = _('Not exists device block on %s: \ntry time: %d\n') % (devpath, trycnt)
         logger.w(msg)
         return msg
     else:
         logger.d('try_format %s ls device %s time' % (id_, trycnt))
     # Run command to format partition
     cmd_format = CF.D.FSTYPE_MAP[fstype][1]
     cmd_f_list = cmd_format.split()
     cmd = cmd_f_list[0]
     argv = cmd_f_list[1:]
     argv.append(devn)
     cmdres = run_bash(cmd, argv)
     logger.d('%s %s' % (cmd, ' '.join(argv)))
     logger.d(' '.join(cmdres['out']))
     if cmdres['ret'] != 0:
         errmsg = _('Run "%s %s" failed: %s\ntry time: %d\n')
         return  errmsg % ( cmd, ' '.join(argv), str(cmdres['err']), trycnt )
     else:
         return  0
示例#2
0
def run_post_script(script_rel, _argv=[], f_chroot=True):
    logger.i('Run post_script %s %s' % (script_rel, str(_argv)))
    post_scripts_dir = CF.D.POST_SCRIPTS_DIR
    script = os.path.join(post_scripts_dir, script_rel)
    if not os.path.exists(script):
        msg = _('Can not find the script %s' % script)
        logger.e(msg)
        return -1, msg
    
    root = CF.D.TGTSYS_ROOT
    if f_chroot:
        if not os.path.exists('%s/tmp' % root):
            os.makedirs('%s/tmp' % root)
        cmd0 = 'cp -pr %s %s/tmp/' % (post_scripts_dir, root)
        logger.d(cmd0)
        os.system(cmd0)
        cmd = '/tmp/%s/%s' % (os.path.basename(post_scripts_dir), script_rel)
        cmd0 = 'chmod 777 %s%s' % (root, cmd)
        logger.d(cmd0)
        os.system(cmd0)
        argv = _argv
        _environ = dict(os.environ)
        _environ['LANG'] = 'en_US.UTF-8'
        try:
            res = run_bash(cmd, argv, root, env=_environ, cwd='/tmp/%s' % os.path.basename(post_scripts_dir))
        except OSError, e:
            res = {}
            res['ret'] = -1
            res['err'] = ['Can not run %s, can not chroot to target system or can not run this script.' % script_rel]
            res['out'] = ['']
            logger.e(res['err'], exc_info = sys.exc_info())
        cmd0 = 'rm -rf %s/tmp/%s' % (root, os.path.basename(post_scripts_dir))
        logger.d(cmd0)
        os.system(cmd0)
    def _install(self, pkgpath, noscripts, not_pre_post_script, progress_cb):
        pkgname = get_pkg_name(pkgpath)
        try:
            cmd = 'rpm'
            argv = ['-i', '--noorder', # '--nosuggest', # on ubuntu platform rpm do not have --nosuggest parameter
                    '--force','--nodeps',
                    '--ignorearch',
                    '--root', CF.D.TGTSYS_ROOT,
                    pkgpath,
                ]
            if self.use_noscripts or noscripts:
                argv.append('--noscripts')
                self.noscripts_pkg_list.append(pkgpath)

            #cmd_res = {'err':[], 'std': [], 'ret':0}   # DEBUG
            cmd_res = run_bash(cmd, argv)
            # Sign the installing pkg name in stderr
            if cmd_res['err']:
                # Ok the stderr will dup2 a log file, so we just out it on err screen
                print >>sys.stderr, '***INSTALLING %s:\n**STDERR:\n%s\n' \
                        %(pkgname, ''.join(cmd_res['err']))
            problems = cmd_res['ret']
            if problems:
                errormsg = ''.join(cmd_res['err'])
                message = 'PROBLEMS on %s: \n return code is %s error message is\n[%s]' \
                          % (pkgname, str(problems), errormsg)
                logger.i(message)
                return  message
        except Exception, errmsg:
            logger.i('FAILED on %s: %s\n' % (pkgname, str(errmsg)))
            return str(errmsg)
示例#4
0
def logger_copy_logfiles(mia, operid, param):
    def start_operate(title):
        time.sleep(0.2)
        print title

    usb_dev_path, usb_fs_type, logfiles = param
    usb_mount_dir = ""
    steps = 4
    step = 0
    mia.set_step(operid, step, steps)
    # mount the usb device.
    step = step + 1
    mia.set_step(operid, step, steps)
    start_operate('Mount...')
    ret, msg = mount_dev(usb_fs_type, usb_dev_path)
    if not ret:
        return str(msg)
    else:
        usb_mount_dir = msg

    # Copy logfiles to usb.
    step = step + 1
    mia.set_step(operid, step, steps)
    start_operate('Copy logfiles...')
    ret, msg = copy_logfiles(logfiles,
                             os.path.join(usb_mount_dir, "magiclogger"))
    if ret:
        return str(msg)

    step = step + 1
    mia.set_step(operid, step, steps)
    start_operate('Sync files...')
    run_bash('/bin/sync')

    # umount the usb device.
    step = step + 1
    mia.set_step(operid, step, steps)
    start_operate('Umount...')
    ret, msg = umount_dev(usb_mount_dir)
    if not ret:
        return str(msg)

    return 0
示例#5
0
def logger_copy_logfiles(mia, operid, param):
    def start_operate(title):
        time.sleep(0.2)
        print title

    usb_dev_path, usb_fs_type, logfiles = param
    usb_mount_dir = ""
    steps = 4
    step = 0
    mia.set_step(operid, step, steps)
    # mount the usb device.
    step = step + 1
    mia.set_step(operid, step, steps)
    start_operate('Mount...')
    ret, msg = mount_dev(usb_fs_type, usb_dev_path)
    if not ret:
        return str(msg)
    else:
        usb_mount_dir = msg

    # Copy logfiles to usb.
    step = step + 1
    mia.set_step(operid, step, steps)
    start_operate('Copy logfiles...')
    ret, msg = copy_logfiles(logfiles, os.path.join(usb_mount_dir, "magiclogger"))
    if ret:
        return str(msg)
    
    step = step + 1
    mia.set_step(operid, step, steps)
    start_operate('Sync files...')
    run_bash('/bin/sync')

    # umount the usb device.
    step = step + 1
    mia.set_step(operid, step, steps)
    start_operate('Umount...')
    ret, msg = umount_dev(usb_mount_dir)
    if not ret:
        return str(msg)

    return 0
示例#6
0
def copy_logfiles(logfiles, destdir):
    ret = []
    errormsg = []
    for logfile in logfiles:
        if not os.path.exists(logfile):
            continue
        if not os.path.exists(destdir):
            os.makedirs(destdir)
        cmd_res = run_bash("cp",[ "-r", logfile, destdir])
        if cmd_res['ret']:
            ret.append(cmd_res['ret'])
            errormsg.append(cmd_res['err'])
    return ret, errormsg
示例#7
0
    def umount_tgt_device(self):
        self.mounted_devs.reverse()
        for dev in self.mounted_devs:
            if type(dev) is MiDevice:
                if not dev.do_umount():
                    logger.w('Umount device %s Failed, but we continue')
            else:
                umount_dev(dev)
        res = run_bash('mount')
        logger.d(''''UMount target system partition finished, check the mount output please:)
%s
%s
        ''' % ('\n'.join(res['out']), '\n'.join(res['err'])))
示例#8
0
def copy_logfiles(logfiles, destdir):
    ret = []
    errormsg = []
    for logfile in logfiles:
        if not os.path.exists(logfile):
            continue
        if not os.path.exists(destdir):
            os.makedirs(destdir)
        cmd_res = run_bash("cp", ["-r", logfile, destdir])
        if cmd_res['ret']:
            ret.append(cmd_res['ret'])
            errormsg.append(cmd_res['err'])
    return ret, errormsg
示例#9
0
    def do_bash_rpm_install():
        global noscripts_pkg_list
        global use_noscripts
        mia.set_step(operid, 1, 1)

        try:
            cmd = "rpm"
            argv = [
                "-i",
                "--noorder",  # '--nosuggest', # on ubuntu platform rpm do not have --nosuggest parameter
                "--force",
                "--nodeps",
                "--ignorearch",
                "--root",
                CF.D.TGTSYS_ROOT,
                pkgpath,
            ]
            if use_noscripts or noscripts:
                argv.append("--noscripts")
                noscripts_pkg_list.append(pkgpath)

            # cmd_res = {'err':[], 'std': [], 'ret':0}   # DEBUG
            cmd_res = run_bash(cmd, argv)
            # Sign the installing pkg name in stderr
            if cmd_res["err"]:
                # Ok the stderr will dup2 a log file, so we just out it on err screen
                print >>sys.stderr, "***INSTALLING %s:\n**STDERR:\n%s\n" % (pkgname, "".join(cmd_res["err"]))
            problems = cmd_res["ret"]
            if problems:
                errormsg = "".join(cmd_res["err"])
                message = "PROBLEMS on %s: \n return code is %s error message is\n[%s]" % (
                    pkgname,
                    str(problems),
                    errormsg,
                )
                dolog(message)
                return message
        except Exception, errmsg:
            dolog("FAILED on %s: %s\n" % (pkgname, str(errmsg)))
            return str(errmsg)
示例#10
0
            def try_format(devn, id_):
                # Wait for device block appear.
                fblk = False
                time.sleep(1)
                # We attemp to detect device file whether exists
                for trycnt in range(10):
                    # os.path.exists cannot detect file exists real time
                    #if os.path.exists(devn):
                    if os.system('ls %s' % devn) == 0:
                        fblk = True
                        break
                    else:
                        time.sleep(1)

                if not fblk:
                    msg = _('Not exists device block on %s: \ntry time: %d\n'
                            ) % (devpath, trycnt)
                    logger.w(msg)
                    return msg
                else:
                    logger.d('try_format %s ls device %s time' % (id_, trycnt))
                # Run command to format partition
                cmd_format = CF.D.FSTYPE_MAP[fstype][1]
                cmd_f_list = cmd_format.split()
                cmd = cmd_f_list[0]
                argv = cmd_f_list[1:]
                argv.append(devn)
                cmdres = run_bash(cmd, argv)
                logger.d('%s %s' % (cmd, ' '.join(argv)))
                logger.d(' '.join(cmdres['out']))
                if cmdres['ret'] != 0:
                    errmsg = _('Run "%s %s" failed: %s\ntry time: %d\n')
                    return errmsg % (cmd, ' '.join(argv), str(
                        cmdres['err']), trycnt)
                else:
                    return 0
示例#11
0
        _environ['LANG'] = 'en_US.UTF-8'
        try:
            res = run_bash(cmd, argv, root, env=_environ, cwd='/tmp/%s' % os.path.basename(post_scripts_dir))
        except OSError, e:
            res = {}
            res['ret'] = -1
            res['err'] = ['Can not run %s, can not chroot to target system or can not run this script.' % script_rel]
            res['out'] = ['']
            logger.e(res['err'], exc_info = sys.exc_info())
        cmd0 = 'rm -rf %s/tmp/%s' % (root, os.path.basename(post_scripts_dir))
        logger.d(cmd0)
        os.system(cmd0)
    else:
        cmd = os.path.join(post_scripts_dir, script_rel)
        argv = _argv
        res = run_bash(cmd, argv, cwd=os.path.dirname(cmd))
    
    if res['ret'] != 0:
        return res['ret'], ' '.join(res['err'])
    return res['ret'], ' '.join(res['out'])

@register.server_handler('long')
def setup_accounts(mia, operid, rootpasswd, acclist):
    mia.set_step(operid, 0, -1)

    argv = [rootpasswd, ]
    for (username, password, shell, homedir, realuid) in acclist:
        argv.extend([username, password, shell, homedir, realuid])
    ret, msg = run_post_script('setup-accounts', argv)
    if ret == 0:
        return 0, ''
示例#12
0
    def mount_tgt_device(self):
        tgt_root_dev, tgt_root_type = self.get_devinfo_by_mpoint('/')
        
        tgt_swap_dev, tgt_swap_type = self.get_devinfo_by_mpoint('USE')
        if tgt_swap_dev and os.path.exists(tgt_swap_dev):
            os.system('swapon %s' % tgt_swap_dev)

        #### mount root device
        mnt_point = CF.D.TGTSYS_ROOT
        dev_tgt_root = MiDevice(tgt_root_dev, tgt_root_type, mnt_point)
        if not dev_tgt_root.do_mount(): #### NOTE: carefully handle this device's mount.
            logger.e('Mount device %s Failed, install operate can not continue' % dev_tgt_root.get_dev())
            return False
        else:
            self.mounted_devs.append(dev_tgt_root)
        def mount_each(tgt_root_dev, tgt_other_dev, tgt_other_type, tgt_other_mpoint):
            if tgt_other_dev and tgt_root_dev != tgt_other_dev:
                mnt_point = os.path.join(CF.D.TGTSYS_ROOT, tgt_other_mpoint.lstrip('/'))
                dev_tgt_other = MiDevice(tgt_other_dev, tgt_other_type, mnt_point)
                
                if not dev_tgt_other.do_mount(): #### NOTE: carefully handle this device's mount.
                    logger.e('Mount device %s Failed, install operate can not continue' % dev_tgt_other.get_dev())
                    self.umount_tgt_device()
                    return False
                else:
                    self.mounted_devs.append(dev_tgt_other)
                return True
            else:
                logger.e('Can not run to here!! The root file system had been mounted before!!')
                return False
                    
        for mpoint, dev_, type_ in self.tgtsys_devinfo:
            if mpoint not in ('/', 'USE'):
                if not mount_each(tgt_root_dev, dev_, type_, mpoint):
                    return False
        
        # mount -t proc proc myroot/proc/
        mnt_point = os.path.join(CF.D.TGTSYS_ROOT, 'proc')
        ret, msg = mount_dev('proc', 'proc', mntdir=mnt_point,flags=None)
        if not ret:
            logger.e("Error: mount proc on target failed '%s'" % msg)
            return False
        self.mounted_devs.append(mnt_point)

        # mount -t sysfs sys myroot/sys/
        mnt_point = os.path.join(CF.D.TGTSYS_ROOT, 'sys')
        ret, msg = mount_dev('sysfs', 'sys', mntdir=mnt_point,flags=None)
        if not ret:
            logger.e("Error: mount sys on target failed '%s'" % msg)
            return False
        self.mounted_devs.append(mnt_point)

        # mount -o bind /dev myroot/dev/
        mnt_point = os.path.join(CF.D.TGTSYS_ROOT, 'dev')
        ret, msg = mount_dev(None, '/dev', mntdir=mnt_point,flags='bind')
        if not ret:
            logger.e("Error: mount /dev on target failed '%s'" % msg)
            return False
        self.mounted_devs.append(mnt_point)
        
        res = run_bash('mount')
        logger.d(''''Mount target system partition finished, check the mount output please:)
%s
%s
        ''' % ('\n'.join(res['out']), '\n'.join(res['err'])))
        return True
示例#13
0
                return _('Not exists device block on %s: \ntry time: %d\n') % (devpath, trycnt)
                
            #cmd = '%s %s%d' % (CF.D.FSTYPE_MAP[fstype][1], devpath, part.number)
            #ret = os.system(cmd)
            #if ret != 0:
            #    errmsg = _('Run "%s" failed: %s\n')
            #    return  errmsg % (cmd, str(ret))
            #else:
            #    return  0
            # Run command to format partition
            cmd_format = CF.D.FSTYPE_MAP[fstype][1]
            cmd_f_list = cmd_format.split()
            cmd = cmd_f_list[0]
            argv = cmd_f_list[1:]
            argv.append('%s%d' % (devpath, part.number))
            cmdres = run_bash(cmd, argv)
            dolog('%s %s\n' % (cmd, ' '.join(argv)))
            dolog(' '.join(cmdres['out'])+'\n')
            if cmdres['ret'] != 0:
                errmsg = _('Run "%s %s" failed: %s\ntry time: %d\n')
                return  errmsg % ( cmd, ' '.join(argv), str(cmdres['err']), trycnt )
            else:
                return  0
    return _('Not any partition found on position: ') + str(part_start)

def _gen_fstab(mount_all_list):
    # Generate fstab.
    mountmap = {}
    for (mntdir, devfn, fstype) in mount_all_list:
        if fstype == 'linux-swap':  continue
        if fstype in ('fat32', 'fat16'):