set default dns server in config-templates; separate CmdLineHandler from switch-server-ip script for further usage

Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
This commit is contained in:
Michael Kaufmann (d00p)
2018-02-11 13:57:07 +01:00
parent 13b1503bf2
commit ca4c93ac92
8 changed files with 240 additions and 199 deletions

View File

@@ -13,46 +13,33 @@
* @author Froxlor team <team@froxlor.org> (2016-) * @author Froxlor team <team@froxlor.org> (2016-)
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * @license GPLv2 http://files.froxlor.org/misc/COPYING.txt
* @package Cron * @package Cron
* *
*/ */
// Check if we're in the CLI // Check if we're in the CLI
if(@php_sapi_name() !== 'cli') { if (@php_sapi_name() !== 'cli') {
die('This script will only work in the shell.'); die('This script will only work in the shell.');
} }
// give control to command line handler require dirname(dirname(__DIR__)) . '/lib/classes/output/class.CmdLineHandler.php';
try {
CmdLineHandler::processParameters($argc, $argv);
} catch (Exception $e) {
CmdLineHandler::printerr($e->getMessage());
}
class CmdLineHandler class SwitchServerIp extends CmdLineHandler
{ {
/** /**
* internal variable for passed arguments * list of valid switches
* *
* @var array * @var array
*/ */
private static $args = null;
/**
* Action object read from commandline/config
*
* @var Action
*/
private $_action = null;
/**
* list of valid parameters/switches
*/
public static $switches = array( public static $switches = array(
/* 'd', // debug / output information for everything */
'h' 'h'
); );
// same as --help
/**
* list of valid parameters
*
* @var array
*/
public static $params = array( public static $params = array(
'switch', 'switch',
'list', 'list',
@@ -60,131 +47,7 @@ class CmdLineHandler
'help' 'help'
); );
/** public static $action_class = 'Action';
* Returns a CmdLineHandler object with given
* arguments from command line
*
* @param int $argc
* @param array $argv
*
* @return CmdLineHandler
*/
public static function processParameters($argc, $argv)
{
return new CmdLineHandler($argc, $argv);
}
/**
* returns the Action object generated in
* the class constructor
*
* @return Action
*/
public function getAction()
{
return $this->_action;
}
/**
* class constructor, validates the command line parameters
* and sets the Action-object if valid
*
* @param int $argc
* @param string[] $argv
*
* @return null
* @throws Exception
*/
private function __construct($argc, $argv)
{
self::$args = $this->_parseArgs($argv);
$this->_action = $this->_createAction();
}
/**
* Parses the arguments given via the command line;
* three types are supported:
* 1.
* --parm1 or --parm2=value
* 2. -xyz (multiple switches in one) or -a=value
* 3. parm1 parm2
*
* The 1. will be mapped as
* ["parm1"] => true, ["parm2"] => "value"
* The 2. as
* ["x"] => true, ["y"] => true, ["z"] => true, ["a"] => "value"
* And the 3. as
* [0] => "parm1", [1] => "parm2"
*
* @param array $argv
*
* @return array
*/
private function _parseArgs($argv)
{
array_shift($argv);
$o = array();
foreach ($argv as $a) {
if (substr($a, 0, 2) == '--') {
$eq = strpos($a, '=');
if ($eq !== false) {
$o[substr($a, 2, $eq - 2)] = substr($a, $eq + 1);
} else {
$k = substr($a, 2);
if (! isset($o[$k])) {
$o[$k] = true;
}
}
} else
if (substr($a, 0, 1) == '-') {
if (substr($a, 2, 1) == '=') {
$o[substr($a, 1, 1)] = substr($a, 3);
} else {
foreach (str_split(substr($a, 1)) as $k) {
if (! isset($o[$k])) {
$o[$k] = true;
}
}
}
} else {
$o[] = $a;
}
}
return $o;
}
/**
* Creates an Action-Object for the Action-Handler
*
* @return Action
* @throws Exception
*/
private function _createAction()
{
// Test for help-switch
if (empty(self::$args) || array_key_exists("help", self::$args) || array_key_exists("h", self::$args)) {
self::printHelp();
// end of execution
}
// check if no unknown parameters are present
foreach (self::$args as $arg => $value) {
if (is_numeric($arg)) {
throw new Exception("Unknown parameter '" . $value . "' in argument list");
} elseif (! in_array($arg, self::$params) && ! in_array($arg, self::$switches)) {
throw new Exception("Unknown parameter '" . $arg . "' in argument list");
}
}
// set debugger switch
if (isset(self::$args["d"]) && self::$args["d"] == true) {
// Debugger::getInstance()->setEnabled(true);
// Debugger::getInstance()->debug("debug output enabled");
}
return new Action(self::$args);
}
public static function printHelp() public static function printHelp()
{ {
@@ -207,34 +70,9 @@ class CmdLineHandler
// self::println("-d\t\t\tenable debug output"); // self::println("-d\t\t\tenable debug output");
self::println("-h\t\t\tsame as --help"); self::println("-h\t\t\tsame as --help");
self::println(""); self::println("");
die(); // end of execution die(); // end of execution
} }
public static function println($msg = "")
{
print $msg . PHP_EOL;
}
private static function _printcolor($msg = "", $color = "0")
{
print "\033[" . $color . "m" . $msg . "\033[0m" . PHP_EOL;
}
public static function printerr($msg = "")
{
self::_printcolor($msg, "31");
}
public static function printsucc($msg = "")
{
self::_printcolor($msg, "32");
}
public static function printwarn($msg = "")
{
self::_printcolor($msg, "33");
}
} }
class Action class Action
@@ -268,11 +106,11 @@ class Action
if (array_key_exists("list", $this->_args) || array_key_exists("switch", $this->_args)) { if (array_key_exists("list", $this->_args) || array_key_exists("switch", $this->_args)) {
$need_config = true; $need_config = true;
} }
$this->_checkConfigParam($need_config); $this->_checkConfigParam($need_config);
$this->_parseConfig(); $this->_parseConfig();
if (array_key_exists("list", $this->_args)) { if (array_key_exists("list", $this->_args)) {
$this->_listIPs(); $this->_listIPs();
} }
@@ -300,11 +138,11 @@ class Action
private function _switchIPs() private function _switchIPs()
{ {
$ip_list = $this->_args['switch']; $ip_list = $this->_args['switch'];
if (empty($ip_list) || is_bool($ip_list)) { if (empty($ip_list) || is_bool($ip_list)) {
throw new Exception("No paramters given for --switch action."); throw new Exception("No paramters given for --switch action.");
} }
$ips_to_switch = array(); $ips_to_switch = array();
$ip_list = explode(" ", $ip_list); $ip_list = explode(" ", $ip_list);
foreach ($ip_list as $ips_combo) { foreach ($ip_list as $ips_combo) {
@@ -324,22 +162,22 @@ class Action
} }
$ips_to_switch[] = $ip_pair; $ips_to_switch[] = $ip_pair;
} }
if (count($ips_to_switch) > 0) { if (count($ips_to_switch) > 0) {
$upd_stmt = Database::prepare("UPDATE panel_ipsandports SET `ip` = :newip WHERE `ip` = :oldip"); $upd_stmt = Database::prepare("UPDATE panel_ipsandports SET `ip` = :newip WHERE `ip` = :oldip");
// system.ipaddress // system.ipaddress
$check_sysip_stmt = Database::prepare("SELECT `value` FROM `panel_settings` WHERE `settinggroup` = 'system' and `varname` = 'ipaddress'"); $check_sysip_stmt = Database::prepare("SELECT `value` FROM `panel_settings` WHERE `settinggroup` = 'system' and `varname` = 'ipaddress'");
$check_sysip = Database::pexecute_first($check_sysip_stmt); $check_sysip = Database::pexecute_first($check_sysip_stmt);
// system.mysql_access_host // system.mysql_access_host
$check_mysqlip_stmt = Database::prepare("SELECT `value` FROM `panel_settings` WHERE `settinggroup` = 'system' and `varname` = 'mysql_access_host'"); $check_mysqlip_stmt = Database::prepare("SELECT `value` FROM `panel_settings` WHERE `settinggroup` = 'system' and `varname` = 'mysql_access_host'");
$check_mysqlip = Database::pexecute_first($check_mysqlip_stmt); $check_mysqlip = Database::pexecute_first($check_mysqlip_stmt);
// system.axfrservers // system.axfrservers
$check_axfrip_stmt = Database::prepare("SELECT `value` FROM `panel_settings` WHERE `settinggroup` = 'system' and `varname` = 'axfrservers'"); $check_axfrip_stmt = Database::prepare("SELECT `value` FROM `panel_settings` WHERE `settinggroup` = 'system' and `varname` = 'axfrservers'");
$check_axfrip = Database::pexecute_first($check_axfrip_stmt); $check_axfrip = Database::pexecute_first($check_axfrip_stmt);
foreach ($ips_to_switch as $ip_pair) { foreach ($ips_to_switch as $ip_pair) {
echo "Switching IP \033[1m" . $ip_pair[0] . "\033[0m to IP \033[1m" . $ip_pair[1] . "\033[0m" . PHP_EOL; echo "Switching IP \033[1m" . $ip_pair[0] . "\033[0m to IP \033[1m" . $ip_pair[1] . "\033[0m" . PHP_EOL;
Database::pexecute($upd_stmt, array( Database::pexecute($upd_stmt, array(
@@ -347,11 +185,11 @@ class Action
'oldip' => $ip_pair[0] 'oldip' => $ip_pair[0]
)); ));
$rows_updated = $upd_stmt->rowCount(); $rows_updated = $upd_stmt->rowCount();
if ($rows_updated == 0) { if ($rows_updated == 0) {
CmdLineHandler::printwarn("Note: " . $ip_pair[0] . " not updated to " . $ip_pair[1] . " (possibly no entry found in froxlor database. Use --list to see what IP addresses are added in froxlor"); CmdLineHandler::printwarn("Note: " . $ip_pair[0] . " not updated to " . $ip_pair[1] . " (possibly no entry found in froxlor database. Use --list to see what IP addresses are added in froxlor");
} }
// check whether the system.ipaddress needs updating // check whether the system.ipaddress needs updating
if ($check_sysip['value'] == $ip_pair[0]) { if ($check_sysip['value'] == $ip_pair[0]) {
$upd2_stmt = Database::prepare("UPDATE `panel_settings` SET `value` = :newip WHERE `settinggroup` = 'system' and `varname` = 'ipaddress'"); $upd2_stmt = Database::prepare("UPDATE `panel_settings` SET `value` = :newip WHERE `settinggroup` = 'system' and `varname` = 'ipaddress'");
@@ -360,7 +198,7 @@ class Action
)); ));
CmdLineHandler::printsucc("Updated system-ipaddress from '" . $ip_pair[0] . "' to '" . $ip_pair[1] . "'"); CmdLineHandler::printsucc("Updated system-ipaddress from '" . $ip_pair[0] . "' to '" . $ip_pair[1] . "'");
} }
// check whether the system.mysql_access_host needs updating // check whether the system.mysql_access_host needs updating
if (strstr($check_mysqlip['value'], $ip_pair[0]) !== false) { if (strstr($check_mysqlip['value'], $ip_pair[0]) !== false) {
$new_mysqlip = str_replace($ip_pair[0], $ip_pair[1], $check_mysqlip['value']); $new_mysqlip = str_replace($ip_pair[0], $ip_pair[1], $check_mysqlip['value']);
@@ -370,7 +208,7 @@ class Action
)); ));
CmdLineHandler::printsucc("Updated mysql_access_host from '" . $check_mysqlip['value'] . "' to '" . $new_mysqlip . "'"); CmdLineHandler::printsucc("Updated mysql_access_host from '" . $check_mysqlip['value'] . "' to '" . $new_mysqlip . "'");
} }
// check whether the system.axfrservers needs updating // check whether the system.axfrservers needs updating
if (strstr($check_axfrip['value'], $ip_pair[0]) !== false) { if (strstr($check_axfrip['value'], $ip_pair[0]) !== false) {
$new_axfrip = str_replace($ip_pair[0], $ip_pair[1], $check_axfrip['value']); $new_axfrip = str_replace($ip_pair[0], $ip_pair[1], $check_axfrip['value']);
@@ -382,7 +220,7 @@ class Action
} }
} }
} }
echo PHP_EOL; echo PHP_EOL;
CmdLineHandler::printwarn("*** ATTENTION *** Remember to replace IP addresses in configuration files if used anywhere."); CmdLineHandler::printwarn("*** ATTENTION *** Remember to replace IP addresses in configuration files if used anywhere.");
CmdLineHandler::printsucc("IP addresses updated"); CmdLineHandler::printsucc("IP addresses updated");
@@ -391,10 +229,10 @@ class Action
private function _parseConfig() private function _parseConfig()
{ {
define('FROXLOR_INSTALL_DIR', $this->_args['froxlor-dir']); define('FROXLOR_INSTALL_DIR', $this->_args['froxlor-dir']);
if (!file_exists(FROXLOR_INSTALL_DIR . '/lib/classes/database/class.Database.php')) { if (! file_exists(FROXLOR_INSTALL_DIR . '/lib/classes/database/class.Database.php')) {
throw new Exception("Could not find froxlor's Database class. Is froxlor really installed to '".FROXLOR_INSTALL_DIR."'?"); throw new Exception("Could not find froxlor's Database class. Is froxlor really installed to '" . FROXLOR_INSTALL_DIR . "'?");
} }
if (!file_exists(FROXLOR_INSTALL_DIR . '/lib/userdata.inc.php')) { if (! file_exists(FROXLOR_INSTALL_DIR . '/lib/userdata.inc.php')) {
throw new Exception("Could not find froxlor's userdata.inc.php file. You should use this script only with a fully installed and setup froxlor system."); throw new Exception("Could not find froxlor's userdata.inc.php file. You should use this script only with a fully installed and setup froxlor system.");
} }
require FROXLOR_INSTALL_DIR . '/lib/classes/database/class.Database.php'; require FROXLOR_INSTALL_DIR . '/lib/classes/database/class.Database.php';
@@ -415,3 +253,10 @@ class Action
} }
} }
} }
// give control to command line handler
try {
SwitchServerIp::processParameters($argc, $argv);
} catch (Exception $e) {
SwitchServerIp::printerr($e->getMessage());
}

