0b5758d8e33089501d8d9c3d2042d04a1d62ad1c
[freeside.git] / FS / bin / freeside-upgrade
1 #!/usr/bin/perl -w
2
3 use strict;
4 use vars qw($opt_d $opt_s $opt_q $opt_v);
5 use vars qw($DEBUG $DRY_RUN);
6 use Getopt::Std;
7 use DBIx::DBSchema 0.31;
8 use FS::UID qw(adminsuidsetup checkeuid datasrc );  #getsecrets);
9 use FS::CurrentUser;
10 use FS::Schema qw( dbdef dbdef_dist reload_dbdef );
11 use FS::Misc::prune qw(prune_applications);
12 use FS::Conf;
13 use FS::Record qw(qsearch);
14 use FS::Upgrade qw(upgrade upgrade_sqlradius);
15
16 die "Not running uid freeside!" unless checkeuid();
17
18 getopts("dqs");
19
20 $DEBUG = !$opt_q;
21 #$DEBUG = $opt_v;
22
23 $DRY_RUN = $opt_d;
24
25 my $user = shift or die &usage;
26 $FS::CurrentUser::upgrade_hack = 1;
27 $FS::UID::callback_hack = 1;
28 my $dbh = adminsuidsetup($user);
29 $FS::UID::callback_hack = 0;
30
31 #needs to match FS::Schema...
32 my $dbdef_file = "%%%FREESIDE_CONF%%%/dbdef.". datasrc;
33
34 dbdef_create($dbh, $dbdef_file);
35
36 delete $FS::Schema::dbdef_cache{$dbdef_file}; #force an actual reload
37 reload_dbdef($dbdef_file);
38
39 $DBIx::DBSchema::DEBUG = $DEBUG;
40 $DBIx::DBSchema::Table::DEBUG = $DEBUG;
41 $DBIx::DBSchema::Index::DEBUG = $DEBUG;
42
43 my @bugfix = ();
44
45 if (dbdef->table('cust_main')->column('agent_custid') && ! $opt_s) { 
46   push @bugfix,
47     "UPDATE cust_main SET agent_custid = NULL where agent_custid = ''";
48
49   push @bugfix,
50     "UPDATE h_cust_main SET agent_custid = NULL where agent_custid = ''"
51       if (dbdef->table('h_cust_main')); 
52 }
53
54 #you should have run fs-migrate-part_svc ages ago, when you upgraded
55 #from 1.3 to 1.4... if not, it needs to be hooked into -upgrade here or
56 #you'll lose all the part_svc settings it migrates to part_svc_column
57
58 if ( $DRY_RUN ) {
59   print
60     join(";\n", @bugfix, dbdef->sql_update_schema( dbdef_dist(datasrc), $dbh ) ). ";\n";
61   exit;
62 } else {
63   foreach my $statement ( @bugfix ) {
64     $dbh->do( $statement )
65       or die "Error: ". $dbh->errstr. "\n executing: $statement";
66   }
67
68   dbdef->update_schema( dbdef_dist(datasrc), $dbh );
69 }
70
71 my $hashref = {};
72 $hashref->{dry_run} = 1 if $DRY_RUN;
73 $hashref->{debug} = 1 if $DEBUG && $DRY_RUN;
74 prune_applications($hashref) unless $opt_s;
75
76 print "\n" if $DRY_RUN;
77
78 if ( $dbh->{Driver}->{Name} =~ /^mysql/i && ! $opt_s ) {
79
80   foreach my $table (qw( svc_acct svc_phone )) {
81
82     my $sth = $dbh->prepare(
83       "SELECT COUNT(*) FROM duplicate_lock WHERE lockname = '$table'"
84     ) or die $dbh->errstr;
85
86     $sth->execute or die $sth->errstr;
87
88     unless ( $sth->fetchrow_arrayref->[0] ) {
89
90       $sth = $dbh->prepare(
91         "INSERT INTO duplicate_lock ( lockname ) VALUES ( '$table' )"
92       ) or die $dbh->errstr;
93
94       $sth->execute or die $sth->errstr;
95
96     }
97
98   }
99
100 }
101
102 $dbh->commit or die $dbh->errstr;
103
104 dbdef_create($dbh, $dbdef_file);
105
106 $dbh->disconnect or die $dbh->errstr;
107
108 delete $FS::Schema::dbdef_cache{$dbdef_file}; #force an actual reload
109 $FS::UID::AutoCommit = 0;
110 $FS::UID::callback_hack = 1;
111 $dbh = adminsuidsetup($user);
112 $FS::UID::callback_hack = 0;
113 unless ( $DRY_RUN ) {
114   my $dir = "%%%FREESIDE_CONF%%%/conf.". datasrc;
115   if (!scalar(qsearch('conf', {}))) {
116     my $error = FS::Conf::init_config($dir);
117     if ($error) {
118       warn "CONFIGURATION UPGRADE FAILED\n";
119       $dbh->rollback or die $dbh->errstr;
120       die $error;
121     }
122   }
123 }
124 $dbh->commit or die $dbh->errstr;
125 $dbh->disconnect or die $dbh->errstr;
126
127 $dbh = adminsuidsetup($user);
128
129 upgrade()
130   unless $DRY_RUN || $opt_s;
131
132 upgrade_sqlradius()
133   unless $DRY_RUN || $opt_s;
134
135 $dbh->commit or die $dbh->errstr;
136 $dbh->disconnect or die $dbh->errstr;
137
138 ###
139
140 sub dbdef_create { # reverse engineer the schema from the DB and save to file
141   my( $dbh, $file ) = @_;
142   my $dbdef = new_native DBIx::DBSchema $dbh;
143   $dbdef->save($file);
144 }
145
146 sub usage {
147   die "Usage:\n  freeside-upgrade [ -d ] [ -s ] [ -q | -v ] user\n"; 
148 }
149
150 =head1 NAME
151
152 freeside-upgrade - Upgrades database schema for new freeside verisons.
153
154 =head1 SYNOPSIS
155
156   freeside-upgrade [ -d ] [ -s ] [ -q | -v ]
157
158 =head1 DESCRIPTION
159
160 Reads your existing database schema and updates it to match the current schema,
161 adding any columns or tables necessary.
162
163 Also performs other upgrade functions:
164
165 =over 4
166
167 =item Calls FS:: Misc::prune::prune_applications (probably unnecessary every upgrade, but simply won't find any records to change)
168
169 =item If necessary, moves your configuration information from the filesystem in /usr/local/etc/freeside/conf.<datasrc> to the database.
170
171 =back
172
173   [ -d ]: Dry run; output SQL statements (to STDOUT) only, but do not execute
174           them.
175
176   [ -q ]: Run quietly.  This may become the default at some point.
177
178   [ -v ]: Run verbosely, sending debugging information to STDERR.  This is the
179           current default.
180
181   [ -s ]: Schema changes only.  Useful for Pg/slony slaves where the data
182           changes will be replicated from the Pg/slony master.
183
184 =head1 SEE ALSO
185
186 =cut
187