Depend on python3-networkx because ldap.Connection.object_class_tree needs it. Note that this is a relatively weak necessity which installed 1.7 GB worth of 500 new packages on talmix.david.jannet. Maybe this can be solved in a less costly way.
The entry instance passed to the walk callback contains raw results of LDAP search operations, i.e. all attribute values are lists, and all attribute values are bytes. Add the boolean parameters decode and unroll to walk() as a convenience method to get decoded values. They default to False, representing current behaviour.
Currently the configuration passed to the Connection constructor needs to contain an ldap_uri entry. Add "uri" as alias, because ldap_uri for the LDAP config in many contexts represents a tautology and is left out.
update_symlink(target, link_name) does the equivalent of ln -sf, i.e. force replacement of link_name with a new sysmlink, if it existed before the call.
An application based on Cmds will now try to read StringTree formatted config data from a file $HOME/.<name>rc, and make the data available via the newly added conf_value() method.
log.add_log_file(path) allows to pass a file path log messages will be written into. Special characters (e.g. console color codes) will be removed from the messages.
Do "from . import log" instead of "from jwutils import log". It works and looks cleaner than a module referencing itself. Not entirely sure if that's the way to go, I must admit.
Commit 72d56d9 (Move type argument into config) swapped the order of arguments in Auth.load(), but the ctor of ldap.Auth didn't follow the change, fix that.
Auth.load() takes a "tp" argument, specifying the Auth module name to load. In case of jw-devops, this is part of the configuration, which is also passed as an argument. Make taking 'type' from the config the default. Note that this changes the prototype.
jw-client-devops configures its databases with a set of config keys which are identical - except for the 'bind_pw' key, which is called 'password'. Allow that, too.
ldap.Auth lost a lot of code when jwutils.ldap was introduced, and rightfully so, because jwutils.ldap contains most of it. OTOH, it was used wrongly, fix that.
MapAttr2Shape is a class which allows processing GraphML files, such that nodes get added shape attributes understood by the yEd editor, based on the values of other node attributes. This allows to programmatically visualize node attributes.