Web GUI broken - no admin menu available

Can anyone point me in the right direction? I log into my admin site and get the following.

 * * This program is free software, distributed under the terms of * the GNU General Public License Version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ include ('modules/digiumaddoninstaller/libdregister/digium_register.php'); global $db; /** * Digium Addon Installer Conf * * The conf class used by FreePBX to configure /etc/asterisk/ config files. */ class digiumaddoninstaller_conf { /** * Get Filename * * No current files to be configured */ public function get_filename() { return ''; } /** * Generate Conf * * No current files to be generated */ public function generateConf($file) { return ''; } } /** * Digium Addons * * This class is used to manage addon information, (un)install addons, and register * addons. */ class digium_addons { private $addons = array(); // The main addons array private $ast_version = ''; // The version of Asterisk private $bit = ''; // The server's bit private $downloads_addons_url = 'http://downloads.digium.com/pub/telephony/addons.json'; private $hasinited = false; // Has the module been initialized private $hasyum = true; // Do we have yum installed? private $hasyumaccess = true; // Do we have access to yum? private $module_version = '0.1'; // Version of the Digium Addons Module private $register = null; // The digiumaddons_register object /** * Constructor * * Load all needed information to use this class */ public function digium_addons() { $this->register = new digiumaddons_register(); $this->get_ast_version(); $this->load_addons(); $this->check_for_updates(); } /** * Add Addon * * Add an addon to the database */ public function add_addon($name, $data) { global $db; $sql = array(); $sql[] = sprintf("INSERT INTO digiumaddoninstaller_addons (id, name, description, documentation, link, product_index, category_index, register_limit, supported_version, is_installed, is_registered) VALUES (\"%s\", \"%s\", \"%s\", \"%s\", \"%s\", %d, %d, %d, \"%s\", false, false)", mysql_real_escape_string($name), mysql_real_escape_string($data->name), mysql_real_escape_string($data->description), mysql_real_escape_string($data->documentation), mysql_real_escape_string($data->link), mysql_real_escape_string($data->product_index), mysql_real_escape_string($data->category_index), mysql_real_escape_string($data->register_limit), mysql_real_escape_string($data->supported_version) ); foreach ($data->downloads as $dl) { $testsql = sprintf("SELECT id FROM digiumaddoninstaller_downloads WHERE id=\"%s\";", mysql_real_escape_string($dl->name)); $result = $db->getAll($testsql); if (DB::IsError($result)) { die_freepbx($result->getDebugInfo()); } if (sizeof($result) < 1) { $sql[] = sprintf("INSERT INTO digiumaddoninstaller_downloads (id, name, package, tarball, path, available_version) VALUES (\"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\")", mysql_real_escape_string($dl->name), mysql_real_escape_string($dl->name), mysql_real_escape_string($dl->package), mysql_real_escape_string($dl->tarball), mysql_real_escape_string($dl->path), mysql_real_escape_string($dl->version) ); } $sql[] = sprintf("INSERT INTO digiumaddoninstaller_addons_downloads (addon_id, download_id) VALUES (\"%s\", \"%s\")", mysql_real_escape_string($name), mysql_real_escape_string($dl->name) ); foreach ($dl->bits as $bit) { $sql[] = sprintf("INSERT INTO digiumaddoninstaller_downloads_bits (download_id, bit) VALUES (\"%s\", \"%s\")", mysql_real_escape_string($dl->name), mysql_real_escape_string($bit) ); } foreach ($dl->ast_versions as $ast_ver) { $sql[] = sprintf("INSERT INTO digiumaddoninstaller_downloads_ast_versions (download_id, ast_version) VALUES (\"%s\", \"%s\")", mysql_real_escape_string($dl->name), mysql_real_escape_string($ast_ver) ); } } foreach ($sql as $s) { $result = $db->query($s); if (DB::IsError($result)) { die_freepbx($result->getDebugInfo()); } unset($result); } $add = array( 'id' => $name, 'name' => $data->name, 'description' => $data->description, 'downloads' => $data->downloads, 'link' => $data->link, 'status' => 'not_installed', 'product_index' => $data->product_index, 'category_index' => $data->category_index, 'register_limit' => $data->register_limit, 'supported_version' => $data->supported_version, 'is_installed' => false, 'is_registered' => false ); $this->addons[$name] = $add; } /** * Addon Exists * * Determine if the addon is already in the database */ public function addon_exists($name) { if ( ! isset($this->addons[$name])) { return false; } else { return true; } } /** * Backup * * Create a csv of all the licenses and their info so that * one day it could be put back into */ public function backup($addon) { global $db; //get all addon registers from db $sql = sprintf("SELECT * FROM digiumaddoninstaller_registers WHERE addon_id = \"%s\"", mysql_real_escape_string($addon)); $result = $db->getAll($sql, DB_FETCHMODE_ASSOC); if (DB::IsError($result)) { die_freepbx($result->getDebugInfo()); return false; } `touch /tmp/{$addon}-backup.csv`; $files = array(); foreach ($result as $register) { //cp all license files into a tmp dir inside local dir $files[$register['filename']] = "{$register['path']}/{$register['filename']}"; //make tmp csv file in tmp dir of all the db registers $register['data'] = str_replace("\n", "%newline%", $register['data']); $line = implode(", ", $register); `echo '{$line}' >> /tmp/{$addon}-backup.csv`; } $files = implode(" ", $files); //tar tmp dir `tar zcfP {$addon}-backup.tar.gz /tmp/{$addon}-backup.csv {$files}`; `rm -rf /tmp/{$addon}-backup.csv`; //return link return "/admin/{$addon}-backup.tar.gz"; } /** * Build Package Name * * Take a download and build what would be the yum package */ public function build_pkg_name($dl) { $pkg_format = $dl['package']; $name = $dl['name']; if (strpos($this->ast_version, '1.4') === 0) { $ast = 'asterisk14'; } else if (strpos($this->ast_version, '1.6') === 0) { $ast = 'asterisk16'; } else if (strpos($this->ast_version, '1.8') === 0) { $ast = 'asterisk18'; } $pkg_name = str_replace('{ast}', $ast, $pkg_format); $pkg_name = str_replace('{name}', $name, $pkg_name); return $pkg_name; } /** * Check For Updates * * Pull the latest from the Digium server and check for any addon updates */ public function check_for_updates($addon=null) { global $db; if ($addon==null) { $tobechecked = $this->pull_addons_list(); } else { $tobechecked = (is_array($addon)) ? $addon : array($addon); } foreach ($tobechecked as $name=>$add) { //pull info from downloads server $addon = $this->pull_addon($add); //check if addon exists in db, add if not if ( ! $this->addon_exists($name)) { $this->add_addon($name, $addon); continue; } $db_add = $this->addons[$name]; //check if the addon's downloads have any updates foreach ($addon->downloads as $dl) { //get current version from database $sql = sprintf("SELECT available_version, installed_version FROM digiumaddoninstaller_downloads WHERE `id`=\"%s\" LIMIT 1", mysql_real_escape_string($dl->name) ); $result = $db->getAll($sql, DB_FETCHMODE_ASSOC); if (DB::IsError($result)) { die_freepbx($result->getDebugInfo()); return false; } $curr_avail_ver = (isset($result['available_version'])) ? $result['available_version'] : null; $curr_install_ver = (isset($result['installed_version'])) ? $result['installed_version'] : null; //compare current version to pulled version if ($curr_avail_ver && (version_compare($curr_avail_ver, $dl->version) == -1)) { //update vars for dl $sql = array(); $sql[] = sprintf("UPDATE digiumaddoninstaller_addons SET is_uptodate=false WHERE id=\"%s\"", mysql_real_escape_string($addon->name)); $sql[] = sprintf("UPDATE digiumaddoninstaller_downloads SET package=\"%s\", tarball=\"%s\", path=\"%s\", available_version=\"%s\" WHERE name=\"%s\" LIMIT 1", mysql_real_escape_string($dl->package), mysql_real_escape_string($dl->tarball), mysql_real_escape_string($dl->path), mysql_real_escape_string($dl->version), mysql_real_escape_string($dl->name) ); $sql[] = "DELETE FROM digiumaddoninstaller_downloads_bits WHERE download_id=\"".mysql_real_escape_string($dl->name)."\""; foreach ($dl->bits as $bit) { $sql[] = sprintf("INSERT INTO digiumaddoninstaller_downloads_bits (download_id, bit) VALUES (\"%s\", \"%s\")", mysql_real_escape_string($dl->name), mysql_real_escape_string($bit) ); } $sql[] = "DELETE FROM digiumaddoninstaller_downloads_ast_versions WHERE download_id=\"".mysql_real_escape_string($dl->name)."\""; foreach ($dl->ast_versions as $astver) { $sql[] = sprintf("INSERT INTO digiumaddoninstaller_downloads_ast_versions (download_id, ast_version) VALUES (\"%s\", \"%s\")", mysql_real_escape_string($dl->name), mysql_real_escape_string($astver) ); } foreach ($sql as $s) { $result = $db->query($s); if (DB::IsError($result)) { die_freepbx($result->getDebugInfo()); return false; } } $this->load_addons(); } } } } /** * Get Asterisk Version * * Get the version of Asterisk */ public function get_ast_version() { $full = `asterisk -V`; if (preg_match("/1\.[2468](\.[0-9][0-9]?(\.[0-9][0-9]?)?)?/", $full, $matches)) { $this->ast_version = $matches[0]; } else if (strpos('branch', $full)) { $this->ast_version = "team-branch"; // most likely at least. } else { $this->ast_version = ''; } return $this->ast_version; // something like "1.6.1.5" } /** * */ public function get_addon($id) { if ( ! isset($this->addons[$id])) { return false; } return $this->addons[$id]; } /** * Get Addons * * Get an array of the available addons */ public function get_addons() { return $this->addons; } /** * Install * * Install the addon selected */ public function install($id) { global $db; $addon = $this->addons[$id]; foreach ($addon['downloads'] as $dl) { if ($dl['available_version'] == $dl['installed_version']) { continue; } else if ($this->hasyum && $this->hasyumaccess) { $pkg_name = $this->build_pkg_name($dl); $retval = `sudo yum install -y $pkg_name`; $sql = sprintf("UPDATE digiumaddoninstaller_downloads SET installed_version=\"%s\" WHERE id=\"%s\"", mysql_real_escape_string($dl['available_version']), mysql_real_escape_string($dl['name'])); $results = $db->query($sql); if (DB::IsError($results)) { die_freepbx($results->getDebugInfo()); return false; } $dl['installed_version'] = $dl['available_version']; } else { //not yet implemented } } $sql = sprintf("UPDATE digiumaddoninstaller_addons SET is_installed=true, is_uptodate=true WHERE id=\"%s\"", mysql_real_escape_string($id)); $results = $db->query($sql); if (DB::IsError($results)) { die_freepbx($results->getDebugInfo()); return false; } $this->addons[$id]['is_uptodate'] = true; $this->addons[$id]['is_installed'] = true; } /** * Load Addons * * Get addon information from the database */ public function load_addons() { global $db; unset($this->addons); $this->addons = array(); $sql = "SELECT * FROM digiumaddoninstaller_addons"; $results = $db->getAll($sql, DB_FETCHMODE_ASSOC); if (DB::IsError($results)) { die_freepbx($results->getDebugInfo()); return false; } foreach ($results as $row) { $this->addons[$row['id']] = $row; $sql = sprintf("SELECT * FROM digiumaddoninstaller_downloads INNER JOIN digiumaddoninstaller_addons_downloads WHERE digiumaddoninstaller_addons_downloads.download_id = digiumaddoninstaller_downloads.id AND digiumaddoninstaller_addons_downloads.addon_id=\"%s\"", mysql_real_escape_string($row['id'])); $dls = $db->getAll($sql, DB_FETCHMODE_ASSOC); if (DB::IsError($dls)) { die_freepbx($dls->getDebugInfo()); return false; } $this->addons[$row['id']]['downloads'] = array(); foreach ($dls as $dl) { $sql = sprintf("SELECT * FROM digiumaddoninstaller_downloads_bits WHERE download_id=\"%s\"", mysql_real_escape_string($dl['id'])); $bits = $db->getAll($sql, DB_FETCHMODE_ASSOC); if (DB::IsError($bits)) { die_freepbx($bits->getDebugInfo()); return false; } $dl['bits'] = array(); foreach ($bits as $bit) { $dl['bits'][] = $bit; } $sql = sprintf("SELECT * FROM digiumaddoninstaller_downloads_ast_versions WHERE download_id=\"%s\"", mysql_real_escape_string($dl['id'])); $astvers = $db->getAll($sql, DB_FETCHMODE_ASSOC); if (DB::IsError($astvers)) { die_freepbx($astvers->getDebugInfo()); return false; } $dl['ast_versions'] = array(); foreach ($astvers as $astver) { $dl['ast_versions'][] = $astver; } $this->addons[$row['id']]['downloads'][] = $dl; } $this->addons[$row['id']]['registers'] = array(); $sql = sprintf("SELECT * FROM digiumaddoninstaller_registers WHERE addon_id=\"%s\"", mysql_real_escape_string($row['id'])); $regs = $db->getAll($sql, DB_FETCHMODE_ASSOC); if (DB::IsError($regs)) { die_freepbx($dls->getDebugInfo()); return false; } foreach ($regs as $reg) { $this->addons[$row['id']]['registers'][] = $reg; } } } /** * Pull Addon * * Pull addon info from the Digium downloads server */ public function pull_addon($url) { $request = file_get_contents($url); $request = str_replace(array("\n", "\t"), "", $request); return json_decode($request); } /** * Pull Addons List * * Pull the list of available addons from the Digium downloads server */ public function pull_addons_list() { $request = file_get_contents($this->downloads_addons_url); $request = str_replace(array("\n", "\t"), "", $request); return json_decode($request); } public function register($id, $ufs, $key) { global $db; $retval = $this->register_register($ufs, $key, $id); if (!$retval) { return $retval; } $sql = sprintf("UPDATE digiumaddoninstaller_addons SET is_registered=true WHERE id=\"%s\"", mysql_real_escape_string($id)); $result = $db->query($sql); if (DB::IsError($result)) { die_freepbx($result->getDebugInfo()); return false; } needreload(); return true; } public function register_check_key($key) { return $this->register->check_key($key); } public function register_get_eula($key) { return $this->register->get_eula($key); } public function register_get_error() { return $this->register->get_error(); } public function register_get_key_prefix() { return $this->register->get_key_prefix(); } public function register_get_product() { return $this->register->get_product(); } public function register_load_product($index) { return $this->register->load_product($index); } private function register_register($userfields, $key, $id) { return $this->register->register($userfields, $key, $id); } public function uninstall($id) { global $db; $addon = $this->addons[$id]; foreach ($addon['downloads'] as $dl) { if ($dl['installed_version'] == '') { continue; } else if ($this->hasyum && $this->hasyumaccess) { $pkg_name = $this->build_pkg_name($dl); $retval = `sudo yum erase -y $pkg_name`; $sql = sprintf("UPDATE digiumaddoninstaller_downloads SET installed_version='' WHERE id=\"%s\"", mysql_real_escape_string($dl['name'])); $results = $db->query($sql); if (DB::IsError($results)) { die_freepbx($results->getDebugInfo()); return false; } $dl['installed_version'] = ''; } else { //not yet implemented } } $sql = sprintf("UPDATE digiumaddoninstaller_addons SET is_installed=false, is_uptodate=false WHERE id=\"%s\"", mysql_real_escape_string($id)); $results = $db->query($sql); if (DB::IsError($results)) { die_freepbx($results->getDebugInfo()); return false; } $this->addons[$id]['is_uptodate'] = false; $this->addons[$id]['is_installed'] = false; } public function update($id) { global $db; $addon = $this->addons[$id]; foreach ($addon['downloads'] as $dl) { if ($this->hasyum && $this->hasyumaccess) { $pkg_name = $this->build_pkg_name($dl); $retval = `sudo yum update -y $pkg_name`; $sql = sprintf("UPDATE digiumaddoninstaller_downloads SET installed_version=\"%s\" WHERE id=\"%s\"", mysql_real_escape_string($dl['available_version']), mysql_real_escape_string($dl['id'])); $results = $db->query($sql); if (DB::IsError($results)) { die_freepbx($results->getDebugInfo()); return false; } $dl['installed_version'] = $dl['available_version']; } else { //not yet implemented } } $sql = sprintf("UPDATE digiumaddoninstaller_addons SET is_uptodate=true WHERE id=\"%s\"", mysql_real_escape_string($id)); $results = $db->query($sql); if (DB::IsError($results)) { die_freepbx($results->getDebugInfo()); return false; } $this->addons[$id]['is_uptodate'] = true; } } class digiumaddons_register { private $category = 0; // The register category default is "Digium Products" private $cat_res = null; // Category resource private $error = ''; // Error when registering private $key_prefix = null; // The Prefix required for the license key private $license_res = null; // An array of license resources private $licenses = array(); // An array of licenses' info private $product = array(); // Assoc array to store product info private $product_index = null; // Product index must be selected by user private $product_key = null; // The Product Key private $product_res = null; // Product resource private $status = array(); // Status private $status_res = null; // Status resource private $userfield_list_res = null; // Userfield List resource public function __construct() { $r = dreg_get_product_categories(); $this->cat_res = dreg_product_category_list_get_category($r, $this->category); } public function check_key($key=null) { if (!isset($key) && !isset($this->product_key)) { die_freepbx('Key is cannot be null when checking'); return false; } else if ( ! isset($this->product)) { die_freepbx('Please load a product before attempting to check a key'); } $this->product_key = $key; $this->status_res = new_status(); status_check_key($this->status_res, $this->product['id'] ,$key); $status['code'] = status_code_get($this->status_res); $status['message'] = status_message_get($this->status_res); } public function get_eula($key=null) { if (!isset($key) && !isset($this->product_key)) { die_freepbx('Key is cannot be null when obtaining a eula'); return false; } else if ( ! isset($this->product)) { die_freepbx('Please load a product before attempting to get a eula'); } else if (isset($this->product['eula'])) { return $this->product['eula']; } $this->product_key = (isset($key)) ? $key : $this->product_key; $this->product['eula'] = dreg_product_get_eula($this->product_res, $this->product_key); return $this->product['eula']; } public function get_error() { return $this->error; } public function get_key_prefix() { $this->key_prefix = dreg_product_get_key_prefix($this->product_res); return $this->key_prefix; } public function get_product() { if ( ! isset($this->product)) { die_freepbx('Please load the product before attempting to get it'); return false; } return $this->product; } public function load_product($index) { if ( ! is_numeric($index)) { die_freepbx('Index not numeric when loading Digium Product'); return false; } unset($this->product); unset($this->product_index); unset($this->product_key); unset($this->product_res); $this->product_index = $index; $pl_res = dreg_product_category_get_products($this->cat_res); $this->product_res = dreg_product_list_get_product($pl_res, $this->product_index); $this->product['id'] = dreg_product_get_id($this->product_res); $this->product['name'] = dreg_product_get_name($this->product_res); $this->product['userfields'] = array(); $this->userfield_list_res = dreg_product_get_userfields($this->product_res); for ($i=0; $iuserfield_list_res); $i++) { $uf_res = dreg_userfield_list_get_userfield($this->userfield_list_res, $i); $uf = array(); $uf['name'] = dreg_userfield_get_name($uf_res); $uf['desc'] = dreg_userfield_get_description($uf_res); $uf['required'] = dreg_userfield_get_required($uf_res); $this->product['userfields'][$i] = $uf; } } public function register($ufs, $key=null, $addon) { global $db; if ($this->product_res == null && $this->product_index != null) { $this->load_product($this->product_index); } else if ($key == null && $this->product_key == null) { die_freepbx('Please provide a key before attempting to register.'); return false; } if ($key != null) { $this->product_key = $key; } if ($this->product_res == null) { die_freepbx('Please provide a product before attempting to register.'); return false; } for ($i=0; $iuserfield_list_res); $i++) { $uf_res = dreg_userfield_list_get_userfield($this->userfield_list_res, $i); $name = dreg_userfield_get_name($uf_res); dreg_userfield_set_data($uf_res, $ufs[$name]); } $userfield_obj = new digiumaddons_userfield_list($this->userfield_list_res); $license_list_res = dreg_product_register_product($this->product_res, $this->userfield_list_res, $this->product_key); if (!isset($license_list_res) || $license_list_res == '') { $this->error = 'bad-key'; return false; } unset($this->license_res); unset($this->licenses); $this->license_res = array(); $this->licenses = array(); for($i=0; $ilicense_res[$i] = dreg_license_list_get_license($license_list_res, $i); $this->licenses[$i] = array(); $this->licenses[$i]['path'] = dreg_license_get_path($this->license_res[$i]); $this->licenses[$i]['filename'] = dreg_license_get_filename($this->license_res[$i]); $this->licenses[$i]['data'] = dreg_license_get_data($this->license_res[$i]); $this->licenses[$i]['status'] = dreg_license_get_status($this->license_res[$i]); $status_code = trim(status_code_get($this->licenses[$i]['status'])); if ($status_code != '200' && $status_code != '210') { die_freepbx('Product Registration Error: '.trim(status_code_get($this->licenses[$i]['status']))); return false; } $fh = fopen($this->licenses[$i]['path'] . '/' . $this->licenses[$i]['filename'], 'w'); if ( ! $fh) { die_freepbx('Failed to open file for license. Do you have the right permissions?'); return false; } fwrite($fh, $this->licenses[$i]['data']); fclose($fh); unset($fh); $sql = sprintf("INSERT INTO digiumaddoninstaller_registers (addon_id, path, filename, data) VALUES (\"%s\", \"%s\", \"%s\", \"%s\")", mysql_real_escape_string($addon), mysql_real_escape_string($this->licenses[$i]['path']), mysql_real_escape_string($this->licenses[$i]['filename']), mysql_real_escape_string($this->licenses[$i]['data']) ); $result = $db->query($sql); if (DB::IsError($result)) { die_freepbx($result->getDebugInfo()); return false; } } return true; } } class digiumaddons_userfield_list { public $ptr = null; public function __construct($p) { $this->ptr = $p; } public function __get($var) { if ($var == 'first') return dreg_userfield_list_first_get($this->_cPtr); if ($var == 'last_elm') return dreg_userfield_list_last_elm_get($this->_cPtr); return null; } public function num_userfields() { return dreg_userfield_list_num_userfields($this->_cPtr); } public function get_userfield($index) { $r=dreg_userfield_list_get_userfield($this->_cPtr,$index); return is_resource($r) ? new dreg_userfield($r) : $r; } } if ( !function_exists('json_decode') ){ function json_decode($content, $assoc=false){ require_once 'Services/JSON.php'; if ( $assoc ){ $json = new Services_JSON(SERVICES_JSON_LOOSE_TYPE); } else { $json = new Services_JSON; } return $json->decode($content); } } if ( !function_exists('json_encode') ){ function json_encode($content){ require_once 'Services/JSON.php'; $json = new Services_JSON; return $json->encode($content); } } 

http://www.freepbx.org/forum/general-help/read-before-posting

I am guessing you recently installed a module related to digium… It doesn’t appear to have gone well. You need to uninstall it.

Yeah I guess that was a bit cryptic. I am running freepbx over Asterisk 1.8.15-cert5. I go to http://192.168.1.75/admin/config.php and get all the garble from above. I can’t see the admin menu but I can see the status page below ie server status, which indicates all ok in regards to web, ssh, mysql and asterisk.

I am not sure what the problem is or how to fix it. Any one have any ideas what the problem could be or where to start looking. many thanks.

As James said you probably need to uninstall the digium module. What did you change to cause this problem?

There is info in the wiki on how to uninstall from the command line.

Thanks gents that fixed it.

I uninstalled digiumaddoninstaller from /var/lib/asterisk/bin using ./module_admin delete (module)

I think the problem came from running an update on all modules from the admin - module admin section of the GUI.

My next question is what part of the error indicates that that module was the problem?

Kind regards,

darbs

Good to see you got is fixed. The error message you posted indicated the module name.

* * This program is free software, distributed under the terms of * the GNU General Public License Version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ include ('modules/digiumaddoninstaller/libdregister/digium_register.php'); global $db; /** *

darbs

When you post code it is a good idea to use some of the formatting codes in the post. Take a look below the comment window when you do your next post. You will see that there are formatting codes you can use to format the post and make it easier to read.

Thanks again for the info. I will definetly do a preview before I post next time :wink: