This commit was generated by cvs2svn to compensate for changes in r8593,
[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 $opt_r);
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 my $start = time;
17
18 die "Not running uid freeside!" unless checkeuid();
19
20 getopts("dqrs");
21
22 $DEBUG = !$opt_q;
23 #$DEBUG = $opt_v;
24
25 $DRY_RUN = $opt_d;
26
27 my $user = shift or die &usage;
28 $FS::CurrentUser::upgrade_hack = 1;
29 $FS::UID::callback_hack = 1;
30 my $dbh = adminsuidsetup($user);
31 $FS::UID::callback_hack = 0;
32
33 #needs to match FS::Schema...
34 my $dbdef_file = "%%%FREESIDE_CONF%%%/dbdef.". datasrc;
35
36 dbdef_create($dbh, $dbdef_file);
37
38 delete $FS::Schema::dbdef_cache{$dbdef_file}; #force an actual reload
39 reload_dbdef($dbdef_file);
40
41 warn "Upgrade startup completed in ". (time-$start). " seconds\n"; # if $DEBUG;
42 $start = time;
43
44 $DBIx::DBSchema::DEBUG = $DEBUG;
45 $DBIx::DBSchema::Table::DEBUG = $DEBUG;
46 $DBIx::DBSchema::Index::DEBUG = $DEBUG;
47
48 my @bugfix = ();
49
50 if (dbdef->table('cust_main')->column('agent_custid') && ! $opt_s) { 
51   push @bugfix,
52     "UPDATE cust_main SET agent_custid = NULL where agent_custid = ''";
53
54   push @bugfix,
55     "UPDATE h_cust_main SET agent_custid = NULL where agent_custid = ''"
56       if (dbdef->table('h_cust_main')); 
57 }
58
59 #you should have run fs-migrate-part_svc ages ago, when you upgraded
60 #from 1.3 to 1.4... if not, it needs to be hooked into -upgrade here or
61 #you'll lose all the part_svc settings it migrates to part_svc_column
62
63 my @statements =
64   grep { $_ !~ /^CREATE +INDEX +h_queue/ } #useless, holds up queue insertion
65        dbdef->sql_update_schema( dbdef_dist(datasrc), $dbh );
66
67 if ( $DRY_RUN ) {
68   print
69     join(";\n", @bugfix, @statements ). ";\n";
70   exit;
71 } else {
72   foreach my $statement ( @bugfix, @statements ) {
73     $dbh->do( $statement )
74       or die "Error: ". $dbh->errstr. "\n executing: $statement";
75   }
76
77 #  warn "Pre-schema change upgrades completed in ". (time-$start). " seconds\n"; # if $DEBUG;
78 #  $start = time;
79
80 #  dbdef->update_schema( dbdef_dist(datasrc), $dbh );
81 }
82
83 warn "Schema upgrade completed in ". (time-$start). " seconds\n"; # if $DEBUG;
84 $start = time;
85
86 my $hashref = {};
87 $hashref->{dry_run} = 1 if $DRY_RUN;
88 $hashref->{debug} = 1 if $DEBUG && $DRY_RUN;
89 prune_applications($hashref) unless $opt_s;
90
91 warn "Application pruning completed in ". (time-$start). " seconds\n"; # if $DEBUG;
92 $start = time;
93
94 print "\n" if $DRY_RUN;
95
96 if ( $dbh->{Driver}->{Name} =~ /^mysql/i && ! $opt_s ) {
97
98   foreach my $table (qw( svc_acct svc_phone )) {
99
100     my $sth = $dbh->prepare(
101       "SELECT COUNT(*) FROM duplicate_lock WHERE lockname = '$table'"
102     ) or die $dbh->errstr;
103
104     $sth->execute or die $sth->errstr;
105
106     unless ( $sth->fetchrow_arrayref->[0] ) {
107
108       $sth = $dbh->prepare(
109         "INSERT INTO duplicate_lock ( lockname ) VALUES ( '$table' )"
110       ) or die $dbh->errstr;
111
112       $sth->execute or die $sth->errstr;
113
114     }
115
116   }
117
118   warn "Duplication lock creation completed in ". (time-$start). " seconds\n"; # if $DEBUG;
119   $start = time;
120
121 }
122
123 $dbh->commit or die $dbh->errstr;
124
125 dbdef_create($dbh, $dbdef_file);
126
127 $dbh->disconnect or die $dbh->errstr;
128
129 delete $FS::Schema::dbdef_cache{$dbdef_file}; #force an actual reload
130 $FS::UID::AutoCommit = 0;
131 $FS::UID::callback_hack = 1;
132 $dbh = adminsuidsetup($user);
133 $FS::UID::callback_hack = 0;
134 unless ( $DRY_RUN || $opt_s ) {
135   my $dir = "%%%FREESIDE_CONF%%%/conf.". datasrc;
136   if (!scalar(qsearch('conf', {}))) {
137     my $error = FS::Conf::init_config($dir);
138     if ($error) {
139       warn "CONFIGURATION UPGRADE FAILED\n";
140       $dbh->rollback or die $dbh->errstr;
141       die $error;
142     }
143   }
144 }
145 $dbh->commit or die $dbh->errstr;
146 $dbh->disconnect or die $dbh->errstr;
147
148 $dbh = adminsuidsetup($user);
149
150 warn "Re-initialization with updated schema completed in ". (time-$start). " seconds\n"; # if $DEBUG;
151 $start = time;
152
153 upgrade()
154   unless $DRY_RUN || $opt_s;
155
156 $dbh->commit or die $dbh->errstr;
157
158 warn "Table updates completed in ". (time-$start). " seconds\n"; # if $DEBUG;
159 $start = time;
160
161 upgrade_sqlradius()
162   unless $DRY_RUN || $opt_s || $opt_r;
163
164 warn "SQL RADIUS updates completed in ". (time-$start). " seconds\n"; # if $DEBUG;
165 $start = time;
166
167 $dbh->commit or die $dbh->errstr;
168 $dbh->disconnect or die $dbh->errstr;
169
170 warn "Final commit and disconnection completed in ". (time-$start). " seconds; upgrade done!\n"; # if $DEBUG;
171
172 ###
173
174 sub dbdef_create { # reverse engineer the schema from the DB and save to file
175   my( $dbh, $file ) = @_;
176   my $dbdef = new_native DBIx::DBSchema $dbh;
177   $dbdef->save($file);
178 }
179
180 sub usage {
181   die "Usage:\n  freeside-upgrade [ -d ] [ -r ] [ -s ] [ -q | -v ] user\n"; 
182 }
183
184 =head1 NAME
185
186 freeside-upgrade - Upgrades database schema for new freeside verisons.
187
188 =head1 SYNOPSIS
189
190   freeside-upgrade [ -d ] [ -r ] [ -s ] [ -q | -v ]
191
192 =head1 DESCRIPTION
193
194 Reads your existing database schema and updates it to match the current schema,
195 adding any columns or tables necessary.
196
197 Also performs other upgrade functions:
198
199 =over 4
200
201 =item Calls FS:: Misc::prune::prune_applications (probably unnecessary every upgrade, but simply won't find any records to change)
202
203 =item If necessary, moves your configuration information from the filesystem in /usr/local/etc/freeside/conf.<datasrc> to the database.
204
205 =back
206
207   [ -d ]: Dry run; output SQL statements (to STDOUT) only, but do not execute
208           them.
209
210   [ -q ]: Run quietly.  This may become the default at some point.
211
212   [ -r ]: Skip sqlradius updates.  Useful for occassions where the sqlradius
213           databases may be inaccessible.
214
215   [ -v ]: Run verbosely, sending debugging information to STDERR.  This is the
216           current default.
217
218   [ -s ]: Schema changes only.  Useful for Pg/slony slaves where the data
219           changes will be replicated from the Pg/slony master.
220
221 =head1 SEE ALSO
222
223 =cut
224