View File

@@ -0,0 +1,196 @@
<?php
/**
* This file is part of the Froxlor project.
* Copyright (c) 2018 the Froxlor Team (see authors).
*
* For the full copyright and license information, please view the COPYING
* file that was distributed with this source code. You can also view the
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt
*
* @copyright (c) the authors
* @author Froxlor team <team@froxlor.org> (2018-)
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt
* @package Cron
*
*/
abstract class CmdLineHandler
{
/**
* internal variable for passed arguments
*
* @var array
*/
private static $args = null;
/**
* Action object read from commandline/config
*
* @var Action
*/
private $_action = null;
/**
* Returns a CmdLineHandler object with given
* arguments from command line
*
* @param int $argc
* @param array $argv
*
* @return CmdLineHandler
*/
public static function processParameters($argc, $argv)
{
$me = get_called_class();
return new $me($argc, $argv);
}
/**
* returns the Action object generated in
* the class constructor
*
* @return Action
*/
public function getAction()
{
return $this->_action;
}
/**
* class constructor, validates the command line parameters
* and sets the Action-object if valid
*
* @param int $argc
* @param string[] $argv
*
* @return null
* @throws Exception
*/
private function __construct($argc, $argv)
{
self::$args = $this->_parseArgs($argv);
$this->_action = $this->_createAction();
}
/**
* Parses the arguments given via the command line;
* three types are supported:
* 1.
* --parm1 or --parm2=value
* 2. -xyz (multiple switches in one) or -a=value
* 3. parm1 parm2
*
* The 1. will be mapped as
* ["parm1"] => true, ["parm2"] => "value"
* The 2. as
* ["x"] => true, ["y"] => true, ["z"] => true, ["a"] => "value"
* And the 3. as
* [0] => "parm1", [1] => "parm2"
*
* @param array $argv
*
* @return array
*/
private function _parseArgs($argv)
{
array_shift($argv);
$o = array();
foreach ($argv as $a) {
if (substr($a, 0, 2) == '--') {
$eq = strpos($a, '=');
if ($eq !== false) {
$o[substr($a, 2, $eq - 2)] = substr($a, $eq + 1);
} else {
$k = substr($a, 2);
if (! isset($o[$k])) {
$o[$k] = true;
}
}
} else if (substr($a, 0, 1) == '-') {
if (substr($a, 2, 1) == '=') {
$o[substr($a, 1, 1)] = substr($a, 3);
} else {
foreach (str_split(substr($a, 1)) as $k) {
if (! isset($o[$k])) {
$o[$k] = true;
}
}
}
} else {
$o[] = $a;
}
}
return $o;
}
/**
* Creates an Action-Object for the Action-Handler
*
* @return Action
* @throws Exception
*/
private function _createAction()
{
// Test for help-switch
if (empty(self::$args) || array_key_exists("help", self::$args) || array_key_exists("h", self::$args)) {
static::printHelp();
// end of execution
}
// check if no unknown parameters are present
foreach (self::$args as $arg => $value) {
if (is_numeric($arg)) {
throw new Exception("Unknown parameter '" . $value . "' in argument list");
} elseif (! in_array($arg, static::$params) && ! in_array($arg, static::$switches)) {
throw new Exception("Unknown parameter '" . $arg . "' in argument list");
}
}
// set debugger switch
if (isset(self::$args["d"]) && self::$args["d"] == true) {
// Debugger::getInstance()->setEnabled(true);
// Debugger::getInstance()->debug("debug output enabled");
}
return new static::$action_class(self::$args);
}
public static function getInput($prompt = "#", $default = "")
{
if (! empty($default)) {
$prompt .= " [" . $default . "]";
}
$result = readline($prompt . ":");
if (empty($result) && ! empty($default)) {
$result = $default;
}
return mb_strtolower($result);
}
public static function println($msg = "")
{
print $msg . PHP_EOL;
}
private static function _printcolor($msg = "", $color = "0")
{
print "\033[" . $color . "m" . $msg . "\033[0m" . PHP_EOL;
}
public static function printerr($msg = "")
{
self::_printcolor($msg, "31");
}
public static function printsucc($msg = "")
{
self::_printcolor($msg, "32");
}
public static function printwarn($msg = "")
{
self::_printcolor($msg, "33");
}
}

