#!/usr/bin/perl require './geohelm-lib.pl'; require './tomcat-lib.pl'; require './pg-lib.pl'; require './geoserver-lib.pl'; require '../webmin/webmin-lib.pl'; #for OS detection foreign_require('software', 'software-lib.pl'); sub add_tomcat_user{ #check if tomcat user exists if(read_file_contents('/etc/passwd') !~ /\ntomcat:/){ #add tomcat user local $out = &backquote_command('useradd -m tomcat', 0); }elsif(! -d '/home/tomcat'){ &make_dir("/home/tomcat", 0755, 1); &set_ownership_permissions('tomcat','tomcat', undef, '/home/tomcat'); } } sub setup_tomcat_users{ my $tomcat_ver = $_[0]; my @pw_chars = ("A".."Z", "a".."z", "0".."9", "_", "-"); my $manager_pass; my $admin_pass; $manager_pass .= $pw_chars[rand @pw_chars] for 1..32; $admin_pass .= $pw_chars[rand @pw_chars] for 1..32; #Save tomcat-users.xml open(my $fh, '>', "/home/tomcat/apache-tomcat-$tomcat_ver/conf/tomcat-users.xml") or die "open:$!"; print $fh < EOF close $fh; print "
Setting Tomcat users..."; } sub setup_tomcat_service{ my $tomcat_ver = $_[0]; copy_source_dest("$module_root_directory/tomcat.service", '/etc/init.d/tomcat'); &set_ownership_permissions('root','root', 0555, "/etc/init.d/tomcat"); print "
Setting Tomcat service ..."; } sub install_tomcat_from_archive{ add_tomcat_user(); my $tomcat_ver = download_and_install($in{'source_archive'}); setup_catalina_env($tomcat_ver); setup_tomcat_users($tomcat_ver); setup_tomcat_service($tomcat_ver); } sub latest_leafletjs_version(){ my $tmpfile = transname('download.html'); &error_setup(&text('install_err3', "https://leafletjs.com/download.html")); &http_download('leafletjs.com', 443, '/download.html', $tmpfile, \$error, undef, 1); if($error){ print &html_escape($error); die "Error: Failed to get latest version of LeafletJS"; } my $latest_url = 'https://leafletjs-cdn.s3.amazonaws.com/content/leaflet/v1.9.3/leaflet.zip'; open(my $fh, '<', $tmpfile) or die "open:$!"; while(my $line = <$fh>){ if($line =~ /(https:\/\/.*leaflet\/v[0-9\.]+\/leaflet\.zip)/){ $latest_ver = $1; last; } } close $fh; return $latest_url; } sub install_leafletjs{ if( -d '/var/www/html/leafletjs'){ return 0; } $in{'source'} = 2; $in{'url'} = latest_leafletjs_version(); my $tmpfile = process_file_source(); my $ll_dir = unzip_me($tmpfile); print "Moving to /var/www/html/leafletjs ..."; rename_file($ll_dir, '/var/www/html/leafletjs'); &execute_command("chown -R root:root '/var/www/html/leafletjs'"); } sub latest_openlayers_version(){ my $tmpfile = transname('download.html'); &error_setup(&text('install_err3', "https://openlayers.org/download")); &http_download('openlayers.org', 443, '/download', $tmpfile, \$error, undef, 1); if($error){ print &html_escape($error); die "Error: Failed to get latest version of OpenLayers"; } my $latest_ver = '0.0.0'; open(my $fh, '<', $tmpfile) or die "open:$!"; while(my $line = <$fh>){ #Downloads for the v4.2.0 release if($line =~ /Downloads\sfor\sthe\sv([0-9\.]+)\srelease/){ $latest_ver = $1; last; } } close $fh; return $latest_ver; } sub install_openlayers{ if( -d '/var/www/html/OpenLayers'){ return 0; } #get OpenLayers version my $ol_ver = latest_openlayers_version(); my $dist = '-package'; #'-site' string for full release or '-package' for libs only my $tmpfile = transname("v${ol_ver}.zip"); my $url = "https://github.com/openlayers/openlayers/releases/download/v${ol_ver}/v${ol_ver}${dist}.zip"; $progress_callback_url = $url; &error_setup(&text('install_err3', $url)); &http_download('github.com', 443, "/openlayers/openlayers/releases/download/v${ol_ver}/v${ol_ver}${dist}.zip", $tmpfile, \$error, \&progress_callback, 1); if($error){ print &html_escape($error); die "Error: Failed to get latest OpenLayers archive"; } my $ol_dir = unzip_me($tmpfile); print "Moving ${ol_dir} to /var/www/html/OpenLayers ..."; rename_file($ol_dir, '/var/www/html/OpenLayers'); &execute_command("chown -R root:root '/var/www/html/OpenLayers'"); } sub install_bootstrap_web_app(){ my $www_dir = '/var/www/html'; if( ! -d $www_dir){ print &html_escape("Error: $www_dir is missing"); return 0; } #download bootstrap web app zip my $url = "https://cdn.acugis.com/geohelm/docs.tar.bz2"; $progress_callback_url = $url; &error_setup(&text('install_err3', $url)); my $tmpfile = &transname("docs.tar.bz2"); &http_download('cdn.acugis.com', 443, "/geohelm/docs.tar.bz2", $tmpfile, \$error, \&progress_callback, 1); if($error){ print &html_escape($error); return 1; } #unzip extension to temp dir $cmd_out; $cmd_err; print "
Extracting docs ...
"; local $out = &execute_command("tar -x --overwrite -f \"$tmpfile\" -C\"$www_dir\"", undef, \$cmd_out, \$cmd_err, 0, 0); if($cmd_err){ &error("Error: tar: $cmd_err"); }else{ $cmd_out = s/\r\n/
/g; print &html_escape($cmd_out); } open(my $fh, '>', "$module_config_directory/bootstraped.txt") or die "open:$!"; print $fh "Installed\n"; close $fh; #update localhost in demo html my @demo_files = ('LeafletJSDemo.html', 'OpenLayersDemo.html'); foreach my $file (@demo_files){ print 'Updating localhost in '.$file."
"; my $ln = 0; $lref = read_file_lines($www_dir.'/'.$file); foreach my $line (@$lref){ if($line =~ /http:\/\/localhost\/geoserver\/wms/){ @{$lref}[$ln] =~ s/localhost\/geoserver/$ENV{'SERVER_NAME'}\/geoserver/; } $ln=$ln+1; } &flush_file_lines($www_dir.'/'.$file); } print "Done
"; return 0; } sub setup_apache_for_geoserver(){ my $gs_proxy_file = ''; my %osinfo = &detect_operating_system(); if( ( $osinfo{'real_os_type'} =~ /centos/i) or #CentOS ($osinfo{'real_os_type'} =~ /fedora/i) or #Fedora ($osinfo{'real_os_type'} =~ /scientific/i) ){ if( ! -d '/etc/httpd/'){ return 0; } $gs_proxy_file = '/etc/httpd/conf.d/geoserver_proxy.conf'; }elsif( ($osinfo{'real_os_type'} =~ /ubuntu/i) or ($osinfo{'real_os_type'} =~ /debian/i) ){ #ubuntu or debian if( ! -d '/etc/apache2/'){ return 0; } $gs_proxy_file = '/etc/apache2/conf-enabled/geoserver_proxy.conf'; } if(! -f $gs_proxy_file){ open(my $fh, '>', $gs_proxy_file) or die "open:$!"; if( ($osinfo{'real_os_type'} =~ /centos/i) or #CentOS ($osinfo{'real_os_type'} =~ /fedora/i) ){ #Fedora &execute_command('setsebool httpd_can_network_connect 1'); print $fh "LoadModule proxy_module modules/mod_proxy.so\n"; print $fh "LoadModule proxy_http_module modules/mod_proxy_http.so\n"; print $fh "LoadModule rewrite_module modules/mod_rewrite.so\n"; }elsif( $osinfo{'os_type'} =~ /debian/i){ #ubuntu or debian print $fh "LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so\n"; print $fh "LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so\n"; print $fh "LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so\n"; } print $fh "ProxyRequests Off\n"; print $fh "ProxyPreserveHost On\n"; print $fh " \n"; print $fh " Order allow,deny\n"; print $fh " Allow from all\n"; print $fh " \n"; print $fh "ProxyPass /geoserver http://localhost:8080/geoserver\n"; print $fh "ProxyPassReverse /geoserver http://localhost:8080/geoserver\n"; close $fh; } print "Wrote configuration to $gs_proxy_file\n"; } sub check_pg_ext_deps{ my $pg_ver = $_[0]; my $pg_ver2; ($pg_ver2 = $pg_ver) =~ s/\.//; my @ext_pkgs; my %osinfo = &detect_operating_system(); if( ($osinfo{'os_type'} =~ /debian/i)){ @ext_pkgs = ("postgresql-$pg_ver-postgis-3-scripts", "postgresql-$pg_ver-pgrouting-scripts", "postgresql-$pg_ver-pgrouting"); }elsif( $osinfo{'os_type'} =~ /arch/i){ #Arch @ext_pkgs = 'postgis'; }elsif($osinfo{'os_type'} =~ /suse/i){ #Suse @ext_pkgs = "postgresql$pg_ver2-postgis postgresql$pg_ver2-postgis-utils"; }elsif( $osinfo{'os_type'} =~ /redhat/i){ @ext_pkgs = ("pgrouting_$pg_ver2", "postgresql$pg_ver2-contrib"); my @pgis_pkgs = (); my $cache_file = '/tmp/postgis_versions_cache'; if(-f $cache_file){ my %version; read_file_cached($cache_file, \%version); if($version{'updated'} >= (time() - 86400)){ #if last update was less than a day ago @pgis_pkgs = split ',', $version{'postgis_versions'}; } } if(scalar(@pgis_pkgs) == 0){ my @avail = search_pkg('postgis'); #we have postgis{23,24,25}_{96,...,10,11} foreach $a (@avail) { if($a->{'name'} =~ /^postgis[0-9]+_$pg_ver2$/){ push(@pgis_pkgs, $a->{'name'}); } } @pgis_pkgs = sort @pgis_pkgs; #save the results my %version; $version{'updated'} = time(); $version{'postgis_versions'} = join(',', @pgis_pkgs); &write_file($cache_file, \%version); } push(@ext_pkgs, @pgis_pkgs[-1]); push(@ext_pkgs, @pgis_pkgs[-1].'-client'); } return @ext_pkgs; } sub select_tomcat_archive{ print "$text{'base_desc1'}

