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
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
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
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
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