From b02e2d439440c8069879e87adaacc5d9c9147080 Mon Sep 17 00:00:00 2001 From: mark Date: Fri, 11 Jun 2010 04:14:23 +0000 Subject: [PATCH] RT#8691: script to merge usernums --- bin/apache.export | 8 +++++++ bin/merge-user | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100755 bin/merge-user diff --git a/bin/apache.export b/bin/apache.export index 82eb6d6b0..124a3c5bf 100755 --- a/bin/apache.export +++ b/bin/apache.export @@ -47,6 +47,14 @@ foreach my $export ( @exports ) { use vars qw($zone $username $dir $email $config); $zone = $svc_www->domain_record->zone; $config = $svc_www->config; + my $template; + my $cust_pkg = $svc_www->cust_svc->cust_pkg; + if ( $cust_pkg->getfield('susp') or $cust_pkg->getfield('cancel') ) { + $template = $export->option('template_inactive'); + } + # Use the regular template if the pkg is live + # or if template_inactive doesn't exist. + $template ||= $export->option('template'); if ( $svc_www->svc_acct ) { $username = $svc_www->svc_acct->username; $dir = $svc_www->svc_acct->dir; diff --git a/bin/merge-user b/bin/merge-user new file mode 100755 index 000000000..4aca9a44f --- /dev/null +++ b/bin/merge-user @@ -0,0 +1,64 @@ +#!/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 $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) { + next if $table =~ /^access/; # Don't try to merge these. + if( grep /^usernum$/, FS::Record::real_fields($table) ) { + foreach ($table, "h_$table") { + print "$_: "; + my $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"; +} -- 2.11.0