mvhub-dev team mailing list archive
-
mvhub-dev team
-
Mailing list archive
-
Message #00028
[Branch ~mvhub-dev/mvhub/trunk] Rev 352: merged create_config_in_mv_setup
Merge authors:
Lee Goodrich (leegoodrich)
Related merge proposals:
https://code.launchpad.net/~leegoodrich/mvhub/create_config_in_mv_setup/+merge/22003
proposed by: Dan MacNeil (omacneil)
review: Resubmit - Dan MacNeil (omacneil)
------------------------------------------------------------
revno: 352 [merge]
committer: Lee Goodrich <lgoodrich@xxxxxxxxxx>
branch nick: trunk
timestamp: Thu 2010-03-25 15:03:21 -0400
message:
merged create_config_in_mv_setup
modified:
app-mvhub/project-tools/bin/mv_setup
app-mvhub/project-tools/templates/template.conf
lib-mvhub/t/conf/all.conf
--
lp:mvhub
https://code.launchpad.net/~mvhub-dev/mvhub/trunk
Your team mvhub-dev is subscribed to branch lp:mvhub.
To unsubscribe from this branch go to https://code.launchpad.net/~mvhub-dev/mvhub/trunk/+edit-subscription.
=== modified file 'app-mvhub/project-tools/bin/mv_setup'
--- app-mvhub/project-tools/bin/mv_setup 2010-03-10 19:51:30 +0000
+++ app-mvhub/project-tools/bin/mv_setup 2010-03-25 18:51:21 +0000
@@ -7,22 +7,28 @@
use Carp;
use DBI;
use IO::Prompt;
+use Config::Simple;
+use MVHub::Utils::ConfigSimple;
use English '-no_match_vars';
{ # main
local $OUTPUT_AUTOFLUSH=1;
-
+
my $USERNAME = get_username_or_die();
-
+ my $cfg = MVHub::Utils::ConfigSimple::create_config_from($ENV{MV_CONFIG_FILE});
+ my @WEBSITE_CODES = qw/ mvh nsp /;
+
+ my $base_dir = $cfg->param('BASE.dir');
+
# should have nothing left on command line
# at this point
die usage() if scalar @ARGV;
system('clear');
-
- print "(re)making dirs in /var/www/mvhub/$USERNAME...";
- my @dirs = get_dirs_with( '/var/www/mvhub/', $USERNAME );
+
+ print "(re)making dirs in $base_dir$USERNAME...";
+ my @dirs = get_dirs_with( "$base_dir", $USERNAME );
make_dirs_from( $USERNAME, \@dirs );
print "..done\n";
@@ -36,39 +42,172 @@
my $DBH = get_dbh();
print "...done\n"
- if make_dbs_for( $DBH, $USERNAME );;
- }
-}
-
-sub get_username_or_die {
- my $username =
- shift @ARGV
- || $ENV{NEW_DEV_USER}
- || ( defined $ENV{MV_CONFIG_FILE} ? $ENV{USER} : undef );
-
- if ( !$username ) {
- die "No username defined" . usage();
- }
- my @ignore = getpwnam($username);
-
- if ( !scalar @ignore ) {
- die "'$username' is not a valid username" . usage();
- }
-
- return $username;
-}
-
-sub usage {
- return << "USAGE";
-
-Usage:
- mv_setup <username>
-or:
- export NEW_DEV_USER=<username> && mv_setup
-or:
- cdw && mv_setup
-USAGE
-
+ if make_dbs_for( $DBH, $USERNAME, @WEBSITE_CODES );;
+ }
+ create_config_files_for($USERNAME, $cfg, @WEBSITE_CODES);
+}
+
+sub add_calculable_values{
+ my $template_cfg = shift or croak 'missing param: $template_cfg';
+ my $username = shift or croak 'missing param: $username';
+ my $site_code = shift or croak 'missing param: $site_code';
+
+ $template_cfg->param('DATABASE.database_name',"$username.$site_code");
+ $template_cfg->param('DATABASE.database_user',"$username");
+ $template_cfg->param('NOTIFICATION.admin_email', "$username\@thecsl.org");
+ $template_cfg->param('NOTIFICATION.dev_email', "$username\@thecsl.org");
+ $template_cfg->param('SITE.website_name',"$site_code.$username.testing123.net");
+
+ return $template_cfg;
+}
+
+sub add_site_specific_values{
+ my $template_cfg = shift or croak 'missing param: $template_cfg';
+ my $username = shift or croak 'missing param: $username';
+ my %site_specific_values = %_;
+
+ foreach my $key (keys %site_specific_values){
+ $template_cfg->param($key, $site_specific_values{$key});
+ }
+ return $template_cfg;
+}
+
+sub add_user_generated_values{
+ my $template_cfg = shift or croak 'missing param: $template_cfg';
+ my $user_cfg = shift or croak 'missing param: $user_cfg';
+ my @keys = @_;
+
+ foreach my $key (@keys){
+ if (!($user_cfg->param($key))){
+ prompt("Please enter a value for $key: ");
+ $template_cfg->param($key,$_);
+ }
+ }
+ return $template_cfg;
+}
+
+sub create_config_files_for{
+ my $username = shift;
+ my $cfg = shift;
+ my @website_codes = @_;
+ my @keys_for_user_generated_values = qw/ DATABASE.database_magic_word /;
+
+ my $base_dir = $cfg->param('BASE.dir');
+ my $template_cfg = new Config::Simple($cfg->param('ABSOLUTE_PATH.template_conf_dir') . "/template.conf");
+
+ foreach my $site_code (@website_codes){
+ my $user_cfg = new Config::Simple(syntax=>'ini');
+ if (-e "$base_dir/$username/conf/$site_code.conf") {
+ $user_cfg-> read("$base_dir/$username/conf/$site_code.conf");
+ }
+
+ print "Editing Config: $base_dir/$username/conf/$site_code.conf\n";
+ my %site_specific_values = get_site_specific_values($site_code);
+
+ $template_cfg = add_site_specific_values($template_cfg, $username, %site_specific_values);
+ $template_cfg = add_calculable_values($template_cfg, $username, $site_code);
+ $template_cfg = add_user_generated_values($template_cfg, $user_cfg, @keys_for_user_generated_values);
+
+ merge_conf_objects($template_cfg, $user_cfg);
+
+ $user_cfg->write("$base_dir/$username/conf/$site_code.conf");
+ }
+}
+
+sub db_exists {
+ my $dbh = shift or croak 'missing param: $dbh';
+ my $db_name = shift or croak 'missing param: $db_name';
+
+ my $sql = <<"SQL";
+SELECT
+ datname
+FROM
+ pg_database
+WHERE
+ datname = ?
+SQL
+
+ my $matching_dbs_aref = $dbh->selectall_arrayref( $sql, {}, ($db_name) );
+ return scalar @$matching_dbs_aref;
+
+}
+
+sub db_user_found {
+ my $dbh = shift or croak 'missing param: $dbh';
+ my $username = shift or croak 'missing param: $username';
+
+ my $sql = <<"SQL";
+SELECT
+ usename
+FROM
+ pg_user
+WHERE
+ usename = ?
+SQL
+
+ my $matching_db_users_aref =
+ $dbh->selectall_arrayref( $sql, {}, ($username) );
+ return scalar @$matching_db_users_aref;
+}
+
+sub db_user_has_needed_roles {
+ my $dbh = shift or croak 'missing param: $dbh';
+ my $username = shift or croak 'missing param: $username';
+
+ my $sql = <<"SQL";
+SELECT
+ rolname,rolcreaterole,rolcreatedb
+FROM
+ pg_roles
+WHERE
+ rolname = ?
+SQL
+
+ my $role_rows_aref = $dbh->selectall_arrayref( $sql, {Slice =>{} }, ($username) );
+ my $result = $$role_rows_aref[0]{rolcreaterole}
+ && $$role_rows_aref[0]{rolcreatedb};
+
+ return $result ? 1 :0;
+}
+
+sub db_user_has_superuser_role {
+ my $dbh = shift or croak 'missing param: $dbh';
+ my $username = shift or croak 'missing param: $username';
+
+ my $sql = <<"SQL";
+SELECT
+ rolname,rolsuper
+FROM
+ pg_roles
+WHERE
+ rolname = ?
+SQL
+
+ my $role_rows_aref = $dbh->selectall_arrayref( $sql, {Slice=>{}}, ($username) );
+ return $$role_rows_aref[0]{rolsuper} ? 1:0;
+}
+
+sub do_or_die {
+ my $cmd = shift or croak 'missing param: $cmd';
+ $cmd =~ s/^\s+//;
+ my @cmd = split /\s+/, $cmd;
+ ( system(@cmd) == 0 )
+ or die "$cmd failed ABORTING\n";
+}
+
+# depends a lot on brave.thecsl.org enviroment
+sub get_dbh {
+
+ my %attr = (
+ 'PrintError' => 0,
+ 'RaiseError' => 1,
+ 'AutoCommit' => 1,
+ 'ShowErrorStatement' => 1,
+ );
+ my $dbh = DBI->connect( 'dbi:Pg:dbname=template1', '', '', \%attr )
+ or die "couldn't connect to database";
+
+ return $dbh;
}
sub get_dirs_with {
@@ -135,9 +274,106 @@
return @dirs;
}
+sub get_site_specific_values{
+ my $site_code = shift or croak 'missing param: $site_code';
+
+ my %hash_of_site_specific_values = (
+ 'mvh' => {
+ 'SITE.location' => '"Massachusetts Merrimack Valley"',
+ 'SITE.website_description' => 'Merrimack Valley Hub',
+ 'NOTIFICATION.team_name' => 'Merrimack Valley Hub Team'},
+ 'nsp' => {
+ 'SITE.location' => '"Massachusetts North Shore"',
+ 'SITE.website_description' => 'North Shore Portal',
+ 'NOTIFICATION.team_name' => 'North Shore Portal Team'});
+ return %{$hash_of_site_specific_values{$site_code}};
+}
+
+sub get_username_or_die {
+ my $username =
+ shift @ARGV
+ || $ENV{NEW_DEV_USER}
+ || ( defined $ENV{MV_CONFIG_FILE} ? $ENV{USER} : undef );
+
+ if ( !$username ) {
+ die "No username defined" . usage();
+ }
+ my @ignore = getpwnam($username);
+
+ if ( !scalar @ignore ) {
+ die "'$username' is not a valid username" . usage();
+ }
+
+ return $username;
+}
+
+sub load_test_data_for {
+ my $dbh = shift or croak 'missing param: $dbh';
+ my $username = shift or croak 'missing param: $username';
+ my $suffix = shift or croak 'missing param: $db_name';
+
+ my $cfg =
+ MVHub::Utils::ConfigSimple::create_config_from($ENV{MV_CONFIG_FILE});
+
+ my $path_to_project_tools = $cfg->param('ABSOLUTE_PATH.project_tools_dir');
+ my $db_password = $cfg->param('DATABASE.database_magic_word');
+
+
+ my $cmd = "export PGPASSWORD=$db_password ";
+ $cmd .= "&& psql -h localhost -U $username -d $username.$suffix ";
+ $cmd .= "-f ${path_to_project_tools}/test_${suffix}_db.sql >/dev/null 2>/dev/null";
+
+ ( system($cmd) == 0 )
+ or warn "failed to load data for $username.$suffix";
+
+}
+
+sub make_dbs_for {
+ my $dbh = shift or croak 'missing param: $dbh';
+ my $username = shift or croak 'missing param: $username';
+ my @website_codes = @_;
+
+ my $sql;
+
+ if ( !db_user_has_needed_roles( $dbh, $ENV{USER} ) ) {
+ warn "\nSkipping db stuff $ENV{USER} lacks CREATEDB or CREATEROLE\n";
+ return;
+ }
+
+ if ( ( $ENV{USER} ne $username )
+ && !db_user_has_superuser_role($dbh,$ENV{USER}) ){
+ my $msg = qq/
+ skipping db stuff $ENV{USER} can't drop table owned by $username
+ without role SUPERUSER
+ /;
+ warn $msg;
+ return;
+ }
+
+ if ( !db_user_found( $dbh, $username ) ) {
+ $sql = "CREATE USER $username WITH PASSWORD 'test' CREATEDB CREATEROLE";
+ $dbh->do($sql);
+ }
+
+ foreach my $suffix ( @website_codes ) {
+ if ( db_exists( $dbh, "$username.$suffix" ) ) {
+ $sql = qq{DROP DATABASE "$username.${suffix}"};
+ $dbh->do($sql);
+ }
+ # kludge to avoid 'db being currently being accessed' errs
+ sleep 1;
+
+ $sql = qq{CREATE DATABASE "$username.${suffix}" OWNER $username};
+ $dbh->do($sql);
+
+ load_test_data_for( $dbh, $username, $suffix );
+ }
+return 1;
+}
+
sub make_dirs_from {
my $username = shift or croak 'missing param: $username';
- my $dir_hrefs_href = shift or croak 'missing param:dir_hrefs_href';
+ my $dir_hrefs_href = shift or croak 'missing param: $dir_hrefs_href';
my @dir_hrefs = @$dir_hrefs_href;
my $sudo_cmd;
@@ -171,159 +407,29 @@
}
}
-sub do_or_die {
- my $cmd = shift or croak 'missing param: $cmd';
- $cmd =~ s/^\s+//;
- my @cmd = split /\s+/, $cmd;
- ( system(@cmd) == 0 )
- or die "$cmd failed ABORTING\n";
-}
-
-# depends a lot on brave.thecsl.org enviroment
-sub get_dbh {
-
- my %attr = (
- 'PrintError' => 0,
- 'RaiseError' => 1,
- 'AutoCommit' => 1,
- 'ShowErrorStatement' => 1,
- );
- my $dbh = DBI->connect( 'dbi:Pg:dbname=template1', '', '', \%attr )
- or die "couldn't connect to database";
-
- return $dbh;
-}
-
-sub make_dbs_for {
- my $dbh = shift or croak 'missing param: $dbh';
- my $username = shift or croak 'missing param: $username';
-
- my $sql;
-
- if ( !db_user_has_needed_roles( $dbh, $ENV{USER} ) ) {
- warn "\nSkipping db stuff $ENV{USER} lacks CREATEDB or CREATEROLE\n";
- return;
- }
-
- if ( ( $ENV{USER} ne $username )
- && !db_user_has_superuser_role($dbh,$ENV{USER}) ){
- my $msg = qq/
- skipping db stuff $ENV{USER} can't drop table owned by $username
- without role SUPERUSER
- /;
- warn $msg;
- return;
- }
-
- if ( !db_user_found( $dbh, $username ) ) {
- $sql = "CREATE USER $username WITH PASSWORD 'test' CREATEDB CREATEROLE";
- $dbh->do($sql);
- }
-
- foreach my $suffix qw/nsp mvh/ {
- if ( db_exists( $dbh, "$username.$suffix" ) ) {
- $sql = qq{DROP DATABASE "$username.${suffix}"};
- $dbh->do($sql);
- }
- # kludge to avoid 'db being currently being accessed' errs
- sleep 1;
-
- $sql = qq{CREATE DATABASE "$username.${suffix}" OWNER $username};
- $dbh->do($sql);
-
- load_test_data_for( $dbh, $username, $suffix );
- }
-return 1;
-}
-
-sub db_user_found {
- my $dbh = shift or croak 'missing param: $dbh';
- my $username = shift or croak 'missing param: $username';
-
- my $sql = <<"SQL";
-SELECT
- usename
-FROM
- pg_user
-WHERE
- usename = ?
-SQL
-
- my $matching_db_users_aref =
- $dbh->selectall_arrayref( $sql, {}, ($username) );
- return scalar @$matching_db_users_aref;
-}
-
-sub db_user_has_needed_roles {
- my $dbh = shift or croak 'missing param: $dbh';
- my $username = shift or croak 'missing param: $username';
-
- my $sql = <<"SQL";
-SELECT
- rolname,rolcreaterole,rolcreatedb
-FROM
- pg_roles
-WHERE
- rolname = ?
-SQL
-
- my $role_rows_aref = $dbh->selectall_arrayref( $sql, {Slice =>{} }, ($username) );
- my $result = $$role_rows_aref[0]{rolcreaterole}
- && $$role_rows_aref[0]{rolcreatedb};
-
- return $result ? 1 :0;
-}
-
-sub db_user_has_superuser_role {
- my $dbh = shift or croak 'missing param: $dbh';
- my $username = shift or croak 'missing param: $username';
-
- my $sql = <<"SQL";
-SELECT
- rolname,rolsuper
-FROM
- pg_roles
-WHERE
- rolname = ?
-SQL
-
- my $role_rows_aref = $dbh->selectall_arrayref( $sql, {Slice=>{}}, ($username) );
- return $$role_rows_aref[0]{rolsuper} ? 1:0;
-}
-
-sub db_exists {
- my $dbh = shift or croak 'missing param: $dbh';
- my $db_name = shift or croak 'missing param: $db_name';
-
- my $sql = <<"SQL";
-SELECT
- datname
-FROM
- pg_database
-WHERE
- datname = ?
-SQL
-
- my $matching_dbs_aref = $dbh->selectall_arrayref( $sql, {}, ($db_name) );
- return scalar @$matching_dbs_aref;
-
-}
-
-sub load_test_data_for {
- my $dbh = shift or croak 'missing param: $dbh';
- my $username = shift or croak 'missing param: $username';
- my $suffix = shift or croak 'missing param: $db_name';
-
- # KLUDGE PATH
- my $dir =
- "/var/www/mvhub/$ENV{USER}/link-to-live-code/app-mvhub/project-tools/";
-
- # KLUDGE HARD-CODED password
- my $cmd = "export PGPASSWORD='test' ";
- $cmd .= "&& psql -h localhost -U $username -d $username.$suffix ";
- $cmd .= "-f ${dir}/test_${suffix}_db.sql >/dev/null 2>/dev/null";
-
- ( system($cmd) == 0 )
- or warn "failed to load data for $username.$suffix";
-
-}
+sub merge_conf_objects{
+ my $template_cfg = shift or croak 'missing param: $template_cfg';
+ my $user_cfg = shift or croak 'missing param: $user_cfg';
+
+ foreach my $key ($template_cfg->param()){
+
+ if (! ($user_cfg->param($key))){
+ $user_cfg->param($key, $template_cfg->param($key));
+ }
+ }
+ return $user_cfg;
+}
+
+sub usage {
+ return << "USAGE";
+
+Usage:
+ mv_setup <username>
+or:
+ export NEW_DEV_USER=<username> && mv_setup
+or:
+ cdw && mv_setup
+USAGE
+
+}
+
=== modified file 'app-mvhub/project-tools/templates/template.conf'
--- app-mvhub/project-tools/templates/template.conf 2010-03-08 08:04:23 +0000
+++ app-mvhub/project-tools/templates/template.conf 2010-03-23 17:11:37 +0000
@@ -99,9 +99,11 @@
[RELATIVE_PATH]
conf_dir=link-to-live-code/app-mvhub/conf/
+template_conf_dir=link-to-live-code/app-mvhub/project-tools/templates/
template_html_dir=link-to-live-code/app-mvhub/conf/templates/html/
template_text_dir=link-to-live-code/app-mvhub/conf/templates/text/
reports_dir=reports/
+project_tools_dir=link-to-live-code/app-mvhub/project-tools/
tmp_dir=tmp/
[COOKIES]
=== modified file 'lib-mvhub/t/conf/all.conf'
--- lib-mvhub/t/conf/all.conf 2010-02-01 01:50:40 +0000
+++ lib-mvhub/t/conf/all.conf 2010-03-23 17:14:10 +0000
@@ -86,9 +86,11 @@
[RELATIVE_PATH]
conf_dir=link-to-live-code/app-mvhub/conf/
+template_conf_dir=link-to-live-code/app-mvhub/project-tools/templates/
template_html_dir=link-to-live-code/app-mvhub/conf/templates/html/
template_text_dir=link-to-live-code/app-mvhub/conf/templates/text/
reports_dir=reports/
+project_tools_dir=link-to-live-code/app-mvhub/project-tools/
tmp_dir=tmp/
[COOKIES]