Пример #1
0
def disk(xid):

    b_used, b_total, i_used, i_total = 0, 0, 0, 0

    dl = vsutil.get_disk_limits(xid)

    if not dl:
        log("Warning: no limits on xid %s" % xid)
    else:
        b_used, b_total, i_used, i_total = dl["b_used"], dl["b_total"], dl["i_used"], dl["i_total"]

    return {"vs_disk_b_used": b_used, "vs_disk_b_total": b_total, "vs_disk_i_used": i_used, "vs_disk_i_total": i_total}
Пример #2
0
def disk(xid):

    b_used, b_total, i_used, i_total = 0, 0, 0, 0

    dl = vsutil.get_disk_limits(xid)

    if not dl:
        log('Warning: no limits on xid %s' % xid)
    else:
        b_used, b_total, i_used, i_total = \
                dl['b_used'], dl['b_total'], dl['i_used'], dl['i_total']

    return {
        'vs_disk_b_used': b_used,
        'vs_disk_b_total': b_total,
        'vs_disk_i_used': i_used,
        'vs_disk_i_total': i_total
    }
Пример #3
0
def dump(vserver_name, refserver, outfile, pace=cfg.PACE[0]):

    # Save the difference between reference and the server in an
    # archive The archive is encrypted. This is because you have to
    # trust it before you try restoring it. It is also better for any
    # backed up data to be encrypted always.

    # pace counter
    p = 0

    # this will also strip trailing slashes
    vserver, refserver = os.path.abspath(os.path.join(cfg.VSERVERS_ROOT, vserver_name)), \
                         os.path.abspath(refserver)

    print 'Dumping %s in reference to %s ... (this will take a while)' % (
        vserver, refserver)

    # this will prevent some warnings
    os.chdir(cfg.VSERVERS_ROOT)

    # first we need a header. for now the header format is:
    # "openvps-dump|Fedora Core release 2 (Tettnang)|2004010101|userid|ctxid|ip|hmac"
    # where the fields are:
    # * \0openvps-dump (constant) (the \0 makes it apear like a binary file to less)
    # * /etc/fedora-release from reference server
    # * /etc/openvps-release from reference (default to YYYYMMDDHHMMSS
    # * name of vserver
    # * context id of vserver
    # * ips in format dev:ip/mask,dev:ip/mask
    # * current disk limits (the argument to -S of vdlim)
    # * hmac of the preceeding string

    config = vsutil.get_vserver_config(vserver_name)

    header = ['\0openvps-dump']
    header.append(
        open(os.path.join(refserver, 'etc/fedora-release')).read().strip())
    if os.path.exists(os.path.join(refserver, 'etc/openvps-release')):
        header.append(
            open(os.path.join(refserver,
                              'etc/openvps-release')).read().strip())
    else:
        header.append(time.strftime('%Y%m%d%H%M%S', time.localtime()))
    header.append(vserver_name)
    header.append(config['context'])
    header.append(','.join([
        '%s:%s/%s' % (i['dev'], i['ip'], i['mask'])
        for i in config['interfaces']
    ]))

    dl = vsutil.get_disk_limits(config['context'])
    if dl:
        header.append('%s,%s,%s,%s,%s' %
                      (dl['b_used'], dl['b_total'], dl['i_used'],
                       dl['i_total'], dl['root']))
    else:
        print 'Wargning: no disk limits for xid %s' % config['context']
        header.append('None')

    # turn it into string
    header = '|'.join(header)

    # sign it
    digest = hmac.new(cfg.DUMP_SECRET, header).hexdigest()

    # now write to our file
    open(outfile, 'w').write('%s|%s|\0' % (header, digest))

    # open a pipe to cpio
    fd_r, fd_w = os.pipe()

    # write the password to the new file descriptor so openssl can read it
    os.write(fd_w, cfg.DUMP_SECRET + '\n')

    # cpio will be fed the list of files to archive. the output is compressed using
    # bzip2, then encrypted with openssl using blowfish
    cmd = '/bin/cpio -oHcrc | /usr/bin/bzip2 | /usr/bin/openssl bf -salt -pass fd:%d >> %s' % (
        fd_r, outfile)
    pipe = os.popen(cmd, 'w', 0)

    # the first things to go into the archive should be the config and rrd

    # config
    cfg_dir = os.path.join(cfg.ETC_VSERVERS, vserver_name)
    cmd = '/usr/bin/find %s -print' % cfg_dir
    cfg_files = commands.getoutput(cmd)
    pipe.write(cfg_files + '\n')

    # the rrd
    rrd_path = os.path.join(cfg.VAR_DB_OPENVPS, vserver_name + '.rrd')
    pipe.write(rrd_path + '\n')

    #print source, dest
    for root, dirs, files in os.walk(vserver, topdown=False):

        for file in files + dirs:

            if pace and p >= pace:
                sys.stdout.write('.')
                sys.stdout.flush()
                time.sleep(cfg.PACE[1])
                p = 0
            else:
                p += 1

            src = os.path.join(root, file)

            # reldst is they way it would look inside vserver
            reldst = os.path.join(max(root[len(vserver):], '/'), file)
            dst = os.path.join(refserver, reldst[1:])

            if os.path.exists(dst):

                if os.path.islink(dst) or os.path.isdir(
                        dst) or not os.path.isfile(dst):

                    # If this is a link, dir or other non-file, their
                    # mere existence is sufficient, no need to compare
                    # inodes since these are never unified. But we
                    # need to make sure they are not skipped (copy
                    # means they will be there after cloning, touch
                    # doesn't apply here)

                    c, t, s = match_path(file)

                    if not s:
                        continue
                else:

                    # this is a regular file that exists in both
                    # reference and our server, let's compare inodes

                    src_stat = os.lstat(src)
                    dst_stat = os.lstat(dst)

                    if src_stat.st_ino == dst_stat.st_ino:

                        # inodes match, this is a unified file, no
                        # reason to back it up

                        continue
            pipe.write(src + '\n')

    os.close(fd_w)
    pipe.close()
