summaryrefslogtreecommitdiffstats
path: root/contrib
diff options
context:
space:
mode:
Diffstat (limited to 'contrib')
-rwxr-xr-xcontrib/sanitizeme.pl61
1 files changed, 38 insertions, 23 deletions
diff --git a/contrib/sanitizeme.pl b/contrib/sanitizeme.pl
index 2e7613a6e..be1fc9706 100755
--- a/contrib/sanitizeme.pl
+++ b/contrib/sanitizeme.pl
@@ -1,4 +1,4 @@
-#!/usr/bin/perl -wT
+#!/usr/bin/perl -w
# -*- Mode: perl; indent-tabs-mode: nil -*-
#
# The contents of this file are subject to the Mozilla Public
@@ -24,16 +24,17 @@
use strict;
-use lib qw(.);
+use FindBin '$RealBin';
+use lib "$RealBin/..", "$RealBin/lib";
use Bugzilla;
use Bugzilla::Bug;
use Bugzilla::Constants;
use Bugzilla::Hook;
use Bugzilla::Util;
-use List::MoreUtils qw(uniq);
-
use Getopt::Long;
+use List::MoreUtils qw(uniq);
+$| = 1;
my $dbh = Bugzilla->dbh;
@@ -41,26 +42,41 @@ my $dbh = Bugzilla->dbh;
# doesn't contain any information that can't be viewed from a web browser by
# a user who is not logged in.
-# Last validated against Bugzilla version 4.0
-
-my ($dry_run, $from_cron, $keep_attachments, $keep_groups,
- $keep_passwords, $keep_insider, $trace, $enable_email) = (0, 0, 0, '', 0, 0, 0, 0);
-my $keep_groups_sql = '';
-
+my ($dry_run, $from_cron, $keep_attachments, $keep_group_bugs, $keep_groups, $execute,
+ $keep_passwords, $keep_insider, $trace, $enable_email) = (0, 0, 0, '', 0, 0, 0, 0, 0, 0);
+my $keep_group_bugs_sql = '';
+
+my $syntax = <<EOF;
+options:
+--execute perform database sanitization
+--keep-attachments disable removal of attachment content
+--keep-passwords disable resetting of passwords
+--keep-insider disable removal of insider comments and attachments
+--keep-group-bugs disable removal of the specified groups and associated bugs
+--keep-groups disable removal of group definitions
+--enable-email do not disable email for all users
+--dry-run do not update the database, just output what will be deleted
+--from-cron quite mode - suppress non-warning/error output
+--trace output sql statements
+EOF
GetOptions(
+ "execute" => \$execute,
"dry-run" => \$dry_run,
"from-cron" => \$from_cron,
"keep-attachments" => \$keep_attachments,
"keep-passwords" => \$keep_passwords,
"keep-insider" => \$keep_insider,
- "keep-groups:s" => \$keep_groups,
+ "keep-group-bugs:s" => \$keep_group_bugs,
+ "keep-groups" => \$keep_groups,
"trace" => \$trace,
"enable-email" => \$enable_email,
-) or exit;
+) or die $syntax;
+die "--execute switch required to perform database sanitization.\n\n$syntax"
+ unless $execute or $dry_run;
-if ($keep_groups ne '') {
+if ($keep_group_bugs ne '') {
my @groups;
- foreach my $group_id (split(/\s*,\s*/, $keep_groups)) {
+ foreach my $group_id (split(/\s*,\s*/, $keep_group_bugs)) {
my $group;
if ($group_id =~ /\D/) {
$group = Bugzilla::Group->new({ name => $group_id });
@@ -70,7 +86,7 @@ if ($keep_groups ne '') {
die "Invalid group '$group_id'\n" unless $group;
push @groups, $group->id;
}
- $keep_groups_sql = "NOT IN (" . join(",", @groups) . ")";
+ $keep_group_bugs_sql = "NOT IN (" . join(",", @groups) . ")";
}
$dbh->{TraceLevel} = 1 if $trace;
@@ -84,7 +100,7 @@ eval {
delete_secure_bugs();
delete_deleted_comments();
delete_insider_comments() unless $keep_insider;
- delete_security_groups();
+ delete_security_groups() unless $keep_groups;
delete_sensitive_user_data();
delete_attachment_data() unless $keep_attachments;
delete_bug_user_last_visit();
@@ -117,14 +133,13 @@ sub delete_non_public_products {
sub delete_secure_bugs {
# Delete all data for bugs in security groups.
my $buglist = $dbh->selectall_arrayref(
- $keep_groups
- ? "SELECT DISTINCT bug_id FROM bug_group_map WHERE group_id $keep_groups_sql"
+ $keep_group_bugs
+ ? "SELECT DISTINCT bug_id FROM bug_group_map WHERE group_id $keep_group_bugs_sql"
: "SELECT DISTINCT bug_id FROM bug_group_map"
);
- $|=1; # disable buffering so the bug progress counter works
my $numbugs = scalar(@$buglist);
my $bugnum = 0;
- print "Deleting $numbugs bugs in " . ($keep_groups ? 'non-' : '') . "security groups...\n";
+ print "Deleting $numbugs bugs in " . ($keep_group_bugs ? 'non-' : '') . "security groups...\n";
foreach my $row (@$buglist) {
my $bug_id = $row->[0];
$bugnum++;
@@ -160,14 +175,14 @@ sub delete_insider_comments {
sub delete_security_groups {
# Delete all security groups.
- print "Deleting " . ($keep_groups ? 'non-' : '') . "security groups...\n";
+ print "Deleting " . ($keep_group_bugs ? 'non-' : '') . "security groups...\n";
$dbh->do("DELETE user_group_map FROM groups JOIN user_group_map ON groups.id = user_group_map.group_id WHERE groups.isbuggroup = 1");
$dbh->do("DELETE group_group_map FROM groups JOIN group_group_map ON (groups.id = group_group_map.member_id OR groups.id = group_group_map.grantor_id) WHERE groups.isbuggroup = 1");
$dbh->do("DELETE group_control_map FROM groups JOIN group_control_map ON groups.id = group_control_map.group_id WHERE groups.isbuggroup = 1");
$dbh->do("UPDATE flagtypes LEFT JOIN groups ON flagtypes.grant_group_id = groups.id SET grant_group_id = NULL WHERE groups.isbuggroup = 1");
$dbh->do("UPDATE flagtypes LEFT JOIN groups ON flagtypes.request_group_id = groups.id SET request_group_id = NULL WHERE groups.isbuggroup = 1");
- if ($keep_groups) {
- $dbh->do("DELETE FROM groups WHERE isbuggroup = 1 AND id $keep_groups_sql");
+ if ($keep_group_bugs) {
+ $dbh->do("DELETE FROM groups WHERE isbuggroup = 1 AND id $keep_group_bugs_sql");
} else {
$dbh->do("DELETE FROM groups WHERE isbuggroup = 1");
}