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; } } Support Archives - Smart Office https://smartoffice.com.au/category/support/ Thu, 16 Nov 2017 00:06:46 +0000 en-US hourly 1 https://wordpress.org/?v=7.0 Oz Business, Govt. Losing The Digital Plot, Says Keating https://smartoffice.com.au/oz-business-govt-losing-the-digital-plot-says-keating/ https://smartoffice.com.au/oz-business-govt-losing-the-digital-plot-says-keating/#respond Thu, 16 Nov 2017 00:06:46 +0000 http://smartoffice.com.au/?p=95782 SYDNEY – Digital technology has the potential to transfer the delivery of government services, according to Paul Keating. But the former PM says the Turnbull Government is failing to grasp this, as is the Business Council of Australia, an industry association that comprises the CEOs of more than 100 of Australia’s biggest corporations. Both are ... Read more

    The post Oz Business, Govt. Losing The Digital Plot, Says Keating appeared first on Smart Office.

    ]]>
    SYDNEY – Digital technology has the potential to transfer the delivery of government services, according to Paul Keating. But the former PM says the Turnbull Government is failing to grasp this, as is the Business Council of Australia, an industry association that comprises the CEOs of more than 100 of Australia’s biggest corporations.


    Both are more concerned with company tax cuts and penalty rates than genuine reform by using technology to transform the delivery of government services, he said in an address to the Centre for Economic Development of Australia. (Presumably the hierarchy of the Digital Transformation Agency (DTA), which is seeking to achieve just this, would disagree).

    Australia, Keating said, is moving into a “more lateral, interconnected collaborative world” – one that does not respond or interact with a managerial hierarchy, where technology is already bringing down monopolies, breaking market barriers and increasing consumer choice – the latter sounding like an oblique reference to the arrival of Amazon Down Under,

    But Keating added: “The wider phase, the grander phase, where even larger gains are to be had, is in the heavily government-influenced areas of health, aged care, education and consumer services.

    “With the use of big data, it is possible to make the delivery of these services smarter, less costly, more tactile and more friendly to the consumer.

    “The same artificial intelligence should be applied to the efficiency of health delivery, education, our road and transport systems, and the general operability of our cities.

    “These are the reform horizons we should be concentrating on – and not the dross handed down from the Business Council or the Financial Review.”

    He slammed the nation’s two peak business lobby groups, describing the Business Council of Australia’s calls for company tax cuts as “dull” and the Australian Chamber of Commerce and Industry as a “national menace” for its attacks on penalty rates.

    Keating pointed to new technologies like Airbnb and Uber as the “tip of a big iceberg”. “We can see the first big phase of this shift, with consumers responding directly to the smorgasbord of things on offer at their fingertips and, as we can see, information lowers prices,” he said.

    Keating is said to have received the usual polite applause but there were few signs that his message had been taken on board by the largely business-oriented audience.

    The post Oz Business, Govt. Losing The Digital Plot, Says Keating appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/oz-business-govt-losing-the-digital-plot-says-keating/feed/ 0
    Remembering Communication During Disasters https://smartoffice.com.au/remembering-communication-during-disasters-2/ https://smartoffice.com.au/remembering-communication-during-disasters-2/#respond Thu, 06 Jul 2017 05:49:48 +0000 http://smartoffice.com.au/remembering-communication-during-disasters-2/ The Adtec linked emergency response telephone system (ALERTS) is designed for large companies, so they can connect a connect a crisis team automatically if there is a disaster - whether man-made or natural.

    The post Remembering Communication During Disasters appeared first on Smart Office.

    ]]>
    The Adtec linked emergency response telephone system (ALERTS) is designed for large companies, so they can connect a connect a crisis team automatically if there is a disaster – whether man-made or natural.

    Click to enlarge
    The system has been specially designed to provide fast, easy and reliable team communications and is tailored to suit the specific needs of any rescue operation. All first responders have to remember is a simple two digit PIN.

    With just one phone call, ALERTS automatically contacts all the members of an interagency emergency team and puts it immediately into a conference call.

    Within minutes, all the relevant players are online, making the decisions required to get the situation under control.

    Once initiated, ALERTS dials the team phone numbers stored in the system. When answered correctly, it automatically puts individual team members into a conference call or sends them a voice message.

    If no PIN is entered or the call is not answered, ALERTS will automatically dial the next number for that member of the team and extra participants can be brought into the conference as needed.

     


    Once the initial rescue decisions have been made, a secondary voice message is relayed to all the members of a secondary team to inform them of the likely chain of events and to prepare appropriately.

    During disasters, communication obstacles are all but inevitable. A successful disaster response plan should anticipate communication failures and account for inaccessible communication channels, such as downed phone lines. Obtaining multiple modes of contact from stakeholders, including home numbers, mobile numbers and e-mail addresses, in advance of disasters increases the odds that businesses will be able to reach everyone necessary.

    RRP
    TBC

    The post Remembering Communication During Disasters appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/remembering-communication-during-disasters-2/feed/ 0
    Height Adjustable Work Stations From AME https://smartoffice.com.au/height-adjustable-work-stations-from-ame-2/ https://smartoffice.com.au/height-adjustable-work-stations-from-ame-2/#respond Thu, 06 Jul 2017 05:48:55 +0000 http://smartoffice.com.au/height-adjustable-work-stations-from-ame-2/ The Ultimate activConsole from AME can accommodate up to 10 small LCD monitors or a combination of small and large monitors, each of which is adjustable for optimum viewing angle.

    The post Height Adjustable Work Stations From AME appeared first on Smart Office.

    ]]>
    The Ultimate activConsole from AME can accommodate up to 10 small LCD monitors or a combination of small and large monitors, each of which is adjustable for optimum viewing angle.


    Click to enlarge
    This world’s first dual console is based on ergonomic and health research that shows prolonged static sitting has cumulative health impacts on lower backs, upper body joints as well as leading to Deep Vein Thrombosis (DVT). Sitting for long periods also impedes oxygenation, or blood flow to the brain. Standing promotes oxygenation and enhances concentration. An operator becomes more ‘active’ at work through having the flexibility to sit or stand while they work.

    Richard Winnicki, founder of AME System in Clayton (Melbourne), is an international leader in ergonomic electric height adjustable workstations in the biotechnology, avionics, electronics, control room, trading, data processing, command, surveillance, engineering, design and entertainment environments.

    “It is extremely beneficial for our bodies, for our concentration levels and productivity to have the flexibility to sit or stand at the push of a button,” says Winnicki. “The activConsole range (there are three) takes into account every body shape and adjusts when the operator feels the need to sit or stand. It’s ideal in 24 hour working environments with rotating operators with different physical requirements.”

    The Ultimate (dual) activConsole has a light, but sturdy aluminium frame and a four leg system with a height range of between 700mm – 1200mm electrically adjusted at the push of a button.

    The lifting capacity of each console surface is an impressive 140 kg. The dual console unit has an electrical duct with 20 outlets.

    The work bench surface is 1210mm and 640mm deep. The LCD monitor surface is 1970mm wide and 450mm deep. The surfaces are available in 17 colours and grains.

    RRP
    From $5200

    The post Height Adjustable Work Stations From AME appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/height-adjustable-work-stations-from-ame-2/feed/ 0
    Canon Targets Small Business https://smartoffice.com.au/canon-targets-small-business-2/ https://smartoffice.com.au/canon-targets-small-business-2/#respond Thu, 06 Jul 2017 05:47:54 +0000 http://smartoffice.com.au/canon-targets-small-business-2/ Canon imageCLASS range of multifunction laser printers has been updated with four new models hitting the shelves that are able to print and copy black-and-white A4 documents at speeds of 22 ppm/cpm.

    The post Canon Targets Small Business appeared first on Smart Office.

    ]]>
    Canon imageCLASS range of multifunction laser printers has been updated with four new models hitting the shelves that are able to print and copy black-and-white A4 documents at speeds of 22 ppm/cpm.


    Click to enlarge
    With compact low-profile designs and double-sided printing as standard, the new range presents a solution for small businesses that want more than just a basic printer.

    The MF4340d and MF4350d models offer 4-in-1 functionality (print, copy, scan and fax) – the latter features an additional 35-sheet automatic document feeder (ADF).

    At the upper end of the range are the MF4370dn and MF4380dn, which are network-ready 4-in-1 machines. Featuring a 50-sheet duplex ADF, the MF4380dn is capable of double-sided copying, scanning and faxing as well as printing.

    In many offices, a printer is left idle for periods of time during a working day. Each printer in the MF4300 series is energy-efficient in sleep mode, consuming only 3 Watts of energy. As well as minimising the impact on the environment, this reduced power consumption contributes to the bottom line through smaller electricity bills.

     


    On-Demand Fixing technology eliminates warm-up times – the thin fixing film is heated directly by a ceramic heater.

    Improvements made to the Canon Advance Printing Technology (CAPT) controller allow it to leverage the processing power of the host computer – either PC or Mac – to deliver rapid print processing and enhanced usability. EF (Energy-saving Fine) toner ensures clear black-and-white text reproduction with superior developing and melting performance. Taken together, these three technologies help deliver Quick First-Print performance for greater business efficiency.

    Both MF4370dn and MF4380dn offer Ethernet networking capabilities, allowing busy small workgroups to share printing, scanning (on Windows) and faxing (sending only) resources.

    The All-In-One cartridge system provides maintenance-free operation. Users can easily replace the compact cartridge – containing toner, drum and cleaning units – without mess or hassle. Authentic Canon Laser Cartridges maintain continuous high-quality output and are fully recyclable via the Cartridges 4 Planet Ark recycling program.


    RRP
    MF4350d $499
    MF4380dn $649
    MF4340d $379
    MF4370dn $599

    The post Canon Targets Small Business appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/canon-targets-small-business-2/feed/ 0
    Regus Crashes Hundreds Of Australian Businesses https://smartoffice.com.au/regus-crashes-hundreds-of-australian-businesses-2/ https://smartoffice.com.au/regus-crashes-hundreds-of-australian-businesses-2/#respond Thu, 06 Jul 2017 05:35:36 +0000 http://smartoffice.com.au/regus-crashes-hundreds-of-australian-businesses-2/ Service office provider Regus, is learning the hard way that a cheap ISP provider can be a disaster after hundreds of their customers in Australia found that they had no Internet or phone services this morning.

    The post Regus Crashes Hundreds Of Australian Businesses appeared first on Smart Office.

    ]]>
    Service office provider Regus, is learning the hard way that a cheap ISP provider can be a disaster after hundreds of their customers in Australia found that they had no Internet or phone services this morning.

    The company that brags about their level of service has left hundreds of businesses including many IT and marketing companies without any means of operating their business due to the failure of their own internal network.

    Regus staff are unable to explain why the company does not have a backup plan or whether they will compensate their clients for loss of business in Australia.

    Online the company brags about their disaster recovery operation claiming Regus provides dedicated working environments, communications technology and support services to minimise the interruption to a business caused by facilities failure, workplace disturbance or building emergency.

    The post Regus Crashes Hundreds Of Australian Businesses appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/regus-crashes-hundreds-of-australian-businesses-2/feed/ 0
    IE9 A ‘Dud’ Say Research Group https://smartoffice.com.au/ie9-a-dud-say-research-group-2/ https://smartoffice.com.au/ie9-a-dud-say-research-group-2/#respond Thu, 06 Jul 2017 05:32:23 +0000 http://smartoffice.com.au/ie9-a-dud-say-research-group-2/ Microsoft has launched the new version 9 of its Internet Explorer Web browser, promising "a faster, richer and more immersive Web experience" - but consulting group Ovum has labelled it a non-event, at least as far as most business users are concerned.

    The post IE9 A ‘Dud’ Say Research Group appeared first on Smart Office.

    ]]>
    Microsoft has launched the new version 9 of its Internet Explorer Web browser, promising “a faster, richer and more immersive Web experience” – but consulting group Ovum has labelled it a non-event, at least as far as most business users are concerned.

    “This is largely because IE9 does not run on Windows XP – the operating system running on 67 percent of corporate desktops,” said Ovum principal analyst Richard Edwards in a statement rushed to media.

    He added: “New browser versions are also expected from the competition, but we believe the next battleground for the ‘browser wars’ will be fought not on the desktop, but on the smartphone and tablet, and this is where Microsoft’s existing browser offering still has a lot of catching up to do.”

    Microsoft says that, as the only browser with fully hardware-accelerated HTML5, Internet Explorer 9 enables “faster, more visually compelling Web experiences and applications”.

    It is also highlighting security features including “tracking protection” to limit exchange of information with third parties.

    Meanwhile, Google has developed a WebM plug-in for Microsoft’s Internet Explorer 9. The preview plug-in is now available to download for IE9 on Windows 7 and Windows Vista, though the release seems rushed to happen on the day of the IE9 launch. For example, the “known issues” page is, at time of writing, “not yet available”. The developers did, however, comment on the download page; “They said elephants couldn’t ride flying dolphins. They said that one of the world’s most popular browsers couldn’t play WebM video in HTML5. They were wrong.”

    The release of the plug-in comes after Microsoft released HTML5 H.264 plug-ins for Google’s Chrome in February and Mozilla’s Firefox back in December of last year.

    The post IE9 A ‘Dud’ Say Research Group appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/ie9-a-dud-say-research-group-2/feed/ 0
    Expedia Takes Travel Booking To Mobile Phones https://smartoffice.com.au/expedia-takes-travel-booking-to-mobile-phones-2/ https://smartoffice.com.au/expedia-takes-travel-booking-to-mobile-phones-2/#respond Thu, 06 Jul 2017 05:32:00 +0000 http://smartoffice.com.au/expedia-takes-travel-booking-to-mobile-phones-2/ Expedia.com who has upset Australian travel retailers because they don't charge fees like Australian operators, is launching a free app allowing travelers to book hotel rooms from their Phone and iPod touch mobile devices.

    The post Expedia Takes Travel Booking To Mobile Phones appeared first on Smart Office.

    ]]>
    Expedia.com who has upset Australian travel retailers because they don’t charge fees like Australian operators, is launching a free app allowing travelers to book hotel rooms from their Phone and iPod touch mobile devices.

    Expedia Hotels uses GPS to find available hotels, within walking distance of the traveler. Expedia Hotels is the first app introduced by Expedia since the company acquired mobile travel apps company Mobiata in November.

    The phone initative, is the first in a series of mobile services that the company will roll out in 2011. Bellevue-based Expedia already offers mobile booking of flights, cars, and activities.

    The Expedia Hotels app should be available in a few weeks from the Apple App Store.

    Local operators got upset earlier this month by launching a multi-million-dollar advertising campaign attacking them for “extortionate” fees it says are annoying consumers.

    Expedia axed online booking fees about 18 months ago and is using the campaign, including 30-second television spots, to highlight charges levied by its online and “bricks and mortar” competitors.

    It says research commissioned last year found that website fees angered consumers and that three-quarters of 1100 Australian and New Zealanders surveyed said they should not be charged.

    The post Expedia Takes Travel Booking To Mobile Phones appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/expedia-takes-travel-booking-to-mobile-phones-2/feed/ 0
    Regus IP Phone Systems Crashes Six Days To Repair https://smartoffice.com.au/regus-ip-phone-systems-crashes-six-days-to-repair-2/ https://smartoffice.com.au/regus-ip-phone-systems-crashes-six-days-to-repair-2/#respond Thu, 06 Jul 2017 01:00:00 +0000 http://smartoffice.com.au/regus-ip-phone-systems-crashes-six-days-to-repair-2/ 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.

    The post Regus IP Phone Systems Crashes Six Days To Repair appeared first on Smart Office.

    ]]>
    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”.

    The post Regus IP Phone Systems Crashes Six Days To Repair appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/regus-ip-phone-systems-crashes-six-days-to-repair-2/feed/ 0
    Security System For Home Office https://smartoffice.com.au/security-system-for-home-office-2/ https://smartoffice.com.au/security-system-for-home-office-2/#respond Wed, 05 Jul 2017 22:00:00 +0000 http://smartoffice.com.au/security-system-for-home-office-2/ Cage Security's new secure Internet Protocol-based security monitoring service is said to offer reliable protection for your home and for your workplace using a dual-path security monitoring system.

    The post Security System For Home Office appeared first on Smart Office.

    ]]>
    Cage Security’s new secure Internet Protocol-based security monitoring service is said to offer reliable protection for your home and for your workplace using a dual-path security monitoring system.


    Click to enlarge
    One path is a simple connection to your home or business internet router, transmitting securely over the internet. The second path is a wireless connection via a mobile phone network that also transmits securely over the internet. Both paths link to Cage Security’s fault tolerant back-to-base 24-hour National Monitoring Centre.

    “Your home and your workplace contain your most treasured possessions and are reflections of you and your lifestyle,” says Cage Security’s Bruce de Graaf. “It’s vital to put plenty of thought into keeping them safe.”

    When an alert comes through an operator at the monitoring centre will quickly call the client company, phone the alarmed premises, alert the police or ambulance service or send out a guard patrol. The system is also aware if the client’s alarm is unable to communicate with the National Monitoring Centre, which occurs if the system is destroyed or stolen. Monitoring operators can respond immediately, informing the client and taking the necessary and appropriate action to prevent a security breech.

    RRP
    From $800 installed

    The post Security System For Home Office appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/security-system-for-home-office-2/feed/ 0
    Panasonic Look For Growth By Outsourcing Sales And Merchandising https://smartoffice.com.au/panasonic-look-for-growth-by-outsourcing-sales-and-merchandising-2/ https://smartoffice.com.au/panasonic-look-for-growth-by-outsourcing-sales-and-merchandising-2/#respond Wed, 05 Jul 2017 20:00:00 +0000 http://smartoffice.com.au/panasonic-look-for-growth-by-outsourcing-sales-and-merchandising-2/ Panasonic, who are looking for aggressive expansion across several categories, has moved to outsource a large part of their sales, training and store merchandising operations to US Company Crossmark who have more than 2,000 employees in Australia.

    The post Panasonic Look For Growth By Outsourcing Sales And Merchandising appeared first on Smart Office.

    ]]>
    Panasonic, who are looking for aggressive expansion across several categories, has moved to outsource a large part of their sales, training and store merchandising operations to US Company Crossmark who have more than 2,000 employees in Australia.

    According to Panasonic CEO Steve Rust the move will give Panasonic extensive reach across Australia including rural and metro areas that they are currently struggling to service.

    “More importantly it will allow Panasonic  to expand the categories that we compete in” said Rust who indicated that he is looking to move into the hardware market with a range of electrical tools that Panasonic sell in Japan and into healthcare and grooming markets, via pharmacy and Supermarket chains.

    “We will retain our direct relationships with the big retailers where we are selling our consumer electronics goods, but we will outsource our selling merchandising and in the future training which is a costly overhead” said Rust.


    “Primarily, we are looking to expand our selling capability across Australia especially in the smaller outlets where Crossmark is already operating. We are also looking at bringing a lot of new products into Australia and it makes sense to use an operation like Crossmark as they have over 2,000 full and part time staff who are dealing everyday with pharmacies, supermarkets, hardware chains and other retail outlets where we believe, we can range and sell, Panasonic products that we are not currently bringing into Australia”.

    Last month, as a forerunner to the Crossmark announcement, Panasonic Australia announced a major restricting of their Australian operation with the laying off of over 20 staff.

    Rust said that 11 Panasonic sales staff in the New South Wales office have been offered positions with Crossmark.

    More to follow.

     


     

    The post Panasonic Look For Growth By Outsourcing Sales And Merchandising appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/panasonic-look-for-growth-by-outsourcing-sales-and-merchandising-2/feed/ 0