def restore_geoserver_raster_data(self, config, settings, target_folder): if (config.gs_data_dir): if (config.gs_dump_raster_data): gs_data_folder = os.path.join(target_folder, 'gs_data_dir', 'data', 'geonode') if not os.path.exists(gs_data_folder): print(('Skipping geoserver raster data restore: ' + 'directory "{}" not found.'.format(gs_data_folder))) return # Restore '$config.gs_data_dir/data/geonode' gs_data_root = os.path.join(config.gs_data_dir, 'data', 'geonode') if not os.path.isabs(gs_data_root): gs_data_root = os.path.join(settings.PROJECT_ROOT, '..', gs_data_root) try: chmod_tree(gs_data_root) except Exception: print( 'Original GeoServer Data Dir "{}" must be writable by the current user. \ Do not forget to copy it first. It will be wiped-out by the Restore procedure!' .format(gs_data_root)) raise try: shutil.rmtree(gs_data_root) print('Cleaned out old GeoServer Data Dir: ' + gs_data_root) except Exception: pass if not os.path.exists(gs_data_root): os.makedirs(gs_data_root) copy_tree(gs_data_folder, gs_data_root) chmod_tree(gs_data_root) print("GeoServer Uploaded Data Restored to '" + gs_data_root + "'.") # Cleanup '$config.gs_data_dir/gwc-layers' gwc_layers_root = os.path.join(config.gs_data_dir, 'gwc-layers') if not os.path.isabs(gwc_layers_root): gwc_layers_root = os.path.join(settings.PROJECT_ROOT, '..', gwc_layers_root) try: shutil.rmtree(gwc_layers_root) print('Cleaned out old GeoServer GWC Layers Config: ' + gwc_layers_root) except Exception: pass if not os.path.exists(gwc_layers_root): os.makedirs(gwc_layers_root)
def restore_geoserver_raster_data(self, config, settings, target_folder): if (config.gs_data_dir): if (config.gs_dump_raster_data): gs_data_folder = os.path.join(target_folder, 'gs_data_dir', 'data', 'geonode') if not os.path.exists(gs_data_folder): print('Skipping geoserver raster data restore: ' + 'directory "{}" not found.'.format(gs_data_folder)) return # Restore '$config.gs_data_dir/data/geonode' gs_data_root = os.path.join(config.gs_data_dir, 'data', 'geonode') if not os.path.isabs(gs_data_root): gs_data_root = os.path.join(settings.PROJECT_ROOT, '..', gs_data_root) try: chmod_tree(gs_data_root) except: print 'Original GeoServer Data Dir "{}" must be writable by the current user. \ Do not forget to copy it first. It will be wiped-out by the Restore procedure!'.format(gs_data_root) raise try: shutil.rmtree(gs_data_root) print 'Cleaned out old GeoServer Data Dir: ' + gs_data_root except: pass if not os.path.exists(gs_data_root): os.makedirs(gs_data_root) copy_tree(gs_data_folder, gs_data_root) chmod_tree(gs_data_root) print "GeoServer Uploaded Data Restored to '"+gs_data_root+"'." # Cleanup '$config.gs_data_dir/gwc-layers' gwc_layers_root = os.path.join(config.gs_data_dir, 'gwc-layers') if not os.path.isabs(gwc_layers_root): gwc_layers_root = os.path.join(settings.PROJECT_ROOT, '..', gwc_layers_root) try: shutil.rmtree(gwc_layers_root) print 'Cleaned out old GeoServer GWC Layers Config: ' + gwc_layers_root except: pass if not os.path.exists(gwc_layers_root): os.makedirs(gwc_layers_root)
def restore_full(archive): """Full Restore of GeoNode DB""" try: # Create Target Folder restore_folder = 'restore' if not os.path.exists(restore_folder): os.makedirs(restore_folder) # Extract ZIP Archive to Target Folder target_folder = extract_archive(archive, restore_folder) # Prepare Target DB try: call_command('migrate', interactive=False, load_initial_data=False) call_command('flush', interactive=False, load_initial_data=False) helpers.patch_db() except: traceback.print_exc() # Restore Fixtures for app_name, dump_name in zip(helpers.app_names, helpers.dump_names): fixture_file = os.path.join(target_folder, dump_name + '.json') print "Deserializing " + fixture_file try: call_command('loaddata', fixture_file, app_label=app_name) except: #traceback.print_exc() print "WARNING: No valid fixture data found for '" + dump_name + "'." #helpers.load_fixture(app_name, fixture_file) # Restore Media Root media_root = settings.MEDIA_ROOT media_folder = os.path.join(target_folder, helpers.MEDIA_ROOT) try: shutil.rmtree(media_root) except: pass if not os.path.exists(media_root): os.makedirs(media_root) copy_tree(media_folder, media_root) chmod_tree(media_root) print "Media Files Restored into '" + media_root + "'." # Restore Static Root static_root = settings.STATIC_ROOT static_folder = os.path.join(target_folder, helpers.STATIC_ROOT) try: shutil.rmtree(static_root) except: pass if not os.path.exists(static_root): os.makedirs(static_root) copy_tree(static_folder, static_root) chmod_tree(static_root) print "Static Root Restored into '" + static_root + "'." # Restore Static Folders static_folders = settings.STATICFILES_DIRS static_files_folders = os.path.join(target_folder, helpers.STATICFILES_DIRS) for static_files_folder in static_folders: try: shutil.rmtree(static_files_folder) except: pass if not os.path.exists(static_files_folder): os.makedirs(static_files_folder) copy_tree( os.path.join( static_files_folders, os.path.basename(os.path.normpath(static_files_folder))), static_files_folder) chmod_tree(static_files_folder) print "Static Files Restored into '" + static_files_folder + "'." # Restore Template Folders template_folders = settings.TEMPLATE_DIRS template_files_folders = os.path.join(target_folder, helpers.TEMPLATE_DIRS) for template_files_folder in template_folders: try: shutil.rmtree(template_files_folder) except: pass if not os.path.exists(template_files_folder): os.makedirs(template_files_folder) copy_tree( os.path.join( template_files_folders, os.path.basename(os.path.normpath(template_files_folder))), template_files_folder) chmod_tree(template_files_folder) print "Template Files Restored into '" + template_files_folder + "'." # Restore Locale Folders locale_folders = settings.LOCALE_PATHS locale_files_folders = os.path.join(target_folder, helpers.LOCALE_PATHS) for locale_files_folder in locale_folders: try: shutil.rmtree(locale_files_folder) except: pass if not os.path.exists(locale_files_folder): os.makedirs(locale_files_folder) copy_tree( os.path.join( locale_files_folders, os.path.basename(os.path.normpath(locale_files_folder))), locale_files_folder) chmod_tree(locale_files_folder) print "Locale Files Restored into '" + locale_files_folder + "'." # Cleanup DB try: helpers.cleanup_db() except: traceback.print_exc() except Exception, err: print str(err)
def execute_restore(self, **options): self.validate_backup_file_options(**options) ignore_errors = options.get('ignore_errors') force_exec = options.get('force_exec') skip_geoserver = options.get('skip_geoserver') skip_geoserver_info = options.get('skip_geoserver_info') skip_geoserver_security = options.get('skip_geoserver_security') backup_file = options.get('backup_file') recovery_file = options.get('recovery_file') backup_files_dir = options.get('backup_files_dir') with_logs = options.get('with_logs') notify = options.get('notify') soft_reset = options.get('soft_reset') # choose backup_file from backup_files_dir, if --backup-files-dir was provided if backup_files_dir: backup_file = self.parse_backup_files_dir(backup_files_dir) else: backup_files_dir = os.path.dirname(backup_file) # calculate and validate backup archive hash backup_md5 = self.validate_backup_file_hash(backup_file) # check if the original backup file ini setting are available or not backup_ini = self.check_backup_ini_settings(backup_file) if backup_ini: options['config'] = backup_ini config = utils.Config(options) # check if the backup has already been restored if with_logs: if RestoredBackup.objects.filter(archive_md5=backup_md5): raise RuntimeError( 'Backup archive has already been restored. If you want to restore ' 'this backup anyway, run the script without "-l" argument.' ) # get a list of instance administrators' emails admin_emails = [] if notify: admins = get_user_model().objects.filter(is_superuser=True) for user in admins: if user.email: admin_emails.append(user.email) print("Before proceeding with the Restore, please ensure that:") print( " 1. The backend (DB or whatever) is accessible and you have rights" ) print( " 2. The GeoServer is up and running and reachable from this machine" ) message = 'WARNING: The restore will overwrite ALL GeoNode data. You want to proceed?' if force_exec or utils.confirm(prompt=message, resp=False): # Create Target Folder # restore_folder must be located in the directory Geoserver has access to (and it should # not be Geoserver data dir) # for dockerized project-template GeoNode projects, it should be located in /backup-restore, # otherwise default tmp directory is chosen temp_dir_path = backup_files_dir if os.path.exists( backup_files_dir) else None restore_folder = os.path.join(temp_dir_path, f'tmp{str(uuid.uuid4())[:4]}') try: os.makedirs(restore_folder) except Exception as e: raise e try: # Extract ZIP Archive to Target Folder target_folder = extract_archive(backup_file, restore_folder) # Write Checks media_root = settings.MEDIA_ROOT media_folder = os.path.join(target_folder, utils.MEDIA_ROOT) static_root = settings.STATIC_ROOT static_folder = os.path.join(target_folder, utils.STATIC_ROOT) static_folders = settings.STATICFILES_DIRS static_files_folders = os.path.join(target_folder, utils.STATICFILES_DIRS) template_folders = [] try: template_folders = settings.TEMPLATE_DIRS except Exception: try: template_folders = settings.TEMPLATES[0]['DIRS'] except Exception: pass template_files_folders = os.path.join(target_folder, utils.TEMPLATE_DIRS) locale_folders = settings.LOCALE_PATHS locale_files_folders = os.path.join(target_folder, utils.LOCALE_PATHS) try: print( f"[Sanity Check] Full Write Access to '{restore_folder}' ..." ) chmod_tree(restore_folder) print( f"[Sanity Check] Full Write Access to '{media_root}' ..." ) chmod_tree(media_root) print( f"[Sanity Check] Full Write Access to '{static_root}' ..." ) chmod_tree(static_root) for static_files_folder in static_folders: print( f"[Sanity Check] Full Write Access to '{static_files_folder}' ..." ) chmod_tree(static_files_folder) for template_files_folder in template_folders: print( f"[Sanity Check] Full Write Access to '{template_files_folder}' ..." ) chmod_tree(template_files_folder) for locale_files_folder in locale_folders: print( f"[Sanity Check] Full Write Access to '{locale_files_folder}' ..." ) chmod_tree(locale_files_folder) except Exception as exception: if notify: restore_notification.apply_async( (admin_emails, backup_file, backup_md5, str(exception))) print( "...Sanity Checks on Folder failed. Please make sure that the current user has full WRITE access to the above folders (and sub-folders or files)." ) # noqa print("Reason:") raise if not skip_geoserver: try: print( f"[Sanity Check] Full Write Access to '{target_folder}' ..." ) chmod_tree(target_folder) self.restore_geoserver_backup(config, settings, target_folder, skip_geoserver_info, skip_geoserver_security, ignore_errors, soft_reset) self.prepare_geoserver_gwc_config(config, settings) self.restore_geoserver_raster_data( config, settings, target_folder) self.restore_geoserver_vector_data( config, settings, target_folder, soft_reset) print("Restoring geoserver external resources") self.restore_geoserver_externals( config, settings, target_folder) except Exception as exception: if recovery_file: with tempfile.TemporaryDirectory( dir=temp_dir_path) as restore_folder: recovery_folder = extract_archive( recovery_file, restore_folder) self.restore_geoserver_backup( config, settings, recovery_folder, skip_geoserver_info, skip_geoserver_security, ignore_errors, soft_reset) self.restore_geoserver_raster_data( config, settings, recovery_folder) self.restore_geoserver_vector_data( config, settings, recovery_folder, soft_reset) self.restore_geoserver_externals( config, settings, recovery_folder) if notify: restore_notification.apply_async( (admin_emails, backup_file, backup_md5, str(exception))) raise exception else: print("Skipping geoserver backup restore") # Prepare Target DB try: call_command('makemigrations', interactive=False) call_command('migrate', interactive=False, load_initial_data=False) db_name = settings.DATABASES['default']['NAME'] db_user = settings.DATABASES['default']['USER'] db_port = settings.DATABASES['default']['PORT'] db_host = settings.DATABASES['default']['HOST'] db_passwd = settings.DATABASES['default']['PASSWORD'] utils.patch_db(db_name, db_user, db_port, db_host, db_passwd, settings.MONITORING_ENABLED) except Exception: traceback.print_exc() try: # Deactivate GeoNode Signals with DisableDjangoSignals(): # Flush DB try: db_name = settings.DATABASES['default']['NAME'] db_user = settings.DATABASES['default']['USER'] db_port = settings.DATABASES['default']['PORT'] db_host = settings.DATABASES['default']['HOST'] db_passwd = settings.DATABASES['default'][ 'PASSWORD'] utils.flush_db(db_name, db_user, db_port, db_host, db_passwd) except Exception: try: call_command('flush', interactive=False) except Exception: traceback.print_exc() raise # Restore Fixtures abortlater = False for app_name, dump_name in zip(config.app_names, config.dump_names): fixture_file = os.path.join( target_folder, f"{dump_name}.json") print(f"Deserializing '{fixture_file}'") try: call_command('loaddata', fixture_file, app_label=app_name) except IntegrityError: traceback.print_exc() logger.warning( f"WARNING: The fixture '{dump_name}' fails on integrity check and import is aborted after all fixtures have been checked." ) # noqa abortlater = True except Exception as e: traceback.print_exc() logger.warning( f"WARNING: No valid fixture data found for '{dump_name}'." ) # helpers.load_fixture(app_name, fixture_file) raise e if abortlater: raise IntegrityError() # Restore Media Root if config.gs_data_dt_filter[0] is None: shutil.rmtree(media_root, ignore_errors=True) if not os.path.exists(media_root): os.makedirs(media_root) copy_tree(media_folder, media_root) chmod_tree(media_root) print(f"Media Files Restored into '{media_root}'.") # Restore Static Root if config.gs_data_dt_filter[0] is None: shutil.rmtree(static_root, ignore_errors=True) if not os.path.exists(static_root): os.makedirs(static_root) copy_tree(static_folder, static_root) chmod_tree(static_root) print(f"Static Root Restored into '{static_root}'.") # Restore Static Folders for static_files_folder in static_folders: # skip restoration of static files of apps not located under LOCAL_ROOT path # (check to prevent overriding files from site-packages # in project-template based GeoNode projects) if getattr(settings, 'LOCAL_ROOT', None) and \ not static_files_folder.startswith(settings.LOCAL_ROOT): print( f"Skipping static directory: {static_files_folder}. " f"It's not located under LOCAL_ROOT path: {settings.LOCAL_ROOT}." ) continue if config.gs_data_dt_filter[0] is None: shutil.rmtree(static_files_folder, ignore_errors=True) if not os.path.exists(static_files_folder): os.makedirs(static_files_folder) copy_tree( os.path.join( static_files_folders, os.path.basename( os.path.normpath( static_files_folder))), static_files_folder) chmod_tree(static_files_folder) print( f"Static Files Restored into '{static_files_folder}'." ) # Restore Template Folders for template_files_folder in template_folders: # skip restoration of template files of apps not located under LOCAL_ROOT path # (check to prevent overriding files from site-packages # in project-template based GeoNode projects) if getattr(settings, 'LOCAL_ROOT', None) and \ not template_files_folder.startswith(settings.LOCAL_ROOT): print( f"Skipping template directory: {template_files_folder}. " f"It's not located under LOCAL_ROOT path: {settings.LOCAL_ROOT}." ) continue if config.gs_data_dt_filter[0] is None: shutil.rmtree(template_files_folder, ignore_errors=True) if not os.path.exists(template_files_folder): os.makedirs(template_files_folder) copy_tree( os.path.join( template_files_folders, os.path.basename( os.path.normpath( template_files_folder))), template_files_folder) chmod_tree(template_files_folder) print( f"Template Files Restored into '{template_files_folder}'." ) # Restore Locale Folders for locale_files_folder in locale_folders: # skip restoration of locale files of apps not located under LOCAL_ROOT path # (check to prevent overriding files from site-packages # in project-template based GeoNode projects) if getattr(settings, 'LOCAL_ROOT', None) and \ not locale_files_folder.startswith(settings.LOCAL_ROOT): print( f"Skipping locale directory: {locale_files_folder}. " f"It's not located under LOCAL_ROOT path: {settings.LOCAL_ROOT}." ) continue if config.gs_data_dt_filter[0] is None: shutil.rmtree(locale_files_folder, ignore_errors=True) if not os.path.exists(locale_files_folder): os.makedirs(locale_files_folder) copy_tree( os.path.join( locale_files_folders, os.path.basename( os.path.normpath( locale_files_folder))), locale_files_folder) chmod_tree(locale_files_folder) print( f"Locale Files Restored into '{locale_files_folder}'." ) call_command('collectstatic', interactive=False) # Cleanup DB try: db_name = settings.DATABASES['default']['NAME'] db_user = settings.DATABASES['default']['USER'] db_port = settings.DATABASES['default']['PORT'] db_host = settings.DATABASES['default']['HOST'] db_passwd = settings.DATABASES['default'][ 'PASSWORD'] utils.cleanup_db(db_name, db_user, db_port, db_host, db_passwd) except Exception: traceback.print_exc() # store backup info restored_backup = RestoredBackup( name=backup_file.rsplit('/', 1)[-1], archive_md5=backup_md5, creation_date=datetime.fromtimestamp( os.path.getmtime(backup_file))) restored_backup.save() except Exception as exception: if notify: restore_notification.apply_async( (admin_emails, backup_file, backup_md5, str(exception))) finally: call_command('makemigrations', interactive=False) call_command('migrate', interactive=False, fake=True) call_command('sync_geonode_datasets', updatepermissions=True, ignore_errors=True) if notify: restore_notification.apply_async( (admin_emails, backup_file, backup_md5)) print( "HINT: If you migrated from another site, do not forget to run the command 'migrate_baseurl' to fix Links" ) # noqa print( " e.g.: DJANGO_SETTINGS_MODULE=my_geonode.settings python manage.py migrate_baseurl " "--source-address=my-host-dev.geonode.org --target-address=my-host-prod.geonode.org" ) print("Restore finished.") finally: shutil.rmtree(restore_folder)
def handle(self, **options): # ignore_errors = options.get('ignore_errors') config = Config(options) force_exec = options.get('force_exec') backup_file = options.get('backup_file') skip_geoserver = options.get('skip_geoserver') backup_dir = options.get('backup_dir') if not any([backup_file, backup_dir]): raise CommandError("Mandatory option (--backup-file|--backup-dir)") if all([backup_file, backup_dir]): raise CommandError("Exclusive option (--backup-file|--backup-dir)") if backup_file and not os.path.isfile(backup_file): raise CommandError("Provided '--backup-file' is not a file") if backup_dir and not os.path.isdir(backup_dir): raise CommandError("Provided '--backup-dir' is not a directory") print "Before proceeding with the Restore, please ensure that:" print " 1. The backend (DB or whatever) is accessible and you have rights" print " 2. The GeoServer is up and running and reachable from this machine" message = 'WARNING: The restore will overwrite ALL GeoNode data. You want to proceed?' if force_exec or helpers.confirm(prompt=message, resp=False): target_folder = backup_dir if backup_file: # Create Target Folder restore_folder = os.path.join(tempfile.gettempdir(), 'restore') if not os.path.exists(restore_folder): os.makedirs(restore_folder) # Extract ZIP Archive to Target Folder target_folder = extract_archive(backup_file, restore_folder) # Write Checks media_root = settings.MEDIA_ROOT media_folder = os.path.join(target_folder, helpers.MEDIA_ROOT) static_root = settings.STATIC_ROOT static_folder = os.path.join(target_folder, helpers.STATIC_ROOT) static_folders = settings.STATICFILES_DIRS static_files_folders = os.path.join(target_folder, helpers.STATICFILES_DIRS) template_folders = settings.TEMPLATE_DIRS template_files_folders = os.path.join(target_folder, helpers.TEMPLATE_DIRS) locale_folders = settings.LOCALE_PATHS locale_files_folders = os.path.join(target_folder, helpers.LOCALE_PATHS) try: print("[Sanity Check] Full Write Access to '{}' ...".format(media_root)) chmod_tree(media_root) print("[Sanity Check] Full Write Access to '{}' ...".format(static_root)) chmod_tree(static_root) for static_files_folder in static_folders: print("[Sanity Check] Full Write Access to '{}' ...".format(static_files_folder)) chmod_tree(static_files_folder) for template_files_folder in template_folders: print("[Sanity Check] Full Write Access to '{}' ...".format(template_files_folder)) chmod_tree(template_files_folder) for locale_files_folder in locale_folders: print("[Sanity Check] Full Write Access to '{}' ...".format(locale_files_folder)) chmod_tree(locale_files_folder) except: print("...Sanity Checks on Folder failed. Please make sure that the current user has full WRITE access to the above folders (and sub-folders or files).") print("Reason:") raise if not skip_geoserver: self.restore_geoserver_backup(settings, target_folder) self.restore_geoserver_raster_data(config, settings, target_folder) self.restore_geoserver_vector_data(config, settings, target_folder) print("Restoring geoserver external resources") self.restore_geoserver_externals(config, settings, target_folder) else: print("Skipping geoserver backup restore") # Prepare Target DB try: call_command('migrate', interactive=False, load_initial_data=False) db_name = settings.DATABASES['default']['NAME'] db_user = settings.DATABASES['default']['USER'] db_port = settings.DATABASES['default']['PORT'] db_host = settings.DATABASES['default']['HOST'] db_passwd = settings.DATABASES['default']['PASSWORD'] helpers.patch_db(db_name, db_user, db_port, db_host, db_passwd, settings.MONITORING_ENABLED) except: traceback.print_exc() try: # Deactivate GeoNode Signals print "Deactivating GeoNode Signals..." designals() print "...done!" # Flush DB try: db_name = settings.DATABASES['default']['NAME'] db_user = settings.DATABASES['default']['USER'] db_port = settings.DATABASES['default']['PORT'] db_host = settings.DATABASES['default']['HOST'] db_passwd = settings.DATABASES['default']['PASSWORD'] helpers.flush_db(db_name, db_user, db_port, db_host, db_passwd) except: try: call_command('flush', interactive=False, load_initial_data=False) except: traceback.print_exc() raise # Restore Fixtures for app_name, dump_name in zip(config.app_names, config.dump_names): fixture_file = os.path.join(target_folder, dump_name+'.json') print "Deserializing "+fixture_file try: call_command('loaddata', fixture_file, app_label=app_name) except: traceback.print_exc() print "WARNING: No valid fixture data found for '"+dump_name+"'." # helpers.load_fixture(app_name, fixture_file) raise # Restore Media Root try: shutil.rmtree(media_root) except: pass if not os.path.exists(media_root): os.makedirs(media_root) copy_tree(media_folder, media_root) chmod_tree(media_root) print "Media Files Restored into '"+media_root+"'." # Restore Static Root try: shutil.rmtree(static_root) except: pass if not os.path.exists(static_root): os.makedirs(static_root) copy_tree(static_folder, static_root) chmod_tree(static_root) print "Static Root Restored into '"+static_root+"'." # Restore Static Root try: shutil.rmtree(static_root) except: pass if not os.path.exists(static_root): os.makedirs(static_root) copy_tree(static_folder, static_root) chmod_tree(static_root) print "Static Root Restored into '"+static_root+"'." # Restore Static Folders for static_files_folder in static_folders: try: shutil.rmtree(static_files_folder) except: pass if not os.path.exists(static_files_folder): os.makedirs(static_files_folder) copy_tree(os.path.join(static_files_folders, os.path.basename(os.path.normpath(static_files_folder))), static_files_folder) chmod_tree(static_files_folder) print "Static Files Restored into '"+static_files_folder+"'." # Restore Template Folders for template_files_folder in template_folders: try: shutil.rmtree(template_files_folder) except: pass if not os.path.exists(template_files_folder): os.makedirs(template_files_folder) copy_tree(os.path.join(template_files_folders, os.path.basename(os.path.normpath(template_files_folder))), template_files_folder) chmod_tree(template_files_folder) print "Template Files Restored into '"+template_files_folder+"'." # Restore Locale Folders for locale_files_folder in locale_folders: try: shutil.rmtree(locale_files_folder) except: pass if not os.path.exists(locale_files_folder): os.makedirs(locale_files_folder) copy_tree(os.path.join(locale_files_folders, os.path.basename(os.path.normpath(locale_files_folder))), locale_files_folder) chmod_tree(locale_files_folder) print "Locale Files Restored into '"+locale_files_folder+"'." call_command('collectstatic', interactive=False) # Cleanup DB try: db_name = settings.DATABASES['default']['NAME'] db_user = settings.DATABASES['default']['USER'] db_port = settings.DATABASES['default']['PORT'] db_host = settings.DATABASES['default']['HOST'] db_passwd = settings.DATABASES['default']['PASSWORD'] helpers.cleanup_db(db_name, db_user, db_port, db_host, db_passwd) except: traceback.print_exc() return str(target_folder) finally: # Reactivate GeoNode Signals print "Reactivating GeoNode Signals..." resignals() print "...done!" call_command('migrate', interactive=False, load_initial_data=False, fake=True) print "HINT: If you migrated from another site, do not forget to run the command 'migrate_baseurl' to fix Links" print " e.g.: DJANGO_SETTINGS_MODULE=my_geonode.settings python manage.py migrate_baseurl --source-address=my-host-dev.geonode.org --target-address=my-host-prod.geonode.org" print "Restore finished. Please find restored files and dumps into:"
def handle(self, **options): # ignore_errors = options.get('ignore_errors') config = Config(options) force_exec = options.get('force_exec') backup_file = options.get('backup_file') skip_geoserver = options.get('skip_geoserver') backup_dir = options.get('backup_dir') if not any([backup_file, backup_dir]): raise CommandError("Mandatory option (--backup-file|--backup-dir)") if all([backup_file, backup_dir]): raise CommandError("Exclusive option (--backup-file|--backup-dir)") if backup_file and not os.path.isfile(backup_file): raise CommandError("Provided '--backup-file' is not a file") if backup_dir and not os.path.isdir(backup_dir): raise CommandError("Provided '--backup-dir' is not a directory") print "Before proceeding with the Restore, please ensure that:" print " 1. The backend (DB or whatever) is accessible and you have rights" print " 2. The GeoServer is up and running and reachable from this machine" message = 'WARNING: The restore will overwrite ALL GeoNode data. You want to proceed?' if force_exec or helpers.confirm(prompt=message, resp=False): target_folder = backup_dir if backup_file: # Create Target Folder restore_folder = os.path.join(tempfile.gettempdir(), 'restore') if not os.path.exists(restore_folder): os.makedirs(restore_folder) # Extract ZIP Archive to Target Folder target_folder = extract_archive(backup_file, restore_folder) # Write Checks media_root = settings.MEDIA_ROOT media_folder = os.path.join(target_folder, helpers.MEDIA_ROOT) static_root = settings.STATIC_ROOT static_folder = os.path.join(target_folder, helpers.STATIC_ROOT) static_folders = settings.STATICFILES_DIRS static_files_folders = os.path.join(target_folder, helpers.STATICFILES_DIRS) template_folders = [] try: template_folders = settings.TEMPLATE_DIRS except: try: template_folders = settings.TEMPLATES[0]['DIRS'] except: pass template_files_folders = os.path.join(target_folder, helpers.TEMPLATE_DIRS) locale_folders = settings.LOCALE_PATHS locale_files_folders = os.path.join(target_folder, helpers.LOCALE_PATHS) try: print("[Sanity Check] Full Write Access to '{}' ...".format(media_root)) chmod_tree(media_root) print("[Sanity Check] Full Write Access to '{}' ...".format(static_root)) chmod_tree(static_root) for static_files_folder in static_folders: print("[Sanity Check] Full Write Access to '{}' ...".format(static_files_folder)) chmod_tree(static_files_folder) for template_files_folder in template_folders: print("[Sanity Check] Full Write Access to '{}' ...".format(template_files_folder)) chmod_tree(template_files_folder) for locale_files_folder in locale_folders: print("[Sanity Check] Full Write Access to '{}' ...".format(locale_files_folder)) chmod_tree(locale_files_folder) except: print("...Sanity Checks on Folder failed. Please make sure that the current user has full WRITE access to the above folders (and sub-folders or files).") print("Reason:") raise if not skip_geoserver: self.restore_geoserver_backup(settings, target_folder) self.restore_geoserver_raster_data(config, settings, target_folder) self.restore_geoserver_vector_data(config, settings, target_folder) print("Restoring geoserver external resources") self.restore_geoserver_externals(config, settings, target_folder) else: print("Skipping geoserver backup restore") # Prepare Target DB try: call_command('migrate', interactive=False, load_initial_data=False) db_name = settings.DATABASES['default']['NAME'] db_user = settings.DATABASES['default']['USER'] db_port = settings.DATABASES['default']['PORT'] db_host = settings.DATABASES['default']['HOST'] db_passwd = settings.DATABASES['default']['PASSWORD'] helpers.patch_db(db_name, db_user, db_port, db_host, db_passwd, settings.MONITORING_ENABLED) except: traceback.print_exc() try: # Deactivate GeoNode Signals print "Deactivating GeoNode Signals..." designals() print "...done!" # Flush DB try: db_name = settings.DATABASES['default']['NAME'] db_user = settings.DATABASES['default']['USER'] db_port = settings.DATABASES['default']['PORT'] db_host = settings.DATABASES['default']['HOST'] db_passwd = settings.DATABASES['default']['PASSWORD'] helpers.flush_db(db_name, db_user, db_port, db_host, db_passwd) except: try: call_command('flush', interactive=False, load_initial_data=False) except: traceback.print_exc() raise # Restore Fixtures for app_name, dump_name in zip(config.app_names, config.dump_names): fixture_file = os.path.join(target_folder, dump_name+'.json') print "Deserializing "+fixture_file try: call_command('loaddata', fixture_file, app_label=app_name) except: traceback.print_exc() print "WARNING: No valid fixture data found for '"+dump_name+"'." # helpers.load_fixture(app_name, fixture_file) raise # Restore Media Root try: shutil.rmtree(media_root) except: pass if not os.path.exists(media_root): os.makedirs(media_root) copy_tree(media_folder, media_root) chmod_tree(media_root) print "Media Files Restored into '"+media_root+"'." # Restore Static Root try: shutil.rmtree(static_root) except: pass if not os.path.exists(static_root): os.makedirs(static_root) copy_tree(static_folder, static_root) chmod_tree(static_root) print "Static Root Restored into '"+static_root+"'." # Restore Static Root try: shutil.rmtree(static_root) except: pass if not os.path.exists(static_root): os.makedirs(static_root) copy_tree(static_folder, static_root) chmod_tree(static_root) print "Static Root Restored into '"+static_root+"'." # Restore Static Folders for static_files_folder in static_folders: try: shutil.rmtree(static_files_folder) except: pass if not os.path.exists(static_files_folder): os.makedirs(static_files_folder) copy_tree(os.path.join(static_files_folders, os.path.basename(os.path.normpath(static_files_folder))), static_files_folder) chmod_tree(static_files_folder) print "Static Files Restored into '"+static_files_folder+"'." # Restore Template Folders for template_files_folder in template_folders: try: shutil.rmtree(template_files_folder) except: pass if not os.path.exists(template_files_folder): os.makedirs(template_files_folder) copy_tree(os.path.join(template_files_folders, os.path.basename(os.path.normpath(template_files_folder))), template_files_folder) chmod_tree(template_files_folder) print "Template Files Restored into '"+template_files_folder+"'." # Restore Locale Folders for locale_files_folder in locale_folders: try: shutil.rmtree(locale_files_folder) except: pass if not os.path.exists(locale_files_folder): os.makedirs(locale_files_folder) copy_tree(os.path.join(locale_files_folders, os.path.basename(os.path.normpath(locale_files_folder))), locale_files_folder) chmod_tree(locale_files_folder) print "Locale Files Restored into '"+locale_files_folder+"'." call_command('collectstatic', interactive=False) # Cleanup DB try: db_name = settings.DATABASES['default']['NAME'] db_user = settings.DATABASES['default']['USER'] db_port = settings.DATABASES['default']['PORT'] db_host = settings.DATABASES['default']['HOST'] db_passwd = settings.DATABASES['default']['PASSWORD'] helpers.cleanup_db(db_name, db_user, db_port, db_host, db_passwd) except: traceback.print_exc() return str(target_folder) finally: # Reactivate GeoNode Signals print "Reactivating GeoNode Signals..." resignals() print "...done!" call_command('migrate', interactive=False, load_initial_data=False, fake=True) print "HINT: If you migrated from another site, do not forget to run the command 'migrate_baseurl' to fix Links" print " e.g.: DJANGO_SETTINGS_MODULE=my_geonode.settings python manage.py migrate_baseurl --source-address=my-host-dev.geonode.org --target-address=my-host-prod.geonode.org" print "Restore finished. Please find restored files and dumps into:"
def restore_full(archive): """Full Restore of GeoNode DB""" try: # Create Target Folder restore_folder = 'restore' if not os.path.exists(restore_folder): os.makedirs(restore_folder) # Extract ZIP Archive to Target Folder target_folder = extract_archive(archive, restore_folder) # Prepare Target DB try: call_command('migrate', interactive=False, load_initial_data=False) call_command('flush', interactive=False, load_initial_data=False) helpers.patch_db() except: traceback.print_exc() # Restore Fixtures for app_name, dump_name in zip(helpers.app_names, helpers.dump_names): fixture_file = os.path.join(target_folder, dump_name+'.json') print "Deserializing "+fixture_file try: call_command('loaddata', fixture_file, app_label=app_name) except: #traceback.print_exc() print "WARNING: No valid fixture data found for '"+dump_name+"'." #helpers.load_fixture(app_name, fixture_file) # Restore Media Root media_root = settings.MEDIA_ROOT media_folder = os.path.join(target_folder, helpers.MEDIA_ROOT) try: shutil.rmtree(media_root) except: pass if not os.path.exists(media_root): os.makedirs(media_root) copy_tree(media_folder, media_root) chmod_tree(media_root) print "Media Files Restored into '"+media_root+"'." # Restore Static Root static_root = settings.STATIC_ROOT static_folder = os.path.join(target_folder, helpers.STATIC_ROOT) try: shutil.rmtree(static_root) except: pass if not os.path.exists(static_root): os.makedirs(static_root) copy_tree(static_folder, static_root) chmod_tree(static_root) print "Static Root Restored into '"+static_root+"'." # Restore Static Folders static_folders = settings.STATICFILES_DIRS static_files_folders = os.path.join(target_folder, helpers.STATICFILES_DIRS) for static_files_folder in static_folders: try: shutil.rmtree(static_files_folder) except: pass if not os.path.exists(static_files_folder): os.makedirs(static_files_folder) copy_tree(os.path.join(static_files_folders, os.path.basename(os.path.normpath(static_files_folder))), static_files_folder) chmod_tree(static_files_folder) print "Static Files Restored into '"+static_files_folder+"'." # Restore Template Folders template_folders = [] try: template_folders = settings.TEMPLATE_DIRS except: try: template_folders = settings.TEMPLATES[0]['DIRS'] except: pass template_files_folders = os.path.join(target_folder, helpers.TEMPLATE_DIRS) for template_files_folder in template_folders: try: shutil.rmtree(template_files_folder) except: pass if not os.path.exists(template_files_folder): os.makedirs(template_files_folder) copy_tree(os.path.join(template_files_folders, os.path.basename(os.path.normpath(template_files_folder))), template_files_folder) chmod_tree(template_files_folder) print "Template Files Restored into '"+template_files_folder+"'." # Restore Locale Folders locale_folders = settings.LOCALE_PATHS locale_files_folders = os.path.join(target_folder, helpers.LOCALE_PATHS) for locale_files_folder in locale_folders: try: shutil.rmtree(locale_files_folder) except: pass if not os.path.exists(locale_files_folder): os.makedirs(locale_files_folder) copy_tree(os.path.join(locale_files_folders, os.path.basename(os.path.normpath(locale_files_folder))), locale_files_folder) chmod_tree(locale_files_folder) print "Locale Files Restored into '"+locale_files_folder+"'." # Cleanup DB try: helpers.cleanup_db() except: traceback.print_exc() except Exception, err: print str(err)