#!/usr/bin/perl use warnings; use strict; use DBI; use Getopt::Long; use Passwd::Unix; use Data::Dumper qw(Dumper); my $db_adm = 'ase_lar'; my $db_adm_usr = 'ase_lar'; my $db_root_pwd = 'Ase@22500'; my $db_adm_pwd = 'laravel'; my $db_adm_srv = 'www.aseltd.eu'; my ( $company, $company_id, $company_name ); my ( $company_db_name, $company_db_user, $company_db_pwd ); sub getTimeStamp { # parm [ts] => timestamp for filename; [log] => timestamp for log; [db_ts] => timestamp for db; my $format = "%04d%02d%02d%02d%02d%02d"; my ($p1) = @_; if ( defined $p1 and $p1 eq "log" ) { $format = "%04d%02d%02d %02d:%02d:%02d"; } if ( defined $p1 and $p1 eq "db_ts" ) { $format = "%04d-%02d-%02d %02d:%02d:%02d"; } my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = localtime(time); my $timestamp = sprintf( $format, $year + 1900, $mon + 1, $mday, $hour, $min, $sec ); return $timestamp; } sub generateRandomPassword { my $passwordsize = shift; my @alphanumeric = ( 'a' .. 'z', 'A' .. 'Z', 0 .. 9 ); my $randpassword = join '', map $alphanumeric[ rand @alphanumeric ], 0 .. ( $passwordsize - 1 ); return $randpassword; } sub checkCompanyDBSet { my $dbh = DBI->connect( "DBI:mysql:$db_adm;host=$db_adm_srv", $db_adm_usr, $db_adm_pwd ) or die getTimeStamp("log") . " - pid $$ >> Could not connect to admin database: $DBI::errstr"; my $sth = $dbh->prepare( "select id, name, db_user, db_pwd, db_name from " . "ase_lar.companies where name_short like '" . $company . "%';" ) or die getTimeStamp("log") . " - pid $$ >> $DBI::errstr"; $sth->execute(); if ( $sth->rows < 0 ) { die getTimeStamp("log") . " - pid $$ >> No company selected.\n"; } elsif ( $sth->rows > 1 ) { die getTimeStamp("log") . " - pid $$ >> Too many company selected.\n"; } else { my $results = $sth->fetchrow_hashref; $company_name = $results->{'name'}; $company_id = $results->{'id'}; $company_db_name = $results->{'db_name'}; $company_db_user = $results->{'db_user'}; $company_db_pwd = $results->{'db_pwd'}; print getTimeStamp("log") . " - pid $$ >> Selected company: " . $company_name . ".\n"; } $sth->finish; if ( $company_db_name and $company_db_user and $company_db_pwd ) { return 1; } } sub setCompanyDBSet { my $dbh = DBI->connect( "DBI:mysql:$db_adm;host=$db_adm_srv", $db_adm_usr, $db_adm_pwd ) or die getTimeStamp("log") . " - pid $$ >> Could not connect to admin database: $DBI::errstr"; $company_db_user = sprintf "dbu%08s", $company_id; $company_db_name = sprintf "dbn%08s", $company_id; $company_db_pwd = generateRandomPassword(16); my $sth = $dbh->prepare( "update ase_lar.companies set db_user = '" . $company_db_user . "', db_pwd = '" . $company_db_pwd . "', db_name = '" . $company_db_name . "' where id = " . $company_id . ";" ) or die getTimeStamp("log") . " - pid $$ >> $DBI::errstr"; $sth->execute() or die getTimeStamp("log") . " - pid $$ >> $DBI::errstr"; $sth->finish; return 1; } sub checkCompanyDBGrant() { my $exit_rc = 1; my $dbh = DBI->connect( "DBI:mysql:$db_adm;host=$db_adm_srv", 'root', $db_root_pwd ) or die getTimeStamp("log") . " - pid $$ >> Could not connect to db server: $DBI::errstr"; my $sth = $dbh->prepare( "show grants for '" . $company_db_user . "'\@'localhost';" ) or die getTimeStamp("log") . " - pid $$ >> $DBI::errstr"; if ( !$sth->execute() ) { print getTimeStamp("log") . " - pid $$ >> $DBI::errstr\n"; $exit_rc = 0; } else { my $results = $sth->fetchall_arrayref; my @arr_res = @{$results}; if ( @arr_res == 1 ) { $exit_rc = 0 } } $sth->finish; return $exit_rc; } sub setCompanyDBGrant() { my $dbh = DBI->connect( "DBI:mysql:$db_adm;host=$db_adm_srv", 'root', $db_root_pwd ) or die getTimeStamp("log") . " - pid $$ >> Could not connect to db server: $DBI::errstr"; my $sth_db = $dbh->prepare( "CREATE DATABASE IF NOT EXISTS " . $company_db_name . " CHARACTER SET utf8 COLLATE utf8_general_ci;" ) or die getTimeStamp("log") . " - pid $$ >> $DBI::errstr"; $sth_db->execute() or die getTimeStamp("log") . " - pid $$ >> $DBI::errstr"; $sth_db->finish; my $sth_user = $dbh->prepare( "CREATE USER IF NOT EXISTS '" . $company_db_user . "'\@'localhost' IDENTIFIED BY '" . $company_db_pwd . "';" ) or die getTimeStamp("log") . " - pid $$ >> $DBI::errstr"; $sth_user->execute() or die getTimeStamp("log") . " - pid $$ >> $DBI::errstr"; $sth_user->finish; my $sth_grant = $dbh->prepare( "GRANT ALL PRIVILEGES ON " . $company_db_name . ".* TO '" . $company_db_user . "'\@'localhost' WITH GRANT OPTION;" ) or die getTimeStamp("log") . " - pid $$ >> $DBI::errstr"; $sth_grant->execute() or die getTimeStamp("log") . " - pid $$ >> $DBI::errstr"; $sth_grant->finish; return 1; } sub checkCompanyDBTables() { my $dbh = DBI->connect( "DBI:mysql:$db_adm;host=$db_adm_srv", 'root', $db_root_pwd ) or die getTimeStamp("log") . " - pid $$ >> Could not connect to db server: $DBI::errstr"; my $sth_db = $dbh->prepare( "CREATE DATABASE IF NOT EXISTS " . $company_db_name . " CHARACTER SET utf8 COLLATE utf8_general_ci;" ) or die getTimeStamp("log") . " - pid $$ >> $DBI::errstr"; $sth_db->execute() or die getTimeStamp("log") . " - pid $$ >> $DBI::errstr"; $sth_db->finish; } print getTimeStamp("log") . " - pid $$ >> Execution started.\n"; GetOptions( "company=s" => \$company ) or die("Error in command line arguments\n"); if ( !checkCompanyDBSet() ) { print getTimeStamp("log") . " - pid $$ >> Set Company DB set.\n"; setCompanyDBSet(); } if ( !checkCompanyDBGrant() ) { print getTimeStamp("log") . " - pid $$ >> Set Company user DB grant.\n"; setCompanyDBGrant(); print getTimeStamp("log") . " - pid $$ >> Set Company user DB tables.\n"; setCompanyDBTables(); } print getTimeStamp("log") . " - pid $$ >> Execution ended.\n"; exit;