Example #1
0
def _parse_and_save_auth_pw_keys(publickeys, password, client_id,
                                 configuration, proto, proto_conf_dir):
    """Validate and write publickey and password settings for proto
    (ssh/davs/ftps) in proto_conf_dir.
    """
    client_dir = client_id_dir(client_id)
    proto_conf_path = os.path.join(configuration.user_home, client_dir,
                                 proto_conf_dir)
    # Create proto conf dir for any old users
    try:
        os.mkdir(proto_conf_path)
    except:
        pass
    keys_path = os.path.join(proto_conf_path, authkeys_filename)
    key_status = parse_and_save_publickeys(keys_path, publickeys, client_id,
                                           configuration)
    pw_path = os.path.join(proto_conf_path, authpasswords_filename)
    pw_status = parse_and_save_passwords(pw_path, password, client_id,
                                         configuration)
    digest_path = os.path.join(proto_conf_path, authdigests_filename)
    if proto == 'davs':
        digest_status = parse_and_save_digests(digest_path, password, client_id,
                                               configuration)
    else:
        digest_status = (True, '')
    status = (key_status[0] and pw_status[0] and digest_status[0],
              key_status[1] + pw_status[1] + digest_status[1])
    if status[0]:
        mark_user_modified(configuration, client_id)
    return status
Example #2
0
def parse_and_save_profile(filename, client_id, configuration):
    """Validate and write profile entries from filename"""
    status = parse_and_save_pickle(filename, profile_filename,
                                   get_profile_fields(), client_id,
                                   configuration, False, False)
    if status[0]:
        mark_user_modified(configuration, client_id)
    return status
Example #3
0
def parse_and_save_settings(filename, client_id, configuration):
    """Validate and write settings entries from filename"""
    status = parse_and_save_pickle(filename, settings_filename,
                                   get_settings_fields(), client_id,
                                   configuration, True, True)
    if status[0]:
        mark_user_modified(configuration, client_id)
    return status
Example #4
0
def parse_and_save_settings(filename, client_id, configuration):
    """Validate and write settings entries from filename"""
    status = parse_and_save_pickle(filename, settings_filename,
                                   get_settings_fields(), client_id,
                                   configuration, True, True)
    if status[0]:
        mark_user_modified(configuration, client_id)
    return status
Example #5
0
def parse_and_save_profile(filename, client_id, configuration):
    """Validate and write profile entries from filename"""
    status = parse_and_save_pickle(filename, profile_filename,
                                   get_profile_fields(), client_id,
                                   configuration, False, False)
    if status[0]:
        mark_user_modified(configuration, client_id)
    return status
Example #6
0
def _parse_and_save_auth_pw_keys(publickeys, password, client_id,
                                 configuration, proto, proto_conf_dir):
    """Validate and write publickey and password settings for proto
    (ssh/davs/ftps/seafile) in proto_conf_dir.
    """
    client_dir = client_id_dir(client_id)
    # Make sure permissions are tight enough for e.g. ssh auth keys to work
    os.umask(022)
    proto_conf_path = os.path.join(configuration.user_home, client_dir,
                                   proto_conf_dir)
    # Create proto conf dir for any old users
    try:
        os.mkdir(proto_conf_path)
    except:
        pass
    keys_path = os.path.join(proto_conf_path, authkeys_filename)
    key_status = parse_and_save_publickeys(keys_path, publickeys, client_id,
                                           configuration)
    pw_path = os.path.join(proto_conf_path, authpasswords_filename)
    pw_status = parse_and_save_passwords(pw_path,
                                         password,
                                         client_id,
                                         configuration,
                                         check_valid=True)
    digest_path = os.path.join(proto_conf_path, authdigests_filename)
    if proto == 'davs':
        # NOTE: we already checked password validity above
        digest_status = parse_and_save_digests(digest_path,
                                               password,
                                               client_id,
                                               configuration,
                                               check_valid=False)
    else:
        digest_status = (True, '')
    status = (key_status[0] and pw_status[0] and digest_status[0],
              key_status[1] + ' ' + pw_status[1] + ' ' + digest_status[1])
    if status[0]:
        mark_user_modified(configuration, client_id)
    return status
Example #7
0
def parse_and_save_duplicati(filename, client_id, configuration):
    """Validate and write duplicati entries from filename. Generate JSON conf
    files for import in Duplicati client.
    """
    _logger = configuration.logger
    status = parse_and_save_pickle(filename, duplicati_filename,
                                   get_duplicati_fields(), client_id,
                                   configuration, False, False)
    if status[0]:
        mark_user_modified(configuration, client_id)
        saved_values = load_duplicati(client_id, configuration)
        if not saved_values:
            _logger.error('loading just saved %s duplicati settings failed!' %
                          client_id)
            return (False, 'could not load saved Duplicati settings!')
        fill_helper = extract_duplicati_helper(configuration, client_id,
                                               saved_values)
        client_dir = client_id_dir(client_id)
        duplicati_dir = os.path.join(configuration.user_home, client_dir,
                                     duplicati_conf_dir)
        saved_protocol = saved_values.get('PROTOCOL', None)
        if saved_protocol.lower() in ['webdavs', 'davs']:
            saved_creds = load_davs(client_id, configuration)
        elif saved_protocol.lower() in ['ssh', 'sftp']:
            saved_creds = load_ssh(client_id, configuration)
        elif saved_protocol.lower() in ['ftps']:
            saved_creds = load_ftps(client_id, configuration)
        else:
            return (False, 'could not load credentials for verification!')
        _logger.debug('found saved creds: %s' % saved_creds)
        if not saved_creds.get('authpassword', None):
            warn = '''Warning: you need to enable password login on your %s
Settings page before you can use it directly with Duplicati.''' % saved_protocol
            saved_keys = saved_creds.get('authkeys', [])
            saved_keys = [i for i in saved_keys if i.strip()]
            if saved_keys:
                warn += ''' It <emph>does</emph> support ssh keys but for that
you need to manually configure the key through the Advanced options on the
Backup destination page during import.'''
            status = (status[0], status[1] + warn)
            _logger.warning('no saved %s creds for %s' %
                            (saved_protocol, client_id))

        for backup_name in saved_values['BACKUPS']:
            fill_helper['backup_name'] = backup_name
            fill_helper['backup_dir'] = os.path.join(duplicati_conf_dir,
                                                     backup_name)
            inner_json = []
            for (section_name, section) in duplicati_conf_templates.items():
                # Skip schedule section if disabled
                if section_name == 'schedule' and \
                        not fill_helper['schedule_freq']:
                    continue
                inner_json.append(duplicati_conf_templates[section_name] %
                                  fill_helper)
            filled_json = '{\n%s\n}' % ',\n'.join(inner_json)
            backup_dst = os.path.join(duplicati_dir, backup_name)
            try:
                os.makedirs(backup_dst)
            except:
                # probably exists
                pass
            json_name = "%s.json" % backup_name
            json_path = os.path.join(duplicati_dir, json_name)
            json_fd = open(json_path, "w")
            json_fd.write(filled_json)
            json_fd.close()
    return status