From c70407507599b7f2a27a69826c5d7ed494cb5fad Mon Sep 17 00:00:00 2001 From: jartigag Date: Tue, 29 Jun 2021 14:18:10 +0200 Subject: [PATCH 1/4] fix "organaizations" --- grafana_backup/save_orgs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grafana_backup/save_orgs.py b/grafana_backup/save_orgs.py index 39fafb11..63425ea2 100755 --- a/grafana_backup/save_orgs.py +++ b/grafana_backup/save_orgs.py @@ -16,7 +16,7 @@ def main(args, settings): pretty_print = settings.get('PRETTY_PRINT') folder_path = '{0}/organizations/{1}'.format(backup_dir, timestamp) - log_file = 'organaizations_{0}.txt'.format(timestamp) + log_file = 'organizations_{0}.txt'.format(timestamp) if http_get_headers_basic_auth: if not os.path.exists(folder_path): From 9c93d2a6d6c9b217ee4da7e81a6449d7c1d7371a Mon Sep 17 00:00:00 2001 From: jartigag Date: Tue, 29 Jun 2021 17:18:12 +0200 Subject: [PATCH 2/4] get_folder_permissions() --- grafana_backup/dashboardApi.py | 7 +++++++ grafana_backup/save_folders.py | 14 +++++++++----- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/grafana_backup/dashboardApi.py b/grafana_backup/dashboardApi.py index 2fac0d39..44478687 100755 --- a/grafana_backup/dashboardApi.py +++ b/grafana_backup/dashboardApi.py @@ -125,6 +125,13 @@ def get_folder(uid, grafana_url, http_get_headers, verify_ssl, client_cert, debu return (status_code, content) +def get_folder_permissions(uid, grafana_url, http_get_headers, verify_ssl, client_cert, debug): + (status_code, content) = send_grafana_get('{0}/api/folders/{1}/permissions'.format(grafana_url, uid), http_get_headers, + verify_ssl, client_cert, debug) + print("query folder permissions:{0}, status:{1}".format(uid, status_code)) + return (status_code, content) + + def get_folder_id_from_old_folder_url(folder_url, grafana_url, http_post_headers, verify_ssl, client_cert, debug): if folder_url != "": # Get folder uid diff --git a/grafana_backup/save_folders.py b/grafana_backup/save_folders.py index 41c6634e..f80e0b20 100644 --- a/grafana_backup/save_folders.py +++ b/grafana_backup/save_folders.py @@ -1,6 +1,6 @@ import os import json -from grafana_backup.dashboardApi import search_folders, get_folder +from grafana_backup.dashboardApi import search_folders, get_folder, get_folder_permissions from grafana_backup.commons import to_python2_and_3_compatible_string, print_horizontal_line, save_json @@ -42,9 +42,11 @@ def get_all_folders_in_grafana(grafana_url, http_get_headers, verify_ssl, client return [] -def save_folder_setting(folder_name, file_name, folder_settings, folder_path, pretty_print): +def save_folder_setting(folder_name, file_name, folder_settings, folder_permissions, folder_path, pretty_print): file_path = save_json(file_name, folder_settings, folder_path, 'folder', pretty_print) print("folder:{0} are saved to {1}".format(folder_name, file_path)) + file_path = save_json(file_name, folder_permissions, folder_path, 'folder_permissions', pretty_print) + print("folder permissions:{0} are saved to {1}".format(folder_name, file_path)) def get_individual_folder_setting_and_save(folders, folder_path, log_file, grafana_url, http_get_headers, verify_ssl, client_cert, debug, pretty_print, uid_support): @@ -56,13 +58,15 @@ def get_individual_folder_setting_and_save(folders, folder_path, log_file, grafa else: folder_uri = folder['uri'] - (status, content) = get_folder(folder['uid'], grafana_url, http_get_headers, verify_ssl, client_cert, debug) + (status_folder_settings, content_folder_settings) = get_folder(folder['uid'], grafana_url, http_get_headers, verify_ssl, client_cert, debug) + (status_folder_permissions, content_folder_permissions) = get_folder_permissions(folder['uid'], grafana_url, http_get_headers, verify_ssl, client_cert, debug) - if status == 200: + if status_folder_settings == 200 and status_folder_permissions == 200: save_folder_setting( to_python2_and_3_compatible_string(folder['title']), folder_uri, - content, + content_folder_settings, + content_folder_permissions, folder_path, pretty_print ) From 4bdf220a0d8faa3ac0c5c0a1261c297be7917e18 Mon Sep 17 00:00:00 2001 From: jartigag Date: Tue, 29 Jun 2021 18:39:53 +0200 Subject: [PATCH 3/4] update_folder_permissions() --- grafana_backup/cli.py | 4 +-- grafana_backup/dashboardApi.py | 6 +++++ grafana_backup/restore.py | 28 +++++++++++++++++++++ grafana_backup/update_folder_permissions.py | 18 +++++++++++++ 4 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 grafana_backup/update_folder_permissions.py diff --git a/grafana_backup/cli.py b/grafana_backup/cli.py index 9c3b7e58..bc22e586 100755 --- a/grafana_backup/cli.py +++ b/grafana_backup/cli.py @@ -10,7 +10,7 @@ Usage: grafana-backup save [--config=] [--components=] [--no-archive] - grafana-backup restore [--config=] [--components=] + grafana-backup restore [--config=] [--components=] grafana-backup [--config=] grafana-backup -h | --help grafana-backup --version @@ -19,7 +19,7 @@ -h --help Show this help message and exit --version Get version information and exit --config= Override default configuration path - --components= Comma separated list of individual components to backup + --components= Comma separated list of individual components to backup rather than backing up all components by default --no-archive Skip archive creation and do not delete unarchived files (used for troubleshooting purposes) diff --git a/grafana_backup/dashboardApi.py b/grafana_backup/dashboardApi.py index 44478687..2780844a 100755 --- a/grafana_backup/dashboardApi.py +++ b/grafana_backup/dashboardApi.py @@ -132,6 +132,12 @@ def get_folder_permissions(uid, grafana_url, http_get_headers, verify_ssl, clien return (status_code, content) +def update_folder_permissions(payload, grafana_url, http_post_headers, verify_ssl, client_cert, debug): + items = json.dumps({'items': payload}) + return send_grafana_post('{0}/api/folders/{1}/permissions'.format(grafana_url,payload[0]['uid']), items, http_post_headers, verify_ssl, client_cert, + debug) + + def get_folder_id_from_old_folder_url(folder_url, grafana_url, http_post_headers, verify_ssl, client_cert, debug): if folder_url != "": # Get folder uid diff --git a/grafana_backup/restore.py b/grafana_backup/restore.py index 2d73f40c..a62a0815 100755 --- a/grafana_backup/restore.py +++ b/grafana_backup/restore.py @@ -2,6 +2,7 @@ from grafana_backup.create_org import main as create_org from grafana_backup.api_checks import main as api_checks from grafana_backup.create_folder import main as create_folder +from grafana_backup.update_folder_permissions import main as update_folder_permissions from grafana_backup.create_datasource import main as create_datasource from grafana_backup.create_dashboard import main as create_dashboard from grafana_backup.create_alert_channel import main as create_alert_channel @@ -117,3 +118,30 @@ def restore_components(args, settings, restore_functions, tmpdir): file_path = os.path.join(root, filename) print('restoring {0}: {1}'.format(ext, file_path)) restore_functions[ext](args, settings, file_path) + + +def restore_from_dir(args, arg_components, settings, restore_dir): + + restore_functions = { 'folder': create_folder, + 'folder_permissions': update_folder_permissions, + 'datasource': create_datasource, + 'dashboard': create_dashboard, + 'alert_channel': create_alert_channel, + 'organization': create_org, + 'user': create_user} + + if arg_components: + arg_components_list = arg_components.split(',') + + # Restore only the components that provided via an argument + # but must also exist in extracted archive + for ext in arg_components_list: + for file_path in glob('{0}/**/*.{1}'.format(restore_dir, ext[:-1]), recursive=True): + print('restoring {0}: {1}'.format(ext, file_path)) + restore_functions[ext[:-1]](args, settings, file_path) + else: + # Restore every component included in extracted archive + for ext in restore_functions.keys(): + for file_path in glob('{0}/**/*.{1}'.format(restore_dir, ext), recursive=True): + print('restoring {0}: {1}'.format(ext, file_path)) + restore_functions[ext](args, settings, file_path) diff --git a/grafana_backup/update_folder_permissions.py b/grafana_backup/update_folder_permissions.py new file mode 100644 index 00000000..025a0d6c --- /dev/null +++ b/grafana_backup/update_folder_permissions.py @@ -0,0 +1,18 @@ +import json +from grafana_backup.dashboardApi import update_folder_permissions + + +def main(args, settings, file_path): + grafana_url = settings.get('GRAFANA_URL') + http_post_headers = settings.get('HTTP_POST_HEADERS') + verify_ssl = settings.get('VERIFY_SSL') + client_cert = settings.get('CLIENT_CERT') + debug = settings.get('DEBUG') + + with open(file_path, 'r') as f: + data = f.read() + + folder_permissions = json.loads(data) + if folder_permissions: + result = update_folder_permissions(folder_permissions, grafana_url, http_post_headers, verify_ssl, client_cert, debug) + print("update folder permissions {0}, status: {1}, msg: {2}".format(folder_permissions[0].get('title', ''), result[0], result[1])) From b5801589cec52d332661b6b9a06d25451009c904 Mon Sep 17 00:00:00 2001 From: Javier Artiga <33371871+jartigag@users.noreply.github.com> Date: Mon, 4 Oct 2021 22:19:31 +0200 Subject: [PATCH 4/4] Update save_folders.py --- grafana_backup/save_folders.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grafana_backup/save_folders.py b/grafana_backup/save_folders.py index e23074ff..b257054b 100644 --- a/grafana_backup/save_folders.py +++ b/grafana_backup/save_folders.py @@ -1,6 +1,6 @@ import os import json -from grafana_backup.dashboardApi import search_folders, get_folder +from grafana_backup.dashboardApi import search_folders, get_folder, get_folder_permissions from grafana_backup.commons import to_python2_and_3_compatible_string, print_horizontal_line, save_json