From 1390c8b7d13c84d4d7dcfc909acf17fe1dec5115 Mon Sep 17 00:00:00 2001
From: tbrehm <t.brehm@ispconfig.org>
Date: Wed, 21 Jul 2010 09:26:55 -0400
Subject: [PATCH] Implemented: FS#1251 - Add option to software installer to create databases Implemented: FS#1252 - Add permission system based on user / password to app installer
---
interface/web/admin/templates/language_add.htm | 5
interface/web/admin/lib/lang/en_software_package_install.lng | 6
interface/web/admin/software_package_list.php | 54 +++++--
interface/web/admin/templates/language_edit.htm | 3
interface/web/admin/templates/software_update_list.htm | 2
interface/web/admin/templates/software_package_list.htm | 10 +
server/plugins-available/software_update_plugin.inc.php | 105 ++++++++++++++
interface/web/admin/software_package_install.php | 134 +++++++++++++++++++
interface/web/admin/templates/language_complete.htm | 7
interface/web/admin/templates/language_export.htm | 5
install/sql/ispconfig3.sql | 4
interface/web/admin/templates/language_import.htm | 5
interface/web/admin/templates/software_package_install.htm | 30 ++++
interface/web/admin/lib/lang/en_package_install.lng | 7 +
interface/web/admin/lib/lang/en_software_package_list.lng | 2
15 files changed, 352 insertions(+), 27 deletions(-)
diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql
index 3d75c6d..ec5d857 100644
--- a/install/sql/ispconfig3.sql
+++ b/install/sql/ispconfig3.sql
@@ -745,6 +745,10 @@
`package_description` text,
`package_version` varchar(8) default NULL,
`package_type` enum('ispconfig','app','web') NOT NULL default 'app',
+ `package_installable` enum('yes','no','key') NOT NULL default 'yes',
+ `package_requires_db` enum('no','mysql') NOT NULL default 'no',
+ `package_key` varchar(255) NOT NULL,
+ `package_config` text,
PRIMARY KEY (`package_id`),
UNIQUE KEY `package_name` (`package_name`)
) ENGINE=MyISAM AUTO_INCREMENT=1;
diff --git a/interface/web/admin/lib/lang/en_package_install.lng b/interface/web/admin/lib/lang/en_package_install.lng
new file mode 100644
index 0000000..7968b00
--- /dev/null
+++ b/interface/web/admin/lib/lang/en_package_install.lng
@@ -0,0 +1,7 @@
+<?php
+$wb["repo_name_txt"] = 'Repository';
+$wb["repo_url_txt"] = 'URL';
+$wb["repo_username_txt"] = 'User (optional)';
+$wb["repo_password_txt"] = 'Password (optional)';
+$wb["active_txt"] = 'Active';
+?>
\ No newline at end of file
diff --git a/interface/web/admin/lib/lang/en_software_package_install.lng b/interface/web/admin/lib/lang/en_software_package_install.lng
new file mode 100644
index 0000000..7986035
--- /dev/null
+++ b/interface/web/admin/lib/lang/en_software_package_install.lng
@@ -0,0 +1,6 @@
+<?php
+$wb["head_txt"] = 'Install software package';
+$wb["install_key_txt"] = 'Enter install key';
+$wb["btn_save_txt"] = 'Start Installation';
+$wb["btn_cancel_txt"] = 'Cancel';
+?>
\ No newline at end of file
diff --git a/interface/web/admin/lib/lang/en_software_package_list.lng b/interface/web/admin/lib/lang/en_software_package_list.lng
index 03917ca..87674c4 100644
--- a/interface/web/admin/lib/lang/en_software_package_list.lng
+++ b/interface/web/admin/lib/lang/en_software_package_list.lng
@@ -4,4 +4,6 @@
$wb['package_title_txt'] = 'Package';
$wb['package_description_txt'] = 'Description';
$wb['action_txt'] = 'Action';
+$wb['toolsarea_head_txt'] = 'Packages';
+$wb['repoupdate_txt'] = 'Update package list';
?>
diff --git a/interface/web/admin/software_package_install.php b/interface/web/admin/software_package_install.php
new file mode 100644
index 0000000..3013eb1
--- /dev/null
+++ b/interface/web/admin/software_package_install.php
@@ -0,0 +1,134 @@
+<?php
+
+/*
+Copyright (c) 2010, Till Brehm, projektfarm Gmbh
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the name of ISPConfig nor the names of its contributors
+ may be used to endorse or promote products derived from this software without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require_once('../../lib/config.inc.php');
+require_once('../../lib/app.inc.php');
+
+//* Check permissions for module
+$app->auth->check_module_permissions('admin');
+
+//* This is only allowed for administrators
+if(!$app->auth->is_admin()) die('only allowed for administrators.');
+
+$package_name = $app->db->quote($_REQUEST['package']);
+$install_server_id = intval($_REQUEST['server_id']);
+$install_key = $app->db->quote(trim($_REQUEST['install_key']));
+
+$package = $app->db->queryOneRecord("SELECT * FROM software_package WHERE package_name = '$package_name'");
+
+$install_key_verified = false;
+$message_err = '';
+$message_ok = '';
+
+//* verify the key
+if($package['package_installable'] == 'key' && $install_key != '') {
+
+ $repo = $app->db->queryOneRecord("SELECT * FROM software_repo WHERE software_repo_id = ".$package['software_repo_id']);
+
+ $client = new SoapClient(null, array('location' => $repo['repo_url'],
+ 'uri' => $repo['repo_url']));
+
+ $install_key_verified = $client->check_installable($package_name, $install_key, $repo['repo_username'], $repo['repo_password']);
+
+ if($install_key_verified == false) {
+ //$install_key = '';
+ $message_err = 'Verification of the key failed.';
+ } else {
+ // Store the verified key into the database
+ $app->db->datalogUpdate('software_package', "package_key = '$install_key'", 'package_id',$package['package_id']);
+ }
+} else {
+ $message_ok = 'Please enter the software key for the package.';
+}
+
+//* Install packages, if all requirements are fullfilled.
+if($install_server_id > 0 && $package_name != '' && ($package['package_installable'] == 'yes' || $install_key_verified == true)) {
+ $sql = "SELECT software_update_id, package_name, update_title FROM software_update WHERE type = 'full' AND package_name = '$package_name' ORDER BY v1 DESC, v2 DESC, v3 DESC, v4 DESC LIMIT 0,1";
+ $tmp = $app->db->queryOneRecord($sql);
+ $software_update_id = $tmp['software_update_id'];
+
+ //* if package requires a DB and there is no data for a db in config, then we create this data now
+ if($package['package_requires_db'] == 'mysql') {
+ $app->uses('ini_parser,getconf');
+
+ $package_config_array = array();
+ if(trim($package['package_config']) != '') {
+ $package_config_array = $app->ini_parser->parse_ini_string(stripslashes($package['package_config']));
+ }
+
+ if(!isset($package_config_array['mysql'])) {
+ $package_config_array['mysql'] = array( 'database_name' => 'ispapp'.$package['package_id'],
+ 'database_user' => 'ispapp'.$package['package_id'],
+ 'database_password' => md5(mt_rand()),
+ 'database_host' => 'localhost');
+ $package_config_str = $app->ini_parser->get_ini_string($package_config_array);
+ $app->db->datalogUpdate('software_package', "package_config = '".$app->db->quote($package_config_str)."'", 'package_id',$package['package_id']);
+ }
+ }
+
+ //* Add the record to start the install process
+ $insert_data = "(package_name, server_id, software_update_id, status) VALUES ('$package_name', '$install_server_id', '$software_update_id','installing')";
+ $app->db->datalogInsert('software_update_inst', $insert_data, 'software_update_inst_id');
+ $message_ok = 'Starting package installation '."<a href=\"#\" onClick=\"submitForm('pageForm','admin/software_package_list.php');\">".$app->lng('next')."</a>";
+
+}
+
+if(count($_POST) > 2 && $install_key == '') {
+ $message_ok = 'Please enter the software key.';
+}
+
+//* Show key input form
+if($package['package_installable'] == 'key' && !$install_key_verified) {
+ $insert_key = true;
+} else {
+ $insert_key = false;
+}
+
+// Loading the template
+$app->uses('tpl');
+$app->tpl->newTemplate("form.tpl.htm");
+$app->tpl->setInclude('content_tpl','templates/software_package_install.htm');
+
+$app->tpl->setVar('message_ok',$message_ok);
+$app->tpl->setVar('message_err',$message_err);
+$app->tpl->setVar('insert_key',$insert_key);
+$app->tpl->setVar('install_key',$install_key);
+$app->tpl->setVar('package_name',$package_name);
+$app->tpl->setVar('server_id',$install_server_id);
+
+
+include_once('lib/lang/en_software_package_install.lng');
+$app->tpl->setVar($wb);
+
+
+$app->tpl_defaults();
+$app->tpl->pparse();
+
+?>
diff --git a/interface/web/admin/software_package_list.php b/interface/web/admin/software_package_list.php
index 789a71e..0a534e3 100644
--- a/interface/web/admin/software_package_list.php
+++ b/interface/web/admin/software_package_list.php
@@ -40,7 +40,7 @@
//* Get the latest packages from the repositorys and insert them in the local database
$packages_added = 0;
$repos = $app->db->queryAllRecords("SELECT software_repo_id, repo_url, repo_username, repo_password FROM software_repo WHERE active = 'y'");
-if(is_array($repos)) {
+if(is_array($repos) && isset($_GET['action']) && $_GET['action'] == 'repoupdate' ) {
foreach($repos as $repo) {
$client = new SoapClient(null, array('location' => $repo['repo_url'],
'uri' => $repo['repo_url']));
@@ -50,16 +50,26 @@
foreach($packages as $p) {
$package_name = $app->db->quote($p['name']);
$tmp = $app->db->queryOneRecord("SELECT package_id FROM software_package WHERE package_name = '$package_name'");
+
+ $package_title = $app->db->quote($p['title']);
+ $package_description = $app->db->quote($p['description']);
+ $software_repo_id = intval($repo['software_repo_id']);
+ $package_type = $app->db->quote($p['type']);
+ $package_installable = $app->db->quote($p['installable']);
+ $package_requires_db = $app->db->quote($p['requires_db']);
+
if(empty($tmp['package_id'])) {
-
- $package_title = $app->db->quote($p['title']);
- $package_description = $app->db->quote($p['description']);
- $software_repo_id = intval($repo['software_repo_id']);
- $package_type = $app->db->quote($p['type']);
-
- $sql = "INSERT INTO software_package (software_repo_id, package_name, package_title, package_description,package_type) VALUES ($software_repo_id, '$package_name', '$package_title', '$package_description','$package_type')";
- $app->db->query($sql);
+ //$sql = "INSERT INTO software_package (software_repo_id, package_name, package_title, package_description,package_type,package_installable,package_requires_db) VALUES ($software_repo_id, '$package_name', '$package_title', '$package_description','$package_type','$package_installable','$package_requires_db')";
+ //$app->db->query($sql);
+ $insert_data = "(software_repo_id, package_name, package_title, package_description,package_type,package_installable,package_requires_db) VALUES ($software_repo_id, '$package_name', '$package_title', '$package_description','$package_type','$package_installable','$package_requires_db')";
+ $app->db->datalogInsert('software_package', $insert_data, 'package_id');
$packages_added++;
+ } else {
+ //$sql = "UPDATE software_package SET software_repo_id = $software_repo_id, package_title = '$package_title', package_description = '$package_description', package_type = '$package_type', package_installable = '$package_installable', package_requires_db = '$package_requires_db' WHERE package_name = '$package_name'";
+ //$app->db->query($sql);
+ $update_data = "software_repo_id = $software_repo_id, package_title = '$package_title', package_description = '$package_description', package_type = '$package_type', package_installable = '$package_installable', package_requires_db = '$package_requires_db'";
+ //echo $update_data;
+ $app->db->datalogUpdate('software_package', $update_data, 'package_id',$tmp['package_id']);
}
}
}
@@ -93,10 +103,13 @@
$tmp = $app->db->queryOneRecord($sql);
if(!isset($tmp['software_update_id'])) {
// Insert the update in the datbase
- $sql = "INSERT INTO software_update (software_repo_id, package_name, update_url, update_md5, update_dependencies, update_title, v1, v2, v3, v4, type)
- VALUES ($software_repo_id, '$package_name', '$update_url', '$update_md5', '$update_dependencies', '$update_title', '$v1', '$v2', '$v3', '$v4', '$type')";
+ //$sql = "INSERT INTO software_update (software_repo_id, package_name, update_url, update_md5, update_dependencies, update_title, v1, v2, v3, v4, type)
+ //VALUES ($software_repo_id, '$package_name', '$update_url', '$update_md5', '$update_dependencies', '$update_title', '$v1', '$v2', '$v3', '$v4', '$type')";
//die($sql);
- $app->db->query($sql);
+ //$app->db->query($sql);
+ $insert_data = "(software_repo_id, package_name, update_url, update_md5, update_dependencies, update_title, v1, v2, v3, v4, type)
+ VALUES ($software_repo_id, '$package_name', '$update_url', '$update_md5', '$update_dependencies', '$update_title', '$v1', '$v2', '$v3', '$v4', '$type')";
+ $app->db->datalogInsert('software_update', $insert_data, 'software_update_id');
}
}
@@ -107,6 +120,7 @@
}
//* Install packages, if GET Request
+/*
if(isset($_GET['action']) && $_GET['action'] == 'install' && $_GET['package'] != '' && $_GET['server_id'] > 0) {
$package_name = $app->db->quote($_GET['package']);
$server_id = intval($_GET['server_id']);
@@ -117,8 +131,8 @@
$insert_data = "(package_name, server_id, software_update_id, status) VALUES ('$package_name', '$server_id', '$software_update_id','installing')";
// $insert_data = "(package_name, server_id, software_update_id, status) VALUES ('$package_name', '$server_id', '$software_update_id','installed')";
$app->db->datalogInsert('software_update_inst', $insert_data, 'software_update_inst_id');
-
}
+*/
@@ -139,15 +153,19 @@
$version = $inst['v1'].'.'.$inst['v2'].'.'.$inst['v3'].'.'.$inst['v4'];
if($inst['status'] == 'installed') {
- $installed_txt .= $s['server_name'].": Installed version $version<br />";
+ $installed_txt .= $s['server_name'].": ".$app->lng("Installed version $version")."<br />";
} elseif ($inst['status'] == 'installing') {
- $installed_txt .= $s['server_name'].": Installation in progress<br />";
+ $installed_txt .= $s['server_name'].": ".$app->lng("Installation in progress")."<br />";
} elseif ($inst['status'] == 'failed') {
- $installed_txt .= $s['server_name'].": Installation failed<br />";
+ $installed_txt .= $s['server_name'].": ".$app->lng("Installation failed")."<br />";
} elseif ($inst['status'] == 'deleting') {
- $installed_txt .= $s['server_name'].": Deletion in progress<br />";
+ $installed_txt .= $s['server_name'].": ".$app->lng("Deletion in progress")."<br />";
} else {
- $installed_txt .= $s['server_name'].": <a href=\"#\" onClick=\"loadContent('admin/software_package_list.php?action=install&package=".$p["package_name"]."&server_id=".$s["server_id"]."');\">Install now</a><br />";
+ if($p['package_installable'] == 'no') {
+ $installed_txt .= $s['server_name'].": ".$app->lng("Package can not be installed.")."<br />";
+ } else {
+ $installed_txt .= $s['server_name'].": <a href=\"#\" onClick=\"loadContent('admin/software_package_install.php?package=".$p["package_name"]."&server_id=".$s["server_id"]."');\">Install now</a><br />";
+ }
}
}
$packages[$key]['installed'] = $installed_txt;
diff --git a/interface/web/admin/templates/language_add.htm b/interface/web/admin/templates/language_add.htm
index d2254c2..b0ebde4 100644
--- a/interface/web/admin/templates/language_add.htm
+++ b/interface/web/admin/templates/language_add.htm
@@ -16,7 +16,7 @@
<input name="lng_new" id="lng_new" value="" size="30" maxlength="255" type="text" class="textInput formLengthHalf" />
<p class="formHint">{tmpl_var name='language_new_hint_txt'}</p>
</div>
- </fieldset>
+
<input type="hidden" name="id" value="{tmpl_var name='id'}">
@@ -24,6 +24,9 @@
<button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','admin/language_add.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
<button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('admin/language_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
</div>
+
+ </fieldset>
+
</div>
</div>
diff --git a/interface/web/admin/templates/language_complete.htm b/interface/web/admin/templates/language_complete.htm
index bbf6da7..76d38f6 100644
--- a/interface/web/admin/templates/language_complete.htm
+++ b/interface/web/admin/templates/language_complete.htm
@@ -18,12 +18,15 @@
{tmpl_var name='language_option'}
</select>
</div>
- </fieldset>
+
- <div class="buttonHolder buttons" style="margin-top: -100px;">
+ <div class="buttonHolder buttons">
<button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','admin/language_complete.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
<button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('admin/language_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
</div>
+
+ </fieldset>
+
</div>
</div>
diff --git a/interface/web/admin/templates/language_edit.htm b/interface/web/admin/templates/language_edit.htm
index a0ef32e..1e5d306 100644
--- a/interface/web/admin/templates/language_edit.htm
+++ b/interface/web/admin/templates/language_edit.htm
@@ -24,6 +24,9 @@
<button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','admin/language_edit.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
<button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('admin/language_list.php?lng_select={tmpl_var name='lang'}');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
</div>
+
+
+
</div>
</div>
diff --git a/interface/web/admin/templates/language_export.htm b/interface/web/admin/templates/language_export.htm
index d0ba3a3..12dd237 100644
--- a/interface/web/admin/templates/language_export.htm
+++ b/interface/web/admin/templates/language_export.htm
@@ -11,7 +11,7 @@
{tmpl_var name='language_option'}
</select>
</div>
- </fieldset>
+
<tmpl_if name="msg">
<div id="OKMsg"><p><tmpl_var name="msg"></p></div>
@@ -23,6 +23,9 @@
<button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','admin/language_export.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
<button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('admin/language_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
</div>
+
+ </fieldset>
+
</div>
</div>
diff --git a/interface/web/admin/templates/language_import.htm b/interface/web/admin/templates/language_import.htm
index 389a898..c947813 100644
--- a/interface/web/admin/templates/language_import.htm
+++ b/interface/web/admin/templates/language_import.htm
@@ -21,7 +21,7 @@
<input id="ignore_version" type="checkbox" value="1" name="ignore_version"/>
</div>
</div>
- </fieldset>
+
<tmpl_if name="msg">
<div id="OKMsg"><p><tmpl_var name="msg"></p></div>
@@ -36,6 +36,9 @@
<button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitUploadForm('pageForm','admin/language_import.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
<button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('admin/language_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
</div>
+
+ </fieldset>
+
</div>
</div>
diff --git a/interface/web/admin/templates/software_package_install.htm b/interface/web/admin/templates/software_package_install.htm
new file mode 100644
index 0000000..d034de7
--- /dev/null
+++ b/interface/web/admin/templates/software_package_install.htm
@@ -0,0 +1,30 @@
+<h2><tmpl_var name="head_txt"></h2>
+<p><tmpl_var name="desc_txt"></p>
+
+<div class="panel panel_software_repo">
+<tmpl_if name="message_err">
+<div id="errorMsg"><tmpl_var name="message_err"></div>
+</tmpl_if>
+<tmpl_if name="message_ok">
+<div id="OKMsg"><tmpl_var name="message_ok"></div>
+</tmpl_if>
+<tmpl_if name="insert_key">
+ <div class="pnl_formsarea">
+ <fieldset class="inlineLabels">
+ <p> </p>
+ <div class="ctrlHolder">
+ <label for="install_key">{tmpl_var name='install_key_txt'}</label>
+ <input name="install_key" id="install_key" value="{tmpl_var name='install_key'}" size="40" maxlength="40" type="text" class="textInput" />
+ </div>
+
+ <input type="hidden" name="package" value="{tmpl_var name='package_name'}">
+ <input type="hidden" name="server_id" value="{tmpl_var name='server_id'}">
+ <p> </p>
+ <div class="buttonHolder buttons">
+ <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','admin/software_package_install.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
+ <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('admin/software_package_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+ </div>
+ </fieldset>
+ </div>
+</tmpl_if>
+</div>
\ No newline at end of file
diff --git a/interface/web/admin/templates/software_package_list.htm b/interface/web/admin/templates/software_package_list.htm
index dd465ac..e8710bf 100644
--- a/interface/web/admin/templates/software_package_list.htm
+++ b/interface/web/admin/templates/software_package_list.htm
@@ -3,6 +3,16 @@
<div class="panel panel_list_package">
+ <div class="pnl_toolsarea">
+ <fieldset><legend>{tmpl_var name="toolsarea_head_txt"}</legend>
+ <div class="buttons">
+ <button class="iconstxt icoAdd" type="button" onClick="loadContent('admin/software_package_list.php?action=repoupdate');">
+ <span>{tmpl_var name="repoupdate_txt"}</span>
+ </button>
+ </div>
+ </fieldset>
+ </div>
+
<div class="pnl_listarea">
<fieldset><legend><tmpl_var name="list_head_txt"></legend>
<table class="list">
diff --git a/interface/web/admin/templates/software_update_list.htm b/interface/web/admin/templates/software_update_list.htm
index 10a0acf..db2b036 100644
--- a/interface/web/admin/templates/software_update_list.htm
+++ b/interface/web/admin/templates/software_update_list.htm
@@ -7,7 +7,7 @@
<fieldset class="inlineLabels"><legend>Tools</legend>
<div class="buttons">
<div class="ctrlHolder">
- <label for="server_id">{tmpl_var name='server_select_txt'}</label>
+ <label for="server_id">{tmpl_var name='server_select_txt'}</label>
<select name="server_id" id="server_id" class="selectInput" onChange="submitForm('pageForm','admin/software_update_list.php');">
<tmpl_loop name="servers">
<option value="{tmpl_var name='server_id'}" {tmpl_var name='selected'}>{tmpl_var name='server_name'}</option>
diff --git a/server/plugins-available/software_update_plugin.inc.php b/server/plugins-available/software_update_plugin.inc.php
index 71fbccc..be73c8b 100644
--- a/server/plugins-available/software_update_plugin.inc.php
+++ b/server/plugins-available/software_update_plugin.inc.php
@@ -105,6 +105,10 @@
return false;
}
+ //* Replace placeholders in download URL
+ $software_update["update_url"] = str_replace('{key}',$software_package['package_key'],$software_update["update_url"]);
+
+ //* Download the update package
$cmd = "cd $temp_dir && wget ".$software_update["update_url"];
if($installuser == '') {
exec($cmd);
@@ -113,8 +117,28 @@
}
$app->log("Downloading the update file from: ".$software_update["update_url"],LOGLEVEL_DEBUG);
- $url_parts = parse_url($software_update["update_url"]);
- $update_filename = basename($url_parts["path"]);
+ //$url_parts = parse_url($software_update["update_url"]);
+ //$update_filename = basename($url_parts["path"]);
+ //* Find the name of the zip file which contains the app.
+ $tmp_dir_handle = dir($temp_dir);
+ $update_filename = '';
+ while (false !== ($t = $tmp_dir_handle->read())) {
+ if($t != '.' && $t != '..' && is_file($temp_dir.'/'.$t) && substr($t,-4) == '.zip') {
+ $update_filename = $t;
+ }
+ }
+ $tmp_dir_handle->close();
+ unset($tmp_dir_handle);
+ unset($t);
+
+ if($update_filename == '') {
+ $app->log("No package file found. Download failed? Installation aborted.",LOGLEVEL_WARN);
+ exec("rm -rf $temp_dir");
+ $app->log("Deleting the temp directory $temp_dir",LOGLEVEL_DEBUG);
+ $this->set_install_status($data["new"]["software_update_inst_id"], "failed");
+ return false;
+ }
+
$app->log("The update filename is $update_filename",LOGLEVEL_DEBUG);
if(is_file($temp_dir.'/'.$update_filename)) {
@@ -137,6 +161,35 @@
exec($cmd);
} else {
exec("su -c ".escapeshellarg($cmd)." $installuser");
+ }
+
+ //* Create a database, if the package requires one
+ if($software_package['package_type'] == 'app' && $software_package['package_requires_db'] == 'mysql') {
+
+ $app->uses('ini_parser');
+ $package_config = $app->ini_parser->parse_ini_string(stripslashes($software_package['package_config']));
+
+ $this->create_app_db($package_config['mysql']);
+ $app->log("Creating the app DB.",LOGLEVEL_DEBUG);
+
+ //* Load the sql dump into the database
+ if(is_file($temp_dir.'/setup.sql')) {
+ $db_config = $package_config['mysql'];
+ if( $db_config['database_user'] != '' &&
+ $db_config['database_password'] != '' &&
+ $db_config['database_name'] != '' &&
+ $db_config['database_host'] != '') {
+ system("mysql --default-character-set=utf8 --force -h '".$db_config['database_host']."' -u '".$db_config['database_user']."' ".$db_config['database_name']." < ".escapeshellcmd($temp_dir.'/setup.sql'));
+ $app->log("Loading setup.sql dump into the app db.",LOGLEVEL_DEBUG);
+ }
+ }
+
+ }
+
+ //* Save the package config file as app.ini
+ if($software_package['package_config'] != '') {
+ file_put_contents($temp_dir.'/app.ini',$software_package['package_config']);
+ $app->log("Writing ".$temp_dir.'/app.ini',LOGLEVEL_DEBUG);
}
if(is_file($temp_dir.'/setup.sh')) {
@@ -168,10 +221,56 @@
$this->set_install_status($data["new"]["software_update_inst_id"], "failed");
}
- exec("rm -rf $temp_dir");
+ if($temp_dir != '' && $temp_dir != '/') exec("rm -rf $temp_dir");
$app->log("Deleting the temp directory $temp_dir",LOGLEVEL_DEBUG);
}
+ private function create_app_db($db_config) {
+ global $app, $conf;
+
+ if( $db_config['database_user'] != '' &&
+ $db_config['database_password'] != '' &&
+ $db_config['database_name'] != '' &&
+ $db_config['database_host'] != '') {
+
+ if(!include(ISPC_LIB_PATH.'/mysql_clientdb.conf')) {
+ $app->log('Unable to open'.ISPC_LIB_PATH.'/mysql_clientdb.conf',LOGLEVEL_ERROR);
+ return;
+ }
+
+ if($db_config['database_user'] == 'root') {
+ $app->log('User root not allowed for App databases',LOGLEVEL_WARNING);
+ return;
+ }
+
+ //* Connect to the database
+ $link = mysql_connect($clientdb_host, $clientdb_user, $clientdb_password);
+ if (!$link) {
+ $app->log('Unable to connect to the database'.mysql_error($link),LOGLEVEL_ERROR);
+ return;
+ }
+
+ $query_charset_table = '';
+
+ //* Create the new database
+ if (mysql_query('CREATE DATABASE '.mysql_real_escape_string($db_config['database_name']).$query_charset_table,$link)) {
+ $app->log('Created MySQL database: '.$db_config['database_name'],LOGLEVEL_DEBUG);
+ } else {
+ $app->log('Unable to connect to the database'.mysql_error($link),LOGLEVEL_ERROR);
+ }
+
+ if(mysql_query("GRANT ALL ON ".mysql_real_escape_string($db_config['database_name'],$link).".* TO '".mysql_real_escape_string($db_config['database_user'],$link)."'@'".$db_config['database_host']."' IDENTIFIED BY '".mysql_real_escape_string($db_config['database_password'],$link)."';",$link)) {
+ $app->log('Created MySQL user: '.$db_config['database_user'],LOGLEVEL_DEBUG);
+ } else {
+ $app->log('Unable to create database user'.$db_config['database_user'].' '.mysql_error($link),LOGLEVEL_ERROR);
+ }
+
+ mysql_query("FLUSH PRIVILEGES;",$link);
+ mysql_close($link);
+
+ }
+
+ }
} // end class
--
Gitblit v1.9.1