\n"; print &ui_form_start("setup.cgi", "form-data"); print ui_hidden('mode', 'tomcat_install'); print &ui_table_start($text{'base_options'}, undef, 2); my @tmver = &get_tomcat_major_versions(); my $sel_tmver = $in{'tmver'} || $tmver[0]; my @tm_opts = ( ); foreach my $v (@tmver) { push(@tm_opts, [ $v, $v ]); } print < function update_select(){ var majorSel = document.getElementById('base_major'); var major = majorSel.options[majorSel.selectedIndex].value; get_pjax_content('/geohelm/setup.cgi?mode=tomcat_install_form&tmver='+major); } EOF print &ui_table_row($text{'base_major'}, &ui_select("base_major", $sel_tmver, \@tm_opts, 1, 0, undef, undef, 'id="base_major" onchange="update_select()"')); my @tver = &major_tomcat_versions($sel_tmver); my @tver_opts = ( ); foreach my $v (reverse @tver) { push(@tver_opts, [ $v, $v ]); } print &ui_table_row($text{'base_installsource'}, &ui_radio_table("source", 100, [ [ 100, $text{'base_archive'}, &ui_select("source_archive", undef, \@tver_opts,1, 0)], [ 0, $text{'source_local'}, &ui_textbox("file", undef, 40)." ". &file_chooser_button("file", 0) ], [ 1, $text{'source_uploaded'}, &ui_upload("upload", 40) ], [ 2, $text{'source_ftp'},&ui_textbox("url", undef, 40) ] ])); print &ui_table_end(); print &ui_form_end([ [ "", $text{'base_installok'} ] ]); } sub setup_checks{ #Check for commands if (!&has_command('java')) { print '

