#! /usr/bin/perl =head1 NAME rgw_install_config.pl - Script to install and configure the rados gateway on client machine. =head1 SYNOPSIS Use: perl rgw_install_config.pl [--help] Examples: perl rgw_install_config.pl or perl rgw_install_config.pl --help =head1 ARGUMENTS rgw_install_config.pl takes the following arguments: --help (optional) Displays the usage message. =cut use strict; use warnings; use Pod::Usage(); use Getopt::Long(); my $help; Getopt::Long::GetOptions( 'help' => \$help ); Pod::Usage::pod2usage( -verbose => 1 ) if ($help); # Function that enters the given msg to log.txt sub _write_log_entry { my $logmsg = shift; open(TC,'>>log.txt'); print TC "[Log] $logmsg\n"; close(TC); } # Function to get the hostname sub get_hostname { my $cmd = "hostname"; my $get_host = `$cmd`; chomp($get_host); return($get_host); } # Function to execute the command and return the exit status sub exec_cmd { my $cmd = shift; my $excmd = system($cmd); if ( $excmd == 0 ) { _write_log_entry("$cmd successful"); return 0; } else{ _write_log_entry("$cmd NOT successful"); return 1; } } # function to execute the command and return output sub get_cmd_op { my $cmd = shift; my $excmd = `$cmd`; _write_log_entry("$cmd \n $excmd"); return $excmd; } # Function to enable module for apache and fastcgi sub enmod { if (!system("sudo a2enmod rewrite")){ if (!system("sudo a2enmod fastcgi")){ _write_log_entry("a2enmod rewrite && a2enmod fastcgi successful"); return 0; } write_log_entry("a2enmod fastcgi NOT successful"); return 1; } write_log_entry("a2enmod rewrite NOT successful"); return 1; } # Function to create httpd.conf file sub set_httpconf { my $hostname = shift; my $http_conf = "/etc/apache2/httpd.conf"; my $file = "test_file"; open (FH, ">$file"); print FH "ServerName $hostname"; close FH; my $get_op = "sudo sh -c \"cat $file >> $http_conf\""; my $exit_status = exec_cmd($get_op); exec_cmd("rm -f $file"); return $exit_status; } # To append ceph.conf file with radosgw info sub append_ceph_conf { my $hostname = shift; my $file = "/etc/ceph/ceph.conf"; my $file1 = "test_file1"; open (FH, ">$file1"); print FH "[client.radosgw.gateway] host = $hostname keyring = /etc/ceph/keyring.radosgw.gateway rgw socket path = /tmp/radosgw.sock log file = /var/log/ceph/radosgw.log \n"; close FH; my $get_op = "sudo sh -c \"cat $file1 >> $file\""; my $exit_status = exec_cmd($get_op); exec_cmd("rm -f $file1"); return $exit_status; } # create s3gw.fcgi file and set execute permission for the file sub create_fcgi { my $file = "/var/www/s3gw.fcgi"; my $chmod_file = "sudo chmod +x /var/www/s3gw.fcgi"; my $exe_cmd = "exec /usr/bin/radosgw -c /etc/ceph/ceph.conf -n client.radosgw.gateway"; my $file1 = "test_file3"; open (FH, ">$file1"); print FH "#!/bin/sh \n $exe_cmd \n"; close FH; my $get_op = "sudo sh -c \"cat $file1 >> $file\"" ; my $exit_status = exec_cmd($get_op); exec_cmd("rm -f $file1"); my $exit_status1 = exec_cmd($chmod_file) if (!$exit_status); return $exit_status1; } # To create rgw.conf sub create_rgw_conf { my $content = "FastCgiExternalServer /var/www/s3gw.fcgi -socket /tmp/radosgw.sock ServerName rados.domain.com ServerAdmin qa\@inktank.com DocumentRoot /var/www RewriteEngine On RewriteRule ^/([a-zA-Z0-9-_.]*)([/]?.*) /s3gw.fcgi?page=\$1¶ms=\$2&%{QUERY_STRING} [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L] Options +ExecCGI AllowOverride All SetHandler fastcgi-script Order allow,deny Allow from all AuthBasicAuthoritative Off AllowEncodedSlashes On ErrorLog /var/log/apache2/error.log CustomLog /var/log/apache2/access.log combined ServerSignature Off "; my $file = "/etc/apache2/sites-available/rgw.conf"; my $file1 = "test_file2"; open (FH, ">$file1"); print FH "$content"; close FH; my $get_op = "sudo sh -c \"cat $file1 >> $file\""; my $exit_status = exec_cmd($get_op); exec_cmd("rm -f $file1"); return $exit_status; } # To generate keyring for rados gateway and add it to ceph keyring with required access sub generate_keyring_and_key { my $cmd = "sudo ceph-authtool --create-keyring /etc/ceph/keyring.radosgw.gateway"; my $chmod_cmd = "sudo chmod +r /etc/ceph/keyring.radosgw.gateway"; my $cmd_key = "sudo ceph-authtool /etc/ceph/keyring.radosgw.gateway -n client.radosgw.gateway --gen-key"; my $chmod_cmd_key = "sudo ceph-authtool -n client.radosgw.gateway --cap osd \'allow rwx\' --cap mon \'allow r\' /etc/ceph/keyring.radosgw.gateway"; my $exit_status = exec_cmd($cmd); my $exit_status1 = exec_cmd($chmod_cmd) if(!$exit_status); my $exit_status2 = exec_cmd($cmd_key) if(!$exit_status1); my $exit_status3 = exec_cmd($chmod_cmd_key) if(!$exit_status2); return($exit_status3); } # To create a rgw user sub create_user { my $usr = shift; my $cmd = "sudo radosgw-admin user create --uid=$usr --display-name=$usr"; my $status = exec_cmd($cmd); return($status); } #To start radosgw sub start_rgw { my $cmd = "sudo /etc/init.d/radosgw start"; my $check_ps = "ps -ef | grep radosgw | grep -v grep"; my $status = get_cmd_op($cmd); if (!$status) { my $ps = get_cmd_op($check_ps); if ($ps =~ /radosgw/) { return 0; } } return 1; } # To start the given service sub start_service { my $input = shift; my $status = exec_cmd ("sudo service $input restart"); if (!$status){ my $output = get_cmd_op("sudo service $input status"); if ($output =~ /running/ ){ if($input eq "apache2" ) { return 0; }elsif($input eq "ceph"){ my $count = get_cmd_op("sudo service ceph status | wc -l"); if ($count == 8 ){ return 0; } } } } return 1; } # To enable/disable site sub ensite_dissite { my $a2ensite = "sudo a2ensite rgw.conf"; my $a2dissite = "sudo a2dissite default"; my $check_en = get_cmd_op($a2ensite); my $check_dis = get_cmd_op($a2dissite); if (($check_en =~ /nabl/) && ($check_dis =~ /isabl/)){ return 0; } return 1; } #====Main starts here ====== my $domain = "front.sepia.ceph.com"; my $host = get_hostname(); my $hostname = "$host.$domain"; my $run_update = "sudo apt-get update"; my $install_radosgw = "sudo apt-get install radosgw"; my $mkdir_rgw = "sudo mkdir -p /var/lib/ceph/radosgw/ceph-radosgw.gateway"; my $add_entry_ceph_keyring = "sudo ceph -k /etc/ceph/ceph.keyring auth add client.radosgw.gateway -i /etc/ceph/keyring.radosgw.gateway"; my $start_rgw = "sudo /etc/init.d/radosgw start"; my $user = "qa"; my $install_ap_fcgi = "yes | sudo apt-get install apache2 libapache2-mod-fastcgi" if(!exec_cmd($run_update)); my $check_en = enmod() if(!$install_ap_fcgi); my $check_http = set_httpconf($hostname) if (!$check_en); my $check_apache = start_service("apache2") if (!$check_http) ; my $check_install = exec_cmd($install_radosgw) if(!$check_apache); my $get_exit = append_ceph_conf($host) if(!$check_install); my $get_exec = exec_cmd($mkdir_rgw) if(!$get_exit); my $get_status = create_rgw_conf() if (!$get_exec); my $get_enstatus = ensite_dissite() if (!$get_status); my $get_status1 = create_fcgi() if(!$get_enstatus); my $status = generate_keyring_and_key() if (!$get_status1); my $status_add = exec_cmd($add_entry_ceph_keyring) if(!$status); my $status_ceph = start_service("ceph") if (!$status_add); my $status_apache = start_service("apache2") if (!$status_ceph); my $status_rgw = start_rgw() if (!$status_apache); my $status_user = create_user($user) if (!$status_rgw); _write_log_entry("RGW installation and configuration successful!") if (!$status_user);