/** * Adds the new server */ function add($post) { global $fmdb, $__FM_CONFIG, $fm_name; /** Validate entries */ $post = $this->validatePost($post); if (!is_array($post)) { return $post; } $module = isset($post['module_name']) ? $post['module_name'] : $_SESSION['module']; /** Get a valid and unique serial number */ $post['server_serial_no'] = isset($post['server_serial_no']) ? $post['server_serial_no'] : generateSerialNo($module); $sql_insert = "REPLACE INTO `fm_{$__FM_CONFIG[$_SESSION['module']]['prefix']}servers`"; $sql_fields = '('; $sql_values = null; $post['account_id'] = $_SESSION['user']['account_id']; $exclude = array('submit', 'action', 'server_id', 'compress', 'AUTHKEY', 'module_name', 'module_type', 'config'); foreach ($post as $key => $data) { $clean_data = sanitize($data); if ($key == 'server_name' && empty($clean_data)) { return __('No server name defined.'); } if (!in_array($key, $exclude)) { $sql_fields .= $key . ','; $sql_values .= "'{$clean_data}',"; } } $sql_fields = rtrim($sql_fields, ',') . ')'; $sql_values = rtrim($sql_values, ','); $query = "{$sql_insert} {$sql_fields} VALUES ({$sql_values})"; $result = $fmdb->query($query); if (!$fmdb->result) { return __('Could not add the server because a database error occurred.'); } /** Add default fM interaction rules */ $account_id = isset($post['AUTHKEY']) ? getAccountID($post['AUTHKEY']) : $_SESSION['user']['account_id']; include_once ABSPATH . 'fm-modules/' . $module . '/classes/class_policies.php'; $fm_host_id = getNameFromID($fm_name, 'fm_' . $__FM_CONFIG[$module]['prefix'] . 'objects', 'object_', 'object_name', 'object_id', $account_id); $fm_service_id[] = 'g' . getNameFromID('Web Server', 'fm_' . $__FM_CONFIG[$module]['prefix'] . 'groups', 'group_', 'group_name', 'group_id', $account_id); if ($post['server_type'] == 'iptables') { $fm_service_id[] = 's' . getNameFromID('High TCP Ports', 'fm_' . $__FM_CONFIG[$module]['prefix'] . 'services', 'service_', 'service_name', 'service_id', $account_id); } $default_rules[] = array('account_id' => $account_id, 'server_serial_no' => $post['server_serial_no'], 'source_items' => 'o' . $fm_host_id, 'destination_items' => '', 'services_items' => implode(';', $fm_service_id), 'policy_comment' => sprintf(__('Required for %s client interaction.'), $fm_name)); $default_rules[] = array('account_id' => $account_id, 'server_serial_no' => $post['server_serial_no'], 'policy_direction' => 'out', 'source_items' => '', 'destination_items' => 'o' . $fm_host_id, 'services_items' => implode(';', $fm_service_id), 'policy_comment' => sprintf(__('Required for %s client interaction.'), $fm_name)); foreach ($default_rules as $rule) { $fm_module_policies->add($rule); } addLogEntry("Added server:\nName: {$post['server_name']} ({$post['server_serial_no']})\nType: {$post['server_type']}\n" . "Update Method: {$post['server_update_method']}\nConfig File: {$post['server_config_file']}"); return true; }
/** * Runs the installer * * @since 1.0 * @package facileManager */ function installFM($proto, $compress) { global $argv, $module_name, $data; unset($data['SERIALNO']); echo fM("Welcome to the {$module_name} installer.\n\n"); echo fM("Please answer the following questions and the necessary configurations will be performed for you.\n\n"); /** facileManager host **/ echo "Please enter the location of the facileManager interface:\n"; echo " Examples include:\n"; echo "\tfm.mydomain.com\n"; echo "\tfm.mydomain.com:8443\n"; echo "\tmydomain.com/fm\n"; echo "\thttp://fm.mydomain.com/facileManager\n\n"; echo 'Please enter the location of the facileManager interface: '; if (defined('FMHOST')) { $serverhost = FMHOST; echo FMHOST . "\n"; } else { $serverhost = trim(fgets(STDIN)); } /** Get server name from input */ $server_location = getServerPath($serverhost); extract($server_location); $data['config'] = array(); /** Run tests */ echo fM(" --> Testing {$hostname} via https..."); if (socketTest($hostname, 443)) { echo "ok\n"; $proto = 'https'; } else { echo "failed\n"; echo fM(" --> Testing {$hostname} via http..."); if (socketTest($hostname, 80)) { echo "ok\n"; $proto = 'http'; } else { echo "failed\n\n"; echo fM("Cannot access {$hostname} with http or https. Please correct this before proceeding.\n"); exit(1); } } $data['config'][] = array('FMHOST', 'facileManager server', $hostname . '/' . $path); /** Account key **/ $key = 'default'; while (!isset($key)) { echo fM('Please enter your account key: '); $key = trim(fgets(STDIN)); } $data['compress'] = $compress; $data['AUTHKEY'] = $key; $data['config'][] = array('AUTHKEY', 'Account number', $key); /** Test the authentication */ echo fM(' --> Checking account details...'); $url = "{$proto}://{$hostname}/{$path}admin-accounts.php?verify"; $raw_data = getPostData($url, $data); $raw_data = $data['compress'] ? @unserialize(gzuncompress($raw_data)) : @unserialize($raw_data); echo $raw_data . "\n\n"; if ($raw_data != 'Success') { echo "Installation failed. "; echo !strlen($raw_data) ? fM("Could not communicate properly with {$hostname}. Failed to access {$url}.") : fM('Please check your account key.'); echo "\n"; exit(1); } /** Server serial number **/ $data['server_name'] = exec('hostname -f', $output, $rc); if ($rc > 0 || empty($data['server_name'])) { $data['server_name'] = php_uname('n'); } $data['server_os'] = PHP_OS; $data['server_os_distro'] = detectOSDistro(); echo fM('Please enter the serial number for ' . $data['server_name'] . ' (or leave blank to create new): '); if (defined('SERIALNO')) { $serialno = $data['server_serial_no'] = SERIALNO; echo SERIALNO . "\n"; } else { $serialno = trim(fgets(STDIN)); } $url = "{$proto}://{$hostname}/{$path}admin-servers.php?genserial"; /** Process new server */ if (empty($serialno)) { /** Generate new serial number */ echo fM(' --> Generating new serial number: '); $serialno = $data['server_serial_no'] = generateSerialNo($url, $data); echo $serialno . "\n"; } /** Add new server */ echo fM(' --> Adding ' . $data['server_name'] . ' to the database...'); $add_server_result = moduleAddServer($url, $data); extract($add_server_result, EXTR_OVERWRITE); echo fM($add_result); $data['SERIALNO'] = $serialno; $data['config'][] = array('SERIALNO', 'Server unique serial number', $serialno); $data = installFMModule($module_name, $proto, $compress, $data, $server_location, $url); /** Save the file */ saveFMConfigFile($data); /** Complete installation */ $url = "{$proto}://{$hostname}/{$path}admin-servers.php?install"; $raw_data = getPostData($url, $data); /** Add log entry */ addLogEntry('Client installed successfully.'); echo fM("Installation is complete. Please login to the UI to ensure the server settings are correct.\n"); /** chmod and prepend php to this file */ chmod($argv[0], 0755); $contents = file_get_contents($argv[0]); $bin = '#!' . findProgram('php'); if (strpos($contents, $bin) === false) { $contents = $bin . "\n" . $contents; file_put_contents($argv[0], $contents); } exit; }
/** * Adds the new server */ function add($post) { global $fmdb, $__FM_CONFIG; extract($post, EXTR_SKIP); $server_name = sanitize($server_name); if (empty($server_name)) { return __('No server name defined.'); } /** Check name field length */ $field_length = getColumnLength('fm_' . $__FM_CONFIG['fmSQLPass']['prefix'] . 'servers', 'server_name'); if ($field_length !== false && strlen($server_name) > $field_length) { return sprintf(__('Server name is too long (maximum %d characters).'), $field_length); } /** Does the record already exist for this account? */ basicGet('fm_' . $__FM_CONFIG['fmSQLPass']['prefix'] . 'servers', $server_name, 'server_', 'server_name'); if ($fmdb->num_rows) { return __('This server name already exists.'); } $sql_insert = "REPLACE INTO `fm_{$__FM_CONFIG['fmSQLPass']['prefix']}servers`"; $sql_fields = '('; $sql_values = null; $log_message = "Added a database server with the following details:\n"; $post['account_id'] = $_SESSION['user']['account_id']; /** Set default ports */ if (!empty($post['server_port']) && !verifyNumber($post['server_port'], 1, 65535, false)) { return __('Server port must be a valid TCP port.'); } if (empty($post['server_port'])) { $post['server_port'] = $__FM_CONFIG['fmSQLPass']['default']['ports'][$post['server_type']]; } $module = isset($post['module_name']) ? $post['module_name'] : $_SESSION['module']; /** Get a valid and unique serial number */ $post['server_serial_no'] = isset($post['server_serial_no']) ? $post['server_serial_no'] : generateSerialNo($module); $exclude = array('submit', 'action', 'server_id', 'compress', 'AUTHKEY', 'module_name', 'module_type', 'config'); /** Convert groups and policies arrays into strings */ if (isset($post['server_groups']) && is_array($post['server_groups'])) { $temp_var = null; foreach ($post['server_groups'] as $id) { $temp_var .= $id . ';'; } $post['server_groups'] = rtrim($temp_var, ';'); } /** Handle credentials */ if (is_array($post['server_credentials'])) { $post['server_credentials'] = serialize($post['server_credentials']); } foreach ($post as $key => $data) { $clean_data = sanitize($data); if (!in_array($key, $exclude)) { $sql_fields .= $key . ','; $sql_values .= "'{$clean_data}',"; if ($key == 'server_credentials') { $clean_data = str_repeat('*', 7); } if ($key == 'server_groups') { if ($post['server_groups']) { $group_array = explode(';', $post['server_group']); $clean_data = null; foreach ($group_array as $group_id) { $clean_data .= getNameFromID($group_id, 'fm_' . $__FM_CONFIG['fmSQLPass']['prefix'] . 'groups', 'group_', 'group_id', 'group_name') . '; '; } $clean_data = rtrim($clean_data, '; '); } else { $clean_data = 'None'; } } $log_message .= $clean_data && $key != 'account_id' ? formatLogKeyData('server_', $key, $clean_data) : null; } } $sql_fields = rtrim($sql_fields, ',') . ')'; $sql_values = rtrim($sql_values, ','); $query = "{$sql_insert} {$sql_fields} VALUES ({$sql_values})"; $result = $fmdb->query($query); if (!$fmdb->result) { return __('Could not add the server because a database error occurred.'); } addLogEntry($log_message); return true; }
} require_once 'fm-init.php'; if (file_exists(ABSPATH . 'fm-modules/' . $_POST['module_name'] . '/variables.inc.php')) { include ABSPATH . 'fm-modules/' . $_POST['module_name'] . '/variables.inc.php'; } include ABSPATH . 'fm-includes/version.php'; /** Check account key */ include ABSPATH . 'fm-modules/facileManager/classes/class_accounts.php'; $account_status = $fm_accounts->verifyAccount($_POST['AUTHKEY']); if ($account_status !== true) { $data = $account_status; } else { if (in_array($_POST['module_name'], getActiveModules())) { if (array_key_exists('genserial', $_GET)) { $module = $_POST['module_name'] ? $_POST['module_name'] : $_SESSION['module']; $data['server_serial_no'] = generateSerialNo($module); } if (array_key_exists('addserial', $_GET)) { /** Client expects an array for a good return */ $data = $_POST; /** Does the record already exist for this account? */ basicGet('fm_' . $__FM_CONFIG[$_POST['module_name']]['prefix'] . 'servers', $_POST['server_name'], 'server_', 'server_name'); if ($fmdb->num_rows) { $server_array = $fmdb->last_result; $_POST['server_id'] = $server_array[0]->server_id; $update_server = moduleAddServer('update'); } else { if (getOption('client_auto_register')) { /** Add new server */ $add_server = moduleAddServer('add'); if ($add_server !== true) {
/** * Adds the new server */ function addServer($post) { global $fmdb, $__FM_CONFIG; if (empty($post['server_name'])) { return __('No server name defined.'); } /** Check name field length */ $field_length = getColumnLength('fm_' . $__FM_CONFIG['fmDNS']['prefix'] . 'servers', 'server_name'); if ($field_length !== false && strlen($post['server_name']) > $field_length) { return sprintf(dngettext($_SESSION['module'], 'Server name is too long (maximum %d character).', 'Server name is too long (maximum %d characters).', $field_length), $field_length); } /** Does the record already exist for this account? */ basicGet('fm_' . $__FM_CONFIG['fmDNS']['prefix'] . 'servers', $post['server_name'], 'server_', 'server_name'); if ($fmdb->num_rows) { return __('This server name already exists.'); } if (empty($post['server_root_dir'])) { $post['server_root_dir'] = $__FM_CONFIG['ns']['named_root_dir']; } if (empty($post['server_zones_dir'])) { $post['server_zones_dir'] = $__FM_CONFIG['ns']['named_zones_dir']; } if (empty($post['server_config_file'])) { $post['server_config_file'] = $__FM_CONFIG['ns']['named_config_file']; } $post['server_root_dir'] = rtrim($post['server_root_dir'], '/'); $post['server_chroot_dir'] = rtrim($post['server_chroot_dir'], '/'); $post['server_zones_dir'] = rtrim($post['server_zones_dir'], '/'); /** Process server_run_as */ $server_run_as_options = enumMYSQLSelect('fm_' . $__FM_CONFIG['fmDNS']['prefix'] . 'servers', 'server_run_as_predefined'); if (!in_array($post['server_run_as_predefined'], $server_run_as_options)) { $post['server_run_as'] = $post['server_run_as_predefined']; $post['server_run_as_predefined'] = 'as defined:'; } /** Set default ports */ if (!isset($post['server_update_method'])) { $post['server_update_method'] = 'http'; } if ($post['server_update_method'] == 'cron') { $post['server_update_port'] = 0; } if (!empty($post['server_update_port']) && !verifyNumber($post['server_update_port'], 1, 65535, false)) { return __('Server update port must be a valid TCP port.'); } if (empty($post['server_update_port'])) { if ($post['server_update_method'] == 'http') { $post['server_update_port'] = 80; } elseif ($post['server_update_method'] == 'https') { $post['server_update_port'] = 443; } elseif ($post['server_update_method'] == 'ssh') { $post['server_update_port'] = 22; } } $module = $post['module_name'] ? $post['module_name'] : $_SESSION['module']; /** Get a valid and unique serial number */ $post['server_serial_no'] = isset($post['server_serial_no']) ? $post['server_serial_no'] : generateSerialNo($module); /** Process server_key */ if (!isset($post['server_key']) || !is_numeric($post['server_key'])) { $post['server_key'] = 0; } $sql_insert = "REPLACE INTO `fm_{$__FM_CONFIG['fmDNS']['prefix']}servers`"; $sql_fields = '('; $sql_values = null; $post['account_id'] = $_SESSION['user']['account_id']; $exclude = array('submit', 'action', 'server_id', 'compress', 'AUTHKEY', 'module_name', 'module_type', 'config', 'sub_type'); foreach ($post as $key => $data) { $clean_data = sanitize($data); if ($key == 'server_name' && empty($clean_data)) { return __('No server name defined.'); } if (!in_array($key, $exclude)) { $sql_fields .= $key . ','; $sql_values .= "'{$clean_data}',"; } } $sql_fields = rtrim($sql_fields, ',') . ')'; $sql_values = rtrim($sql_values, ','); $query = "{$sql_insert} {$sql_fields} VALUES ({$sql_values})"; $result = $fmdb->query($query); if ($fmdb->sql_errors) { return __('Could not add the server because a database error occurred.'); } $tmp_key = $post['server_key'] ? getNameFromID($post['server_key'], 'fm_' . $__FM_CONFIG['fmDNS']['prefix'] . 'keys', 'key_', 'key_id', 'key_name') : 'None'; $tmp_runas = $post['server_run_as_predefined'] ? $post['server_run_as_predefined'] : $post['server_run_as']; addLogEntry("Added server:\nName: {$post['server_name']} ({$post['server_serial_no']})\nKey: {$tmp_key}\nType: {$post['server_type']}\n" . "Run-as: {$tmp_runas}\nUpdate Method: {$post['server_update_method']}\nConfig File: {$post['server_config_file']}\n" . "Server Root: {$post['server_root_dir']}\nServer Chroot: {$post['server_chroot_dir']}\n" . "Zone file directory: {$post['server_zones_dir']}"); return true; }