* Use pkg_info -E pkgname* for testing if a package is installed.

* Do not call eval if we cannot include an .inc file since that will make the whole script fail.
* Keep the log from the start to the end without overwriting. This makes debugging and problem reporting easy and explains what is done during installation.
* Check retrun value of download_with_progress_bar to make it possible catching errors during download.
* Lots of improvements in between

Related to Ticket #950
This commit is contained in:
Ermal 2010-11-16 19:40:20 +00:00
parent 55910da798
commit fcf92daec2
2 changed files with 99 additions and 98 deletions

View File

@ -86,7 +86,7 @@ $g['version'] = intval($ver[1]);
******/
function remove_freebsd_package($packagestring) {
$todel = substr(reverse_strrchr($packagestring, "."), 0, -1);
exec("echo y | /usr/sbin/pkg_delete -x {$todel}");
exec("/usr/sbin/pkg_delete -x {$todel}");
}
/****f* pkg-utils/is_package_installed
@ -209,11 +209,10 @@ function resync_all_package_configs($show_message = false) {
* package is installed.
*/
function is_freebsd_pkg_installed($pkg) {
global $g;
$output = "";
exec("/usr/sbin/pkg_info -E \"{$process}*\"", $output, $retval);
if(in_array($pkg, return_dir_as_array("{$g['vardb_path']}/pkg")))
return true;
return false;
return (intval($retval) == 0);
}
/*
@ -289,14 +288,16 @@ function get_pkg_depends($pkg_name, $filetype = ".xml", $format = "files", $retu
}
function uninstall_package($pkg_name) {
global $config;
global $config, $static_output;
$id = get_pkg_id($pkg_name);
if ($id >= 0) {
$pkg_depends =& $config['installedpackages']['package'][$id]['depends_on_package'];
$static_output .= "Removing package...\n";
update_output_window($static_output);
if (is_array($pkg_depends)) {
foreach ($pkg_depends as $pkg_depend)
delete_package($pkg_depend, $id);
delete_package($pkg_depend);
}
}
delete_package_xml($pkg_name);
@ -400,7 +401,8 @@ function pkg_fetch_recursive($pkgname, $filename, $dependlevel = 0, $base_url =
$pkg_extension = strrchr($filename, '.');
$static_output .= "\n" . str_repeat(" ", $dependlevel * 2) . $pkgname . " ";
$fetchto = "{$g['tmp_path']}/apkg_{$pkgname}{$pkg_extension}";
download_file_with_progress_bar("{$base_url}/{$filename}", $fetchto);
if (download_file_with_progress_bar("{$base_url}/{$filename}", $fetchto) !== true)
return false;
$static_output .= " (extracting)";
update_output_window($static_output);
$slaveout = "";
@ -425,7 +427,7 @@ function pkg_fetch_recursive($pkgname, $filename, $dependlevel = 0, $base_url =
}
}
$pkgaddout = "";
exec("/bin/cat {$g['tmp_path']}/y | /usr/sbin/pkg_add -fv {$fetchto} 2>&1", $pkgaddout);
exec("/usr/sbin/pkg_add -fv {$fetchto} 2>&1", $pkgaddout);
@fwrite($fd_log, $pkgname . " " . print_r($pkgaddout, true) . "\n");
return true;
@ -461,17 +463,15 @@ function install_package($package, $pkg_info = "") {
download_file_with_progress_bar($pkg_info['config_file'], '/usr/local/pkg/' . $fetchto);
if(!file_exists('/usr/local/pkg/' . $fetchto)) {
@fwrite($fd_log, "ERROR! Unable to fetch package configuration file. Aborting installation.\n");
if($pkg_interface == "console") {
conf_mount_ro();
if($pkg_interface == "console")
print "\nERROR! Unable to fetch package configuration file. Aborting package installation.\n";
return;
} else {
else {
$static_output .= "failed!\n\nInstallation aborted.";
update_output_window($static_output);
echo "<br>Show <a href=\"pkg_mgr_install.php?showlog=true\">install log</a></center>";
conf_mount_ro();
return -1;
}
conf_mount_ro();
return -1;
}
$static_output .= "done.\n";
update_output_window($static_output);
@ -560,13 +560,6 @@ function install_package_xml($pkg) {
}
}
/* make 'y' file */
$fd = fopen("{$g['tmp_path']}/y", "w");
for($line = 0; $line < 10; $line++) {
fwrite($fd, "y\n");
}
fclose($fd);
/* pkg_add the package and its dependencies */
if($pkg_info['depends_on_package_base_url'] != "") {
if($pkg_interface == "console")
@ -615,12 +608,12 @@ function install_package_xml($pkg) {
$pkg_config = parse_xml_config_pkg("/usr/local/pkg/" . $configfile, "packagegui");
$static_output .= "done.\n";
update_output_window($static_output);
$static_output .= "Configuring package components...\n";
$static_output .= "\tConfiguring package components...\n";
if (!empty($pkg_config['filter_rules_needed']))
$config['installedpackages']['package'][$pkgid]['filter_rule_function'] = $pkg_config['filter_rules_needed'];
update_output_window($static_output);
/* modify system files */
if(is_array($pkg_config['modify_system']['item'])) {
if(is_array($pkg_config['modify_system']) && is_array($pkg_config['modify_system']['item'])) {
$static_output .= "\tSystem files... ";
update_output_window($static_output);
foreach($pkg_config['modify_system']['item'] as $ms) {
@ -652,7 +645,11 @@ function install_package_xml($pkg) {
safe_mkdir($prefix);
$static_output .= $filename . " ";
update_output_window($static_output);
download_file_with_progress_bar($afn['item'][0], $prefix . $filename);
if (download_file_with_progress_bar($afn['item'][0], $prefix . $filename) !== true) {
$static_output .= "failed.\n";
update_output_window($static_output);
return false;
}
if(stristr($filename, ".tgz") <> "") {
fwrite($fd_log, "Extracting tarball to -C for " . $filename . "...\n");
$tarout = "";
@ -674,12 +671,20 @@ function install_package_xml($pkg) {
* show us where an error exists in a package
* instead of making us blindly guess
*/
$missing_include = false;
if($pkg_config['include_file'] <> "") {
$static_output = "Loading package instructions...";
$static_output .= "Loading package instructions...\n";
update_output_window($static_output);
fwrite($fd_log, "require_once('{$pkg_config['include_file']}')\n");
if (file_exists($pkg_config['include_file']))
require_once($pkg_config['include_file']);
else {
$missing_include = true;
$static_output .= "\tInclude " . basename($pkg_config['include_file']) . " is missing!\n";
update_output_window($static_output);
/* XXX: Should undo the steps before this?! */
return false;
}
}
/* sidebar items */
if(is_array($pkg_config['menu'])) {
@ -724,25 +729,31 @@ function install_package_xml($pkg) {
update_output_window($static_output);
}
/* custom commands */
$static_output .= "\tCustom commands... ";
$static_output .= "Custom commands...\n";
update_output_window($static_output);
if($pkg_config['custom_php_global_functions'] <> "") {
$static_output = "Executing custom_php_global_functions()...";
update_output_window($static_output);
eval_once($pkg_config['custom_php_global_functions']);
if ($missing_include == false) {
if($pkg_config['custom_php_global_functions'] <> "") {
$static_output .= "\tExecuting custom_php_global_functions()...";
update_output_window($static_output);
eval_once($pkg_config['custom_php_global_functions']);
$static_output .= "done.\n";
update_output_window($static_output);
}
if($pkg_config['custom_php_install_command']) {
$static_output .= "'tExecuting custom_php_install_command()...";
update_output_window($static_output);
eval_once($pkg_config['custom_php_install_command']);
$static_output .= "done.\n";
update_output_window($static_output);
}
if($pkg_config['custom_php_resync_config_command'] <> "") {
$static_output .= "\tExecuting custom_php_resync_config_command()...";
update_output_window($static_output);
eval_once($pkg_config['custom_php_resync_config_command']);
$static_output .= "done.\n";
update_output_window($static_output);
}
}
if($pkg_config['custom_php_install_command']) {
$static_output = "Executing custom_php_install_command()...";
update_output_window($static_output);
eval_once($pkg_config['custom_php_install_command']);
}
if($pkg_config['custom_php_resync_config_command'] <> "") {
$static_output = "Executing custom_php_resync_config_command()...";
update_output_window($static_output);
eval_once($pkg_config['custom_php_resync_config_command']);
}
$static_output .= "done.\n";
update_output_window($static_output);
} else {
$static_output .= "Loading package configuration... failed!\n\nInstallation aborted.";
update_output_window($static_output);
@ -769,40 +780,14 @@ function install_package_xml($pkg) {
return true;
}
function delete_package($pkg, $pkgid) {
global $g, $config, $fd_log, $static_output;
function delete_package($pkg) {
global $config, $g, $static_output;
update_status("Removing package...");
$static_output .= "Removing package... ";
update_output_window($static_output);
if (!is_array($config['installedpackages']['package']))
return;
$pkg_info =& $config['installedpackages']['package'][$pkgid];
if (empty($pkg_info))
return;
if (empty($pkg_info['configurationfile']))
return;
$static_output .= "\nStarting package deletion for {$pkg_info['name']}...\n";
update_output_window($static_output);
if (!empty($pkg))
delete_package_recursive($pkg);
$static_output .= "done.\n";
update_output_window($static_output);
return;
}
function delete_package_recursive($pkg) {
global $config, $g;
$fd = fopen("{$g['tmp_path']}/y", "w");
for($line = 0; $line < 10; $line++) {
fwrite($fd, "y\n");
}
fclose($fd);
$pkg = substr(reverse_strrchr($pkg, "."), 0, -1);
$static_output .= "\tStarting package deletion for {$pkg}...";
update_output_window($static_output);
$info = "";
exec("/usr/sbin/pkg_info -r {$pkg} 2>&1", $info);
remove_freebsd_package($pkg);
@ -811,8 +796,11 @@ function delete_package_recursive($pkg) {
foreach($info as $line) {
$depend = trim(array_pop(explode(":", $line)));
if(in_array($depend, $pkgdb))
delete_package_recursive($depend);
delete_package($depend);
}
$static_output .= "done.\n";
update_output_window($static_output);
return;
}
@ -840,7 +828,6 @@ function delete_package_xml($pkg) {
update_output_window("Warning, could not open log for writing.");
}
}
update_status("Removing {$pkg} components...");
fwrite($fd_log, "Removing {$pkg} package... ");
$static_output .= "Removing {$pkg} components...\n";
update_output_window($static_output);
@ -913,21 +900,32 @@ function delete_package_xml($pkg) {
* show us where an error exists in a package
* instead of making us blindly guess
*/
$missing_include = false;
if($pkg_config['include_file'] <> "") {
$static_output = "Loading package instructions...";
$static_output .= "Loading package instructions...\n";
update_output_window($static_output);
fwrite($fd_log, "require_once(\"{$pkg_config['include_file']}\")\n");
if(file_exists($pkg_config['include_file']))
if (file_exists($pkg_config['include_file']))
require_once($pkg_config['include_file']);
fwrite($fd_log, "require_once(\"{$pkg_config['include_file']}\") included\n");
else {
$missing_include = true;
update_output_window($static_output);
$static_output .= "\tInclude file " . basename($pkg_config['include_file']) . " could not be found for inclusion.\n";
}
}
/* ermal
* NOTE: It is not possible to handle parse errors on eval.
* So we prevent it from being run at all to not interrupt all the other code.
*/
if ($missing_include == false) {
/* evalate this package's global functions and pre deinstall commands */
if($pkg_config['custom_php_global_functions'] <> "")
eval_once($pkg_config['custom_php_global_functions']);
if($pkg_config['custom_php_pre_deinstall_command'] <> "")
eval_once($pkg_config['custom_php_pre_deinstall_command']);
}
/* evalate this package's global functions and pre deinstall commands */
if($pkg_config['custom_php_global_functions'] <> "")
eval_once($pkg_config['custom_php_global_functions']);
if($pkg_config['custom_php_pre_deinstall_command'] <> "")
eval_once($pkg_config['custom_php_pre_deinstall_command']);
/* system files */
if(is_array($pkg_config['modify_system']['item'])) {
if(is_array($pkg_config['modify_system']) && is_array($pkg_config['modify_system']['item'])) {
$static_output .= "\tSystem files... ";
update_output_window($static_output);
foreach($pkg_config['modify_system']['item'] as $ms)
@ -937,7 +935,7 @@ function delete_package_xml($pkg) {
update_output_window($static_output);
}
/* syslog */
if($pkg_config['logging']['logfile_name'] <> "") {
if(is_array($pkg_config['logging']) && $pkg_config['logging']['logfile_name'] <> "") {
$static_output .= "\tSyslog entries... ";
update_output_window($static_output);
remove_text_from_file("/etc/syslog.conf", $pkg_config['logging']['facilityname'] . "\t\t\t\t" . $pkg_config['logging']['logfilename']);
@ -948,12 +946,15 @@ function delete_package_xml($pkg) {
if($pkg_config['custom_php_deinstall_command'] <> "") {
$static_output .= "\tDeinstall commands... ";
update_output_window($static_output);
eval_once($pkg_config['custom_php_deinstall_command']);
$static_output .= "done.\n";
if ($missing_include == false) {
eval_once($pkg_config['custom_php_deinstall_command']);
$static_output .= "done.\n";
} else
$static_output .= "\n\tNot executing custom deinstall hook because an include is missing.\n";
update_output_window($static_output);
}
if($pkg_config['include_file'] <> "") {
$static_output = "\tRemoving package instructions...";
$static_output .= "\tRemoving package instructions...";
update_output_window($static_output);
fwrite($fd_log, "Remove '{$pkg_config['include_file']}'\n");
unlink_if_exists("/usr/local/pkg/" . $pkg_config['include_file']);
@ -991,7 +992,7 @@ function delete_package_xml($pkg) {
unset($config['installedpackages']['package'][$pkgid]);
$static_output .= "done.\n";
update_output_window($static_output);
write_config("Removed {$pkg} package.");
write_config("Removed {$pkg} package.\n");
/* file cleanup */
$ctag = file("/etc/crontab");
foreach($ctag as $line)
@ -1078,4 +1079,4 @@ function squash_from_bytes($size, $round = "") {
return;
}
?>
?>

View File

@ -145,11 +145,11 @@ switch($_GET['mode']) {
delete_package_xml(htmlspecialchars($_GET['pkg']));
if (install_package(htmlspecialchars($_GET['pkg'])) < 0) {
update_status(gettext("Package reinstallation failed."));
$static_output .= "\n\n" . gettext("Package reinstallation failed.");
$static_output .= "\n" . gettext("Package reinstallation failed.");
update_output_window($static_output);
} else {
update_status(gettext("Package reinstalled."));
$static_output .= "\n\n" . gettext("Package reinstalled.");
$static_output .= "\n" . gettext("Package reinstalled.");
update_output_window($static_output);
filter_configure();
}
@ -180,7 +180,7 @@ switch($_GET['mode']) {
}
}
update_status(gettext("All packages reinstalled."));
$static_output .= "\n\n" . gettext("All packages reinstalled.");
$static_output .= "\n" . gettext("All packages reinstalled.");
update_output_window($static_output);
filter_configure();
break;
@ -188,7 +188,7 @@ switch($_GET['mode']) {
$status = install_package(htmlspecialchars($_GET['id']));
if($status == -1) {
update_status(gettext("Installation of") . " " . htmlspecialchars($_GET['id']) . " " . gettext("FAILED!"));
$static_output .= "\n\n" . gettext("Installation halted.");
$static_output .= "\n" . gettext("Installation halted.");
update_output_window($static_output);
} else {
$filename = escapeshellcmd("/tmp/" . $_GET['id'] . ".info");
@ -197,10 +197,10 @@ switch($_GET['mode']) {
update_status($status_a);
$status = get_after_install_info($_GET['id']);
if($status)
$static_output .= "\n" . gettext("Installation completed.") . "\n\n{$_GET['id']} " . gettext("setup instructions") . ":\n\n{$status}";
$static_output .= "\n" . gettext("Installation completed.") . "\n{$_GET['id']} " . gettext("setup instructions") . ":\n{$status}";
else
$static_output .= "\n" . gettext("Installation completed. Please check to make sure that the package is configured from the respective menu then start the package.");
fwrite($fd, $status_a . "\n\n". $static_output);
fwrite($fd, $status_a . "\n". $static_output);
fclose($fd);
echo "<script type='text/javascript'>document.location=\"pkg_mgr_install.php?mode=installedinfo&pkg={$_GET['id']}\";</script>";
}