#!/usr/bin/perl require './tomcat-lib.pl'; foreign_require('apache', 'apache-lib.pl'); sub get_proxy_file{ my $domain_user = $_[0]; my $proxy_file = ''; if( -d '/etc/httpd/conf.d' ){ $proxy_file = '/etc/httpd/conf.d/tomcat.conf'; }elsif( -d '/etc/apache2/conf-enabled/'){ #ubuntu or debian $proxy_file = '/etc/apache2/conf-enabled/tomcat.conf'; } return $proxy_file; } sub load_proxy_maps{ my $proxy_file = $_[0]; my %maps; open(my $fh, '<', $proxy_file) or return %maps; while(my $line = <$fh>){ if($line =~ /^ProxyPass ([\/a-z0-9_\-\.]+) ([a-z:\/0-9\.\-]+)/i){ $maps{$2} = $1; } } close $fh; return %maps; } sub add_proxy{ my $proxy_file = $_[0]; my $app_name = $_[1]; my $default = $_[2]; my $ssl_port = $_[3]; my $wildcard = $_[4]; my %idata = ('port_http'=>'8080', 'port_https'=>'8443'); my $app_path = '/'; if($default == 0){ #if app is not default $app_path .= $app_name; } if($wildcard == 1){ $app_name = ''; } my $lref = &read_file_lines($proxy_file); my $lnum = 0; my $proxy_header_section = 0; my $user_domain = 'localhost'; foreach my $line (@$lref) { if($line =~ /^ProxyPass \/ |^ProxyPassReverse \/ /){ #another default app if($default == 1){ #if new app is default delete @{$lref}[$lnum]; #remove old default app } }elsif($line =~ /^ProxyPass.*\/$app_name$/){ #if its a line with our app delete @{$lref}[$lnum]; }elsif($line =~ /^ProxyRequests Off$/){ $proxy_header_section = 1; #proxy settings are found }elsif($line =~ /^ServerName (.*)$/){ $user_domain = $1; } $lnum++; } my $conf_tail; if(@$lref[$lnum] eq ''){ $conf_tail = pop @{$lref}; } if($proxy_header_section == 0){ my $line = "ProxyRequests Off ProxyPreserveHost On Order allow,deny Allow from all "; push(@$lref, $line); } my $proto = ''; if($ssl_port == 1){ $proto = 's'; } push(@$lref, "ProxyPass $app_path http".$proto."://$user_domain:".$idata{'port_http'.$proto}."/$app_name"); push(@$lref, "ProxyPassReverse $app_path http".$proto."://$user_domain:".$idata{'port_http'.$proto}."/$app_name"); if($conf_tail){ push(@$lref, $conf_tail); #Restore conf end } flush_file_lines($proxy_file); } sub remove_proxy{ my ($proxy_file, $app_path) = @_; my $lref = &read_file_lines($proxy_file); my $lnum = 0; foreach my $line (@$lref) { if($line =~ /^ProxyPass $app_path |^ProxyPassReverse $app_path /){ #if its a line with our app delete @{$lref}[$lnum]; } $lnum++; } flush_file_lines($proxy_file); } &ReadParse(); my $form_submit = 0; if ($in{'submit_flag'}) { $form_submit = 1; } &ui_print_header(undef, $text{'proxy_title'}, ""); my $proxy_file = get_proxy_file($remote_user); if($proxy_file eq ''){ print "Error: Failed to find proxy file for user $remote_user" } if($form_submit == 1){ if($in{'app_path'}){ remove_proxy($proxy_file, $in{'app_path'}); }else{ add_proxy($proxy_file, $in{'app_name'}, $in{'app_default'}, $in{'proxy_ssl'}, $in{'app_wildcard'}); } apache::restart_apache(); } my %maps = load_proxy_maps($proxy_file); my @tds = (); print &ui_columns_start(['Path','URL'], undef, 0, \@tds, 'Apps with proxy ('.$proxy_file.')'); foreach my $url (keys %maps) { my @cols; push(@cols, $maps{$url}); push(@cols, "$url"); print &ui_columns_row(\@cols, \@tds); } print &ui_columns_end(); print &ui_form_start("edit_proxy.cgi", "post"); print &ui_hidden('submit_flag', 1); print &ui_table_start($text{'proxy_add_options'}, undef, 2); my @apps = get_all_war_infos(); @opt_apps = ( ); foreach $app (@apps) { push(@opt_apps, [ $app, $app ]); } print &ui_table_row($text{'proxy_wildcard'}, &ui_checkbox("app_wildcard", 1, $text{'proxy_wildcard_info'}, 0), 2); print &ui_table_hr(); print &ui_table_row($text{'wars_installed'}, &ui_select("app_name", undef, \@opt_apps, 10, 1), 2); print &ui_table_row($text{'proxy_default_app'}, &ui_checkbox("app_default", 1, $text{'proxy_app_default_warning'}, 0), 2); print &ui_table_row($text{'proxy_ssl'}, &ui_checkbox("proxy_ssl", 1, $text{'proxy_ssl_info'}, 0), 2); print &ui_table_end(); print &ui_form_end([ [ "", $text{'proxy_installok'} ] ]); print &ui_form_start("edit_proxy.cgi", "post"); print &ui_hidden('submit_flag', 1); print &ui_table_start($text{'proxy_remove_options'}, undef, 2); @opt_paths = ( ); foreach $path (keys %maps) { my $val = $maps{$path}; push(@opt_paths, [ $val, $val ]); } print &ui_table_row($text{'proxy_list'}, &ui_select("app_path", undef, \@opt_paths, 10, 1), 2); print &ui_table_end(); print &ui_form_end([ [ "", $text{'proxy_removeok'} ] ]); &ui_print_footer("", $text{'index_return'});