our
$VERSION
=
'0.01'
;
our
$DISPLAY
=
'Jenkins'
;
our
$CONNECT
=
'ssh'
;
our
$defaultInstanceType
=
't2.micro'
;
use
5.005;
our
@ISA
=
qw(Exporter)
;
our
@EXPORT
=
qw($select_jenkins_setup)
;
my
$configure_jenkins
=
sub
{
my
$server_type
=
$_
[0];
my
$cnt
=
$_
[1];
my
$selection
=
$_
[2]||
''
;
my
$handle
=
$main::aws
->{
$server_type
}->[
$cnt
]->[1];
my
(
$stdout
,
$stderr
)=(
''
,
''
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
"sudo yum clean all"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
"sudo yum grouplist hidden"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
"sudo yum groups mark convert"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
"sudo yum -y groupinstall 'Development tools'"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
'sudo yum -y install openssl-devel icu cyrus-sasl'
.
' libicu cyrus-sasl-devel libtool-ltdl-devel'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
"sudo yum -y -v install java-1.8.0"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
"sudo yum -y -v remove java-1.7.0-openjdk"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
'sudo '
.
'yum -y -v install tomcat8 tomcat8-webapps tomcat8-admin-webapps '
.
'tomcat8-docs-webapp tomcat8-javadoc'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
"wget --random-wait --progress=dot $source"
,
'__display__'
);
my
$install_jenkins
=
<<'END';
o o o .oPYo. ooooo .oo o o o o o .oPYo.
8 8b 8 8 8 .P 8 8 8 8 8b 8 8 8
8 8`b 8 `Yooo. 8 .P 8 8 8 8 8`b 8 8
8 8 `b 8 `8 8 oPooo8 8 8 8 8 `b 8 8 oo
8 8 `b8 8 8 .P 8 8 8 8 8 `b8 8 8
8 8 `8 `YooP' 8 .P 8 8oooo 8oooo 8 8 `8 `YooP8
........................................................
::::::::::::::::::::::::::::::::::::::::::::::::::::::::
_ _ _
| | ___ _ __ | | _(_)_ __ ___
_ | |/ _ \ '_ \| |/ / | '_ \/ __|
| |_| | __/ | | | <| | | | \__ \
\___/ \___|_| |_|_|\_\_|_| |_|___/
(Jenkins® is **NOT** a sponsor of the FullAuto© Project.)
END
print
$install_jenkins
;
sleep
10;
(
$stdout
,
$stderr
)=
$handle
->cmd(
"sudo yum -y update"
,
'__display__'
);
my
$master
=
$main::aws
->{
$server_type
}->[
$cnt
]->[0]->{InstanceId};
my
$c
=
"aws ec2 describe-instances --instance-ids $master 2>&1"
;
my
(
$hash
,
$output
,
$error
)=(
''
,
''
,
''
);
(
$hash
,
$output
,
$error
)=run_aws_cmd(
$c
);
my
$mdns
=
$hash
->{Reservations}->[0]->{Instances}->[0]->{PublicDnsName};
my
$pbip
=
$hash
->{Reservations}->[0]->{Instances}->[0]->{PublicIpAddress};
my
$dcnt
=0;
my
$extn
=
''
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
'sudo '
.
'mv ~/jenkins.war /var/lib/tomcat8/webapps'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/usr/share/tomcat8'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
'sudo mkdir .jenkins'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
'sudo chown -Rv tomcat:tomcat .jenkins'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
'sudo chown -Rv tomcat:tomcat *'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
'sudo service tomcat8 start'
,
'__display__'
);
$handle
->{_cmd_handle}->
print
(
'sudo '
.
'tail -f /usr/share/tomcat8/logs/catalina.out'
);
my
$prompt
=
substr
(
$handle
->{_cmd_handle}->prompt(),1,-1);
my
$adminpass
=
''
;
my
$allout
=
''
;
while
(1) {
my
$output
=Net::FullAuto::FA_Core::fetch(
$handle
);
last
if
$output
=~/
$prompt
/;
print
$output
;
$allout
.=
$output
;
if
(
$allout
=~
/^.
*password
to proceed to installation:\s+(.*?)\s+This.*$/s) {
$adminpass
=$1;
}
if
(
$allout
=~/Finished/s) {
sleep
5;
$handle
->{_cmd_handle}->
print
(
"\003"
);
last
;
}
}
$handle
->clean_filehandle();
(
$stdout
,
$stderr
)=
$handle
->cmd(
'hostname'
);
my
$cmd
=
'wget -d -qO- '
.
'-e robots=off '
.
'--cookies=on --keep-session-cookies '
.
'--save-cookies cookies.txt '
.
'--header="Upgrade-Insecure-Requests: 1" '
.
'--header="DNT: 1" http://'
.
$pbip
.
':8080/jenkins'
;
print
"BEGIN_CMD=$cmd\n"
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$cmd
);
print
"BEGIN_STDOUT=$stdout<== and BEGIN_STDERR=$stderr<==\n\n\n\n\n"
;
my
$session
=
$stdout
;
$stdout
=~s/^.*(JSESSIONID=.*?);.*/$1/s;
my
$cookies
=
$stdout
;
$session
=~s/^.
*X
-Jenkins-Session: (.*?)\n.*$/$1/s;
$cmd
=
'sudo wget -d -qO- --content-on-error '
.
'--random-wait --wait=3 '
.
'--cookies=on --keep-session-cookies '
.
'--load-cookies cookies.txt '
.
'--save-cookies cookies.txt '
.
'--header="Accept: text/html,application/xhtml+xml,application/xml;'
.
'q=0.9,*/*;q=0.8" '
.
'--header="User-Agent: Mozilla/5.0 '
.
'(Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0" '
.
'--header="DNT: 1" '
.
'--header="Upgrade-Insecure-Requests: 1" '
.
'--header="Referer: http://'
.
$pbip
.
':8080/jenkins/" '
.
'http://'
.
$pbip
.
':8080/jenkins/login?from=%2Fjenkins%2F'
;
print
"SESSION=$session\n"
;
print
"LOGIN_CMD=$cmd\n"
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$cmd
);
print
"LOGIN_STDOUT=$stdout<========= and LOGIN_STDERR=$stderr<=========\n\n\n\n\n"
;
$cookies
=
$stderr
;
$cookies
=~s/^.*(JSESSIONID=.*?);.*$/$1/s;
print
"COOKIE=$cookies<==\n"
;
$stdout
=~s/^.
*Jenkins
-Crumb
", "
(.*?)"[)].*$/$1/s;
my
$jenkins_crumb
=
$stdout
;
print
"CRUMB=$jenkins_crumb<==\n"
;
my
@files
=(
'/css/style.css'
,
'/css/color.css'
,
'/css/responsive-grid.css'
,
'/scripts/yui/container/assets/container.css'
,
'/scripts/yui/assets/skins/sam/skin.css'
,
'/scripts/yui/container/assets/skins/sam/container.css'
,
'/scripts/yui/button/assets/skins/sam/button.css'
,
'/scripts/yui/menu/assets/skins/sam/menu.css'
,
'/jsbundles/pluginSetupWizard.css'
,
'/scripts/prototype.js'
,
'/scripts/behavior.js'
,
'/org/kohsuke/stapler/bind.js'
,
'/scripts/yui/yahoo/yahoo-min.js'
,
'/scripts/yui/dom/dom-min.js'
,
'/scripts/yui/event/event-min.js'
,
'/scripts/yui/animation/animation-min.js'
,
'/scripts/yui/dragdrop/dragdrop.js'
,
'/scripts/yui/container/container-min.js'
,
'/scripts/yui/connection/connection-min.js'
,
'/scripts/yui/datasource/datasource-min.js'
,
'/scripts/yui/autocomplete/autocomplete-min.js'
,
'/scripts/yui/menu/menu-min.js'
,
'/scripts/yui/element/element-min.js'
,
'/scripts/yui/button/button-min.js'
,
'/scripts/yui/storage/storage-min.js'
,
'/scripts/hudson-behavior.js'
,
'/scripts/sortable.js'
,
'/jsbundles/pluginSetupWizard.js'
,
'/assets/bootstrap/jsmodules/bootstrap3/style.css'
,
'/css/font-awesome/css/font-awesome.min.css'
,
'/css/icomoon/css/icomoon.css'
,
'/assets/jquery-detached/jsmodules/jquery2.js'
,
'/assets/bootstrap/jsmodules/bootstrap3.js'
,
'/assets/handlebars/jsmodules/handlebars3.js'
,
'/css/google-fonts/roboto/fonts/roboto-v15-greek_latin-ext_latin_vietnamese_cyrillic_greek-ext_cyrillic-ext-regular.woff2'
,
'/css/google-fonts/roboto/fonts/roboto-v15-greek_latin-ext_latin_vietnamese_cyrillic_greek-ext_cyrillic-ext-700.woff2'
,
'/css/icomoon/fonts/icomoon.ttf?-itxuas'
,
'/css/google-fonts/roboto/fonts/roboto-v15-greek_latin-ext_latin_vietnamese_cyrillic_greek-ext_cyrillic-ext-300.woff2'
,
'/css/google-fonts/roboto/fonts/roboto-v15-greek_latin-ext_latin_vietnamese_cyrillic_greek-ext_cyrillic-ext-500.woff2'
,
'/favicon.ico'
,
);
my
$r
=1;
if
(
$r
==0) {
foreach
my
$ppath
(
@files
) {
$cmd
=
'wget -qO- --content-on-error '
.
'--random-wait --wait=3 '
.
'--cookies=on --keep-session-cookies '
.
'--load-cookies cookies.txt '
.
'--save-cookies cookies.txt '
.
'--level=1 '
.
'--header "Accept: text/html,application/xhtml+xml,application/xml;'
.
'q=0.9,*/*;q=0.8" '
.
'--header="User-Agent: Mozilla/5.0 '
.
'(Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0" '
.
'--header="DNT: 1" '
.
'--header="Upgrade-Insecure-Requests: 1" '
.
'--header="Referer: http://'
.
$pbip
.
':8080/jenkins/" '
.
'http://'
.
$pbip
.
':8080/jenkins/static/'
.
$session
.
$ppath
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$cmd
);
print
"STDOUT=$stdout<== AND STDERR=$stderr<== XXXXXXXXXXXXXX\n"
;
}
}
print
"PASS=$adminpass\n"
;
my
$data_crumb
=
'from=%2Fjenkins%2F&j_username=admin&j_password='
.
$adminpass
.
'&Jenkins-Crumb='
.
$jenkins_crumb
.
'&json=%7B%22'
.
'from%22%3A+%22%2Fjenkins%2F%22%2C+%22j_username%22%3A+%22admin%22'
.
'%2C+%22j_password%22%3A+%22'
.
$adminpass
.
'%22%2C+%22Jenkins-Crumb%22%'
.
'3A+%22'
.
$jenkins_crumb
.
'%22%7D'
;
$cmd
=
'sudo wget -qO- --no-proxy --content-on-error --auth-no-challenge '
.
'--random-wait --wait=3 '
.
'--cookies=on --keep-session-cookies '
.
'--load-cookies cookies.txt '
.
'--save-cookies cookies.txt '
.
'--header="Accept: text/html,application/xhtml+xml,'
.
'application/xml;q=0.9,*/*;q=0.8" '
.
'--header="DNT: 1" '
.
'--header="Accept-Encoding: deflate, sdch" '
.
'--header="Accept-Language: en-US,en;q=0.5" '
.
'--header="Origin: http://'
.
$pbip
.
':8080" '
.
'--header="User-Agent: Mozilla/5.0 '
.
'(Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0" '
.
'--header="Upgrade-Insecure-Requests: 1" '
.
'--header="Content-Length: 333" '
.
'--header="Content-Type: application/x-www-form-urlencoded" '
.
'--referer="http://'
.
$pbip
.
':8080/jenkins/login?from=%2Fjenkins%2F" '
.
'--post-data="'
.
$data_crumb
.
'" '
.
'http://'
.
$pbip
.
':8080/jenkins/j_acegi_security_check'
;
print
"ACEGI_CMD=$cmd<==\n"
;
$cookies
=
$stderr
;
$cookies
=~s/^.*(JSESSIONID=.*?);.*$/$1/s;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$cmd
);
print
"ACEGI_STDOUT=$stdout and ACEGI_STDERR=$stderr<==\n\n\n\n\n"
;
$cmd
=
'sudo wget -d -qO- --content-on-error '
.
'--random-wait --wait=3 '
.
'--cookies=on --keep-session-cookies '
.
'--load-cookies cookies.txt '
.
'--save-cookies cookies.txt '
.
'--header "Accept: text/html,application/xhtml+xml,application/xml;'
.
'q=0.9,*/*;q=0.8" '
.
'--header="User-Agent: Mozilla/5.0 '
.
'(Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0" '
.
'--header="Accept-Encoding: deflate, sdch" '
.
'--header="DNT: 1" '
.
'--header="Upgrade-Insecure-Requests: 1" '
.
'--header="Referer: http://'
.
$pbip
.
':8080/jenkins/login?from=%2Fjenkins%2F" '
.
'--header="Cache-Control: max-age=0" '
.
print
"FINAL_CMD=$cmd<==\n"
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$cmd
);
print
"FINAL_STDOUT=$stdout<== and FINAL_STDERR=$stderr<==FINALSTDERR\n"
;
$cmd
=
'sudo wget -d -qO- --content-on-error '
.
'--random-wait --wait=3 '
.
'--cookies=on --keep-session-cookies '
.
'--load-cookies cookies.txt '
.
'--save-cookies cookies.txt '
.
'--header="DNT: 1" '
.
'--header="Accept-Encoding: deflate, sdch" '
.
'--header="Accept-Language: en-US,en;q=0.8" '
.
'--header="User-Agent: Mozilla/5.0 (Linux; Android 6.0; '
.
'Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, '
.
'like Gecko) Chrome/58.0.3029.110 Mobile Safari/537.36" '
.
'--header="Accept: application/json, text/javascript, */*; q=0.01" '
.
'--header="Referer: http://'
.
$pbip
.
':8080/jenkins/" '
.
'--header="X-Requested-With: XMLHttpRequest" '
.
'http://'
.
$pbip
.
':8080/jenkins/i18n/resourceBundle?baseName=jenkins.install.pluginSetupWizard&_=1497382801063'
;
print
"WIZ_CMD=$cmd<==\n"
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$cmd
);
print
"WIZ_STDOUT=$stdout<== and WIZ_STDERR=$stderr<==\n\n\n\n\n"
;
$cmd
=
'sudo wget -qO- --cookies=on --keep-session-cookies --load-cookies cookies.txt '
.
'\'http://'
.
$pbip
.
':8080/jenkins/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,%22:%22,//crumb)\''
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$cmd
);
print
"CRUMB_STDOUT=$stdout<== and CRUMB_STDERR=$stderr<==CRUMB_STDERR\n"
;
$jenkins_crumb
=
$stdout
;
$jenkins_crumb
=~s/^.*:(.*)$/$1/;
$cmd
=
'sudo wget -d -qO- --content-on-error '
.
'--random-wait --wait=3 '
.
'--cookies=on --keep-session-cookies '
.
'--load-cookies cookies.txt '
.
'--save-cookies cookies.txt '
.
'--header="Origin: http://'
.
$pbip
.
':8080" '
.
'--header="Accept-Encoding: deflate, sdch" '
.
'--header="User-Agent: Mozilla/5.0 '
.
'(Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0" '
.
'--header="Accept-Language: en-US,en;q=0.8" '
.
'--header="Content-Type: application/json" '
.
'--header="Accept: application/json, text/javascript, */*; q=0.01" '
.
'--header="Referer: http://'
.
$pbip
.
':8080/jenkins/" '
.
'--header="X-Requested-With: XMLHttpRequest" '
.
'--header="Connection: keep-alive" '
.
'--header="DNT: 1" '
.
'--header="Jenkins-Crumb: '
.
$jenkins_crumb
.
'" '
.
'--post-data=\'{"dynamicLoad":true,"plugins":["cloudbees-folder","antisamy-markup-formatter","build-timeout","credentials-binding","timestamper","ws-cleanup","ant","gradle","workflow-aggregator","github-organization-folder","pipeline-stage-view","git","subversion","ssh-slaves","matrix-auth","pam-auth","ldap","email-ext","mailer"],"Jenkins-Crumb":"'
.
$jenkins_crumb
.
'"}\' '
.
'http://'
.
$pbip
.
':8080/jenkins/pluginManager/installPlugins'
;
print
"PLUGIN_CMD=$cmd<==\n"
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$cmd
);
print
"PLUGIN_STDOUT=$stdout<== and PLUGIN_STDERR=$stderr<==PLUGINSTDERR\n"
;
$cmd
=
'sudo wget -d -qO- --content-on-error '
.
'--random-wait --wait=3 '
.
'--cookies=on --keep-session-cookies '
.
'--load-cookies cookies.txt '
.
'--save-cookies cookies.txt '
.
'--header="DNT: 1" '
.
'--header="Accept-Encoding: deflate, sdch" '
.
'--header="Accept-Language: en-US,en;q=0.8" '
.
'--header="User-Agent: Mozilla/5.0 (Linux; Android 6.0; '
.
'Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, '
.
'like Gecko) Chrome/58.0.3029.110 Mobile Safari/537.36" '
.
'--header="Accept: text/html,application/xhtml+xml,'
.
'application/xml;q=0.9,*/*;q=0.8" '
.
'--header="Referer: http://'
.
$pbip
.
':8080/jenkins/" '
.
'--header="Upgrade-Insecure-Requests: 1" '
.
'--header="Proxy-Connection: keep-alive" '
.
'http://'
.
$pbip
.
':8080/jenkins/setupWizard/setupWizardFirstUser'
;
print
"FIRSTUSER_CMD=$cmd<==\n"
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$cmd
);
print
"FIRSTUSER_STDOUT=$stdout<== and FIRSTUSER_STDERR=$stderr<==\n\n\n\n\n"
;
$cmd
=
'sudo wget -d -qO- --content-on-error '
.
'--random-wait --wait=3 '
.
'--cookies=on --keep-session-cookies '
.
'--load-cookies cookies.txt '
.
'--save-cookies cookies.txt '
.
'--header="DNT: 1" '
.
'--header="Accept-Encoding: deflate, sdch" '
.
'--header="Accept-Language: en-US,en;q=0.8" '
.
'--header="User-Agent: Mozilla/5.0 (Linux; Android 6.0; '
.
'Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, '
.
'like Gecko) Chrome/58.0.3029.110 Mobile Safari/537.36" '
.
'--header="Accept: application/json, text/javascript, */*; q=0.01" '
.
'--header="Referer: http://'
.
$pbip
.
':8080/jenkins/" '
.
'--header="X-Requested-With: XMLHttpRequest" '
.
'--header="Proxy-Connection: keep-alive" '
.
'http://'
.
$pbip
.
':8080/jenkins/setupWizard/'
.
'restartStatus?_=1497374550478'
;
print
"RESTART_CMD=$cmd<==\n"
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$cmd
);
print
"RESTART_STDOUT=$stdout<== and RESTART_STDERR=$stderr<==\n\n\n\n\n"
;
$cmd
=
'sudo wget -d -qO- --content-on-error '
.
'--random-wait --wait=3 '
.
'--cookies=on --keep-session-cookies '
.
'--load-cookies cookies.txt '
.
'--save-cookies cookies.txt '
.
'--header="DNT: 1" '
.
'--header="Accept-Encoding: deflate, sdch" '
.
'--header="Accept-Language: en-US,en;q=0.8" '
.
'--header="User-Agent: Mozilla/5.0 (Linux; Android 6.0; '
.
'Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, '
.
'like Gecko) Chrome/58.0.3029.110 Mobile Safari/537.36" '
.
'--header="Accept: application/json, text/javascript, */*; q=0.01" '
.
'--header="Referer: http://'
.
$pbip
.
':8080/jenkins/" '
.
'--header="X-Requested-With: XMLHttpRequest" '
.
'--header="Origin: http://'
.
$pbip
.
':8080" '
.
'--header="Jenkins-Crumb: '
.
$jenkins_crumb
.
'" '
.
'--post-data=\'{"Jenkins-Crumb":"'
.
$jenkins_crumb
.
'"}\' '
.
'http://'
.
$pbip
.
':8080/jenkins/setupWizard/completeInstall'
;
print
"COMPLETE_CMD=$cmd<==\n"
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$cmd
);
print
"COMPLETE_STDOUT=$stdout<== and COMPLETE_STDERR=$stderr<==\n\n\n\n\n"
;
$cmd
=
'sudo wget -d -qO- --content-on-error '
.
'--random-wait --wait=3 '
.
'--cookies=on --keep-session-cookies '
.
'--load-cookies cookies.txt '
.
'--save-cookies cookies.txt '
.
'--header="DNT: 1" '
.
'--header="Accept-Encoding: deflate, sdch" '
.
'--header="Accept-Language: en-US,en;q=0.8" '
.
'--header="User-Agent: Mozilla/5.0 (Linux; Android 6.0; '
.
'Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, '
.
'like Gecko) Chrome/58.0.3029.110 Mobile Safari/537.36" '
.
'--header="Accept: text/html,application/xhtml+xml,'
.
'application/xml;q=0.9,*/*;q=0.8" '
.
'--header="Referer: http://'
.
$pbip
.
':8080/jenkins/" '
.
'--header="Upgrade-Insecure-Requests: 1" '
.
'--header="Proxy-Connection: keep-alive" '
.
print
"JENKINS_CMD=$cmd<==\n"
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$cmd
);
print
"JENKINS_STDOUT=$stdout<== and JENKINS_STDERR=$stderr<==\n\n\n\n\n"
;
$cmd
=
'sudo wget -d -qO- --content-on-error '
.
'--random-wait --wait=3 '
.
'--cookies=on --keep-session-cookies '
.
'--load-cookies cookies.txt '
.
'--save-cookies cookies.txt '
.
'--header="DNT: 1" '
.
'--header="Accept-Encoding: deflate, sdch" '
.
'--header="Accept-Language: en-US,en;q=0.8" '
.
'--header="User-Agent: Mozilla/5.0 (Linux; Android 6.0; '
.
'Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, '
.
'like Gecko) Chrome/58.0.3029.110 Mobile Safari/537.36" '
.
'--header="Accept: text/html,application/xhtml+xml,'
.
'application/xml;q=0.9,*/*;q=0.8" '
.
'--header="Referer: http://'
.
$pbip
.
':8080/jenkins/" '
.
'--header="Upgrade-Insecure-Requests: 1" '
.
'--header="Proxy-Connection: keep-alive" '
.
'http://'
.
$pbip
.
':8080/jenkins/user/admin/configure'
;
print
"CONFIG_CMD=$cmd<==\n"
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$cmd
);
print
"CONFIG_STDOUT=$stdout<== and CONFIG_STDERR=$stderr<==\n\n\n\n\n"
;
my
$api_token
=
$stdout
;
$api_token
=~s/^.*?apiToken.*?value=[
"](.*?)["
].*$/$1/s;
print
"\n ACCESS JENKINS UI AT:\n\n"
,
" http://$pbip:8080/jenkins\n\n Password: $adminpass"
.
"\n\n API Token: $api_token\n\n"
;
my
$thanks
=
<<'END';
______ _ ,
/ / / ' ) / /
--/ /_ __. ____ /_ / / __ . . /
(_/ / /_(_/|_/ / <_/ <_ (__/_(_)(_/_' For Using
//
_ _ _ _____ _ _ _ _
| \ | | ___| |_ | ___| _| | | / \ _ _| |_ |
| \| |/ _ \ __| o o | |_ | | | | | | / _ \| | | | __/ | \
| |\ | __/ |_ o o | _|| |_| | | |/ ___ \ |_| | || |
|_| \_|\___|\__| |_| \__,_|_|_/_/ \_\__,_|\__\___/ ©
Copyright © 2000-2024 Brian M. Kelly Brian.Kelly@FullAuto.com
END
if
(
defined
$Net::FullAuto::FA_Core::dashboard
) {
eval
{
local
$SIG
{ALRM} =
sub
{
die
"alarm\n"
};
alarm
15;
print
$thanks
;
print
" \n Press Any Key to EXIT ... "
;
<STDIN>;
};
alarm
(0);
print
"\n\n\n Please wait at least a minute for the Default Browser\n"
,
" to start with your new Jenkins™ installation!\n\n\n"
;
}
else
{
print
$thanks
;
}
&Net::FullAuto::FA_Core::cleanup
;
};
my
$standup_jenkins
=
sub
{
my
$type
=
"]T[{select_type}"
;
$type
=~s/^"//;
$type
=~s/"$//;
$type
=~s/^(.*?)\s+-[>].*$/$1/;
my
$jenkins
=
"]T[{select_jenkins_setup}"
;
my
$i
=
$main::aws
->{fullauto}->{ImageId}||
''
;
my
$s
=
$main::aws
->{fullauto}->
{NetworkInterfaces}->[0]->{SubnetId}||
''
;
my
$g
=
$main::aws
->{fullauto}->
{SecurityGroups}->[0]->{GroupId}||
''
;
my
$n
=
$main::aws
->{fullauto}->
{SecurityGroups}->[0]->{GroupName}||
''
;
my
$c
=
'aws ec2 describe-security-groups '
.
"--group-names $n"
;
my
(
$hash
,
$output
,
$error
)=(
''
,
''
,
''
);
(
$hash
,
$output
,
$error
)=run_aws_cmd(
$c
);
Net::FullAuto::FA_Core::handle_error(
$error
)
if
$error
;
my
$cidr
=
$hash
->{SecurityGroups}->[0]->{IpPermissions}
->[0]->{IpRanges}->[0]->{CidrIp};
$c
=
'aws ec2 create-security-group --group-name '
.
'JenkinsSecurityGroup --description '
.
'"Jenkins.io Security Group" 2>&1'
;
(
$hash
,
$output
,
$error
)=run_aws_cmd(
$c
);
Net::FullAuto::FA_Core::handle_error(
$error
)
if
$error
&&
$error
!~/already
exists
/;
$c
=
'aws ec2 authorize-security-group-ingress '
.
'--group-name JenkinsSecurityGroup --protocol '
.
'tcp --port 22 --cidr '
.
$cidr
.
" 2>&1"
;
(
$hash
,
$output
,
$error
)=run_aws_cmd(
$c
);
Net::FullAuto::FA_Core::handle_error(
$error
)
if
$error
&&
$error
!~/already
exists
/;
$c
=
'aws ec2 authorize-security-group-ingress '
.
'--group-name JenkinsSecurityGroup --protocol '
.
'tcp --port 80 --cidr '
.
$cidr
.
" 2>&1"
;
(
$hash
,
$output
,
$error
)=run_aws_cmd(
$c
);
Net::FullAuto::FA_Core::handle_error(
$error
)
if
$error
&&
$error
!~/already
exists
/;
$c
=
'aws ec2 authorize-security-group-ingress '
.
'--group-name JenkinsSecurityGroup --protocol '
.
'tcp --port 443 --cidr '
.
$cidr
.
" 2>&1"
;
(
$hash
,
$output
,
$error
)=run_aws_cmd(
$c
);
Net::FullAuto::FA_Core::handle_error(
$error
)
if
$error
&&
$error
!~/already
exists
/;
$c
=
'aws ec2 authorize-security-group-ingress '
.
'--group-name JenkinsSecurityGroup --protocol '
.
'tcp --port 8080 --cidr '
.
$cidr
.
" 2>&1"
;
(
$hash
,
$output
,
$error
)=run_aws_cmd(
$c
);
Net::FullAuto::FA_Core::handle_error(
$error
)
if
$error
&&
$error
!~/already
exists
/;
my
$cnt
=0;
my
$pemfile
=
$pem_file
;
$pemfile
=~s/\.pem\s*$//s;
$pemfile
=~s/[ ][(]\d+[)]//;
if
(
exists
$main::aws
->{
'Jenkins.io'
}) {
my
$g
=get_aws_security_id(
'JenkinsSecurityGroup'
);
my
$c
=
"aws ec2 run-instances --image-id $i --count 1 "
.
"--instance-type $type --key-name \'$pemfile\' "
.
"--security-group-ids $g --subnet-id $s"
;
if
($
launch_server(
'Jenkins.io'
,
$cnt
,
$jenkins
,
''
,
$c
,
$configure_jenkins
);
}
else
{
my
$num
=$
foreach
my
$num
(0..
$num
) {
launch_server(
'Jenkins.io'
,
$cnt
++,
$jenkins
,
''
,
$c
,
$configure_jenkins
);
}
}
}
return
'{choose_demo_setup}<'
;
};
my
$jenkins_setup_summary
=
sub
{
my
$region
=
"]T[{awsregions}"
;
$region
=~s/^"//;
$region
=~s/"$//;
my
$type
=
"]T[{select_type}"
;
$type
=~s/^"//;
$type
=~s/"$//;
my
$money
=
$type
;
$money
=~s/^.*-> \$(.*?) +(?:[(].+[)] )*\s
*per
hour$/$1/;
$type
=
substr
(
$type
,0,(
index
$type
,
' ->'
)-3);
my
$jenkins
=
"]T[{select_jenkins_setup}"
;
$jenkins
=~s/^"//;
$jenkins
=~s/"$//;
my
$num_of_servers
=0;
my
$ol
=
$jenkins
;
$ol
=~s/^.*(\d+)\sServer.*$/$1/;
if
(
$ol
==1) {
$main::aws
->{
'Jenkins.io'
}->[0]=[];
}
elsif
(
$ol
=~/^\d+$/ &&
$ol
) {
foreach
my
$n
(0..
$ol
) {
$main::aws
->{
'Jenkins.io'
}=[]
unless
exists
$main::aws
->{
'Jenkins.io'
};
$main::aws
->{
'Jenkins.io'
}->[
$n
]=[];
}
}
$num_of_servers
=
$ol
;
my
$cost
=
int
(
$num_of_servers
)
*$money
;
my
$cents
=
''
;
if
(
$cost
=~/^0\./) {
$cents
=
$cost
;
$cents
=~s/^0\.//;
if
(
length
$cents
>2) {
$cents
=~s/^(..)(.*)$/$1.$2/;
$cents
=~s/^0//;
$cents
=
' ('
.
$cents
.
' cents)'
;
}
else
{
$cents
=
' ('
.
$cents
.
' cents)'
;
}
}
my
$show_cost_banner
=
<<'END';
_ _ ___ _ ___
/_\ __ __ ___ _ __| |_ / __|___ __| ||__ \
/ _ \/ _/ _/ -_) '_ \ _| | (__/ _ (_-< _|/_/
/_/ \_\__\__\___| .__/\__| \___\___/__/\__(_)
|_|
END
$show_cost_banner
.=
<<END;
Note: There is a \$$cost per hour cost$cents to launch $num_of_servers
AWS EC2 $type servers for the FullAuto Demo:
$jenkins
END
my
%show_cost
=(
Name
=>
'show_cost'
,
Item_1
=> {
Text
=>
"I accept the \$$cost$cents per hour cost"
,
Result
=>
$standup_jenkins
,
},
Item_2
=> {
Text
=>
"Return to Choose Demo Menu"
,
Result
=>
sub
{
return
'{choose_demo_setup}<'
},
},
Item_3
=> {
Text
=>
"Exit FullAuto"
,
Result
=>
sub
{ Net::FullAuto::FA_Core::cleanup() },
},
Scroll
=> 1,
Banner
=>
$show_cost_banner
,
);
return
\
%show_cost
;
};
our
$select_jenkins_setup
=
sub
{
my
@options
=(
'Jenkins on 1 Server'
);
my
$jenkins_setup_banner
=
<<'END';
_ _ _
| | ___ _ __ | | _(_)_ __ ___
_ | |/ _ \ '_ \| |/ / | '_ \/ __|
| |_| | __/ | | | <| | | | \__ \
\___/ \___|_| |_|_|\_\_|_| |_|___/
Choose the Jenkins setup you wish to demo. Note that more servers
means more expense, and more JVMs means less permformance on a
small instance type. Consider a medium or large instance type (previous
screens) if you wish to test more than 1 JVM on a server. You can
navigate backwards and make new selections with the [<] LEFTARROW key.
END
my
%select_jenkins_setup
=(
Name
=>
'select_jenkins_setup'
,
Item_1
=> {
Text
=>
']C['
,
Convey
=> \
@options
,
Result
=>
$jenkins_setup_summary
,
},
Scroll
=> 1,
Banner
=>
$jenkins_setup_banner
,
);
return
\
%select_jenkins_setup
};
1