"Fossies" - the Fresh Open Source Software Archive  

Source code changes of the file "safekeep" between
safekeep-1.5.0.tar.gz and safekeep-1.5.1.tar.gz

About: SafeKeep is a centralized backup application that tries to combine the best features of a mirror and an incremental backup.

safekeep  (safekeep-1.5.0):safekeep  (safekeep-1.5.1)
skipping to change at line 40 skipping to change at line 40
config_file = '/etc/safekeep/safekeep.conf' config_file = '/etc/safekeep/safekeep.conf'
config_ext = '.backup' config_ext = '.backup'
trickle_cmd = 'trickle' trickle_cmd = 'trickle'
logbuf = [] logbuf = []
is_client = False is_client = False
verbosity_level = 1 verbosity_level = 1
verbosity_ssh = '' verbosity_ssh = ''
verbosity_trickle = '' verbosity_trickle = ''
work_user = getpass.getuser() work_user = getpass.getuser()
backup_user = None backup_user = None
backup_tempdir = None
client_user = 'root' client_user = 'root'
home_dir = None home_dir = None
base_dir = None base_dir = None
client_defaults = [] client_defaults = []
current_pid = os.getpid() current_pid = os.getpid()
default_bandwidth = {} default_bandwidth = {}
default_snapshot = '20%FREE' default_snapshot = '20%FREE'
statistics = [] statistics = []
error_counter = 0 error_counter = 0
warning_counter = 0 warning_counter = 0
skipping to change at line 62 skipping to change at line 63
SSH_TYPES = ['dsa', 'rsa', 'ed25519', 'ecdsa'] SSH_TYPES = ['dsa', 'rsa', 'ed25519', 'ecdsa']
SSH_KEY_TYPES = ['ssh-dss', 'ssh-rsa', 'ssh-ed25519', 'ecdsa-sha2-nistp256', 'ec dsa-sha2-nistp384', 'ecdsa-sha2-nistp521'] SSH_KEY_TYPES = ['ssh-dss', 'ssh-rsa', 'ssh-ed25519', 'ecdsa-sha2-nistp256', 'ec dsa-sha2-nistp384', 'ecdsa-sha2-nistp521']
ssh_StrictHostKeyChecking = 'ask' ssh_StrictHostKeyChecking = 'ask'
SSH_STRICT_HOSTKEY_CHECK_OPTS = ['ask', 'yes', 'no' ] SSH_STRICT_HOSTKEY_CHECK_OPTS = ['ask', 'yes', 'no' ]
# Default mount options, overridden elsewhere: # Default mount options, overridden elsewhere:
# Key is a file system type, or 'snapshot' for default for snapshot mount # Key is a file system type, or 'snapshot' for default for snapshot mount
# or 'bind' for a bind mount (check mount for details) # or 'bind' for a bind mount (check mount for details)
default_mountoptions = {'xfs' : 'ro,nouuid', 'snapshot' : 'ro', 'bind' : 'ro'} default_mountoptions = {'xfs' : 'ro,nouuid', 'snapshot' : 'ro', 'bind' : 'ro'}
PROTOCOL = "1.4" PROTOCOL = "1.4"
VERSION = "1.5.0" VERSION = "1.5.1"
VEBOSITY_BY_CLASS = {'DBG': 3, 'INFO': 2, 'WARN': 1, 'ERR': 0} VEBOSITY_BY_CLASS = {'DBG': 3, 'INFO': 2, 'WARN': 1, 'ERR': 0}
###################################################################### ######################################################################
# Miscellaneous support functions # Miscellaneous support functions
###################################################################### ######################################################################
class ClientException(Exception): class ClientException(Exception):
def __init__(self, value, traceback=None): def __init__(self, value, traceback=None):
self.value = value self.value = value
self.traceback = traceback self.traceback = traceback
skipping to change at line 901 skipping to change at line 902
return False return False
def do_lvremove(device): def do_lvremove(device):
(group, volume) = device.split('/')[-2:] (group, volume) = device.split('/')[-2:]
if group == 'mapper': if group == 'mapper':
lvmdev = device lvmdev = device
else: else:
lvmdev = '/dev/mapper/%s-%s' % (group.replace('-', '--'), volume.replace ('-', '--')) lvmdev = '/dev/mapper/%s-%s' % (group.replace('-', '--'), volume.replace ('-', '--'))
if os.path.exists(lvmdev): if os.path.exists(lvmdev):
for i in range(1, 10): for i in range(1, 10):
ret = spawn(['sync']) os.sync()
ret = spawn(['lvremove', '--force', device]) ret = spawn(['lvremove', '--force', device])
if ret: if ret:
ret = spawn(['dmsetup', 'remove', lvmdev]) ret = spawn(['dmsetup', 'remove', lvmdev])
ret = spawn(['dmsetup', 'remove', lvmdev + '-cow']) ret = spawn(['dmsetup', 'remove', lvmdev + '-cow'])
ret = spawn(['lvremove', '--force', device]) ret = spawn(['lvremove', '--force', device])
if not ret: if not ret:
break break
else: else:
warn('lvremove called for non-existent device: %s' % lvmdev) warn('lvremove called for non-existent device: %s' % lvmdev)
ret = 0 # Equivalent to lvremove succeeding ret = 0 # Equivalent to lvremove succeeding
skipping to change at line 960 skipping to change at line 961
if snap['tags']: if snap['tags']:
for tag in snap['tags']: for tag in snap['tags']:
args.extend(['--addtag', tag.strip()]) args.extend(['--addtag', tag.strip()])
size = snap['size'] size = snap['size']
if size.count('%'): if size.count('%'):
if size.endswith('%'): size += 'ORIGIN' if size.endswith('%'): size += 'ORIGIN'
args.extend(['--snapshot', '--extents', size]) args.extend(['--snapshot', '--extents', size])
else: else:
args.extend(['--snapshot', '--size', size]) args.extend(['--snapshot', '--size', size])
args.extend(['--name', os.path.basename(snapdev), lvmdev]) args.extend(['--name', os.path.basename(snapdev), lvmdev])
os.sync() # Should not be needed except for very old kernels
ec = spawn(args) ec = spawn(args)
if ec: if ec:
warn('Can not snapshot the device: %s' % device) warn('Can not snapshot the device: %s' % device)
return False return False
# no need to mkdir since the mountpoint already exists # no need to mkdir since the mountpoint already exists
args = ['mount', '-t', snaptyp] args = ['mount', '-t', snaptyp]
if snap['mountoptions']: if snap['mountoptions']:
mountoptions = snap['mountoptions'] mountoptions = snap['mountoptions']
elif snaptyp in default_mountoptions: elif snaptyp in default_mountoptions:
skipping to change at line 1429 skipping to change at line 1431
except OSError as e: except OSError as e:
warn('Failed to remove: %s: %s' % (script_dir, e)) warn('Failed to remove: %s: %s' % (script_dir, e))
if ex: if ex:
send('TRACEBACK ' + str(ex) + '>>>' + stacktrace().replace('\n', '###') ) send('TRACEBACK ' + str(ex) + '>>>' + stacktrace().replace('\n', '###') )
###################################################################### ######################################################################
# Server implementation # Server implementation
###################################################################### ######################################################################
def executable_lookup(cfg, executable, location):
key = 'exec_' + location
for option in cfg['options']:
if executable in option:
if key in option[executable]:
return option[executable][key]
return executable
def do_server_getanswer(cout, cl_status): def do_server_getanswer(cout, cl_status):
while True: while True:
line = cout.readline() line = cout.readline()
if line.startswith('OK'): if line.startswith('OK'):
if cl_status: if cl_status:
status_s = line[2:-1].strip() status_s = line[2:-1].strip()
if ' ' in status_s: if ' ' in status_s:
status_s, ret = status_s.split(None, 1) status_s, ret = status_s.split(None, 1)
else: else:
ret = None ret = None
skipping to change at line 1500 skipping to change at line 1511
if limit_dl: if limit_dl:
trickle.extend(['-d', str(limit_dl)]) trickle.extend(['-d', str(limit_dl)])
if limit_ul: if limit_ul:
trickle.extend(['-u', str(limit_ul)]) trickle.extend(['-u', str(limit_ul)])
if len(trickle): if len(trickle):
if try_to_run([trickle_cmd, '-V']) is None: if try_to_run([trickle_cmd, '-V']) is None:
warn('Trickle not available, bandwidth limiting disabled') warn('Trickle not available, bandwidth limiting disabled')
trickle = [] trickle = []
args.extend(trickle) args.extend(trickle)
args.extend(['rdiff-backup']) args.extend([executable_lookup(cfg, 'rdiff-backup', 'local')])
if cfg['host']: if cfg['host']:
basessh = 'ssh -oStrictHostKeyChecking=%s' % (ssh_StrictHostKeyChecking) basessh = 'ssh -oStrictHostKeyChecking=%s' % (ssh_StrictHostKeyChecking)
if cfg['port']: basessh += ' -p %s' % cfg['port'] if cfg['port']: basessh += ' -p %s' % cfg['port']
schema = '%s %s -i %s %%s rdiff-backup --server' % (basessh, verbosity_s sh, cfg['key_data']) schema = '%s %s -i %s %%s %s --server' % (basessh, verbosity_ssh, cfg['k ey_data'], executable_lookup(cfg, 'rdiff-backup', 'remote'))
args.extend(['--remote-schema', schema]) args.extend(['--remote-schema', schema])
if force: if force:
args.extend(['--force']) args.extend(['--force'])
if backup_tempdir:
args.extend(['--tempdir', backup_tempdir])
options_append = [] options_append = []
special_files = [] special_files = []
if cfg['data_options'].get('exclude-devices') == 'true': if cfg['data_options'].get('exclude-devices') == 'true':
special_files.extend(['--exclude-device-files']) special_files.extend(['--exclude-device-files'])
if cfg['data_options'].get('exclude-sockets') == 'true': if cfg['data_options'].get('exclude-sockets') == 'true':
special_files.extend(['--exclude-sockets']) special_files.extend(['--exclude-sockets'])
if cfg['data_options'].get('exclude-fifos') == 'true': if cfg['data_options'].get('exclude-fifos') == 'true':
special_files.extend(['--exclude-fifos']) special_files.extend(['--exclude-fifos'])
skipping to change at line 1548 skipping to change at line 1562
opt = '--' + clude['type'] opt = '--' + clude['type']
if clude['path']: if clude['path']:
args.extend([opt, reroot(bdir, clude['path'])]) args.extend([opt, reroot(bdir, clude['path'])])
if clude['glob']: if clude['glob']:
args.extend([opt, reroot(bdir, clude['glob'])]) args.extend([opt, reroot(bdir, clude['glob'])])
if clude['regexp']: if clude['regexp']:
args.extend([opt + '-regexp', bdir + clude['regexp']]) args.extend([opt + '-regexp', bdir + clude['regexp']])
userhost = '' userhost = ''
if cfg['host']: if cfg['host']:
userhost = '%s@%s' % (cfg['user'], cfg['host']) userhost = '%s@%s::' % (cfg['user'], cfg['host'])
args.extend([userhost + '::' + bdir, cfg['dir']]) args.extend([userhost + bdir, cfg['dir']])
ret = spawn(args) ret = spawn(args)
if ret: if ret:
raise Exception('Failed to run rdiff-backup') raise Exception('Failed to run %s' % executable_lookup(cfg, 'rdiff-backu p', 'local'))
def do_server_rdiff_cleanup(cfg): def do_server_rdiff_cleanup(cfg):
args = ['rdiff-backup', '--check-destination-dir', cfg['dir']] args = [executable_lookup(cfg, 'rdiff-backup', 'local')]
if backup_tempdir:
args.extend(['--tempdir', backup_tempdir])
args.extend(['--check-destination-dir', cfg['dir']])
ret = spawn(args) ret = spawn(args)
if ret: if ret:
warn('Failed to cleanup old data, please fix the problem manually') warn('Failed to cleanup old data, please fix the problem manually')
def do_server_data_cleanup(cfg): def do_server_data_cleanup(cfg):
args = ['rdiff-backup', '--force', '--remove-older-than', cfg['retention'], args = [executable_lookup(cfg, 'rdiff-backup', 'local')]
cfg['dir']] if backup_tempdir:
args.extend(['--tempdir', backup_tempdir])
args.extend(['--force', '--remove-older-than', cfg['retention'], cfg['dir']]
)
ret = spawn(args) ret = spawn(args)
if ret: if ret:
warn('Failed to cleanup old data, please fix the problem manually') warn('Failed to cleanup old data, please fix the problem manually')
def get_protocol_info(protocol, is_client): def get_protocol_info(protocol, is_client):
(major_s, minor_s) = protocol.strip().split('.') (major_s, minor_s) = protocol.strip().split('.')
major = int(major_s) major = int(major_s)
minor = int(minor_s) minor = int(minor_s)
caps = [] caps = []
skipping to change at line 1821 skipping to change at line 1841
if ids and cfg_id not in ids: continue if ids and cfg_id not in ids: continue
stats = {} stats = {}
if list_parsable: if list_parsable:
info('Client: %s' % cfg_id) info('Client: %s' % cfg_id)
else: else:
info('-------------------------------------------------------------- ----') info('-------------------------------------------------------------- ----')
info('Server listing for client %s' % cfg_id) info('Server listing for client %s' % cfg_id)
stats['id'] = cfg_id stats['id'] = cfg_id
output_done = True output_done = True
args = ['rdiff-backup'] args = [executable_lookup(cfg, 'rdiff-backup', 'local')]
if list_type == 'increments': if list_type == 'increments':
args.extend(['--list-increments']) args.extend(['--list-increments'])
elif list_type == 'sizes': elif list_type == 'sizes':
args.extend(['--list-increment-sizes']) args.extend(['--list-increment-sizes'])
elif list_type == 'changed': elif list_type == 'changed':
args.extend(['--list-changed-since', list_date]) args.extend(['--list-changed-since', list_date])
elif list_type == 'attime': elif list_type == 'attime':
args.extend(['--list-at-time', list_date]) args.extend(['--list-at-time', list_date])
else: else:
assert False, 'Unknown list type: ' + list_type assert False, 'Unknown list type: ' + list_type
if list_parsable: if list_parsable:
args.extend(['--parsable-output']) args.extend(['--parsable-output'])
args.extend([cfg['dir']]) args.extend([cfg['dir']])
# Call a low level routine to get the data back as well. # Call a low level routine to get the data back as well.
ret, lines = _spawn(args) ret, lines = _spawn(args)
if ret: if ret:
error('Failed to run rdiff-backup') error('Failed to run %s' % executable_lookup(cfg, 'rdiff-backup', 'l ocal'))
error_counter += 1 error_counter += 1
stats['state'] = 'FAILED' stats['state'] = 'FAILED'
else: else:
stats['state'] = 'OK' stats['state'] = 'OK'
if list_type == 'increments': if list_type == 'increments':
if list_parsable: if list_parsable:
stats['Increments'] = str(len(lines) - 1) stats['Increments'] = str(len(lines) - 1)
date_time = lines[len(lines) - 1].split(None, 1)[0] date_time = lines[len(lines) - 1].split(None, 1)[0]
stats['CurrentMirror'] = time.ctime(int(date_time)) stats['CurrentMirror'] = time.ctime(int(date_time))
date_time = lines[0].split(None, 1)[0] date_time = lines[0].split(None, 1)[0]
stats['OldestIncrement'] = time.ctime(int(date_time)) stats['OldestIncrement'] = time.ctime(int(date_time))
else: else:
stats['Increments'] = str(len(lines) - 2) increments = len(lines) - 2
stats['Increments'] = str(increments)
stats['CurrentMirror'] = lines[len(lines) - 1].strip().split (None, 2)[2] stats['CurrentMirror'] = lines[len(lines) - 1].strip().split (None, 2)[2]
stats['OldestIncrement'] = lines[1].strip().split(None, 1)[1 if increments == 0:
] stats['OldestIncrement'] = lines[1].strip().split(None,
2)[2]
else:
stats['OldestIncrement'] = lines[1].strip().split(None,
1)[1]
elif list_type == 'sizes': elif list_type == 'sizes':
stats['Increments'] = str(len(lines) - 3) stats['Increments'] = str(len(lines) - 3)
stats['CurrentMirror'] = lines[2].split(' ', 1)[0] stats['CurrentMirror'] = lines[2].split(' ', 1)[0]
stats['OldestIncrement'] = lines[len(lines) - 1].split(' ', 1) [0] stats['OldestIncrement'] = lines[len(lines) - 1].split(' ', 1) [0]
statistics.append(stats) statistics.append(stats)
if output_done and not list_parsable: if output_done and not list_parsable:
info('------------------------------------------------------------------ ') info('------------------------------------------------------------------ ')
debug('Server listing done') debug('Server listing done')
skipping to change at line 1883 skipping to change at line 1907
if not cfg['host']: if not cfg['host']:
info('%s: Client is local, it needs no keys' % cfg_id) info('%s: Client is local, it needs no keys' % cfg_id)
continue continue
nice = cfg['nice'] or nice_rem nice = cfg['nice'] or nice_rem
if nice: if nice:
nice_cmd = 'nice -n%s ' % (nice) nice_cmd = 'nice -n%s ' % (nice)
else: else:
nice_cmd = '' nice_cmd = ''
cmds = ['safekeep --client', 'rdiff-backup --server --restrict-read-only /'] cmds = ['safekeep --client', '%s --server --restrict-read-only /' % exec utable_lookup(cfg, 'rdiff-backup', 'remote')]
privatekeyfiles = [cfg.get('key_ctrl'), cfg.get('key_data')] privatekeyfiles = [cfg.get('key_ctrl'), cfg.get('key_data')]
output = [] output = []
keys_ok = False keys_ok = False
for (cmd, privatekeyfile) in zip(cmds, privatekeyfiles): for (cmd, privatekeyfile) in zip(cmds, privatekeyfiles):
publickeyfile = privatekeyfile + '.pub' publickeyfile = privatekeyfile + '.pub'
if not os.path.isfile(privatekeyfile): if not os.path.isfile(privatekeyfile):
if os.path.isfile(publickeyfile): if os.path.isfile(publickeyfile):
error('%s: Public key exists %s, but private key is missing. Skipping client.' % (cfg_id, publickeyfile)) error('%s: Public key exists %s, but private key is missing. Skipping client.' % (cfg_id, publickeyfile))
break break
if dump: if dump:
skipping to change at line 2041 skipping to change at line 2065
print('-c, --conf=FILE use the FILE configuration file') print('-c, --conf=FILE use the FILE configuration file')
print('-h, --help show this help message and exit') print('-h, --help show this help message and exit')
print('-q, --quiet decreases the verbosity level') print('-q, --quiet decreases the verbosity level')
print('-v, --verbose increases the verbosity level') print('-v, --verbose increases the verbosity level')
print('-V, --version show the version number and exit') print('-V, --version show the version number and exit')
print('--noemail disables the sending of email') print('--noemail disables the sending of email')
print() print()
print('server options:') print('server options:')
print('--force force backup destination overwriting, dangerous!' ) print('--force force backup destination overwriting, dangerous!' )
print('--cleanup perform cleanup actions after a failure') print('--cleanup perform cleanup actions after a failure')
print('-t, --tempdir=DIR set tempdir to DIR for rdiff-backup')
print() print()
print('keys options:') print('keys options:')
print('-i FILE use FILE as identity for RSA/DSA authentication') print('-i FILE use FILE as identity for RSA/DSA authentication')
print('--status display the key status for the clients (default)' ) print('--status display the key status for the clients (default)' )
print('--print display the authorization keys') print('--print display the authorization keys')
print('--deploy deploy the authorization keys') print('--deploy deploy the authorization keys')
print() print()
print('list options:') print('list options:')
print('--increments list number and dates of increments') print('--increments list number and dates of increments')
print('--parsable-output tailor output for parsing by other programs') print('--parsable-output tailor output for parsing by other programs')
print('--sizes list sizes of all the increments') print('--sizes list sizes of all the increments')
print('--changed=time list files that have changed since time') print('--changed=time list files that have changed since time')
print('--at-time=time list files in the archive at given time') print('--at-time=time list files in the archive at given time')
if exitcode is not None: sys.exit(exitcode) if exitcode is not None: sys.exit(exitcode)
def main(): def main():
try: try:
opts, args = getopt.getopt(sys.argv[1:], 'c:e:i:hs:qvV', opts, args = getopt.getopt(sys.argv[1:], 'c:e:i:hs:t:qvV',
['conf=', 'client', 'deploy', ['conf=', 'client', 'deploy',
'email=', 'force', 'help', 'keys', 'email=', 'force', 'help', 'keys',
'list', 'increments', 'sizes', 'list', 'increments', 'sizes',
'parsable-output', 'changed=', 'at-time=', 'parsable-output', 'changed=', 'at-time=',
'noemail', 'cleanup', 'noemail', 'cleanup',
'print', 'quiet', 'server', 'smtp=', 'print', 'quiet', 'server', 'smtp=',
'status', 'verbose', 'version']) 'status', 'tempdir=', 'verbose', 'version'])
except getopt.GetoptError: except getopt.GetoptError:
usage(2) usage(2)
global backup_user, client_user, home_dir, base_dir, config_file global backup_user, backup_tempdir, client_user, home_dir, base_dir, config_ file
global verbosity_level global verbosity_level
mode = None mode = None
email = {} email = {}
cfgfile = None cfgfile = None
cfglocs = [] cfglocs = []
verbosity = 0 verbosity = 0
force = False force = False
cleanup = False cleanup = False
noemail = False noemail = False
skipping to change at line 2135 skipping to change at line 2160
mode = 'client' mode = 'client'
elif o in ('--keys', ): elif o in ('--keys', ):
if mode: usage(2) if mode: usage(2)
mode = 'keys' mode = 'keys'
elif o in ('--force', ): elif o in ('--force', ):
force = True force = True
elif o in ('--cleanup', ): elif o in ('--cleanup', ):
cleanup = True cleanup = True
elif o in ('--noemail', ): elif o in ('--noemail', ):
noemail = True noemail = True
elif o in ('-t', '--tempdir'):
backup_tempdir = a
elif o in ('--increments', ): elif o in ('--increments', ):
if list_type: usage(2) if list_type: usage(2)
list_type = 'increments' list_type = 'increments'
elif o in ('--sizes', ): elif o in ('--sizes', ):
if list_type: usage(2) if list_type: usage(2)
list_type = 'sizes' list_type = 'sizes'
elif o in ('--parsable-output', ): elif o in ('--parsable-output', ):
list_parsable = True list_parsable = True
elif o in ('--changed', ): elif o in ('--changed', ):
if list_type: usage(2) if list_type: usage(2)
skipping to change at line 2205 skipping to change at line 2232
props = {} props = {}
def get_int(p): def get_int(p):
v = props.get(p) v = props.get(p)
if v is not None and v != '': if v is not None and v != '':
return int(v) return int(v)
return None return None
if 'backup.user' in props: if 'backup.user' in props:
backup_user = props['backup.user'] backup_user = props['backup.user']
if 'backup.tempdir' in props and not backup_tempdir:
backup_tempdir = props['backup.tempdir']
if 'base.dir' in props: if 'base.dir' in props:
base_dir = props['base.dir'] base_dir = props['base.dir']
if 'client.user' in props: if 'client.user' in props:
client_user = props['client.user'] client_user = props['client.user']
if not noemail: if not noemail:
for prop in [prop for prop in props if prop.startswith('email.')]: for prop in [prop for prop in props if prop.startswith('email.')]:
if prop == 'email.to': if prop == 'email.to':
email['to'] = props[prop].split(',') email['to'] = props[prop].split(',')
elif prop == 'email.format': elif prop == 'email.format':
email['format'] = props[prop] email['format'] = props[prop]
skipping to change at line 2334 skipping to change at line 2363
if not ok: if not ok:
send_notification(email, mode) send_notification(email, mode)
sys.exit(2) sys.exit(2)
try: try:
global is_client, verbosity_ssh, verbosity_trickle global is_client, verbosity_ssh, verbosity_trickle
if verbosity > 2: if verbosity > 2:
verbosity_trickle = verbosity_ssh = '-' + (verbosity-2) * 'v' verbosity_trickle = verbosity_ssh = '-' + (verbosity-2) * 'v'
if mode == 'server': if mode == 'server':
if backup_tempdir:
if not os.path.isabs(backup_tempdir):
info('backup.tempdir %s is relative to base.dir %s' % (backu
p_tempdir, base_dir))
backup_tempdir = os.path.join(base_dir, backup_tempdir)
if not os.path.isdir(backup_tempdir):
error('CONFIG ERROR: backup.tempdir %s is not a valid direct
ory' % backup_tempdir)
sys.exit(2)
elif not os.access(backup_tempdir, os.W_OK):
error('CONFIG ERROR: backup.tempdir %s is not writeable' % b
ackup_tempdir)
sys.exit(2)
is_client = False is_client = False
verbosity_level = 1 + verbosity verbosity_level = 1 + verbosity
do_server(cfgs, args, nice_srv, ionice_def, force, cleanup) do_server(cfgs, args, nice_srv, ionice_def, force, cleanup)
elif mode == 'list': elif mode == 'list':
if list_type is None: if list_type is None:
list_type = 'increments' list_type = 'increments'
is_client = False is_client = False
verbosity_level = 2 + verbosity verbosity_level = 2 + verbosity
do_list(cfgs, args, list_type, list_date, list_parsable) do_list(cfgs, args, list_type, list_date, list_parsable)
elif mode == 'client': elif mode == 'client':
 End of changes. 24 change blocks. 
19 lines changed or deleted 65 lines changed or added

Home  |  About  |  Features  |  All  |  Newest  |  Dox  |  Diffs  |  RSS Feeds  |  Screenshots  |  Comments  |  Imprint  |  Privacy  |  HTTP(S)