#!/usr/bin/perl -Ilib -w # $Id: install_honeyclient_db.pl 601 2007-06-21 20:37:41Z kindlund $ use strict; use warnings; use Carp (); use ExtUtils::MakeMaker qw(prompt); use Net::IP qw(ip_is_ipv4); use DBI; use DBI::Const::GetInfoType; use HoneyClient::Util::Config qw(getVar); print "************************************************\n" . "*** HoneyClient Database Installation Script ***\n" . "************************************************\n" . "\n" . "This script will install and configure the\n" . "HoneyClient database onto an existing MySQL server.\n" . "\n" . "Before running this script, you need to edit your\n" . "etc/honeyclient.xml global configuration file and\n" . "make sure that the section\n" . "contains valid database connection information.\n" . "\n"; # Retrieve values from the global configuration file. my $host = getVar(name => "host", namespace => "HoneyClient::DB"); my $user = getVar(name => "user", namespace => "HoneyClient::DB"); my $pass = getVar(name => "pass", namespace => "HoneyClient::DB"); my $database_name = getVar(name => "dbname", namespace => "HoneyClient::DB"); my ($question, $root_password); print "The following database configuration was found:\n\n"; my $buf = sprintf("%s %s\t= '%s'", " " x 4, "host", $host) . "\n" . sprintf("%s %s\t= '%s'", " " x 4, "user", $user) . "\n" . sprintf("%s %s\t= '%s'", " " x 4, "pass", $pass) . "\n" . sprintf("%s %s\t= '%s'", " " x 4, "dbname", $database_name) . "\n"; print $buf . "\n"; $question = prompt("Is this correct?", "yes"); print "\n"; if ($question !~ /^y.*/i) { print "Please edit the etc/honeyclient.xml file\n" . "accordingly re-run this script.\n"; exit; } # Get the root password. system("stty -echo"); $root_password = prompt("Please enter your database 'root' password:"); system("stty echo"); print "\n"; print "\n"; my $sql = undef; my $dsn = "DBI:mysql:database=mysql;host=" . $host; eval { # Connect and Create Database my $dbh = DBI->connect($dsn, 'root', $root_password, {'RaiseError' => 1}); if ($dbh eq '') { Carp::croak("Installation Failed: " . $DBI::errstr); } my $database_system_name = $dbh->get_info($GetInfoType{SQL_DBMS_NAME}); my $database_system_version = $dbh->get_info($GetInfoType{SQL_DBMS_VER}); # Extract the major version number. $database_system_version =~ s/^(\d.*?)\..*/$1/; if (($database_system_name !~ /^mysql/i) or ($database_system_version < 5)) { print "Your database does not appear to be running MySQL v5.0\n" . "or greater. This code will only work properly on databases\n" . "with this type and version.\n"; $dbh->disconnect() if $dbh; exit; } # Create the database. print "* Creating database name '" . $database_name . "'.\n\n"; $sql = "CREATE DATABASE " . $database_name; print "Issuing SQL Command:\n" . $sql . "\n"; proceed(); $dbh->do($sql); # Get the IP address of the host system where the Manager will be # installed to. my $manager_address = "127.0.0.1"; $question = prompt("Will the database and the HoneyClient::Manager\n" . "run on the same host system?", "yes"); print "\n"; if ($question !~ /^y.*/i) { my $ip = "x"; my $is_valid = 0; while (!$is_valid) { $manager_address = prompt("Enter the IP address of the host system\n" . "that the HoneyClient::Manager will run\n" . "from (wildcard is %):\n", "172.16.164.%"); $ip = $manager_address; $ip =~ s/%/0/g; $is_valid = ip_is_ipv4($ip); if (!$is_valid) { print "\n"; print "* Error: Address is not valid! Try again.\n"; } print "\n"; } } # Create a user account to access and manage the database. print "* Creating database user '". $user . "'.\n\n"; $sql = "GRANT ALL PRIVILEGES ON " . $database_name .".* TO '" . $user . "\'@\'" . $manager_address . "' IDENTIFIED BY '" . $pass . "'"; print "Issuing SQL Command:\n" . $sql . "\n"; proceed(); $dbh->do($sql); # Flush privileges, in order to get MySQL to re-read the GRANT table. print "* Flushing privileges, in order to activate the newly added user.\n\n"; $sql = "FLUSH PRIVILEGES"; print "Issuing SQL Command:\n" . $sql . "\n"; proceed(); $dbh->do($sql); $dbh->disconnect() if $dbh; }; if ($@) { Carp::croak("Installation Failed: " . $@); } sub proceed { print "\n"; my $question = prompt("Proceed?", "yes"); print "\n"; if ($question !~ /^y.*/i) { print "Aborting Installation.\n"; exit; } } print "Database and user installed successfully.\n";