summaryrefslogtreecommitdiff
path: root/bin/merge-user
diff options
context:
space:
mode:
Diffstat (limited to 'bin/merge-user')
-rwxr-xr-xbin/merge-user71
1 files changed, 71 insertions, 0 deletions
diff --git a/bin/merge-user b/bin/merge-user
new file mode 100755
index 0000000..e783359
--- /dev/null
+++ b/bin/merge-user
@@ -0,0 +1,71 @@
+#!/usr/bin/perl -w
+
+use strict;
+use FS::UID qw(adminsuidsetup dbh);
+use FS::Schema;
+use FS::Record qw(qsearch qsearchs);
+
+my $DRY_RUN = 1;
+$FS::UID::AutoCommit = 0;
+
+my ($user, $from_usernum, $to_usernum, $go) = @ARGV;
+die usage() if not ($user and $from_usernum and $to_usernum);
+$DRY_RUN = 0 if defined($go) and $go eq 'go';
+
+my $dbh = adminsuidsetup($user);
+
+# Sanity checks.
+die "Can't merge a user to itself." if $from_usernum == $to_usernum;
+my $from_user = FS::access_user->by_key($from_usernum) or
+ die "Usernum '$from_usernum' not found.\n";
+my $to_user = FS::access_user->by_key($to_usernum) or
+ die "Usernum '$to_usernum' not found.\n";
+
+my $tables = FS::Schema::tables_hashref;
+foreach my $table (keys %$tables) {
+ if( grep /^usernum$/, FS::Record::real_fields($table) ) {
+ next if $table eq 'access_user';
+ foreach ($table, "h_$table") {
+ print "$_: ";
+ my $sql;
+ if( $table =~ /^access_(.*)$/ ) {
+ print "deleting ";
+ $sql = "DELETE FROM $_ WHERE usernum = $from_usernum";
+ }
+ else {
+ print "updating ";
+ $sql = "UPDATE $_ SET usernum = $to_usernum WHERE usernum = $from_usernum";
+ }
+ #print $sql;
+ my $sth = $dbh->prepare($sql);
+ $sth->execute;
+ if($dbh->err) {
+ print $dbh->errstr."\n";
+ $dbh->rollback;
+ exit(1);
+ }
+ print $sth->rows, "\n";
+ }
+ }
+}
+
+if($DRY_RUN) {
+ warn "Dry run complete. Reverting all changes.\n";
+ $dbh->rollback;
+}
+else {
+# Warning: access_user->delete does not transactionize because of
+# htpasswd issues.
+ print "Deleting merged user.\n";
+ my $error = $from_user->delete;
+ die $error if $error;
+
+ warn "Committing changes.\n";
+ $dbh->commit;
+}
+exit(0);
+
+sub usage {
+ "Usage:\n merge-user admin_user from_usernum to_usernum [ 'go' ]\n
+ (Specify 'go' to actually apply changes.)\n\n";
+}