#!/usr/bin/perl
use strict; use warnings; use utf8;
use FindBin;
use lib $FindBin::Bin;
use lib "$FindBin::Bin/../ansible-tools";
binmode STDOUT, ':utf8';
binmode STDERR, ':utf8';
use Getopt::Long qw(:config no_ignore_case bundling);
use siteconf;

my %site_conf = siteconf::read;

my %opts = (
    tmpmask => 24,
    tmpip_skip => 0,
    nodeploy => 0,
    netmask => 24,
    noweb => 0,
    nomysql => 0,
    noreboot => 0
    );
my $usage = <<EOT;
usage: $0 [OPTIONS..]
  --site SITE           vmware site (IP, DNS beállítások)
  --clone-ip IP         friss klón IP címe, default site_conf szerint
  --tmpip IP            ideiglenes IP cím az etalon készítés idejére
   --tmpmask NNN        ideiglenes címhez prefix hossz, default: 24
   --tmpgw              ideiglenes címhez default gw, default: .254
   --tmpip-skip         egyből az ideiglenes címet használja, nem állítja be
  --nodeploy		    nincs hostnév és IP cím változtatás, vagy:
   --hostname HH
   --domain DOMAIN      default site_conf szerint
   --dns DNS[+DNS]      default site_conf szerint
   --ntp NTPSERVER      default site_conf szerint
   --ip IP
   --netmask NNN        lehet prefix-length is (default: 24)
   --gw GW              default: .254
  --datasize NNN        /data mérete (`lvcreate -L` kapja) default: 50%FREE
  --noweb
  --nomysql
   --mysql-root PWD         mysql root jelszó, default: random
  --border PREFIX           installálj BORDERt (web + db localhost)
   --border-db PREFIX       .. de csak az adatbázisát
   --border-web PREFIX      .. de csak a webes részét
   --border-dbpasswd PWD    BORDER db jelszó, default: random
   --border-web-dbhost HH   db szerver hostnév \\_ /etc/hosts-ba kerül
   --border-web-dbip HH     db szerver IP cím  /
  --noreboot
EOT

GetOptions(
    "site=s" => \$opts{site},
    "clone-ip=s" => \$opts{clone_ip},
    "tmpip=s" => \$opts{tmpip},
    "tmpmask=s" => \$opts{tmpmask},
    "tmpgw=s" => \$opts{tmpgw},
    "tmpip-skip" => \$opts{tmpip_skip},
    "nodeploy" => \$opts{nodeploy},
    "hostname=s" => \$opts{hostname},
    "domain=s" => \$opts{domain},
    "dns=s" => \$opts{dns},
    "ntp=s" => \$opts{ntp},
    "ip=s" => \$opts{ip},
    "netmask=s" => \$opts{netmask},
    "gw=s" => \$opts{gw},
    "datasize=s" => \$opts{datasize},
    "noweb" => \$opts{noweb},
    "nomysql" => \$opts{nomysql},
    "mysql-root=s" => \$opts{mysql_root},
    "border=s" => \$opts{border},
    "border-db=s" => \$opts{border_db},
    "border-web=s" => \$opts{border_web},
    "border-web-dbhost=s" => \$opts{border_web_dbhost},
    "border-web-dbip=s" => \$opts{border_web_dbip},
    "border-dbpasswd=s" => \$opts{border_dbpasswd},
    "noreboot" => \$opts{noreboot},
    "help|h" => sub {print $usage; exit 0}
    ) or die $usage;

if (!defined $opts{site}) {
    die "Kell --site.\n";
}
if (!exists $site_conf{$opts{site}}) {
    die "site not found: $opts{site}\n";
}
for my $o (qw(dns ntp domain clone_ip mgmt_ssh_key postfix_relayhost rhsm_user rhsm_passwd)) {
    if (!defined $opts{$o}) {
        $opts{$o} = $site_conf{$opts{site}}->{$o};
    }
}

chdir("$FindBin::Bin/..") or die "chdir() failed.\n";

my @vars;
my @skip;

if ($site_conf{$opts{site}}->{aptproxy}) {
    push @vars, "aptproxy=$site_conf{$opts{site}}->{aptproxy}";
}

my $border_opts = 0;
for my $x ($opts{border}, $opts{border_web}, $opts{border_db}) {
    $border_opts++ if $x;
}
die "Csak egy --border... opciót lehet egyszerre megadni\n" if $border_opts > 1;
    
