diff options
Diffstat (limited to 'bin')
-rwxr-xr-x | bin/wifi_nmcli_backup.py | 63 |
1 files changed, 45 insertions, 18 deletions
diff --git a/bin/wifi_nmcli_backup.py b/bin/wifi_nmcli_backup.py index 7ec9c892..6e4db6a8 100755 --- a/bin/wifi_nmcli_backup.py +++ b/bin/wifi_nmcli_backup.py @@ -12,20 +12,48 @@ import shutil import subprocess as sp import sys +from distutils.version import LooseVersion + NM_CON_DIR = '/etc/NetworkManager/system-connections' SAVE_DIR = os.path.join(os.path.expandvars( '$PLAINBOX_SESSION_SHARE'), 'stored-system-connections') -def get_nm_connections(): - c = [] - cmd = 'nmcli -t -f TYPE,NAME c' +# versions of NM in cosmic or later allow you to request the keyfile name +# in `nmcli -t -f <FIELDS> c` output used below +def legacy_nmcli(): + cmd = "nmcli -v" output = sp.check_output(cmd, shell=True) - for line in output.decode(sys.stdout.encoding).splitlines(): - con_type, name = line.strip().split(':') - if con_type == '802-11-wireless': - c.append(name) - return c + version = LooseVersion(output.strip().split()[-1].decode()) + # check if using an earlier nmcli version with different api + # nmcli in cosmic is 1.12.4, bionic is 1.10 + if version < LooseVersion("1.12.0"): + return True + return False + + +# Creation of keyfile names can be found in: +# https://gitlab.freedesktop.org/NetworkManager/NetworkManager/blob/master/libnm-core/nm-keyfile.c#L4046 +# Old format is to replace path separators with '*', in versions that use +# the new format we can just use the filename supplied by nmcli +def get_nm_keyfiles(): + filenames = [] + if legacy_nmcli(): + cmd = 'nmcli -t -f TYPE,NAME c' + output = sp.check_output(cmd, shell=True) + for line in output.decode(sys.stdout.encoding).splitlines(): + con_type, name = line.strip().split(':') + if con_type == '802-11-wireless': + filename = name.replace('/', '*') + filenames.append(os.path.join(NM_CON_DIR, filename)) + else: + cmd = 'nmcli -t -f TYPE,FILENAME c' + output = sp.check_output(cmd, shell=True) + for line in output.decode(sys.stdout.encoding).splitlines(): + con_type, filename = line.strip().split(':') + if con_type == '802-11-wireless': + filenames.append(filename) + return filenames def reload_nm_connections(): @@ -33,20 +61,19 @@ def reload_nm_connections(): sp.check_call(cmd, shell=True) -def save_connections(con_list): - if len(con_list) == 0: +def save_connections(keyfile_list): + if len(keyfile_list) == 0: print('No stored 802.11 connections to save') return if not os.path.exists(SAVE_DIR): os.makedirs(SAVE_DIR) - for c in con_list: - print('Save connection {}'.format(c)) - c_loc = os.path.join(NM_CON_DIR, c) - if not os.path.exists(c_loc): - print(' No stored connection fount at {}'.format(c_loc)) + for f in keyfile_list: + print('Save connection {}'.format(f)) + if not os.path.exists(f): + print(' No stored connection fount at {}'.format(f)) continue - print(' Found file {}'.format(c_loc)) - save_f = shutil.copy(c_loc, SAVE_DIR) + print(' Found file {}'.format(f)) + save_f = shutil.copy(f, SAVE_DIR) print(' Saved copy at {}'.format(save_f)) @@ -71,7 +98,7 @@ if __name__ == '__main__': action = sys.argv[1] if action == 'save': - save_connections(get_nm_connections()) + save_connections(get_nm_keyfiles()) elif action == 'restore': restore_connections() reload_nm_connections() |