diff options
Diffstat (limited to 'bin/merge-user')
-rwxr-xr-x | bin/merge-user | 71 |
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"; +} |