--- /dev/null
+#! /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
+<VirtualHost *:80>
+ 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]
+
+ <IfModule mod_fastcgi.c>
+ <Directory /var/www>
+ Options +ExecCGI
+ AllowOverride All
+ SetHandler fastcgi-script
+ Order allow,deny
+ Allow from all
+ AuthBasicAuthoritative Off
+ </Directory>
+ </IfModule>
+ AllowEncodedSlashes On
+ ErrorLog /var/log/apache2/error.log
+ CustomLog /var/log/apache2/access.log combined
+ ServerSignature Off
+</VirtualHost>";
+
+ 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);
+
+
+
+
+