summaryrefslogtreecommitdiff
path: root/FS/bin/freeside-setup
blob: d6e191f3bc2671384ac505e838392973d2529597 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#!/usr/bin/perl -w

=head1 NAME

freeside-setup

=cut

#to delay loading dbdef until we're ready
BEGIN { $FS::Schema::setup_hack = 1; }

#to allow initial insert
use FS::part_pkg;
$FS::part_pkg::setup_hack = 1;
$FS::part_pkg::setup_hack = 1;

use strict;
use vars qw($opt_u $opt_d $opt_v $opt_q);
use Getopt::Std;
use FS::UID qw(adminsuidsetup datasrc checkeuid getsecrets);
use FS::CurrentUser;
use FS::Schema qw( dbdef_dist reload_dbdef );
use FS::Record qw( qsearch );
#use FS::raddb;
use FS::Setup qw(create_initial_data);
use FS::Conf;

die "Not running uid freeside!" unless checkeuid();

#my %attrib2db =
#  map { lc($FS::raddb::attrib{$_}) => $_ } keys %FS::raddb::attrib;

getopts("u:vqd:");
$opt_v = 1 unless $opt_q; #verbose by default now

my $config_dir = shift || '%%%DIST_CONF%%%' ;
$config_dir =~ /^([\w.:=\/]+)$/
  or die "unacceptable configuration directory name";
$config_dir = $1;

getsecrets();

#needs to match FS::Record
my($dbdef_file) = "%%%FREESIDE_CONF%%%/dbdef.". datasrc;

my $username_len = 32;

###
# create a dbdef object from the old data structure
###

warn "Loading schema objects\n" if $opt_v;

my $dbdef = dbdef_dist(datasrc);

#important
$dbdef->save($dbdef_file);
&FS::Schema::reload_dbdef($dbdef_file);

###
# create 'em
###

warn "Connecting to database\n" if $opt_v;

$FS::CurrentUser::upgrade_hack = 1;
$FS::UID::callback_hack = 1;
my $dbh = adminsuidsetup $opt_u; #$user;
$FS::UID::callback_hack = 0;

#create tables
$|=1;

warn "Creating tables and indices\n" if $opt_v;

foreach my $statement ( $dbdef->sql($dbh) ) {
  $dbh->do( $statement )
    or die "CREATE error: ". $dbh->errstr. "\ndoing statement: $statement";
}

#now go back and reverse engineer the db
#so we pick up the correct column DEFAULTs for #oidless inserts
dbdef_create($dbh, $dbdef_file);
delete $FS::Schema::dbdef_cache{$dbdef_file}; #force an actual reload
reload_dbdef($dbdef_file);

warn "Tables and indices created - commiting transaction\n" if $opt_v;
$dbh->commit or die $dbh->errstr;
$dbh->disconnect or die $dbh->errstr;
warn "Database schema committed successfully\n" if $opt_v;

warn "Initializing configuration\n" if $opt_v;
$FS::UID::callback_hack = 1;
$dbh = adminsuidsetup $opt_u;
$FS::UID::callback_hack = 0;
if (!scalar(qsearch('conf', {}))) {
  my $error = FS::Conf::init_config($config_dir);
  if ($error) {
    $dbh->rollback or die $dbh->errstr;
    die $error;
  }
}

warn "Configuration initialized - commiting transaction\n" if $opt_v;
$dbh->commit or die $dbh->errstr;
$dbh->disconnect or die $dbh->errstr;
warn "Configuration committed successfully\n" if $opt_v;

$dbh = adminsuidsetup $opt_u;
create_initial_data('domain' => $opt_d);

warn "Database initialized - commiting transaction\n" if $opt_v;
$dbh->commit or die $dbh->errstr;
$dbh->disconnect or die $dbh->errstr;
warn "Database initialization committed successfully\n" if $opt_v;

sub dbdef_create { # reverse engineer the schema from the DB and save to file
  my( $dbh, $file ) = @_;
  my $dbdef = new_native DBIx::DBSchema $dbh;
  $dbdef->save($file);
}

sub usage {
  die "Usage:\n  freeside-setup -d domain.name [ -q ] [ config/dir ]\n"
  # [ -u user ] for devel/multi-db installs
}

1;