#!/usr/bin/perl use strict; use warnings; use 5.010; use Getopt::Long qw(GetOptions); use FileHandle; my $instance; my $destroy = ''; my $brokenAppLink = ''; my $brokenBaseURL = ''; GetOptions('instance=s' => \$instance, 'destroy' => \$destroy, 'brokenAppLink' => \$brokenAppLink, 'brokenBaseURL' => \$brokenBaseURL) or usage(); # check parameters if (!(defined $instance && $instance >= 0)) { usage(); } # set some defaults my $maxWait = 600; # seconds to wait for instance to come up my $waitCycle = 10; my $URLStem = "http://academy.scandio.net"; my $ComposeFolder = "instance$instance"; # Port stem for instance e.g. 8000 # 8080 -> Jira # 8090 -> Confluence my $PortStem = 8000+($instance*100); my $JiraPort = $PortStem+80; my $ConfluencePort = $PortStem+90; my $ConfluenceSynchronyPort = $PortStem+91; if ($destroy) { print "Destroying Instance $instance\n"; system("cd $ComposeFolder && docker-compose down"); system("rm -rf $ComposeFolder"); exit(0); } # Copy Template folder to $ComposeFolder `rsync -a compose/ $ComposeFolder`; # Write new .env file with new ports my $FHenv = new FileHandle("${ComposeFolder}/.env", "w"); unless ($FHenv) { die( "cannot create file ${ComposeFolder}/.env" );} $FHenv->print("JIRA_PORT=$JiraPort\n"); $FHenv->print("CONFLUENCE_PORT=$ConfluencePort\n"); $FHenv->print("CONFLUENCE_SYNCHRONY_PORT=$ConfluenceSynchronyPort\n"); $FHenv->close; # Start the Compose Stack print "Starting instance $instance...\n"; system("cd $ComposeFolder && docker-compose up -d"); # wait for instance to come up, set new BaseURL my $result; my $resultConfluence; my $resultJira; my $waited = 0; if (!$brokenAppLink) { do { print " waiting for instance to become available (" . $waited . "s)...\n"; $waited += $waitCycle; sleep $waitCycle; $resultJira = system("./updateJiraBaseURL --baseurl=${URLStem}:${JiraPort} -u=admin -p=admin"); $resultConfluence = system("./updateConfluenceBaseURL --baseurl=${URLStem}:${ConfluencePort} -u=admin -p=admin > /dev/null 2>&1"); } while (($resultJira ne "0" || $resultConfluence ne "0") && $waited < $maxWait); } if (!$brokenBaseURL) { system ("./createJCAppLink -j=${URLStem}:${JiraPort} -c=${URLStem}:${ConfluencePort} -u=admin -p=admin"); } # check if update was successful if ($waited >= $maxWait) { print "Instance not available after $waited seconds"; print "baseURL not updated - aborting\n"; exit 0; } # restart container to activate context changes print " restarting container to activate new configuration\n"; system("cd $ComposeFolder && docker-compose up --force-recreate -d"); exit 0; sub usage { print "Usage: $0 --instance INSTANCENO [--destroy] [--brokenAppLink] [--brokenBaseURL\n"; exit 1; }