# ----------------- # user_name_cleanup # ----------------- # This subroutine runs only one time if node system.maintenance.username_cleanup does not exist # a. Converts username labels to user node names (replcaces node numbers with user node name) # b. Renames all existing usernames in user_info node to new user node name # c. Removes nodes in user_info if users do not anymore exist include "templates.shared.util.convert_to_valid_node_name"; include "templates.shared.util.get_unique_node_name"; include "templates.shared.util.get_loganalysisinfo_dir"; include "templates.admin.system.util.convert_to_valid_node_name_1"; include "templates.admin.system.util.convert_to_valid_node_name_2"; include "templates.admin.system.util.convert_to_valid_node_name_3"; subroutine(user_name_cleanup, ( debug_message("#### #### =========================\n"); debug_message("#### #### Running user_name_cleanup\n"); debug_message("#### #### =========================\n"); # Note, a $ char in usernames would terminate the application, as $ characters # were not possible prior user_name_cleanup we simply don't run the clean # if one of the usernames contains a $ character node user; bool run_user_name_cleanup = true; foreach user "users" ( if (contains(node_value(subnode_by_name(user, "username")), "$")) then ( run_user_name_cleanup = false; last; ); ); debug_message("\n#### #### run_user_name_cleanup:\n" . run_user_name_cleanup . "\n"); if (run_user_name_cleanup) then ( if (node_exists("volatile.temp")) then ( delete_node("volatile.temp"); ); # ================== # users node cleanup # ================== # ------------------------------------------ # clone existing user to volatile.temp.users # ------------------------------------------ node user; string user_node_name; foreach user "users" ( user_node_name = node_name(user); clone_node(user, "volatile.temp.users." . user_node_name); # debug_message("\nuser_node_name:\n" . user_node_name . "\n"); # debug_message("\nvolatile.temp.users:\n" . node_as_string("volatile.temp.users") . "\n"); ); debug_message("\nvolatile.temp.users:\n" . node_as_string("volatile.temp.users") . "\n"); # --------------------- # delete existing users # --------------------- node user; foreach user "users" ( delete_node(user); ); # --------------------------------------------------------------------------------- # convert user labes of temp node and clone users back from temp node to users node # --------------------------------------------------------------------------------- node user; string user_label; string valid_user_node_name; foreach user "volatile.temp.users" ( user_label = node_value(subnode_by_name(user, "username")); valid_user_node_name = convert_to_valid_node_name(user_label); valid_user_node_name = get_unique_node_name("users", valid_user_node_name); clone_node(user, "users." . valid_user_node_name); save_node("users"); ); # the users node cleanup is complete # ====================== # user_info node cleanup # ====================== # Note, in a new installation no user_info node exists, and hence there wont be any problem # that correct user_node_names in user_info are going to be re-converted if (node_exists("user_info") and (num_subnodes("user_info") > 0)) then ( string log_analysis_info_directory = get_loganalysisinfo_dir(); # ---------------------------------------------------------------- # clone all existing users in user_info to volatile.temp.user_info # ---------------------------------------------------------------- node user; string user_node_name; string user_file_path; foreach user "user_info" ( # only clone nodes with a valid node name because cloning invalid # node names wont be possible. Invalid nodes become deleted in the next # code block. user_node_name = node_name(user); if (!matches_regular_expression(user_node_name, "[^_a-z0-9]")) then ( # Check if this is a *.cfg files so that directories of error messages in older versions are not cloned! # We do that by checking the files in user_info for a .cfg extension. user_file_path = log_analysis_info_directory . "user_info/" . user_node_name . ".cfg"; if (file_exists(user_file_path)) then ( clone_node(user, "volatile.temp.user_info." . user_node_name); ); ); ); # ----------------------------------- # delete existing user_info directory # ----------------------------------- # We delete the entire user_info directory so that any old and invalid files and folders become deleted. if (file_exists(log_analysis_info_directory . "user_info")) then ( delete_directory(log_analysis_info_directory . "user_info"); ); # ----------------------------------------------------- # check for each user in users to match user_info users # ----------------------------------------------------- # If users are matched, clone them back to user info by using the valid node_name node user; string valid_user_node_name; string user_label; string user_node_name_old_1; string user_node_name_old_2; string user_node_name_old_3; bool old_2_done; bool old_3_done; foreach user "users" ( valid_user_node_name = node_name(user); user_label = node_value(subnode_by_name(user, "username")); user_node_name_old_1 = convert_to_valid_node_name_1(user_label); user_node_name_old_2 = convert_to_valid_node_name_2(user_label); user_node_name_old_3 = convert_to_valid_node_name_3(user_label); old_2_done = false; old_3_done = false; if (!node_exists("volatile.temp.users_done." . user_node_name_old_3)) then ( if (node_exists("volatile.temp.user_info." . user_node_name_old_3)) then ( # clone the node back to user_info, but with valid_user_node_name # and mark that the user has been done clone_node("volatile.temp.user_info." . user_node_name_old_3, "user_info." . valid_user_node_name); save_node("user_info." . valid_user_node_name); "volatile.temp.users_done." . user_node_name_old_3 = true; old_3_done = true; ); ); if (!old_3_done and !node_exists("volatile.temp.users_done." . user_node_name_old_2)) then ( if (node_exists("volatile.temp.user_info." . user_node_name_old_2)) then ( # clone the node back to user_info, but with valid_user_node_name # and mark that the user has been done clone_node("volatile.temp.user_info." . user_node_name_old_2, "user_info." . valid_user_node_name); save_node("user_info." . valid_user_node_name); "volatile.temp.users_done." . user_node_name_old_2 = true; old_2_done = true; ); ); if (!old_2_done and !old_3_done and !node_exists("volatile.temp.users_done." . user_node_name_old_1)) then ( if (node_exists("volatile.temp.user_info." . user_node_name_old_1)) then ( # clone the node back to user_info, but with valid_user_node_name # and mark that the user has been done clone_node("volatile.temp.user_info." . user_node_name_old_1, "user_info." . valid_user_node_name); save_node("user_info." . valid_user_node_name); "volatile.temp.users_done." . user_node_name_old_1 = true; ); ); ); # debug_message("\nvolatile.temp.users_done:\n" . node_as_string("volatile.temp.users_done") . "\n"); ); # if node_exists("user_info") ... ); # if run_user_name_cleanup system.maintenance.user_name_cleanup = true; save_node("system"); debug_message("#### #### user_name_cleanup completed\n"); ));