=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(); sub get_tomcat_config { my $lref = &read_file_lines($config{'foobar_conf'}); my @rv; my $lnum = 0; foreach my $line (@$lref) { my ($n, $v) = split(/\s+/, $line, 2); if ($n) { push(@rv, { 'name' => $n, 'value' => $v, 'line' => $lnum }); } $lnum++; } return @rv; } # 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 : '.$1."
"; } } } $running = $out >> 8; if($ctl eq 'status'){ # swap running values, to match init.d logic if($running == 0){ $running = 1; }elsif($running > 0){ $running = 0; } } }else{ local $out = &execute_command("/etc/init.d/tomcat $ctl", undef, \$cmd_out, \$cmd_err, 0, 0); $running = $out >> 8; if($cmd_err ne ""){ $status = $cmd_err; }else{ $status = $cmd_out; } } return ($running, $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)){ &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) { &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 { &error($text{'source_err3'}); } &error($error) if ($error); } return $file; } sub unzip_file{ my $file = $_[0]; my @suffixlist = ('.zip'); ($lib_name,$path,$lib_suffix) = fileparse($file,@suffixlist); my $unzip_dir = "/tmp/.webmin/$lib_name"; #if old temp extension dir exist, remove it #if( -d $unzip_dir and rmtree($unzip_dir) == 0){ # &error("Failed to remove temp extension dir"); # &ui_print_footer("", $text{'index_return'}); # exit; #} &make_dir($unzip_dir, 0754, 1); my $unzip_out; my $unzip_err; print "
Unzipping to $unzip_dir ...
"; local $out = &execute_command("unzip -u \"$file\" -d \"$unzip_dir\"", undef, \$unzip_out, \$unzip_err, 0, 0); if($unzip_err){ &error("Error: unzip: $unzip_err"); }else{ $unzip_out = s/\r\n/
/g; print &html_escape($unzip_out); } return $unzip_dir; } 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; } sub setup_tomcat_service{ my $tomcat_ver = $_[0]; if (&has_command('systemctl')) { copy_source_dest("$module_root_directory/tomcat.service", '/etc/systemd/system/tomcat.service'); my $ln = 0; $lref = read_file_lines('/etc/systemd/system/tomcat.service'); foreach $line (@$lref){ chomp $line; if($line =~ /\$TOMCAT_VER/){ #if its a section start $line =~ s/\$TOMCAT_VER/$tomcat_ver/; @{$lref}[$ln] = $line; }elsif($line =~ /\$CATALINA_HOME/){ $line =~ s/\$CATALINA_HOME/\/home\/tomcat\/apache-tomcat-$tomcat_ver/; @{$lref}[$ln] = $line; } $ln=$ln+1; } &flush_file_lines('/etc/systemd/system/tomcat.service'); &set_ownership_permissions('root','root', 0555, "/etc/systemd/system/tomcat.service"); &backquote_command("systemctl daemon-reload", undef, \$cmd_out, \$cmd_err, 0, 0); }else{ copy_source_dest("$module_root_directory/tomcat.init", '/etc/init.d/tomcat'); &set_ownership_permissions('root','root', 0555, "/etc/init.d/tomcat"); } print "
Setting Tomcat service ..."; } sub upgrade_available(){ my $tomcat_ver = installed_tomcat_version(); my $latest_ver = latest_tomcat_version($tomcat_ver); my @versions = ($tomcat_ver, $latest_ver); @versions = sort sort_version @versions; if($versions[0] eq $tomcat_ver){ return ''; }else { return $latest_ver; } }