View File

@@ -353,7 +353,7 @@ exit "$RETVAL"
<!--DNS --> <!--DNS -->
<service type="dns" title="{{lng.admin.configfiles.dns}}"> <service type="dns" title="{{lng.admin.configfiles.dns}}">
<!--Bind9 --> <!--Bind9 -->
<daemon name="bind" title="Bind9 nameserver"> <daemon name="bind" title="Bind9 nameserver" default="true">
<install><![CDATA[emerge net-dns/bind]]></install> <install><![CDATA[emerge net-dns/bind]]></install>
<file name="/etc/bind/default.zone"> <file name="/etc/bind/default.zone">
<content><![CDATA[ <content><![CDATA[

View File

@@ -365,7 +365,7 @@ exit "$RETVAL"
<!--DNS --> <!--DNS -->
<service type="dns" title="{{lng.admin.configfiles.dns}}"> <service type="dns" title="{{lng.admin.configfiles.dns}}">
<!--Bind9 --> <!--Bind9 -->
<daemon name="bind" title="Bind9 nameserver"> <daemon name="bind" title="Bind9 nameserver" default="true">
<install><![CDATA[apt-get install bind9]]></install> <install><![CDATA[apt-get install bind9]]></install>
<command><![CDATA[echo "include \"{{settings.system.bindconf_directory}}froxlor_bind.conf\";" >> /etc/bind/named.conf.local]]></command> <command><![CDATA[echo "include \"{{settings.system.bindconf_directory}}froxlor_bind.conf\";" >> /etc/bind/named.conf.local]]></command>
<command><![CDATA[touch {{settings.system.bindconf_directory}}froxlor_bind.conf]]></command> <command><![CDATA[touch {{settings.system.bindconf_directory}}froxlor_bind.conf]]></command>

View File

@@ -334,7 +334,7 @@ exit "$RETVAL"
<!--DNS --> <!--DNS -->
<service type="dns" title="{{lng.admin.configfiles.dns}}"> <service type="dns" title="{{lng.admin.configfiles.dns}}">
<!--Bind9 --> <!--Bind9 -->
<daemon name="bind" title="Bind9 nameserver"> <daemon name="bind" title="Bind9 nameserver" default="true">
<install><![CDATA[apt-get install bind9]]></install> <install><![CDATA[apt-get install bind9]]></install>
<command><![CDATA[echo "include \"{{settings.system.bindconf_directory}}froxlor_bind.conf\";" >> /etc/bind/named.conf]]></command> <command><![CDATA[echo "include \"{{settings.system.bindconf_directory}}froxlor_bind.conf\";" >> /etc/bind/named.conf]]></command>
<command><![CDATA[touch {{settings.system.bindconf_directory}}froxlor_bind.conf]]></command> <command><![CDATA[touch {{settings.system.bindconf_directory}}froxlor_bind.conf]]></command>

View File

@@ -354,7 +354,7 @@ exit "$RETVAL"
<!--DNS --> <!--DNS -->
<service type="dns" title="{{lng.admin.configfiles.dns}}"> <service type="dns" title="{{lng.admin.configfiles.dns}}">
<!--Bind9 --> <!--Bind9 -->
<daemon name="bind" title="Bind9 nameserver"> <daemon name="bind" title="Bind9 nameserver" default="true">
<install><![CDATA[apt-get install bind9]]></install> <install><![CDATA[apt-get install bind9]]></install>
<command><![CDATA[echo "include \"{{settings.system.bindconf_directory}}froxlor_bind.conf\";" >> /etc/bind/named.conf.local]]></command> <command><![CDATA[echo "include \"{{settings.system.bindconf_directory}}froxlor_bind.conf\";" >> /etc/bind/named.conf.local]]></command>
<command><![CDATA[touch {{settings.system.bindconf_directory}}froxlor_bind.conf]]></command> <command><![CDATA[touch {{settings.system.bindconf_directory}}froxlor_bind.conf]]></command>

View File

@@ -367,7 +367,7 @@ exit "$RETVAL"
<!--DNS --> <!--DNS -->
<service type="dns" title="{{lng.admin.configfiles.dns}}"> <service type="dns" title="{{lng.admin.configfiles.dns}}">
<!--Bind9 --> <!--Bind9 -->
<daemon name="bind" title="Bind9 nameserver"> <daemon name="bind" title="Bind9 nameserver" default="true">
<install><![CDATA[apt-get install bind9]]></install> <install><![CDATA[apt-get install bind9]]></install>
<command><![CDATA[echo "include \"{{settings.system.bindconf_directory}}froxlor_bind.conf\";" >> /etc/bind/named.conf]]></command> <command><![CDATA[echo "include \"{{settings.system.bindconf_directory}}froxlor_bind.conf\";" >> /etc/bind/named.conf]]></command>
<command><![CDATA[touch {{settings.system.bindconf_directory}}froxlor_bind.conf]]></command> <command><![CDATA[touch {{settings.system.bindconf_directory}}froxlor_bind.conf]]></command>

View File

@@ -407,7 +407,7 @@ exit "$RETVAL"
<!--DNS --> <!--DNS -->
<service type="dns" title="{{lng.admin.configfiles.dns}}"> <service type="dns" title="{{lng.admin.configfiles.dns}}">
<!--Bind9 --> <!--Bind9 -->
<daemon name="bind" title="Bind9 nameserver"> <daemon name="bind" title="Bind9 nameserver" default="true">
<install><![CDATA[apt-get install bind9]]></install> <install><![CDATA[apt-get install bind9]]></install>
<command><![CDATA[echo "include \"{{settings.system.bindconf_directory}}froxlor_bind.conf\";" >> /etc/bind/named.conf.local]]></command> <command><![CDATA[echo "include \"{{settings.system.bindconf_directory}}froxlor_bind.conf\";" >> /etc/bind/named.conf.local]]></command>
<command><![CDATA[touch {{settings.system.bindconf_directory}}froxlor_bind.conf]]></command> <command><![CDATA[touch {{settings.system.bindconf_directory}}froxlor_bind.conf]]></command>