#!/usr/bin/env python # SPDX-License-Identifier: LGPL-2.1-or-later import sys import os import gi gi.require_version("NM", "1.0") from gi.repository import NM, GLib ############################################################################### def kf_load_from_file(filename): kf = GLib.KeyFile.new() kf.load_from_file(filename, GLib.KeyFileFlags.NONE) return kf def kf_to_string(kf): d, l = kf.to_data() return d def debug(message): if os.getenv("DEBUG") == "1": print(">>> %s" % (message)) ############################################################################### filename = sys.argv[1] base_dir = os.path.dirname(os.path.realpath(filename)) kf = kf_load_from_file(filename) print('> keyfile "%s":' % (filename)) print(">>\n%s\n<<" % (kf_to_string(kf))) ############################################################################### def kf_handler_read(keyfile, connection, handler_type, handler_data, user_data): kf_handler_read_cnt = globals().get("kf_handler_read_cnt", 0) + 1 globals()["kf_handler_read_cnt"] = kf_handler_read_cnt [kf_group, kf_key, cur_setting, cur_property] = handler_data.get_context() debug("kf_handler_read(%s): keyfile=%r" % (kf_handler_read_cnt, keyfile)) debug("kf_handler_read(%s): connection=%r" % (kf_handler_read_cnt, connection)) debug("kf_handler_read(%s): handler-type=%r" % (kf_handler_read_cnt, handler_type)) debug("kf_handler_read(%s): handler-data=%r" % (kf_handler_read_cnt, handler_data)) debug("kf_handler_read(%s): user-data=%r" % (kf_handler_read_cnt, user_data)) debug("kf_handler_read(%s): kf-group=%r" % (kf_handler_read_cnt, kf_group)) debug("kf_handler_read(%s): kf-key=%r" % (kf_handler_read_cnt, kf_key)) debug("kf_handler_read(%s): kf-setting=%r" % (kf_handler_read_cnt, cur_setting)) debug("kf_handler_read(%s): kf-property=%r" % (kf_handler_read_cnt, cur_property)) if handler_type == NM.KeyfileHandlerType.WARN: [message, severity] = handler_data.warn_get() debug('parse-warning: <%s> = "%s"' % (severity, message)) print("> warning: %s" % (message)) return False if handler_type == NM.KeyfileHandlerType.WRITE_CERT: # just to show how to abort the parsing. This event won't happen # for read. handler_data.fail_with_error( GLib.GError.new_literal( NM.ConnectionError.quark(), "hallo1", NM.ConnectionError.MISSINGPROPERTY ) ) # don't handle unknown handler types. return False try: print("parse keyfile...") c = NM.keyfile_read(kf, base_dir, NM.KeyfileHandlerFlags.NONE, kf_handler_read, 42) except Exception as e: print("parsing failed: %r" % (e)) raise verify_failure = None try: c.verify() except Exception as e: verify_failure = e.message print( 'parsing succeeded: "%s" (%s)%s' % ( c.get_id(), c.get_uuid(), " (invalid: " + verify_failure + ")" if verify_failure is not None else "", ) ) ############################################################################### def kf_handler_write(connection, keyfile, handler_type, handler_data, user_data): kf_handler_write_cnt = globals().get("kf_handler_write_cnt", 0) + 1 globals()["kf_handler_write_cnt"] = kf_handler_write_cnt [kf_group, kf_key, cur_setting, cur_property] = handler_data.get_context() debug("kf_handler_write(%s): keyfile=%r" % (kf_handler_write_cnt, keyfile)) debug("kf_handler_write(%s): connection=%r" % (kf_handler_write_cnt, connection)) debug( "kf_handler_write(%s): handler-type=%r" % (kf_handler_write_cnt, handler_type) ) debug( "kf_handler_write(%s): handler-data=%r" % (kf_handler_write_cnt, handler_data) ) debug("kf_handler_write(%s): user-data=%r" % (kf_handler_write_cnt, user_data)) debug("kf_handler_write(%s): kf-group=%r" % (kf_handler_write_cnt, kf_group)) debug("kf_handler_write(%s): kf-key=%r" % (kf_handler_write_cnt, kf_key)) debug("kf_handler_write(%s): kf-setting=%r" % (kf_handler_write_cnt, cur_setting)) debug("kf_handler_write(%s): kf-property=%r" % (kf_handler_write_cnt, cur_property)) if handler_type == NM.KeyfileHandlerType.WRITE_CERT: return False return False try: print("") print("write keyfile...") kf2 = NM.keyfile_write(c, NM.KeyfileHandlerFlags.NONE, kf_handler_write, 43) except Exception as e: print("write failed: %r" % (e)) raise print("persisted again:") print(">>\n%s\n<<" % (kf_to_string(kf2)))