Пример #4
0
def dump(vserver_name, refserver, outfile, pace=cfg.PACE[0]):

    # Save the difference between reference and the server in an
    # archive The archive is encrypted. This is because you have to
    # trust it before you try restoring it. It is also better for any
    # backed up data to be encrypted always.

    # pace counter
    p = 0

    # this will also strip trailing slashes
    vserver, refserver = os.path.abspath(os.path.join(cfg.VSERVERS_ROOT, vserver_name)), \
                         os.path.abspath(refserver)

    print 'Dumping %s in reference to %s ... (this will take a while)' % (vserver, refserver)

    # this will prevent some warnings
    os.chdir(cfg.VSERVERS_ROOT)

    # first we need a header. for now the header format is:
    # "openvps-dump|Fedora Core release 2 (Tettnang)|2004010101|userid|ctxid|ip|hmac"
    # where the fields are:
    # * \0openvps-dump (constant) (the \0 makes it apear like a binary file to less)
    # * /etc/fedora-release from reference server
    # * /etc/openvps-release from reference (default to YYYYMMDDHHMMSS
    # * name of vserver
    # * context id of vserver
    # * ips in format dev:ip/mask,dev:ip/mask
    # * current disk limits (the argument to -S of vdlim)
    # * hmac of the preceeding string

    config = vsutil.get_vserver_config(vserver_name)

    header = ['\0openvps-dump']
    header.append(open(os.path.join(refserver, 'etc/fedora-release')).read().strip())
    if os.path.exists(os.path.join(refserver, 'etc/openvps-release')):
        header.append(open(os.path.join(refserver, 'etc/openvps-release')).read().strip())
    else:
        header.append(time.strftime('%Y%m%d%H%M%S', time.localtime()))
    header.append(vserver_name)
    header.append(config['context'])
    header.append(','.join(['%s:%s/%s' % (i['dev'], i['ip'], i['mask']) for i in config['interfaces']]))

    dl = vsutil.get_disk_limits(config['context'])
    if dl:
        header.append('%s,%s,%s,%s,%s' % (dl['b_used'], dl['b_total'], dl['i_used'], dl['i_total'], dl['root']))
    else:
        print 'Wargning: no disk limits for xid %s' % config['context']
        header.append('None')

    # turn it into string
    header = '|'.join(header)

    # sign it
    digest = hmac.new(cfg.DUMP_SECRET, header).hexdigest()

    # now write to our file
    open(outfile, 'w').write('%s|%s|\0' % (header, digest))
    
    # open a pipe to cpio
    fd_r, fd_w = os.pipe()

    # write the password to the new file descriptor so openssl can read it
    os.write(fd_w, cfg.DUMP_SECRET+'\n')

    # cpio will be fed the list of files to archive. the output is compressed using
    # bzip2, then encrypted with openssl using blowfish
    cmd = '/bin/cpio -oHcrc | /usr/bin/bzip2 | /usr/bin/openssl bf -salt -pass fd:%d >> %s' % (fd_r, outfile)
    pipe = os.popen(cmd, 'w', 0)

    # the first things to go into the archive should be the config and rrd
    
    # config
    cfg_dir = os.path.join(cfg.ETC_VSERVERS, vserver_name)
    cmd = '/usr/bin/find %s -print' % cfg_dir
    cfg_files = commands.getoutput(cmd)
    pipe.write(cfg_files+'\n')

    # the rrd
    rrd_path = os.path.join(cfg.VAR_DB_OPENVPS, vserver_name+'.rrd')
    pipe.write(rrd_path+'\n')
    
    #print source, dest
    for root, dirs, files in os.walk(vserver, topdown=False):

        for file in files + dirs:

            if pace and p >= pace:
                sys.stdout.write('.'); sys.stdout.flush()
                time.sleep(cfg.PACE[1])
                p = 0
            else:
                p += 1

            src = os.path.join(root, file)

            # reldst is they way it would look inside vserver
            reldst = os.path.join(max(root[len(vserver):], '/'), file)
            dst = os.path.join(refserver, reldst[1:])

            if os.path.exists(dst):

                if os.path.islink(dst) or os.path.isdir(dst) or not os.path.isfile(dst):
                    
                    # If this is a link, dir or other non-file, their
                    # mere existence is sufficient, no need to compare
                    # inodes since these are never unified. But we
                    # need to make sure they are not skipped (copy
                    # means they will be there after cloning, touch
                    # doesn't apply here)
                    
                    c, t, s = match_path(file)

                    if not s:
                        continue
                else:

                    # this is a regular file that exists in both
                    # reference and our server, let's compare inodes

                    src_stat = os.lstat(src)
                    dst_stat = os.lstat(dst)

                    if src_stat.st_ino == dst_stat.st_ino:
                        
                        # inodes match, this is a unified file, no
                        # reason to back it up

                        continue
            pipe.write(src+'\n')

    os.close(fd_w)
    pipe.close()