=head1 tomcat-lib.pl
Functions for managing Tomcat server configuration files.
foreign_require("tomcat", "tomcat-lib.pl");
@sites = tomcat::list_tomcat_websites()
=cut
BEGIN { push(@INC, ".."); };
use WebminCore;
use File::Copy;
init_config();
# Returns a hash containing the version type, number and full version
sub get_catalina_version
{
local %version;
local $catalina_home = get_catalina_home();
local $out = &backquote_command($catalina_home."/bin/catalina.sh version 2>&1 > 8, $cmd_err);
}else{
my $status = '';
my @kw = ('Main PID', 'Active', 'Tasks','Memory');
foreach $k (@kw) {
if($cmd_out =~ /$k: (.*)/i){
$status .= ''.$k.': '.$1."";
}
}
return ($out >> 8, $status);
}
}
sub get_all_war_infos(){
my $catalina_home = get_catalina_home();
opendir(DIR, $catalina_home.'/webapps') or die $!;
my @dirs
= grep {
! /^\./ # Doesn't begins with a period
&& -d "$catalina_home/webapps/$_" # and is a directory
} readdir(DIR);
closedir(DIR);
return sort @dirs;
}
sub file_basename
{
my $rv = $_[0];
$rv =~ s/^.*[\/\\]//;
return $rv;
}
sub sort_version {
my @A = split(/\./, $a);
my @B = split(/\./, $b);
# a sort subroutine, expect $a and $b
for(my $i=0; $i < 3; $i++){
if ($A[$i] < $B[$i]) { return -1 } elsif ($A[$i] > $B[$i]) { return 1 }
}
return 0;
}
sub latest_tomcat_version{
my $tomcat_ver = $_[0];
my %version;
if(-f "$module_config_directory/version"){
read_file_cached("$module_config_directory/version", \%version);
if( $version{'updated'} >= (time() - 86400)){ #if last update was less than a day ago
return $version{'latest'} if ($version{'latest'} ne '0.0.0');
}
}
my $major = (split /\./, $tomcat_ver)[0];
my @all_ver = &major_tomcat_versions($major);
my $latest_ver = $all_ver[-1];
#renew the updated timestamp and latest version
$version{'updated'} = time();
$version{'latest'} = $latest_ver;
&write_file("$module_config_directory/version", \%version);
return $latest_ver;
}
sub installed_tomcat_version(){
my %os_env;
read_env_file('/etc/environment', \%os_env);
if($os_env{'CATALINA_HOME'}){
$os_env{'CATALINA_HOME'} =~ /\/home\/tomcat\/apache-tomcat-([0-9\.]+)/;
return $1;
}else{
return undef;
}
}
sub get_catalina_home(){
my $tomcat_ver = installed_tomcat_version();
return "/home/tomcat/apache-tomcat-$tomcat_ver";
}
sub download_and_install{
my $tomcat_ver = $_[0];
my $major = (split /\./, $tomcat_ver)[0];
#download tomcat archive
$in{'url'} = "https://archive.apache.org/dist/tomcat/tomcat-$major/v$tomcat_ver/bin/apache-tomcat-$tomcat_ver.tar.gz";
$in{'source'} = 2;
my $tmpfile = process_file_source();
#extract tomcat archive
my $cmd_out='';
my $cmd_err='';
print "
Extracting to /home/tomcat/apache-tomcat-$tomcat_ver/ ...
";
local $out = &execute_command("tar -x -v --overwrite -f \"$tmpfile\" -C/home/tomcat/", undef, \$cmd_out, \$cmd_err, 0, 0);
if($cmd_err ne ""){
&error("Error: tar: $cmd_err");
}else{
$cmd_out = s/\n/
/g;
print &html_escape($cmd_out);
print "Done
";
}
#folder is created after tomcat is started, but we need it now
&make_dir("/home/tomcat/apache-tomcat-$tomcat_ver/conf/Catalina/localhost/", 0755, 1);
open(my $fh, '>', "/home/tomcat/apache-tomcat-$tomcat_ver/conf/Catalina/localhost/manager.xml") or die "open:$!";
print $fh <
EOF
close $fh;
#&set_ownership_permissions('tomcat','tomcat', undef, "/home/tomcat/apache-tomcat-$tomcat_ver/");
&execute_command("chown -R tomcat:tomcat /home/tomcat/apache-tomcat-$tomcat_ver");
return $tomcat_ver;
}
sub setup_catalina_env{
my $tomcat_ver = $_[0];
my %os_env;
print "
Setting CATALINA environment...
";
read_env_file('/etc/environment', \%os_env);
$os_env{'CATALINA_HOME'} = "/home/tomcat/apache-tomcat-$tomcat_ver/";
$os_env{'CATALINA_BASE'} = "/home/tomcat/apache-tomcat-$tomcat_ver/";
write_env_file('/etc/environment', \%os_env, 0);
open(my $fh, '>>', "/home/tomcat/apache-tomcat-$tomcat_ver/bin/setenv.sh") or die "open:$!";
print $fh "CATALINA_PID=\"/home/tomcat/apache-tomcat-$tomcat_ver/temp/tomcat.pid\"\n";
close $fh;
}
sub get_installed_libs{
opendir(DIR, $module_config_directory) or die $!;
my @lib_lists
= grep {
/^lib_[a-z0-9\.\-_\s]+\.list$/i #
&& -f "$module_config_directory/$_" # and is a file
} readdir(DIR);
closedir(DIR);
return sort @lib_lists;
}
sub process_file_source{
my $file = '';
if (($in{'source'} == 0) && ($in{'file'} ne "")) { # from local file
&error_setup(&text('source_err0', $in{'file'}));
$file = $in{'file'};
if (!(-r $file)){
&inst_error($text{'source_err0'});
}
}elsif (($in{'source'} == 1) && ($in{'upload_filename'} ne "")) { # from uploaded file
&error_setup($text{'source_err1'});
$need_unlink = 1;
if ($no_upload) {
&inst_error($text{'source_err1.2'});
}
$file = transname(file_basename($in{'upload_filename'}));
open(MOD, ">$file");
binmode(MOD);
print MOD $in{'upload'};
close(MOD);
}elsif ($in{'source'} == 2 and $in{'url'} ne '') { # from ftp or http url (possible third-party)
$url = $in{'url'};
&error_setup(&text('source_err2', $url));
$file = &transname(file_basename($url));
$need_unlink = 1;
my $error;
$progress_callback_url = $url;
if ($url =~ /^(http|https):\/\/([^\/]+)(\/.*)$/) {
$ssl = $1 eq 'https';
$host = $2; $page = $3; $port = $ssl ? 443 : 80;
if ($host =~ /^(.*):(\d+)$/) { $host = $1; $port = $2; }
my %cookie_headers = ('Cookie'=>'oraclelicense=accept-securebackup-cookie');
&http_download($host, $port, $page, $file, \$error,
\&progress_callback, $ssl, undef, undef, 0, 0, 1, \%cookie_headers);
} elsif (
$url =~ /^ftp:\/\/([^\/]+)(:21)?\/(.*)$/) {
$host = $1; $ffile = $3;
&ftp_download($host, $ffile, $file, \$error, \&progress_callback);
}else {
&inst_error($text{'source_err3'});
}
&inst_error($error) if ($error);
}
return $file;
}
sub get_tomcat_major_versions(){
my @majors = ();
my $url = "https://archive.apache.org/dist/tomcat/";
&error_setup(&text('install_err3', $url));
my $error = '';
my $tmpfile = &transname('tomcat.html');
&http_download('archive.apache.org', 80, "/dist/tomcat/", $tmpfile, \$error);
if($error){
error($error);
}
my @latest_versions;
open(my $fh, '<', $tmpfile) or die "open:$!";
while(my $line = <$fh>){
if($line =~ /tomcat\-[0-9\.]+\/<\/a>/){
push(@majors, $1);
}
}
close $fh;
return reverse sort sort_version @majors;
}
sub major_tomcat_versions{
my $major = $_[0]; #Tomcat major version 6,7,8,9
my $url = "https://archive.apache.org/dist/tomcat/tomcat-$major/";
&error_setup(&text('install_err3', $url));
my $error = '';
my $tmpfile = &transname('tomcat.html');
&http_download('archive.apache.org', 80, "/dist/tomcat/tomcat-$major/", $tmpfile, \$error);
if($error){
error($error);
}
my @latest_versions;
open(my $fh, '<', $tmpfile) or die "open:$!";
while(my $line = <$fh>){
if($line =~ /v[0-9\.]+\/<\/a>/){
push(@latest_versions, $1);
}
}
close $fh;
return sort sort_version @latest_versions;
}