diff options
Diffstat (limited to 'FS/bin/freeside-setup')
-rwxr-xr-x | FS/bin/freeside-setup | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/FS/bin/freeside-setup b/FS/bin/freeside-setup new file mode 100755 index 0000000..155c74a --- /dev/null +++ b/FS/bin/freeside-setup @@ -0,0 +1,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; + + |