This is an automated email from the ASF dual-hosted git repository. brondsem pushed a commit to branch db/explore_encryption in repository https://gitbox.apache.org/repos/asf/allura.git
commit 9e03f5c5db34a40580485ea75a91cb68b32e4efc Author: Dave Brondsema <[email protected]> AuthorDate: Fri Nov 7 12:42:45 2025 -0500 remove unmaintained scrub-allura-data.py --- Allura/docs/getting_started/administration.rst | 11 -- scripts/scrub-allura-data.py | 156 ------------------------- 2 files changed, 167 deletions(-) diff --git a/Allura/docs/getting_started/administration.rst b/Allura/docs/getting_started/administration.rst index 1f9cfb225..3e8217fda 100644 --- a/Allura/docs/getting_started/administration.rst +++ b/Allura/docs/getting_started/administration.rst @@ -303,17 +303,6 @@ publicize-neighborhood.py :prog: paster script development.ini ../scripts/publicize-neighborhood.py -- -scrub-allura-data.py --------------------- - -*Cannot currently be run as a background task.* - -.. argparse:: - :filename: ../../scripts/scrub-allura-data.py - :func: parser - :prog: paster script development.ini ../scripts/scrub-allura-data.py -- - - .. _site-notifications: Site Notifications diff --git a/scripts/scrub-allura-data.py b/scripts/scrub-allura-data.py deleted file mode 100644 index 744fba148..000000000 --- a/scripts/scrub-allura-data.py +++ /dev/null @@ -1,156 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -import logging -import sys - -from ming.odm import ThreadLocalODMSession -import mock -from tg import tmpl_context as c, app_globals as g - -from allura import model as M -from forgediscussion import model as DM -from forgetracker import model as TM - -from allura.lib import utils - -log = logging.getLogger(__name__) - - -def public(obj, project=None): - if not project: - project = obj - role_anon = M.ProjectRole.by_name(name='*anonymous', project=project) - if not role_anon: - log.info('Missing *anonymous role for project "%s"' % - project.shortname) - return False - read = M.ACE.allow(role_anon._id, 'read') - return read in obj.acl - - -def scrub_project(p, options): - log.info('Scrubbing project "%s"' % p.shortname) - preamble = options.preamble - if not public(p): - log.info(f'{preamble} project "{p.shortname}"') - if not options.dry_run: - p.delete() - return - for ac in p.app_configs: - ac.project = p - c.app = p.app_instance(ac) - mount_point = ac.options.get('mount_point') - tool_name = ac.tool_name.lower() - if tool_name in ('admin', 'search', 'profile'): - continue - if not public(ac, project=p): - log.info('{} tool {}/{} on project "{}"'.format( - preamble, tool_name, mount_point, p.shortname)) - if not options.dry_run: - p.uninstall_app(mount_point) - continue - q = dict(app_config_id=ac._id) - ace = dict(access='DENY', permission='*', role_id=None) - q['acl'] = {'$in': [ace]} - counter = 0 - if tool_name == 'tickets': - if ac.options.get('TicketMonitoringEmail'): - log.info('%s options.TicketMonitoringEmail from the %s/%s ' - 'tool on project "%s"' % (preamble, tool_name, - mount_point, p.shortname)) - if not options.dry_run: - ac.options['TicketMonitoringEmail'] = None - for tickets in utils.chunked_find(TM.Ticket, q): - for t in tickets: - counter += 1 - if not options.dry_run: - t.discussion_thread.delete() - t.delete() - ThreadLocalODMSession.flush_all() - ThreadLocalODMSession.close_all() - if counter > 0: - log.info('%s %s tickets from the %s/%s tool on ' - 'project "%s"' % (preamble, counter, tool_name, - mount_point, p.shortname)) - elif tool_name == 'discussion': - for forums in utils.chunked_find(DM.Forum, q): - for f in forums: - counter += 1 - if not options.dry_run: - f.delete() - if counter > 0: - log.info('%s %s forums from the %s/%s tool on ' - 'project "%s"' % (preamble, counter, tool_name, - mount_point, p.shortname)) - - -def main(options): - log.addHandler(logging.StreamHandler(sys.stdout)) - log.setLevel(getattr(logging, options.log_level.upper())) - - g.solr = mock.Mock() - preamble = options.dry_run and "Would delete" or "Deleting" - options.preamble = preamble - - for nbhd in M.Neighborhood.query.find(): - q = {'neighborhood_id': nbhd._id} - for projects in utils.chunked_find(M.Project, q): - for p in projects: - scrub_project(p, options) - ThreadLocalODMSession.flush_all() - ThreadLocalODMSession.close_all() - - log.info('%s %s EmailAddress documents' % - (preamble, M.EmailAddress.find().count())) - log.info('%s email addresses from %s User documents' % - (preamble, M.User.query.find().count())) - log.info('%s monitoring_email addresses from %s Forum documents' % - (preamble, DM.Forum.query.find({"monitoring_email": - {"$nin": [None, ""]}}).count())) - - if not options.dry_run: - M.EmailAddress.query.remove() - M.User.query.update({}, { - "$set": {"email_addresses": [], - "last_access": {}}, - }, multi=True) - DM.Forum.query.update({"monitoring_email": {"$nin": [None, ""]}}, - {"$set": {"monitoring_email": None}}, multi=True) - return 0 - - -def parser(): - import argparse - parser = argparse.ArgumentParser( - description='Removes private data from the Allura MongoDB. DO NOT RUN THIS on your main database. ' - 'This is intended to be used on a copy of your database, to prepare it for sharing with others.' - ) - parser.add_argument('--dry-run', dest='dry_run', default=False, - action='store_true', - help='Run in test mode (no updates will be applied).') - parser.add_argument('--log', dest='log_level', default='INFO', - help='Log level (DEBUG, INFO, WARNING, ERROR, CRITICAL).') - return parser - - -def parse_options(): - return parser().parse_args() - - -if __name__ == '__main__': - sys.exit(main(parse_options()))