Warning: Java is not found. Install it manually or from the '. "Java tab

"; } my $tomcat_ver = installed_tomcat_version(); if(!$tomcat_ver){ print "

Click here to install Tomcat from Apache site.

"; } my @dep_pkgs; if (!&has_command('unzip')) { push(@dep_pkgs, 'unzip'); } if (!&has_command('bzip2')) { push(@dep_pkgs, 'bzip2'); } my %osinfo = &detect_operating_system(); my $apache_pkg = 'apache2'; if($osinfo{'os_type'} =~ /redhat/i){ $apache_pkg = 'httpd'; }elsif($osinfo{'os_type'} =~ /debian/i){ $apache_pkg = 'apache2'; } if(!software::package_info($apache_pkg, undef)){ push(@dep_pkgs, $apache_pkg); } if($osinfo{'real_os_type'} =~ /centos/i){ #CentOS my @pinfo = software::package_info('epel-release', undef, ); if(!@pinfo){ push(@dep_pkgs, 'epel-release'); } } if(scalar(@dep_pkgs) > 0){ my $pkg_list = join(', ', @dep_pkgs); my $pkgs_urlize = &urlize(join(' ', @dep_pkgs)); print "

Warning: $pkg_list packages are not installed. Install them manually or ". "click here to have them installed.

"; } my @pinfo = software::package_info('haveged', undef, ); if(!@pinfo){ print "

Warning: haveged package is not installed. Install it manually or ". "click here to have it downloaded and installed.

"; } #Check if bootstrap web application is installed if (! -f "$module_config_directory/bootstraped.txt"){ print '

Warning: Bootstrap web app is not installed in /var/www/html. '. "Click here install it"; } # Check if OpenLayers exists if (! -d "/var/www/html/OpenLayers"){ print "

The OpenLayers direcrory /var/www/html/OpenLayers does not exist. ". "Click here install it"; } # Check if LeafletJS exists if (! -d "/var/www/html/leafletjs"){ print "

The LeafletJS direcrory /var/www/html/leafletjs does not exist. ". "Click here install it"; } # Check if GeoExplorer webapp exists if($tomcat_ver){ my $catalina_home = get_catalina_home(); # Check if geoserver webapp exists if (! -d "$catalina_home/webapps/geoserver/") { if( -f "$catalina_home/webapps/geoserver.war"){ print "

The GeoServer webapp is not deployed yet!"; }else{ my $geo_ver = get_latest_geoserver_ver(); my $url = &urlize("http://sourceforge.net/projects/geoserver/files/GeoServer/$geo_ver/geoserver-$geo_ver-war.zip"); print "

The Geoserver webapp direcrory $catalina_home/webapps/geoserver/ does not exist. ". "Click here to have it downloaded and installed.

"; } } } #check for GeoServer Apache config if( ( $osinfo{'real_os_type'} =~ /centos/i) or #CentOS ($osinfo{'real_os_type'} =~ /fedora/i) or #Fedora ($osinfo{'real_os_type'} =~ /scientific/i) ){ $gs_proxy_file = '/etc/httpd/conf.d/geoserver_proxy.conf'; }elsif( ($osinfo{'real_os_type'} =~ /ubuntu/i) or ($osinfo{'real_os_type'} =~ /debian/i) ){ #ubuntu or debian $gs_proxy_file = '/etc/apache2/conf-enabled/geoserver_proxy.conf'; } if(! -f $gs_proxy_file){ print "

The GeoServer Apache config $gs_proxy_file does not exist. ". "Click here to create it."; } my $pg_ver; if(have_pg_repo() == 0){ print '

Warning: PostgreSQL repository is not found. Install it from '.$text{'pg_inst_title'}.''; }else{ $pg_ver = get_installed_pg_version(); if(!$pg_ver){ print '

Warning: PostgreSQL is not installed. Install it from '.$text{'pg_inst_title'}.''; }else{ if (!&has_command('shp2pgsql')) { my $shp2pg_pkg = get_shp2pgsql_pkg_name($pg_ver); print '

Warning: shp2pgsql command is not found. '. "Click here to have it installed from $shp2pg_pkg package.

"; } my @ext_pkgs = check_pg_ext_deps($pg_ver); foreach my $pkg (@ext_pkgs){ my @pinfo = software::package_info($pkg); if(!@pinfo){ print "

Warning: $pkg package is not installed. Install it manually or ". "click here to have it downloaded and installed.

"; } } } } if(foreign_installed('postgresql', 1) != 2){ print '

Warning: Webmin Postgresql module is not installed! Set it up from here

'; } print '

If you don\'t see any warnings above, you can complete setup by clicking '. "here

"; } #Remove all setup files sub setup_cleanup{ my $file = $module_root_directory.'/setup.cgi'; print "Completing Set Up....
"; &unlink_file($file); print &js_redirect("index.cgi"); } &ui_print_header(undef, $text{'setup_title'}, ""); if($ENV{'CONTENT_TYPE'} =~ /boundary=(.*)$/) { &ReadParseMime(); }else { &ReadParse(); $no_upload = 1; } my $mode = $in{'mode'} || "checks"; if($mode eq "checks"){ setup_checks(); &ui_print_footer('', $text{'index_return'}); exit 0; }elsif($mode eq "cleanup"){ setup_cleanup(); &ui_print_footer('', $text{'index_return'}); exit 0; }elsif($mode eq "tomcat_install_form"){ select_tomcat_archive(); }elsif($mode eq "tomcat_install"){ install_tomcat_from_archive(); }elsif($mode eq "install_bootstrap_web_app"){ install_bootstrap_web_app(); }elsif($mode eq "install_openlayers"){ install_openlayers(); }elsif($mode eq "install_leafletjs"){ install_leafletjs(); }elsif($mode eq "setup_geoserver_apache"){ setup_apache_for_geoserver(); }else{ print "Error: Invalid setup mode\n"; } &ui_print_footer('setup.cgi', $text{'setup_title'});