fix the auto sqlradiusupgrade
[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;
74 print join "\n", prune_applications($hashref) unless $opt_s;
75 print "\n" if $DRY_RUN;
76
77 if ( $dbh->{Driver}->{Name} =~ /^mysql/i && ! $opt_s ) {
78
79   my $sth = $dbh->prepare(
80     "SELECT COUNT(*) FROM duplicate_lock WHERE lockname = 'svc_acct'"
81   ) or die $dbh->errstr;
82
83   $sth->execute or die $sth->errstr;
84
85   unless ( $sth->fetchrow_arrayref->[0] ) {
86
87     $sth = $dbh->prepare(
88       "INSERT INTO duplicate_lock ( lockname ) VALUES ( 'svc_acct' )"
89     ) or die $dbh->errstr;
90
91     $sth->execute or die $sth->errstr;
92
93   }
94 }
95
96 $dbh->commit or die $dbh->errstr;
97
98 dbdef_create($dbh, $dbdef_file);
99
100 $dbh->disconnect or die $dbh->errstr;
101
102 delete $FS::Schema::dbdef_cache{$dbdef_file}; #force an actual reload
103 $FS::UID::AutoCommit = 0;
104 $FS::UID::callback_hack = 1;
105 $dbh = adminsuidsetup($user);
106 $FS::UID::callback_hack = 0;
107 unless ( $DRY_RUN ) {
108   my $dir = "%%%FREESIDE_CONF%%%/conf.". datasrc;
109   if (!scalar(qsearch('conf', {}))) {
110     my $error = FS::Conf::init_config($dir);
111     if ($error) {
112       warn "CONFIGURATION UPGRADE FAILED\n";
113       $dbh->rollback or die $dbh->errstr;
114       die $error;
115     }
116   }
117 }
118 $dbh->commit or die $dbh->errstr;
119 $dbh->disconnect or die $dbh->errstr;
120
121 $dbh = adminsuidsetup($user);
122
123 upgrade()
124   unless $DRY_RUN || $opt_s;
125
126 upgrade_sqlradius()
127   unless $DRY_RUN || $opt_s;
128
129 $dbh->commit or die $dbh->errstr;
130 $dbh->disconnect or die $dbh->errstr;
131
132 ###
133
134 sub dbdef_create { # reverse engineer the schema from the DB and save to file
135   my( $dbh, $file ) = @_;
136   my $dbdef = new_native DBIx::DBSchema $dbh;
137   $dbdef->save($file);
138 }
139
140 sub usage {
141   die "Usage:\n  freeside-upgrade [ -d ] [ -s ] [ -q | -v ] user\n"; 
142 }
143
144 =head1 NAME
145
146 freeside-upgrade - Upgrades database schema for new freeside verisons.
147
148 =head1 SYNOPSIS
149
150   freeside-upgrade [ -d ] [ -s ] [ -q | -v ]
151
152 =head1 DESCRIPTION
153
154 Reads your existing database schema and updates it to match the current schema,
155 adding any columns or tables necessary.
156
157 Also performs other upgrade functions:
158
159 =over 4
160
161 =item Calls FS:: Misc::prune::prune_applications (probably unnecessary every upgrade, but simply won't find any records to change)
162
163 =item If necessary, moves your configuration information from the filesystem in /usr/local/etc/freeside/conf.<datasrc> to the database.
164
165 =back
166
167   [ -d ]: Dry run; output SQL statements (to STDOUT) only, but do not execute
168           them.
169
170   [ -q ]: Run quietly.  This may become the default at some point.
171
172   [ -v ]: Run verbosely, sending debugging information to STDERR.  This is the
173           current default.
174
175   [ -s ]: Schema changes only.  Useful for Pg/slony slaves where the data
176           changes will be replicated from the Pg/slony master.
177
178 =head1 SEE ALSO
179
180 =cut
181