if ($opts{border}) {
    if ($opts{noweb} or $opts{nomysql}) {
        die "--border opcióhoz kell web és mysql.\n";
    }
    push @vars, "border_prefix=$opts{border}";
} elsif ($opts{border_web}) {
    die "Kell web.\n" if $opts{noweb};
    die "Kell --mysql-root.\n" if !defined $opts{mysql_root};
    die "Kell dbhost.\n" if !defined $opts{border_web_dbhost};
    die "Kell dbip.\n" if !defined $opts{border_web_dbip};
    die "Kell dbpasswd.\n" if !defined $opts{border_dbpasswd};
    push @vars, "border_prefix=$opts{border_web}";
    push @vars, "border_install_webonly=1";
    push @vars, "border_dbhost=$opts{border_web_dbhost}";
    push @vars, "border_dbip=$opts{border_web_dbip}";
} elsif ($opts{border_db}) {
    die "Kell mysql.\n" if $opts{nomysql};
    die "Kell --mysql-root.\n" if !defined $opts{mysql_root};
    die "Kell dbpasswd.\n" if !defined $opts{border_dbpasswd};
    push @vars, "border_prefix=$opts{border_db}";
    push @vars, "border_install_dbonly=1";
} else {
    push @skip, 'border';
}

if (!$opts{nodeploy}) {
    die "Missing --hostname.\n" if !defined $opts{hostname};
    die "Missing --ip.\n" if !defined $opts{ip};
    if (!defined $opts{gw}) {
        $opts{gw} = $opts{ip};
        $opts{gw} =~ s/\.\d+$/.254/;
    }
    for my $x (qw(hostname domain dns ntp ip netmask gw)) {
        push @vars, "$x=$opts{$x}";
    }
}
if ($opts{datasize}) {
    push @vars, "datasize=$opts{datasize}";
}
if ($opts{mysql_root}) {
    push @vars, "mysql_root=$opts{mysql_root}";
}
if ($opts{border_dbpasswd}) {
    push @vars, "border_dbpasswd=$opts{border_dbpasswd}";
}
if ($opts{postfix_relayhost}) {
    push @vars, "postfix_relayhost=$opts{postfix_relayhost}";
}
if ($opts{rhsm_user} and $opts{rhsm_passwd}) {
    push @vars, "rhsm_user=$opts{rhsm_user}";
    push @vars, "rhsm_passwd=$opts{rhsm_passwd}";
}

if ($opts{tmpip}) {
    if (!$opts{tmpip_skip}) {
        if (!defined $opts{tmpgw}) {
            $opts{tmpgw} = $opts{tmpip};
            $opts{tmpgw} =~ s/\.\d+$/.254/;
        }
        my $cmd = "ansible -i etalon, -e ansible_host=$opts{clone_ip} ".
            "-u root -B 30 -P 0 -m shell -a '".
              "sleep 3; DEV=\$(cd /sys/class/net; \\ls -1d e* | head -1);".
              "ip a flu dev \$DEV; ".
              "ip a add $opts{tmpip}/$opts{tmpmask} dev \$DEV; ".
              "ip r add default via $opts{tmpgw}; ".
              "ping -c 3 $opts{tmpgw}".
            "' etalon";
        print "$cmd\n";
        system $cmd;
        exit 1 if $? > 0;
        print "New IP address: $opts{tmpip}.\n";
        sleep 5;
    }
    push @vars, "ansible_host=$opts{tmpip}";
}

my $vars = '';
for my $v (@vars) {
    if ($v =~ /[\s'"]/) {
        die "invalid character: '$v'.\n";
    }
    $vars .= " -e '$v'";
}

if ($opts{mgmt_ssh_key}) {
    # szokoz van benne: -e 'aaa="bb cc"'
    $vars .= " -e 'mgmt_ssh_key=\"$opts{mgmt_ssh_key}\"'";
}


for my $x (qw(deploy web mysql reboot)) {
    push @skip, $x if $opts{"no$x"};
}
my $skip = '';
if (scalar @skip) {
    $skip = "--skip-tags=". join(',', @skip);
}
my $cmd = "ansible-playbook -i etalon, -e ansible_host=$opts{clone_ip} $skip $vars etalon.yml";

print "$cmd\n";
system $cmd;
exit 1 if $? > 0;

if (!$opts{nodeploy}) {
    print "\nadd to inventory:\n\n".
        "echo '$opts{hostname} $opts{ip}' >> inventory\n\n";
}

# vim: set tabstop=4 shiftwidth=4 expandtab smarttab:
