#!/usr/local/bin/perl # install_pack.cgi # Install a package from some source require './cluster-software-lib.pl'; if ($ENV{REQUEST_METHOD} eq "POST") { &ReadParse(\%getin, "GET"); &ReadParseMime(undef, \&read_parse_mime_callback, [ $getin{'id'} ]); } else { &ReadParse(); $no_upload = 1; } &error_setup($text{'install_err'}); if ($in{source} == 2) { &ui_print_unbuffered_header(undef, $text{'install_title'}, "", "install_pack"); } else { &ui_print_header(undef, $text{'install_title'}, "", "install_pack"); } if ($in{source} == 0) { # installing from local file (or maybe directory) if (!$in{'local'}) { &install_error($text{'install_elocal'}); } if (!-r $in{'local'}) { &install_error(&text('install_elocal2', $in{'local'})); } $source = $in{'local'}; $pfile = $in{'local'}; $filename = $in{'local'}; $filename =~ s/^(.*)[\\\/]//; $need_unlink = 0; } elsif ($in{source} == 1) { # installing from upload .. store file in temp location if ($no_upload) { &install_error($text{'install_eupload'}); } $in{'upload_filename'} =~ /([^\/\\]+$)/; $filename = $in{'upload_filename'}; $filename =~ s/^(.*)[\\\/]//; $pfile = &tempname("$1"); &open_tempfile(PFILE, ">$pfile"); &print_tempfile(PFILE, $in{'upload'}); &close_tempfile(PFILE); $source = $in{'upload_filename'}; $need_unlink = 1; } elsif ($in{source} == 2) { # installing from URL.. store downloaded file in temp location $in{'url'} =~ /\/([^\/]+)\/*$/; $pfile = &tempname("$1"); $progress_callback_url = $in{'url'}; if ($in{'url'} =~ /^(http|https):\/\/([^\/]+)(\/.*)$/) { # Make a HTTP request $ssl = $1 eq 'https'; $host = $2; $page = $3; $port = $ssl ? 443 : 80; if ($host =~ /^(.*):(\d+)$/) { $host = $1; $port = $2; } &http_download($host, $port, $page, $pfile, \$error, \&progress_callback, $ssl); } elsif ($in{'url'} =~ /^ftp:\/\/([^\/]+)(:21)?(\/.*)$/) { $host = $1; $file = $3; &ftp_download($host, $file, $pfile, \$error, \&progress_callback); } else { &install_error(&text('install_eurl', $in{'url'})); } &install_error($error) if ($error); $source = $in{'url'}; $need_unlink = 1; $filename = $in{'url'}; $filename =~ s/^(.*)[\\\/]//; } elsif ($in{source} == 3) { # installing from some update system, so nothing to do here $pfile = $in{'update'}; @rv = split(/\s+/, $in{'update'}); } # Check if any remote systems are using the same package system @anysame = grep { &same_package_system($_) } &list_software_hosts(); @anydiff = grep { !&same_package_system($_) } &list_software_hosts(); # Check validity, if we can $invalid_msg = undef; if ($in{'source'} != 3) { $ps = &software::package_system(); if (!&software::is_package($pfile)) { if (-d $pfile) { &install_error(&text('install_edir', $ps)); } else { # attempt to uncompress local $unc = &software::uncompress_if_needed( $pfile, $need_unlink); if ($unc ne $pfile) { # uncompressed ok.. if (!&software::is_package($unc)) { # but still not valid :( unlink($unc); $invalid_msg = &text('install_ezip', $ps); } else { $pfile = $unc; } } else { # uncompress failed.. give up $invalid_msg = &text('install_efile', $ps); } } } if (!$invalid_msg) { # ask for package to install and install options @rv = &software::file_packages($pfile); } } if ($invalid_msg) { # Could not check package .. but this is OK if we have any remote # systems of different types if (@anydiff) { $filename =~ s/\.[a-z]+$//i; @rv = ( $filename ); $unknownfile = $filename; } else { unlink($pfile) if ($need_unlink); &install_error($invalid_msg); } } # Show install form print &ui_form_start("do_install.cgi"); print &ui_hidden("file", $pfile); print &ui_hidden("unknownfile", $unknownfile); print &ui_hidden("need_unlink", $need_unlink); print &ui_hidden("source", $in{'source'}); print &ui_hidden("ssl", $ssl); print &ui_hidden("host", $host); print &ui_hidden("page", $page); print &ui_hidden("port", $port); print &ui_hidden("ftpfile", $file); print &ui_hidden("down", $in{'down'}); print &ui_table_start($text{'install_header'}, undef, 4); # Packages to install $plist = ""; foreach (@rv) { ($p, $d) = split(/\s+/, $_, 2); if ($d) { $plist .= &html_escape($d)," (",&html_escape($p),")
\n"; } else { $plist .= &html_escape($p),"
\n"; } } print &ui_table_row($text{'install_packs'}, $plist, 3); # Type-specific options if ($in{'source'} != 3 && !@anydiff) { &software::install_options($pfile, $p); } # Show input for hosts to install on &create_on_input($text{'install_servers'}, $in{'source'} == 3, $in{'source'} == 3); print &ui_table_end(); print &ui_form_end([ [ undef, $text{'install_ok'} ] ]); &ui_print_footer("", $text{'index_return'}); sub install_error { print "$main::whatfailed : $_[0]

\n"; &ui_print_footer("", $text{'index_return'}); exit; }