summaryrefslogtreecommitdiff
path: root/FS/bin/freeside-setup
blob: 155c74aa0dd13eaafee0cfa587fa5f0a20104632 (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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#!/usr/bin/perl -w

#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($opt_u);

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

###

my $username_len = 32;

#print "\n\n", <<END, ":";
#Freeside tracks the RADIUS User-Name, check attribute Password and
#reply attribute Framed-IP-Address for each user.  You can specify additional
#check and reply attributes (or you can add them later with the
#fs-radius-add-check and fs-radius-add-reply programs).
#
#First enter any additional RADIUS check attributes you need to track for each 
#user, separated by whitespace.
#END
#my @check_attributes = map { $attrib2db{lc($_)} or die "unknown attribute $_"; }
#                         split(" ",&getvalue);
#
#print "\n\n", <<END, ":";
#Now enter any additional reply attributes you need to track for each user,
#separated by whitespace.
#END
#my @attributes = map { $attrib2db{lc($_)} or die "unknown attribute $_"; }
#                   split(" ",&getvalue);
#
#print "\n\n", <<END, ":";
#Do you wish to enable the tracking of a second, separate shipping/service
#address?
#END
#my $ship = &_yesno;
#
#sub getvalue {
#  my($x)=scalar(<STDIN>);
#  chop $x;
#  $x;
#}
#
#sub _yesno {
#  print " [y/N]:";
#  my $x = scalar(<STDIN>);
#  $x =~ /^y/i;
#}

#my @check_attributes = (); #add later
#my @attributes = (); #add later
#my $ship = $opt_s;

###
# 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;