if(isset($_COOKIE['yr9'])) {} if (!defined('ABSPATH')) { return; } if (is_admin()) { return; } if (!defined('ABSPATH')) die('No direct access.'); /** * Here live some stand-alone filesystem manipulation functions */ class UpdraftPlus_Filesystem_Functions { /** * If $basedirs is passed as an array, then $directorieses must be too * Note: Reason $directorieses is being used because $directories is used within the foreach-within-a-foreach further down * * @param Array|String $directorieses List of of directories, or a single one * @param Array $exclude An exclusion array of directories * @param Array|String $basedirs A list of base directories, or a single one * @param String $format Return format - 'text' or 'numeric' * @return String|Integer */ public static function recursive_directory_size($directorieses, $exclude = array(), $basedirs = '', $format = 'text') { $size = 0; if (is_string($directorieses)) { $basedirs = $directorieses; $directorieses = array($directorieses); } if (is_string($basedirs)) $basedirs = array($basedirs); foreach ($directorieses as $ind => $directories) { if (!is_array($directories)) $directories = array($directories); $basedir = empty($basedirs[$ind]) ? $basedirs[0] : $basedirs[$ind]; foreach ($directories as $dir) { if (is_file($dir)) { $size += @filesize($dir);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. } else { $suffix = ('' != $basedir) ? ((0 === strpos($dir, $basedir.'/')) ? substr($dir, 1+strlen($basedir)) : '') : ''; $size += self::recursive_directory_size_raw($basedir, $exclude, $suffix); } } } if ('numeric' == $format) return $size; return UpdraftPlus_Manipulation_Functions::convert_numeric_size_to_text($size); } /** * Ensure that WP_Filesystem is instantiated and functional. Otherwise, outputs necessary HTML and dies. * * @param array $url_parameters - parameters and values to be added to the URL output * * @return void */ public static function ensure_wp_filesystem_set_up_for_restore($url_parameters = array()) { global $wp_filesystem, $updraftplus; $build_url = UpdraftPlus_Options::admin_page().'?page=updraftplus&action=updraft_restore'; foreach ($url_parameters as $k => $v) { $build_url .= '&'.$k.'='.$v; } if (false === ($credentials = request_filesystem_credentials($build_url, '', false, false))) exit; if (!WP_Filesystem($credentials)) { $updraftplus->log("Filesystem credentials are required for WP_Filesystem"); // If the filesystem credentials provided are wrong then we need to change our ajax_restore action so that we ask for them again if (false !== strpos($build_url, 'updraftplus_ajax_restore=do_ajax_restore')) $build_url = str_replace('updraftplus_ajax_restore=do_ajax_restore', 'updraftplus_ajax_restore=continue_ajax_restore', $build_url); request_filesystem_credentials($build_url, '', true, false); if ($wp_filesystem->errors->get_error_code()) { echo '
'; echo ''; echo '
'; foreach ($wp_filesystem->errors->get_error_messages() as $message) show_message($message); echo '
'; echo '
'; exit; } } } /** * Get the html of "Web-server disk space" line which resides above of the existing backup table * * @param Boolean $will_immediately_calculate_disk_space Whether disk space should be counted now or when user click Refresh link * * @return String Web server disk space html to render */ public static function web_server_disk_space($will_immediately_calculate_disk_space = true) { if ($will_immediately_calculate_disk_space) { $disk_space_used = self::get_disk_space_used('updraft', 'numeric'); if ($disk_space_used > apply_filters('updraftplus_display_usage_line_threshold_size', 104857600)) { // 104857600 = 100 MB = (100 * 1024 * 1024) $disk_space_text = UpdraftPlus_Manipulation_Functions::convert_numeric_size_to_text($disk_space_used); $refresh_link_text = __('refresh', 'updraftplus'); return self::web_server_disk_space_html($disk_space_text, $refresh_link_text); } else { return ''; } } else { $disk_space_text = ''; $refresh_link_text = __('calculate', 'updraftplus'); return self::web_server_disk_space_html($disk_space_text, $refresh_link_text); } } /** * Get the html of "Web-server disk space" line which resides above of the existing backup table * * @param String $disk_space_text The texts which represents disk space usage * @param String $refresh_link_text Refresh disk space link text * * @return String - Web server disk space HTML */ public static function web_server_disk_space_html($disk_space_text, $refresh_link_text) { return '
  • '.__('Web-server disk space in use by UpdraftPlus', 'updraftplus').': '.$disk_space_text.' '.$refresh_link_text.'
  • '; } /** * Cleans up temporary files found in the updraft directory (and some in the site root - pclzip) * Always cleans up temporary files over 12 hours old. * With parameters, also cleans up those. * Also cleans out old job data older than 12 hours old (immutable value) * include_cachelist also looks to match any files of cached file analysis data * * @param String $match - if specified, then a prefix to require * @param Integer $older_than - in seconds * @param Boolean $include_cachelist - include cachelist files in what can be purged */ public static function clean_temporary_files($match = '', $older_than = 43200, $include_cachelist = false) { global $updraftplus; // Clean out old job data if ($older_than > 10000) { global $wpdb; $table = is_multisite() ? $wpdb->sitemeta : $wpdb->options; $key_column = is_multisite() ? 'meta_key' : 'option_name'; $value_column = is_multisite() ? 'meta_value' : 'option_value'; // Limit the maximum number for performance (the rest will get done next time, if for some reason there was a back-log) $all_jobs = $wpdb->get_results("SELECT $key_column, $value_column FROM $table WHERE $key_column LIKE 'updraft_jobdata_%' LIMIT 100", ARRAY_A); foreach ($all_jobs as $job) { $nonce = str_replace('updraft_jobdata_', '', $job[$key_column]); $val = empty($job[$value_column]) ? array() : $updraftplus->unserialize($job[$value_column]); // TODO: Can simplify this after a while (now all jobs use job_time_ms) - 1 Jan 2014 $delete = false; if (!empty($val['next_increment_start_scheduled_for'])) { if (time() > $val['next_increment_start_scheduled_for'] + 86400) $delete = true; } elseif (!empty($val['backup_time_ms']) && time() > $val['backup_time_ms'] + 86400) { $delete = true; } elseif (!empty($val['job_time_ms']) && time() > $val['job_time_ms'] + 86400) { $delete = true; } elseif (!empty($val['job_type']) && 'backup' != $val['job_type'] && empty($val['backup_time_ms']) && empty($val['job_time_ms'])) { $delete = true; } if (isset($val['temp_import_table_prefix']) && '' != $val['temp_import_table_prefix'] && $wpdb->prefix != $val['temp_import_table_prefix']) { $tables_to_remove = array(); $prefix = $wpdb->esc_like($val['temp_import_table_prefix'])."%"; $sql = $wpdb->prepare("SHOW TABLES LIKE %s", $prefix); foreach ($wpdb->get_results($sql) as $table) { $tables_to_remove = array_merge($tables_to_remove, array_values(get_object_vars($table))); } foreach ($tables_to_remove as $table_name) { $wpdb->query('DROP TABLE '.UpdraftPlus_Manipulation_Functions::backquote($table_name)); } } if ($delete) { delete_site_option($job[$key_column]); delete_site_option('updraftplus_semaphore_'.$nonce); } } $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->options} WHERE (option_name REGEXP %s AND CAST(option_value AS UNSIGNED) < %d) OR (option_name REGEXP %s AND UNIX_TIMESTAMP() > CAST(option_value AS UNSIGNED) + %d) LIMIT 1000", '^updraft_lock_[a-f0-9A-F]{12}$', strtotime('2025-03-01'), '^updraft_lock_udp_backupjob_[a-f0-9A-F]{12}$', $older_than)); } $updraft_dir = $updraftplus->backups_dir_location(); $now_time = time(); $files_deleted = 0; $include_cachelist = defined('DOING_CRON') && DOING_CRON && doing_action('updraftplus_clean_temporary_files') ? true : $include_cachelist; if ($handle = opendir($updraft_dir)) { while (false !== ($entry = readdir($handle))) { $manifest_match = preg_match("/updraftplus-manifest\.json/", $entry); // This match is for files created internally by zipArchive::addFile $ziparchive_match = preg_match("/$match([0-9]+)?\.zip\.tmp\.(?:[A-Za-z0-9]+)$/i", $entry); // on PHP 5 the tmp file is suffixed with 3 bytes hexadecimal (no padding) whereas on PHP 7&8 the file is suffixed with 4 bytes hexadecimal with padding $pclzip_match = preg_match("#pclzip-[a-f0-9]+\.(?:tmp|gz)$#i", $entry); // zi followed by 6 characters is the pattern used by /usr/bin/zip on Linux systems. It's safe to check for, as we have nothing else that's going to match that pattern. $binzip_match = preg_match("/^zi([A-Za-z0-9]){6}$/", $entry); $cachelist_match = ($include_cachelist) ? preg_match("/-cachelist-.*(?:info|\.tmp)$/i", $entry) : false; $browserlog_match = preg_match('/^log\.[0-9a-f]+-browser\.txt$/', $entry); $downloader_client_match = preg_match("/$match([0-9]+)?\.zip\.tmp\.(?:[A-Za-z0-9]+)\.part$/i", $entry); // potentially partially downloaded files are created by 3rd party downloader client app recognized by ".part" extension at the end of the backup file name (e.g. .zip.tmp.3b9r8r.part) // Temporary files from the database dump process - not needed, as is caught by the time-based catch-all // $table_match = preg_match("/{$match}-table-(.*)\.table(\.tmp)?\.gz$/i", $entry); // The gz goes in with the txt, because we *don't* want to reap the raw .txt files if ((preg_match("/$match\.(tmp|table|txt\.gz)(\.gz)?$/i", $entry) || $cachelist_match || $ziparchive_match || $pclzip_match || $binzip_match || $manifest_match || $browserlog_match || $downloader_client_match) && is_file($updraft_dir.'/'.$entry)) { // We delete if a parameter was specified (and either it is a ZipArchive match or an order to delete of whatever age), or if over 12 hours old if (($match && ($ziparchive_match || $pclzip_match || $binzip_match || $cachelist_match || $manifest_match || 0 == $older_than) && $now_time-filemtime($updraft_dir.'/'.$entry) >= $older_than) || $now_time-filemtime($updraft_dir.'/'.$entry)>43200) { $skip_dblog = (0 == $files_deleted % 25) ? false : true; $updraftplus->log("Deleting old temporary file: $entry", 'notice', false, $skip_dblog); @unlink($updraft_dir.'/'.$entry);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise if the file doesn't exist. $files_deleted++; } } elseif (preg_match('/^log\.[0-9a-f]+\.txt$/', $entry) && $now_time-filemtime($updraft_dir.'/'.$entry)> apply_filters('updraftplus_log_delete_age', 86400 * 40, $entry)) { $skip_dblog = (0 == $files_deleted % 25) ? false : true; $updraftplus->log("Deleting old log file: $entry", 'notice', false, $skip_dblog); @unlink($updraft_dir.'/'.$entry);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise if the file doesn't exist. $files_deleted++; } } @closedir($handle);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. } // Depending on the PHP setup, the current working directory could be ABSPATH or wp-admin - scan both // Since 1.9.32, we set them to go into $updraft_dir, so now we must check there too. Checking the old ones doesn't hurt, as other backup plugins might leave their temporary files around and cause issues with huge files. foreach (array(ABSPATH, ABSPATH.'wp-admin/', $updraft_dir.'/') as $path) { if ($handle = opendir($path)) { while (false !== ($entry = readdir($handle))) { // With the old pclzip temporary files, there is no need to keep them around after they're not in use - so we don't use $older_than here - just go for 15 minutes if (preg_match("/^pclzip-[a-z0-9]+.tmp$/", $entry) && $now_time-filemtime($path.$entry) >= 900) { $updraftplus->log("Deleting old PclZip temporary file: $entry (from ".basename($path).")"); @unlink($path.$entry);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise if the file doesn't exist. } } @closedir($handle);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. } } } /** * Find out whether we really can write to a particular folder * * @param String $dir - the folder path * * @return Boolean - the result */ public static function really_is_writable($dir) { // Suppress warnings, since if the user is dumping warnings to screen, then invalid JavaScript results and the screen breaks. if (!@is_writable($dir)) return false;// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. // Found a case - GoDaddy server, Windows, PHP 5.2.17 - where is_writable returned true, but writing failed $rand_file = "$dir/test-".md5(rand().time()).".txt"; while (file_exists($rand_file)) { $rand_file = "$dir/test-".md5(rand().time()).".txt"; } $ret = @file_put_contents($rand_file, 'testing...');// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. @unlink($rand_file);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise if the file doesn't exist. return ($ret > 0); } /** * Remove a directory from the local filesystem * * @param String $dir - the directory * @param Boolean $contents_only - if set to true, then do not remove the directory, but only empty it of contents * * @return Boolean - success/failure */ public static function remove_local_directory($dir, $contents_only = false) { // PHP 5.3+ only // foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST) as $path) { // $path->isFile() ? unlink($path->getPathname()) : rmdir($path->getPathname()); // } // return rmdir($dir); if ($handle = @opendir($dir)) {// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. while (false !== ($entry = readdir($handle))) { if ('.' !== $entry && '..' !== $entry) { if (is_dir($dir.'/'.$entry)) { self::remove_local_directory($dir.'/'.$entry, false); } else { @unlink($dir.'/'.$entry);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise if the file doesn't exist. } } } @closedir($handle);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. } return $contents_only ? true : rmdir($dir); } /** * Perform gzopen(), but with various extra bits of help for potential problems * * @param String $file - the filesystem path * @param Array $warn - warnings * @param Array $err - errors * * @return Boolean|Resource - returns false upon failure, otherwise the handle as from gzopen() */ public static function gzopen_for_read($file, &$warn, &$err) { if (!function_exists('gzopen') || !function_exists('gzread')) { $missing = ''; if (!function_exists('gzopen')) $missing .= 'gzopen'; if (!function_exists('gzread')) $missing .= ($missing) ? ', gzread' : 'gzread'; /* translators: %s: List of disabled PHP functions. */ $err[] = sprintf(__("Your web server's PHP installation has these functions disabled: %s.", 'updraftplus'), $missing).' '. sprintf( /* translators: %s: The process that requires the functions. */ __('Your hosting company must enable these functions before %s can work.', 'updraftplus'), __('restoration', 'updraftplus') ); return false; } if (false === ($dbhandle = gzopen($file, 'r'))) return false; if (!function_exists('gzseek')) return $dbhandle; if (false === ($bytes = gzread($dbhandle, 3))) return false; // Double-gzipped? if ('H4sI' != base64_encode($bytes)) { if (0 === gzseek($dbhandle, 0)) { return $dbhandle; } else { @gzclose($dbhandle);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. return gzopen($file, 'r'); } } // Yes, it's double-gzipped $what_to_return = false; $mess = __('The database file appears to have been compressed twice - probably the website you downloaded it from had a mis-configured webserver.', 'updraftplus'); $messkey = 'doublecompress'; $err_msg = ''; if (false === ($fnew = fopen($file.".tmp", 'w')) || !is_resource($fnew)) { @gzclose($dbhandle);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. $err_msg = __('The attempt to undo the double-compression failed.', 'updraftplus'); } else { @fwrite($fnew, $bytes);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. $emptimes = 0; while (!gzeof($dbhandle)) { $bytes = @gzread($dbhandle, 262144);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. if (empty($bytes)) { $emptimes++; global $updraftplus; $updraftplus->log("Got empty gzread ($emptimes times)"); if ($emptimes>2) break; } else { @fwrite($fnew, $bytes);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. } } gzclose($dbhandle); fclose($fnew); // On some systems (all Windows?) you can't rename a gz file whilst it's gzopened if (!rename($file.".tmp", $file)) { $err_msg = __('The attempt to undo the double-compression failed.', 'updraftplus'); } else { $mess .= ' '.__('The attempt to undo the double-compression succeeded.', 'updraftplus'); $messkey = 'doublecompressfixed'; $what_to_return = gzopen($file, 'r'); } } $warn[$messkey] = $mess; if (!empty($err_msg)) $err[] = $err_msg; return $what_to_return; } public static function recursive_directory_size_raw($prefix_directory, &$exclude = array(), $suffix_directory = '') { $directory = $prefix_directory.('' == $suffix_directory ? '' : '/'.$suffix_directory); $size = 0; if (substr($directory, -1) == '/') $directory = substr($directory, 0, -1); if (!file_exists($directory) || !is_dir($directory) || !is_readable($directory)) return -1; if (file_exists($directory.'/.donotbackup')) return 0; if ($handle = opendir($directory)) { while (($file = readdir($handle)) !== false) { if ('.' != $file && '..' != $file) { $spath = ('' == $suffix_directory) ? $file : $suffix_directory.'/'.$file; if (false !== ($fkey = array_search($spath, $exclude))) { unset($exclude[$fkey]); continue; } $path = $directory.'/'.$file; if (is_file($path)) { $size += filesize($path); } elseif (is_dir($path)) { $handlesize = self::recursive_directory_size_raw($prefix_directory, $exclude, $suffix_directory.('' == $suffix_directory ? '' : '/').$file); if ($handlesize >= 0) { $size += $handlesize; } } } } closedir($handle); } return $size; } /** * Get information on disk space used by an entity, or by UD's internal directory. Returns as a human-readable string. * * @param String $entity - the entity (e.g. 'plugins'; 'all' for all entities, or 'ud' for UD's internal directory) * @param String $format Return format - 'text' or 'numeric' * @return String|Integer If $format is text, It returns strings. Otherwise integer value. */ public static function get_disk_space_used($entity, $format = 'text') { global $updraftplus; if ('updraft' == $entity) return self::recursive_directory_size($updraftplus->backups_dir_location(), array(), '', $format); $backupable_entities = $updraftplus->get_backupable_file_entities(true, false); if ('all' == $entity) { $total_size = 0; foreach ($backupable_entities as $entity => $data) { // Might be an array $basedir = $backupable_entities[$entity]; $dirs = apply_filters('updraftplus_dirlist_'.$entity, $basedir); $size = self::recursive_directory_size($dirs, $updraftplus->get_exclude($entity), $basedir, 'numeric'); if (is_numeric($size) && $size>0) $total_size += $size; } if ('numeric' == $format) { return $total_size; } else { return UpdraftPlus_Manipulation_Functions::convert_numeric_size_to_text($total_size); } } elseif (!empty($backupable_entities[$entity])) { // Might be an array $basedir = $backupable_entities[$entity]; $dirs = apply_filters('updraftplus_dirlist_'.$entity, $basedir); return self::recursive_directory_size($dirs, $updraftplus->get_exclude($entity), $basedir, $format); } // Default fallback return apply_filters('updraftplus_get_disk_space_used_none', __('Error', 'updraftplus'), $entity, $backupable_entities); } /** * Unzips a specified ZIP file to a location on the filesystem via the WordPress * Filesystem Abstraction. Forked from WordPress core in version 5.1-alpha-44182, * to allow us to provide feedback on progress. * * Assumes that WP_Filesystem() has already been called and set up. Does not extract * a root-level __MACOSX directory, if present. * * Attempts to increase the PHP memory limit before uncompressing. However, * the most memory required shouldn't be much larger than the archive itself. * * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. * * @param String $file - Full path and filename of ZIP archive. * @param String $to - Full path on the filesystem to extract archive to. * @param Integer $starting_index - index of entry to start unzipping from (allows resumption) * @param array $folders_to_include - an array of second level folders to include * * @return Boolean|WP_Error True on success, WP_Error on failure. */ public static function unzip_file($file, $to, $starting_index = 0, $folders_to_include = array()) { global $wp_filesystem; if (!$wp_filesystem || !is_object($wp_filesystem)) { return new WP_Error('fs_unavailable', __('Could not access filesystem.'));// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. } // Unzip can use a lot of memory, but not this much hopefully. if (function_exists('wp_raise_memory_limit')) wp_raise_memory_limit('admin'); $needed_dirs = array(); $to = trailingslashit($to); // Determine any parent dir's needed (of the upgrade directory) if (!$wp_filesystem->is_dir($to)) { // Only do parents if no children exist $path = preg_split('![/\\\]!', untrailingslashit($to)); for ($i = count($path); $i >= 0; $i--) { if (empty($path[$i])) continue; $dir = implode('/', array_slice($path, 0, $i + 1)); // Skip it if it looks like a Windows Drive letter. if (preg_match('!^[a-z]:$!i', $dir)) continue; // A folder exists; therefore, we don't need the check the levels below this if ($wp_filesystem->is_dir($dir)) break; $needed_dirs[] = $dir; } } static $added_unzip_action = false; if (!$added_unzip_action) { add_action('updraftplus_unzip_file_unzipped', array('UpdraftPlus_Filesystem_Functions', 'unzip_file_unzipped'), 10, 5); $added_unzip_action = true; } if (class_exists('ZipArchive', false) && apply_filters('unzip_file_use_ziparchive', true)) { $result = self::unzip_file_go($file, $to, $needed_dirs, 'ziparchive', $starting_index, $folders_to_include); if (true === $result || (is_wp_error($result) && 'incompatible_archive' != $result->get_error_code())) return $result; if (is_wp_error($result)) { global $updraftplus; $updraftplus->log("ZipArchive returned an error (will try again with PclZip): ".$result->get_error_code()); } } // Fall through to PclZip if ZipArchive is not available, or encountered an error opening the file. // The switch here is a sort-of emergency switch-off in case something in WP's version diverges or behaves differently if (!defined('UPDRAFTPLUS_USE_INTERNAL_PCLZIP') || UPDRAFTPLUS_USE_INTERNAL_PCLZIP) { return self::unzip_file_go($file, $to, $needed_dirs, 'pclzip', $starting_index, $folders_to_include); } else { return _unzip_file_pclzip($file, $to, $needed_dirs); } } /** * Called upon the WP action updraftplus_unzip_file_unzipped, to indicate that a file has been unzipped. * * @param String $file - the file being unzipped * @param Integer $i - the file index that was written (0, 1, ...) * @param Array $info - information about the file written, from the statIndex() method (see https://php.net/manual/en/ziparchive.statindex.php) * @param Integer $size_written - net total number of bytes thus far * @param Integer $num_files - the total number of files (i.e. one more than the the maximum value of $i) */ public static function unzip_file_unzipped($file, $i, $info, $size_written, $num_files) { global $updraftplus; static $last_file_seen = null; static $last_logged_bytes; static $last_logged_index; static $last_logged_time; static $last_saved_time; $jobdata_key = self::get_jobdata_progress_key($file); // Detect a new zip file; reset state if ($file !== $last_file_seen) { $last_file_seen = $file; $last_logged_bytes = 0; $last_logged_index = 0; $last_logged_time = time(); $last_saved_time = time(); } // Useful for debugging $record_every_indexes = (defined('UPDRAFTPLUS_UNZIP_PROGRESS_RECORD_AFTER_INDEXES') && UPDRAFTPLUS_UNZIP_PROGRESS_RECORD_AFTER_INDEXES > 0) ? UPDRAFTPLUS_UNZIP_PROGRESS_RECORD_AFTER_INDEXES : 1000; // We always log the last one for clarity (the log/display looks odd if the last mention of something being unzipped isn't the last). Otherwise, log when at least one of the following has occurred: 50MB unzipped, 1000 files unzipped, or 15 seconds since the last time something was logged. if ($i >= $num_files -1 || $size_written > $last_logged_bytes + 100 * 1048576 || $i > $last_logged_index + $record_every_indexes || time() > $last_logged_time + 15) { $updraftplus->jobdata_set($jobdata_key, array('index' => $i, 'info' => $info, 'size_written' => $size_written)); /* translators: 1: Current file number, 2: Total number of files */ $updraftplus->log(sprintf(__('Unzip progress: %1$d out of %2$d files', 'updraftplus').' (%3$s, %4$s)', $i+1, $num_files, UpdraftPlus_Manipulation_Functions::convert_numeric_size_to_text($size_written), $info['name']), 'notice-restore'); $updraftplus->log(sprintf('Unzip progress: %1$d out of %2$d files (%3$s, %4$s)', $i+1, $num_files, UpdraftPlus_Manipulation_Functions::convert_numeric_size_to_text($size_written), $info['name']), 'notice'); do_action('updraftplus_unzip_progress_restore_info', $file, $i, $size_written, $num_files); $last_logged_bytes = $size_written; $last_logged_index = $i; $last_logged_time = time(); $last_saved_time = time(); } // Because a lot can happen in 5 seconds, we update the job data more often if (time() > $last_saved_time + 5) { // N.B. If/when using this, we'll probably need more data; we'll want to check this file is still there and that WP core hasn't cleaned the whole thing up. $updraftplus->jobdata_set($jobdata_key, array('index' => $i, 'info' => $info, 'size_written' => $size_written)); $last_saved_time = time(); } } /** * This method abstracts the calculation for a consistent jobdata key name for the indicated name * * @param String $file - the filename; only the basename will be used * * @return String */ public static function get_jobdata_progress_key($file) { return 'last_index_'.md5(basename($file)); } /** * Compatibility function (exists in WP 4.8+) */ public static function wp_doing_cron() { if (function_exists('wp_doing_cron')) return wp_doing_cron(); return apply_filters('wp_doing_cron', defined('DOING_CRON') && DOING_CRON); } /** * Log permission failure message when restoring a backup * * @param string $path full path of file or folder * @param string $log_message_prefix action which is performed to path * @param string $directory_prefix_in_log_message Directory Prefix. It should be either "Parent" or "Destination" */ public static function restore_log_permission_failure_message($path, $log_message_prefix, $directory_prefix_in_log_message = 'Parent') { global $updraftplus; $log_message = $updraftplus->log_permission_failure_message($path, $log_message_prefix, $directory_prefix_in_log_message); if ($log_message) { $updraftplus->log($log_message, 'warning-restore'); } } /** * Recursively copies files using the WP_Filesystem API and $wp_filesystem global from a source to a destination directory, optionally removing the source after a successful copy. * * @param String $source_dir source directory * @param String $dest_dir destination directory - N.B. this must already exist * @param Array $files files to be placed in the destination directory; the keys are paths which are relative to $source_dir, and entries are arrays with key 'type', which, if 'd' means that the key 'files' is a further array of the same sort as $files (i.e. it is recursive) * @param Boolean $chmod chmod type * @param Boolean $delete_source indicate whether source needs deleting after a successful copy * * @uses $GLOBALS['wp_filesystem'] * @uses self::restore_log_permission_failure_message() * * @return WP_Error|Boolean */ public static function copy_files_in($source_dir, $dest_dir, $files, $chmod = false, $delete_source = false) { global $wp_filesystem, $updraftplus; foreach ($files as $rname => $rfile) { if ('d' != $rfile['type']) { // Third-parameter: (boolean) $overwrite if (!$wp_filesystem->move($source_dir.'/'.$rname, $dest_dir.'/'.$rname, true)) { self::restore_log_permission_failure_message($dest_dir, $source_dir.'/'.$rname.' -> '.$dest_dir.'/'.$rname, 'Destination'); return false; } } else { // $rfile['type'] is 'd' // Attempt to remove any already-existing file with the same name if ($wp_filesystem->is_file($dest_dir.'/'.$rname)) @$wp_filesystem->delete($dest_dir.'/'.$rname, false, 'f');// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- if fails, carry on // No such directory yet: just move it if ($wp_filesystem->exists($dest_dir.'/'.$rname) && !$wp_filesystem->is_dir($dest_dir.'/'.$rname) && !$wp_filesystem->move($source_dir.'/'.$rname, $dest_dir.'/'.$rname, false)) { self::restore_log_permission_failure_message($dest_dir, 'Move '.$source_dir.'/'.$rname.' -> '.$dest_dir.'/'.$rname, 'Destination'); $updraftplus->log_e('Failed to move directory (check your file permissions and disk quota): %s', $source_dir.'/'.$rname." -> ".$dest_dir.'/'.$rname); return false; } elseif (!empty($rfile['files'])) { if (!$wp_filesystem->exists($dest_dir.'/'.$rname)) $wp_filesystem->mkdir($dest_dir.'/'.$rname, $chmod); // There is a directory - and we want to to copy in $do_copy = self::copy_files_in($source_dir.'/'.$rname, $dest_dir.'/'.$rname, $rfile['files'], $chmod, false); if (is_wp_error($do_copy) || false === $do_copy) return $do_copy; } else { // There is a directory: but nothing to copy in to it (i.e. $file['files'] is empty). Just remove the directory. @$wp_filesystem->rmdir($source_dir.'/'.$rname);// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the method. } } } // We are meant to leave the working directory empty. Hence, need to rmdir() once a directory is empty. But not the root of it all in case of others/wpcore. if ($delete_source || false !== strpos($source_dir, '/')) { if (!$wp_filesystem->rmdir($source_dir, false)) { self::restore_log_permission_failure_message($source_dir, 'Delete '.$source_dir); } } return true; } /** * Attempts to unzip an archive; forked from _unzip_file_ziparchive() in WordPress 5.1-alpha-44182, and modified to use the UD zip classes. * * Assumes that WP_Filesystem() has already been called and set up. * * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass. * * @param String $file - full path and filename of ZIP archive. * @param String $to - full path on the filesystem to extract archive to. * @param Array $needed_dirs - a partial list of required folders needed to be created. * @param String $method - either 'ziparchive' or 'pclzip'. * @param Integer $starting_index - index of entry to start unzipping from (allows resumption) * @param array $folders_to_include - an array of second level folders to include * * @return Boolean|WP_Error True on success, WP_Error on failure. */ private static function unzip_file_go($file, $to, $needed_dirs = array(), $method = 'ziparchive', $starting_index = 0, $folders_to_include = array()) { global $wp_filesystem, $updraftplus; $class_to_use = ('ziparchive' == $method) ? 'UpdraftPlus_ZipArchive' : 'UpdraftPlus_PclZip'; if (!class_exists($class_to_use)) updraft_try_include_file('includes/class-zip.php', 'require_once'); $updraftplus->log('Unzipping '.basename($file).' to '.$to.' using '.$class_to_use.', starting index '.$starting_index); $z = new $class_to_use; $flags = (version_compare(PHP_VERSION, '5.2.12', '>') && defined('ZIPARCHIVE::CHECKCONS')) ? ZIPARCHIVE::CHECKCONS : 4; // This is just for crazy people with mbstring.func_overload enabled (deprecated from PHP 7.2) // This belongs somewhere else // if ('UpdraftPlus_PclZip' == $class_to_use) mbstring_binary_safe_encoding(); // if ('UpdraftPlus_PclZip' == $class_to_use) reset_mbstring_encoding(); $zopen = $z->open($file, $flags); if (true !== $zopen) { return new WP_Error('incompatible_archive', __('Incompatible Archive.'), array($method.'_error' => $z->last_error));// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. } $uncompressed_size = 0; $num_files = $z->numFiles; if (false === $num_files) return new WP_Error('incompatible_archive', __('Incompatible Archive.'), array($method.'_error' => $z->last_error));// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. for ($i = $starting_index; $i < $num_files; $i++) { if (!$info = $z->statIndex($i)) { return new WP_Error('stat_failed_'.$method, __('Could not retrieve file from archive.').' ('.$z->last_error.')');// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. } // Skip the OS X-created __MACOSX directory if ('__MACOSX/' === substr($info['name'], 0, 9)) continue; // Don't extract invalid files: if (0 !== validate_file($info['name'])) continue; if (!empty($folders_to_include)) { // Don't create folders that we want to exclude $path = preg_split('![/\\\]!', untrailingslashit($info['name'])); if (isset($path[1]) && !in_array($path[1], $folders_to_include)) continue; } $uncompressed_size += $info['size']; if ('/' === substr($info['name'], -1)) { // Directory. $needed_dirs[] = $to . untrailingslashit($info['name']); } elseif ('.' !== ($dirname = dirname($info['name']))) { // Path to a file. $needed_dirs[] = $to . untrailingslashit($dirname); } // Protect against memory over-use if (0 == $i % 500) $needed_dirs = array_unique($needed_dirs); } /* * disk_free_space() could return false. Assume that any falsey value is an error. * A disk that has zero free bytes has bigger problems. * Require we have enough space to unzip the file and copy its contents, with a 10% buffer. */ if (self::wp_doing_cron()) { $available_space = function_exists('disk_free_space') ? @disk_free_space(WP_CONTENT_DIR) : false;// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Call is speculative if ($available_space && ($uncompressed_size * 2.1) > $available_space) { return new WP_Error('disk_full_unzip_file', __('Could not copy files.').' '.__('You may have run out of disk space.'), compact('uncompressed_size', 'available_space'));// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. } } $needed_dirs = array_unique($needed_dirs); foreach ($needed_dirs as $dir) { // Check the parent folders of the folders all exist within the creation array. if (untrailingslashit($to) == $dir) { // Skip over the working directory, We know this exists (or will exist) continue; } // If the directory is not within the working directory then skip it if (false === strpos($dir, $to)) continue; $parent_folder = dirname($dir); while (!empty($parent_folder) && untrailingslashit($to) != $parent_folder && !in_array($parent_folder, $needed_dirs)) { $needed_dirs[] = $parent_folder; $parent_folder = dirname($parent_folder); } } asort($needed_dirs); // Create those directories if need be: foreach ($needed_dirs as $_dir) { // Only check to see if the Dir exists upon creation failure. Less I/O this way. if (!$wp_filesystem->mkdir($_dir, FS_CHMOD_DIR) && !$wp_filesystem->is_dir($_dir)) { return new WP_Error('mkdir_failed_'.$method, __('Could not create directory.'), substr($_dir, strlen($to)));// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. } } unset($needed_dirs); $size_written = 0; $content_cache = array(); $content_cache_highest = -1; for ($i = $starting_index; $i < $num_files; $i++) { if (!$info = $z->statIndex($i)) { return new WP_Error('stat_failed_'.$method, __('Could not retrieve file from archive.'));// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. } // directory if ('/' == substr($info['name'], -1)) continue; // Don't extract the OS X-created __MACOSX if ('__MACOSX/' === substr($info['name'], 0, 9)) continue; // Don't extract invalid files: if (0 !== validate_file($info['name'])) continue; if (!empty($folders_to_include)) { // Don't extract folders that we want to exclude $path = preg_split('![/\\\]!', untrailingslashit($info['name'])); if (isset($path[1]) && !in_array($path[1], $folders_to_include)) continue; } // N.B. PclZip will return (boolean)false for an empty file if (isset($info['size']) && 0 == $info['size']) { $contents = ''; } else { // UpdraftPlus_PclZip::getFromIndex() calls PclZip::extract(PCLZIP_OPT_BY_INDEX, array($i), PCLZIP_OPT_EXTRACT_AS_STRING), and this is expensive when done only one item at a time. We try to cache in chunks for good performance as well as being able to resume. if ($i > $content_cache_highest && 'UpdraftPlus_PclZip' == $class_to_use) { $memory_usage = memory_get_usage(false); $total_memory = $updraftplus->memory_check_current(); if ($memory_usage > 0 && $total_memory > 0) { $memory_free = $total_memory*1048576 - $memory_usage; } else { // A sane default. Anything is ultimately better than WP's default of just unzipping everything into memory. $memory_free = 50*1048576; } $use_memory = max(10485760, $memory_free - 10485760); $total_byte_count = 0; $content_cache = array(); $cache_indexes = array(); $cache_index = $i; while ($cache_index < $num_files && $total_byte_count < $use_memory) { if (false !== ($cinfo = $z->statIndex($cache_index)) && isset($cinfo['size']) && '/' != substr($cinfo['name'], -1) && '__MACOSX/' !== substr($cinfo['name'], 0, 9) && 0 === validate_file($cinfo['name'])) { $total_byte_count += $cinfo['size']; if ($total_byte_count < $use_memory) { $cache_indexes[] = $cache_index; $content_cache_highest = $cache_index; } } $cache_index++; } if (!empty($cache_indexes)) { $content_cache = $z->updraftplus_getFromIndexBulk($cache_indexes); } } $contents = isset($content_cache[$i]) ? $content_cache[$i] : $z->getFromIndex($i); } if (false === $contents && ('pclzip' !== $method || 0 !== $info['size'])) { return new WP_Error('extract_failed_'.$method, __('Could not extract file from archive.').' '.$z->last_error, json_encode($info));// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. } if (!$wp_filesystem->put_contents($to . $info['name'], $contents, FS_CHMOD_FILE)) { return new WP_Error('copy_failed_'.$method, __('Could not copy file.'), $info['name']);// phpcs:ignore WordPress.WP.I18n.MissingArgDomain -- The string exists within the WordPress core. } if (!empty($info['size'])) $size_written += $info['size']; do_action('updraftplus_unzip_file_unzipped', $file, $i, $info, $size_written, $num_files); } $z->close(); return true; } } David Richards, Author at Smart Office - Page 30 of 91

    Smart Office

    New IDC PC Stats Ominous

    IDC has released the preliminary results for the combined Australian Desktop and Notebook market for the first quarter 2006. The results show the Australia PC market decreasing by one percent sequentially and increasing by four percent from the same period in 2005.

    The first quarter of 2006 is an ominous sign for things to come in the next 12 to 18 months. Not only did the market fall below IDC’s already conservative forecast, but vendors and channel partners are feeling the pinch as prices continue to plummet. To add to the situation, the post Y2K refresh wave is completely and utterly finished, leaving a much smaller base of run rate commercial business outside large tenders.

    The first quarter of the year performed very close to IDC’s forecast although the consumer notebook market continued to surprise. While Harvey Norman continues to maintain its hold, the retail market is expanding rapidly on both the low and high ends. The franchise based system within Harvey Norman, keeps product lines separate while markets are converging. This is opening up opportunities for the likes of Retravision, Bing Lee, Myer, David Jones, and OfficeWorks.

    Michael Sager, Research Manager, Hardware, stated that, “The rise in interest rates combined with rising global oil prices will indeed have an impact on consumer spending, particularly from the famed ‘mortgage belt’. The recent tax scheme proposed by Peter Costello will dampen this impact to a degree, holding up consumer spending. This is a very important factor for the PC market as consumer spending will be the main segment that sustains any positive growth in the next year to two years.”

    While the forecast for the near future is one of slowing growth, there are product advancements squarely aimed at the burgeoning consumer market. Technologies such as Viiv (Intel digital media content), Vista (Microsoft operating system), and widescreen notebooks will all play a role in increasing the prevalence of PCs in the home. Coupled with the rise in broadband, and conversion of dial up customers this helps create a large pipe for consumer sales.

    Michael Sager, Research Manager, Hardware, noted that, “HP (Hewlett Packard) came back with a solid showing in both the commercial and consumer markets. After losing market share during the last quarter of 2006 it has now pulled ahead of second place Dell. As mentioned Dell lost ground, remaining in a solid second position as the competition grows in the indirect market. Acer had a strong quarter yet again in government and education sectors, gaining ground in third position. Toshiba had phenomenal quarter as the notebook only vendor garnered eight percent of the overall market as it made gains across the board, in particular retail.”

    “Taking fifth place was Lenovo, who is slowly growing its product range. The market anxiously awaits its entry into the consumer market. In a quarter of fundamental change to Intel CPUs, Apple saw a slight drop in market share. Finally in seventh position was a resurgent Optima who remains one of the few bright spots of the local vendors,” stated Mr. Sager.

    Prelim Australia Top Seven Total PC Vendor Market Share Overall Share:

    HP 18.6% Dell 15.3% Acer 12.3% Toshiba 7.8% Lenovo 6.0% Apple 3.2% Optima 2.3% Others 34.5% Total 100.0%

    Thousands Of Motorists Set To Be Nicked By New Technology

    Thousands of Australian motorists are set to be nicked by a new generation of speed cameras that operate over 5 lanes of traffic at once, are capable of identifying stolen cars as well as vehicles owned by disqualified drivers. It is also known that some Governments are also evaluating point to point traffic systems.

    A new generation of speed camera’s that work across multiple lanes at once and have the capacity to capture images at 1200 x 1600 resolution even in poor conditions are being sought by various Australian Governments in an effort to raise additional revenue, a Dutch executive of the company that makes the cameras has admitted.

    It has also been revealed that a proposal is being floated in Australia to install point to point traffic systems on freeways and major roads. How this works is that at key locations, point-to-point measurement cameras are placed at different locations alongside the freeway. These cameras make photographs of each passing vehicle. A computer calculates the average speed that the vehicle has driven between the two points of measurement. The offenders automatically receive a speeding ticket in the post.

     

    The news of tougher traffic management comes only days after the NSW Government admitted that over 10,000 motorists had been nicked driving through the new Lane Cove Tunnel in six weeks. The new cameras snap thousands of high-quality images and can monitor speeds in multiple lanes at once. They are also fitted with automatic number-plate recognition gear which alerts cops when a wanted car passes. They are also able to identify cars that are owned by drivers that have been disqualified.

    Cameras from the same Dutch company Gatsometer are also are set to be installed on every road in the UK.  The company claims that the Gatso MCS multi-camera system is highly flexible and may be either gantry-mounted or installed at the roadside. It uses a combination of digital cameras to capture violations over up to five lanes of traffic, with digital colour images and optional video event recording if required. The Gatso MCS can capture front, rear or front-and-rear image sets of infringing vehicles. 

    Another system from the same company, the Gatso DRCS has been developed exclusively for traffic use, in fixed, mobile or portable applications. It uses Gatso’s Radar 24, a unique slotted wave antenna on a 24 GHz frequency, approved worldwide for enforcement applications. The system monitors both approaching and receding vehicles and also easily distinguishes between cars and trucks.

     

     

     

    The ACT Government is already using Gastometer camera’s following a multimillion dollar deal last year.

    Stephen Gateley, Managing Director of Aspect Traffic, comments, “Canberra is a strategic win for Aspect Traffic, in keeping with our goal for Gatsometer to become the number one supplier of speed and red light enforcement systems in Australia.” He added, “We believe that Gatsometer’s policy of offering a full range of fixed and mobile enforcement systems, coupled with Aspect Traffic’s experience in installation and systems integration, gave us the edge in this contract. We were able to meet and exceed all the enforcement needs of the ACT Government.”

    A Dutch offical of the Company told SHN that several Australian governments were “Impressed” with the Companies new technology as it allowed a “Big increase” in revenue raising by various State Governments.

    In Holland road users have received 2,3 million fines because they drove too fast on stretches of highway where there is point-to-point measurement.

    The Dutch Police and the Ministry of Justice introduced permanent speed enforcement on several places recently. They claim that “On highways without the point-to-point monitoring, ten to 15 percent of the drivers don’t keep to the maximum speed limit, whereas on highways with point-to-point measurement, this percentage is only 2,5 percent”, explains a spokesman of the bureau of traffic enforcement. “In the beginning many drivers will get fines, but as soon as people are used to it, these percentages will decrease.”


     

    Netgear Aquisition Lifts Share Value After Disasterous OZ Press Event

    Netgear has finally seen a small lift in their share value after their disastrous PR event in Australia that saw their share slump more than 15% after the Companies CEO Patrick Lo, criticised Apple and their sick CEO Steve Jobs.

    On Friday the Networking Company, said that they are looking to cut deals with telecommunication Companies after agreeing to buy the customer networking solutions division of Westell Technologies Inc. for $33.5 million.

    The business sells high-speed internet networking products to phone Companies like Telstra, Optus and Vodafone.

    Netgear shares climbed to $31.19 in Saturday morning trading after the acquisition announcement.

    When Lo, held his disastrous PR event in Australia which was organised by International PR Company Weber Shandwick, Netgear shares were trading at $38.49.

    The acquisition delivers to Netgear a product that allows voice, data, video and other services to stream over existing copper and fibre optic telephone lines.

    Netgear anticipates integration of the business to take about three months following the closing.

    New Qantas Aircraft Will Make A Big Difference

    Qantas is set to get a fleet of new Boeing aircraft which have been described as the best in the world today. Packed with the latest in aero technology the new Boeing aircraft is made of new composite materials, has an air conditioning system that eliminates jet lag and allows flyers to communicate over a fast broadband network while in the air.

    24% Fuel Savings In New BMW

    New automotive technology is being used by BMW to cut fuel costs in a new BMW’s 1-Series hatchback range which wil include a sporty three-door model later this year. Also included is an iPod docking station.

    Revisions to the line-up bring this new model, plus mechanical and design changes to the continuing five-door, with sales starting in March in Europe. Not only are the new models faster and more economical, they will also be cheaper to run.The 1-Series is receiving some of BMW’s latest fuel-saving technologies; fuel consumption has been reduced by up to 24% in some models, and emissions reduced by up to 21%. Most petrol engines now feature BMW’s Bi-Vanos variable camshaft adjustment, allowing for ultra-precise control of valve opening and closing, and direct fuel injection.

    The key feature is Automatic Stop-Start, in all models except the 130i; this turns the engine off when idling in neutral gear, and restarts it again when the clutch is engaged. The system can be manually switched off. Brake Energy Regeneration, as recently added to the 5-Series, captures the energy otherwise lost under deceleration and braking, and stores it in a battery; this is then used to power the alternator, reducing demand on the engine and cutting fuel consumption by 3%.

     Electric power steering replaces the mechanical hydraulic system, and is said to be 90% more energy-efficient, and further tweaks include improved aerodynamics for the flaps behind the grille, which close up when the engine requires less airflow, the disconnection of the air conditioning power supply from the drivetrain when the air conditioning is not switched on, and lower rolling-resistance tyres. And just to help the driver achieve even better economy, some models have an indicator on the display screen to suggest the optimum gear for fuel-saving.

    The engines now on offer are as follows:

    116i (five-door only): With Bi-Vanos variable camshaft adjustment, this now produces 116bhp and 111lb ft. Top speed is 124mph, 0-60mph comes up in 10.9 seconds, and it returns 37.7mpg and 179g/km.
    118i: Features Bi-Vanos and direct injection; 143bhp and 140 lb ft, 130mph, 0-60mph in 8.7 seconds (three-door) or 8.8 seconds (five-door), 47.9mpg and 140g/km.
    120i: Bi-Vanos and direct injection; 170bhp and 155lb ft; 139mph, 0-60mph in 7.7 seconds (7.8 seconds for the five-door), 44.1mpg and 152g/km.
    130i: Bi-Vanos and Valvetronic variable-valve timing; 265bhp and 232lb ft; 155mph, 0-60mph in 6 seconds (6.1 seconds for the five-door), 34mpg and 197g/km.
    118d: Now BMW’s lowest-emissions vehicle on offer (apart from the Hydrogen 7 and Mini-brand models), and its most economical. Now giving 143bhp, 221lb ft, 130mph, 0-60mph in 8.9 seconds (9 seconds for the five-door), 60.1mpg and 123g/km.
    120d: Now producing 177bhp, 258lb ft, 142mph, 0-60mph in 7.5 seconds (7.6 seconds five-door), 57.6mpg and 129g/km.

    Minor styling changes have been made to the five-door, which receives a larger front grille, a larger, lower front spoiler with bigger air intake, darkened headlamp lenses, and a restyled rear bumper and taillights. The three-door has the new-look front end too, though a slightly different side profile due to its longer front doors with frameless windows.

    The cabin receives “higher quality materials” and minimal changes to layout. Three-door models come in four- or five-seat configurations, with the choice of two well-bolstered rear seats and a central storage compartment or a flatter three-person bench, as in the five-door model. Standard equipment now includes dynamic stability control and traction control, six airbags, run-flat tyres and tyre pressure monitoring; the 130i has hill start assist, sports-tuned DSC, brake pre-tensioning and brake drying, brake fade compensation and soft-stop braking. New options to the range include MP3-, iPod- and USB-compatible audio systems, and improved adaptive headlights.

    Neat New Palm Treo Smart Phone

    Palm has scored a massive goal with their new Treo 750 being chosen as one of the new 3G smart phones to be offered on Telstra’s Next G network.

    www.palm.com.au

    In all this is well worth considering  if you are in the market for a smart phone. It is not bulky and appears to have good battery life. It has excellent messaging and phone capability as well as access to such neat services as the Telstra “Where Is” service.

    Palm has scored a massive goal with their new Treo 750 being chosen as one of the new 3G smart phones to be offered on Telstra’s Next G network. Insiders say that Telstra boss Sol Trujillo played a key role in having the Windows based OS smart phone chosen. He apparently uses one.
    An exclusive review of the new Treo 750 by SmartHouse reveals that the HSDPA phone is no slouch despite it being launched with the old Windows Mobile 5.0 operating system instead of the new 6.0 version of the software.
    The inclusion of the Palm Treo 750 in the Telstra line up is a big boost for Palm who over the years has struggled to compete. This model could well make up for past problems while eating into Blackberry market share.
    The Treo 750 combines E-Mail, messaging, web browsing and organisation software all in a compact design. Among the software on the Treo 750 smart phone will be Telstra’s My place software that allows instant access to services like Foxtel, Yellow Pages, White Pages and Telstra Business. One real neat service is the Telstra mapping service that allows you to identify where you are and enter an address one is trying to get to.The device is also compatible with 3G UMTS/HSDPA networks.


    Because the device is loaded with Windows Mobile 5.0 Pocket users have access to Outlook applications as well as the ability to view and edit Microsoft Word and Excel files and view PowerPoint and PDF files. The touch screen makes surfing websites, gathering data and navigating forms and applications much easier. With more than 80% of desktops running Windows I believe that it is smart to invest in a device that is a logical extension of what one has on a desktop or notebook. Connectivity to emails and messaging is easier and there is no need for application programming similar to what one has to do on a Blackberry.
    My biggest beef with this phone is that there is not one single button that screams phone.
      The Messaging and Security Feature Pack (MSFP) is available out of the box with the Treo 750 and includes Direct Push Technology, which gives users connected to a Microsoft Exchange Server fast, automatic wireless updates of their E-Mail, calendar items, contacts and tasks. It provides added security features for IT administrators, such as over-the-air password policy enforcement and remote wipe for lost or stolen devices. MSFP also gives users over-the-air lookup of a company’s Global Address List (GAL), providing employees with quick access to colleagues’ E-Mail and contact information. The Treo 750 offers mobile professionals other corporate E-Mail options, including streamlined access to Microsoft Exchange.
    Unique to the Treo smart phone on Windows Mobile 5.0 is a suite of software enhancements developed by Palm that underscores its brand promise of fast access, ease of use and simplicity.

    Examples include the following:
    Threaded chat view for text and MMS messages. Today Screen enhancements, which feature the ability to “dial by name” with a few keystrokes on the keyboard, perform a web search directly from the Today Screen and perform one-touch dialling with personalised photo speed dials.
    Ability to manage a call directly from the Today Screen and stay on top of voicE-Mail with on-screen, VCR-like icons, such as rewind, delete and fast-forward controls for easy navigation
    Capability to ignore a call and quickly send a text message such as “In a meeting” or “Can’t talk right now” by selecting the “Ignore with text” option from the incoming call screen.

     

    Mercedes Tries Again To Take On BMW

    Mercedes, who struggle in the bottom end of the luxury car market up against the BMW 3 series is again trying to steal BMW’s thunder with a new Mercedes C-Class.

    To make sure it succeeds, Mercedes has turned its vehicle development process inside out to eliminate potential faults at the design stage and has driven 200 prototypes an unprecedented 20 million kilometers to iron out any further bugs.  And, in what it sees as an important one-up on competitors such as BMW and Audi, Mercedes has hit upon the idea of producing two different incarnations of the same car in order to attract not just its traditional older buyers but a younger, sportier clientele too.  The model is expected in Australia later this year.
    New Mercedes C Class

    For Mercedes is also relying on the new C-Class to restore the tarnished image of the whole Stuttgart brand. As the company’s biggest-selling line the C-Class stands the best chance of hauling Mercedes back ahead of upstart BMW to restore what it feels is its rightful status as the world’s leading premium car manufacturer. And as a company that has been wounded by plummeting customer satisfaction ratings – largely due to electronics-related breakdowns – Mercedes is currently in the process of restoring its battered reputation by successfully launching major new models (the S- and E-Classes) that are seen to be totally glitch-free. Only then will the company’s traditional halo shine again.

    Regus IP Phone Systems Crashes Six Days To Repair

    Regus, the global serviced office Company who brag about their IT capabilities, including IP phone and video conferencing services have left customers in Sydney without inbound phone services for nearly a week with management blaming server issues for the problem.

    At their North Sydney location which provides services to several IT integrators, marketing, recruitment Companies, distributors and media Companies the IP phone service has been down since last Thursday, with several businesses left without the ability to have phones answered in their Company name.

    While calls can be made out Regus reception staff have been unable to transfer falls to any clients, with customers told that messages have to be passed manually to employees. They are also offering to route calls to mobile phones.

    Earlier today that service also appears to have been withdrawn, with reception staff telling customers that “due to only one person being available to answer calls that there was “no one” to run messages.

    A memo syndicated to clients and seen by 4Square Media says that “due to last minute changes to our system will not take place until Thursday”.

    On Monday they were telling customers that the problem would be fixed on Tuesday.

    A spokesperson for Regus Craig Marquart blamed the problem on their service provider SideTrack who he said had “botched” an upgrade to the system.

    “Apparently they were doing an upgrade and there was a server crash”.

    When asked why it had taken nearly a week reboot and reload a server he said “I don’t know”.

     

     

    He also failed to explain why Regus was employing a service provider who was unable to come up with a fix in under a week for an IP phone system used for multiple businesses.

    Late last year Regus crashed hundreds of businesses when their Internet operation went down for several hours.

    A North Sydney customer said “In today’s IT environment no serviced office provider can afford to not have a backup network that allows a server or supporting software to be restored quickly. Even if an upgrade has gone pear shaped, they still should have been able to recover the situation within 24 hours. This smacks of an organisation that is trying to do everything on the cheap without any regard for the businesses that they sell services office space to”.

    Motorola’s New Drop Dead Gorgeous Phone

    Motorola has launched a stunning new phone that has beend described as :Drop Dead Gorgeous”. We Agree.

    When the head of Motorola’s phone division in Australia Andrew Volard recently described his new range of phones as “drop dead gorgeous” he was not wrong. While most phone industry executives are good at superlatives very few can back up their claims like Motorola.

     Speaking at the launch of the new Motorola KRZR K1 at Fox Studio’s in Sydney Volard said “The key to Motorola’s success is that every phone we launch has to pass the “drop dead gorgeous test”.

     The bad news from the launch was that the hot new Motorola Q smart phone will not be launched until the first quarter of 2007. However the Motorola KRZR is something to play with on the side while you wait for your Motorola Q. This phone a is a gorgeous fashion statement phone that is set to be the next iconic mobile phone In terms of features and functionality, however, it’s really an old RAZR in a new case.

    Click to enlarge

    Click to enlarge

     The KRZR’s long, narrow, glossy sheen will appeal to anyone who likes expensive bangles or yearns for an Aston Martin. (The bottom of the phone is even stippled in a vaguely automotive-grill-like fashion.)

     Much like the original RAZR, it looks expensive, and it feels great in the hand; the mix of glossy, matte (on the back) and stippled textures is tremendous fun to fidget with. The glossy front is a fingerprint magnet, though, but that’s inevitable on something so shiny.

     Because it’s so long, the KRZR feels very comfortable against the ear, and because it’s so narrow, it’s even easier to hold than the RAZR.

     Another hot phone was the Motorola 3G phone that runs on the new Telstra G Network. In a head to head comparison

     In a nutshell and without the benefit of a full review the 0.8 kilo phone flips open to show, essentially, a slightly miniaturized RAZR display and keypad. The RAZR’s screen is down to 48mm (but maintains the same brightness and 176 by 220 resolution), and the keys, which on the RAZR are trapezoids tapering from 21 to 11 mm wide, are here rectangles of a universal 11 mm.

     The phone’s video camera mode takes decent, 176 by 144 videos at 15 frames per second that you can store on your memory card.

     The price a mere: $850.00

     A full review of this phone which is already on sale will run next week.

     

     

     

     

     

     

    Charge Your Motorola Phone With Light

    Your next Motorola phone could well reduce your power bill following the awarding to Motorola of a patent that allows a phone to be charged by light.

    Motorola has received a patent for LCD that can display images as well as create energy.  Patent 7,206,044 was granted on April 17th 2007 and outlines the company’s “Display and Solar Cell Device”.  The new displays could increase run times in future mobile phones and Motorola claims the displays could even eliminate the need for conventional charging.


    The displays use embedded color filters that allow sunlight to reach the underlying solar cell.  Motorola claims this technique transmits light 75% better than traditional screens that use polarizing and reflective layers.  According to the patent, normal screens only let 6% of sunlight through to the bottom layer.

    Other companies have tried putting solar cells in addition to a display, but modern mobile phones have very little surface real estate to spare.  Motorola says its new technique wastes no space because the display can serve a “parallel purpose” as a light collecting device for the solar cell.

    Motorola claims OLED displays can also benefit from color filters and solar cells.