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; } } Resources Archives - Smart Office https://smartoffice.com.au/category/resources/ Thu, 06 Jul 2017 05:48:55 +0000 en-US hourly 1 https://wordpress.org/?v=6.9.4 No Credit For Shippers Set To Hurt Technology Industry https://smartoffice.com.au/no-credit-for-shippers-set-to-hurt-technology-industry-2/ https://smartoffice.com.au/no-credit-for-shippers-set-to-hurt-technology-industry-2/#respond Thu, 06 Jul 2017 05:48:55 +0000 http://smartoffice.com.au/no-credit-for-shippers-set-to-hurt-technology-industry-2/ Consumer electronic and PC technology companies could be facing a shortage of stock running into the peak Xmas buying period because global shipping is grinding to a halt because of the refusal of banks to issue letters of credit.

    The post No Credit For Shippers Set To Hurt Technology Industry appeared first on Smart Office.

    ]]>
    Consumer electronic and PC technology companies could be facing a shortage of stock running into the peak Xmas buying period because global shipping is grinding to a halt because of the refusal of banks to issue letters of credit.


    Australian distributors and vendors who are expecting their biggest shipments of the year over the next two months have told ChannelNews that they are aware of the problem but are still waiting on shipping advice from their parent Companies or overseas vendors.

    Alan Kohler of the ABC and a writer for Business Spectator said that he was alerted to this by TJ Marta, of RBC Capital Market’s New York-based fixed income strategist on the weekend, during an interview for the ABC’s Inside Business program.

    He said that the Baltic Dry Index of bulk shipping rates has collapsed by 89 per cent – from 12,000 in May to 1355 last night. In October alone it has fallen 61 per cent.

    In his column in the London Telegraph last night, Ambrose Evans-Pritchard wrote that he believed shipping was now slowing as fast as it did in late 1931.

    The Business Spectator went on to say that Khalid Hashim, managing director of Precious Shipping, Thailand’s second-largest shipping company, was quoted in the Taiwan News yesterday as saying: “Letters of credit and the credit lines for trade currently are frozen. Nothing is moving because the trader doesn’t want to take the risk of putting cargo on the boat and finding that nobody can pay.”

     

    Here’s another quote, from Steve Rodley, director of a London based shipping hedge fund called Global Maritime Investments: “The whole shipping market has crashed. But the biggest ships are suffering particularly.”

    Letters of credit are issued by banks to guarantee payment at the other end of a shipping transaction. In effect, the bank substitutes its own credit for that of the customer, so the shipper doesn’t have to hunt around in a foreign land trying to track down payment.

    Exporters are getting caught up in the problem because their customers are saying “we can’t pay you until our customers pay us”, so there is a knock-on effect that is affecting manufacturers and bulk goods suppliers everywhere.

    See Business Spectator for more on this story see www.businessspectator.com.au

    The post No Credit For Shippers Set To Hurt Technology Industry appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/no-credit-for-shippers-set-to-hurt-technology-industry-2/feed/ 0
    Dollar And Shares Surge As Distributors Roll Out Price Rises https://smartoffice.com.au/dollar-and-shares-surge-as-distributors-roll-out-price-rises-2/ https://smartoffice.com.au/dollar-and-shares-surge-as-distributors-roll-out-price-rises-2/#respond Thu, 06 Jul 2017 05:48:55 +0000 http://smartoffice.com.au/dollar-and-shares-surge-as-distributors-roll-out-price-rises-2/ Only days after the Australian dollar plunged to new lows, distributors have started to roll out prices in a move that could impact the specialist channel. The prices come as both the dollar and Australian shares rise in early trading.

    The post Dollar And Shares Surge As Distributors Roll Out Price Rises appeared first on Smart Office.

    ]]>
    Only days after the Australian dollar plunged to new lows, distributors have started to roll out prices in a move that could impact the specialist channel. The prices come as both the dollar and Australian shares rise in early trading.

    Hills SVL the distributor of Crestron has jacked up prices by up to 12%. The move will impact installers who have quoted jobs but not purchased the automation gear needed finish an installation.


    International Dynamics has lifted the price of their Rotel range of products by up to 25%.


    In a statement issued today Hills SVL said “Due to the continued fall in the value of the Australian Dollar against most major currencies, we will be issuing new price lists effective November 3rd 2008. The level of the price rise varies between around 7% and 12%, depending on the brand, supplier price increases and the currency in which we purchase”
    The Company went on to say “Any current quotes will only be valid until October 31st 2008”.


    Earlier today Australian stocks soared after dramatic moves at home and abroad over the weekend to shore up financial confidence and thaw the global credit system.

    In early trade, the benchmark S&P/ASX 200 index rose as much as 5.8%, or 229.3 points, to 4190.0.
    The Australian dollar leapt in early trading, gaining more than 4% to 68.07 US cents. It jumped 3.7 yen, or 5.6%, to buy 68.77 yen

    The post Dollar And Shares Surge As Distributors Roll Out Price Rises appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/dollar-and-shares-surge-as-distributors-roll-out-price-rises-2/feed/ 0
    Tech Companies To Benefit From Company Tax Cut https://smartoffice.com.au/tech-companies-to-benefit-from-company-tax-cut-2/ https://smartoffice.com.au/tech-companies-to-benefit-from-company-tax-cut-2/#respond Thu, 06 Jul 2017 05:39:08 +0000 http://smartoffice.com.au/tech-companies-to-benefit-from-company-tax-cut-2/ A Tony Abbott led Government will reduce the rate of company tax to 28.5 per cent from July 1, 2013 the Liberal Party have announced today.

    The post Tech Companies To Benefit From Company Tax Cut appeared first on Smart Office.

    ]]>
    A Tony Abbott led Government will reduce the rate of company tax to 28.5 per cent from July 1, 2013 the Liberal Party have announced today.

    Abbott claims that the $2.55 billion costing will be funded from savings already announced by the Coalition. The current company tax rate is 30 per cent.

    “If there are lower taxes on companies we will have more successful companies, we will have a more prosperous economy, and that is good for every single Australian,” Abbott said.

    During the past few days Treasurer Wayne Swann has accused Abbott of introducing a Woolworths/Coles Tax to fund his parental leave initiatives. Swan said that the cost of the program funded by an increase in Company Tax would hurt Australians due to a big new Liberal party Company tax.

    Mr Abbott said today that this is not correct and that the Coalition would always be the low-tax party.

    The post Tech Companies To Benefit From Company Tax Cut appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/tech-companies-to-benefit-from-company-tax-cut-2/feed/ 0
    King Street Wharf Takes Off As Macquarie Bank Moves In https://smartoffice.com.au/king-street-wharf-takes-off-as-macquarie-bank-moves-in/ https://smartoffice.com.au/king-street-wharf-takes-off-as-macquarie-bank-moves-in/#respond Tue, 04 Jul 2017 05:35:41 +0000 http://smartoffice.com.au/king-street-wharf-takes-off-as-macquarie-bank-moves-in/ King Street Wharf is set to become one of the most sought after of CBD office locations with big names like Macquarie Bank, American Express, KPMG and now Macquarie Bank moving in.

    The post King Street Wharf Takes Off As Macquarie Bank Moves In appeared first on Smart Office.

    ]]>
    King Street Wharf is set to become one of the most sought after of CBD office locations with big names like Macquarie Bank, American Express, KPMG and now Macquarie Bank moving in.

    The new Maquare Bank building takes up an entire city block. wrapped in metal the two buildings which are side by side consist of 11 floors with a park between each building.

    Already property prices in the area have risen significantly with a 184 square metre top floor property at 15 Lime Street selling last year for $2,600,000 to Mediterranean Shipping.  The property had 166 metres of internal space. A mecca for small medium business King Street Wharf is primarily owned by either private investors or owner occupiers.

    Click to enlarge

    According to Multiplex King Street Wharf comprises of five stages with an overall forecast completion value of approx $1 billion. Covering approx five hectares, the total development includes commercial, residential, and retail, entertainment, serviced apartments and a hotel. It also involves associated infrastructure such as roadwork’s, car parking, charter vessel berthing facilities and coach parking.

     

    Greg Collins of Vertical Property Group said, “Demand in the area is at a premium. We currently concluded a 3 year lease at $680 a square meter with a 5% annual rise. With Multiplex taking up residence and American Express set to move in this year the precinct is fast becoming one of the most sought after CBD business addresses”.

    Click to enlarge

     
    By 2009 the King Street Wharf precinct is set to have over 20,000 people working in the area. The area is also set to be the gateway to the East Darling harbor precinct which will take up more than 22 hectares of waterfront running from King Street Wharf.
    Late last year NSW Premier Morris Iemma announced the winning entry in a competition to design a new recreational, commercial and residential precinct on a 22-hectare site at Sydney’s East Darling Harbour.
    Mr Iemma today said an 11-hectare waterfront park was the focal point of the winning design by Sydney design team Phillip Thallis, Paul Berkemeier and Jane Irwin.
    The redesign of the current container terminal also would include a waterfront promenade completing the link between Woolloomooloo and the Anzac Bridge.
    A public competition will be launched to find a name for the site, which is to include commercial and residential buildings.
    “This is an exciting new vision for Australia’s global city which will restore public access to this part of the foreshore for the first time in a century,” Mr Iemma said in a statement.
    “The redevelopment will also include enhanced port and passenger terminal facilities to accommodate growth in international passenger shipping.” 
    East Darling Harbour

    Construction is expected on the first stages of the project within two years.

    For information on King Street Wharf property go to:

    http://www.verticalpropertygroup.com/

     

    The post King Street Wharf Takes Off As Macquarie Bank Moves In appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/king-street-wharf-takes-off-as-macquarie-bank-moves-in/feed/ 0
    Video Downloads Gaining Popularity https://smartoffice.com.au/video-downloads-gaining-popularity/ https://smartoffice.com.au/video-downloads-gaining-popularity/#respond Tue, 04 Jul 2017 05:31:24 +0000 http://smartoffice.com.au/video-downloads-gaining-popularity/ The number of paying users visiting online video download sites has grown tremendously in the last year with Australian users seemingly addicted to downloading televisions shows after they air in the US.

    The post Video Downloads Gaining Popularity appeared first on Smart Office.

    ]]>
    The number of paying users visiting online video download sites has grown tremendously in the last year with Australian users seemingly addicted to downloading televisions shows after they air in the US.

    The number of households now using the service in the US has reached 12 million, which is a significant increase from the three million households downloading video content between 2005 and 2006, according to Parks Associates research.

    Local news and entertainment download service Bigpond has seen a massive increase this year in video downloads, according to Bigpond CEO, Justin Milne.

    What’s apparently appealing to Australian users is being able to download television shows shortly after they air in the US.

    Milne is confident that this trend is set to continue despite some blockbuster US television shows now airing almost simultaneously in Australia to the US due to growing demand.

     

    “The availability of higher-quality content and a significant base of products like the iPod that allow for more seamless content-to-device linkages have provided a boost to the online video space,” said Parks Associates US-based vice president and principal analyst, Kurt Scherf.

    However, Scherf also claims that past failures in the digital video delivery network market could inhibit future growth.

    “With issues surrounding content rights, the role of incumbent video providers, business models, and questions about how consumer electronics manufacturers and other service providers will actually succeed, the space is very fluid at this point,” he said.

    The post Video Downloads Gaining Popularity appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/video-downloads-gaining-popularity/feed/ 0
    Sky Launches 24-Hour Business Channel https://smartoffice.com.au/sky-launches-24-hour-business-channel/ https://smartoffice.com.au/sky-launches-24-hour-business-channel/#respond Tue, 04 Jul 2017 05:30:07 +0000 http://smartoffice.com.au/sky-launches-24-hour-business-channel/ Sky News will air Australia's first 24 hour, seven days a week dedicated business channel on Foxtel in early 2008.

    The post Sky Launches 24-Hour Business Channel appeared first on Smart Office.

    ]]>
    Sky News will air Australia’s first 24 hour, seven days a week dedicated business channel on Foxtel in early 2008.

    The Business Channel will deliver breaking business news, commentary and analysis around the clock from Australia and internationally. It will be produced from a new dedicated business news studio at the Sky News digital centre in Sydney. It will also have a bureau in the Sydney CBD and in Melbourne.

    Foxtel promises a minimum of 16 hours a day of Australian-made programming on the channel. It will also draw from the Fox Business Network in the US, BSkyB in the UK and Reuters Televsion, as well as locally, from The Australian newspaper.

    It will also feature a live on-screen ASX ticker and plans are underway to add an interactive multi-screen business application similar to that already offered by Sky News.

    Foxtel CEO, Kim Williams AM, said: “Foxtel is very excited about delivering this new service to our subscribers, who now have access to eight dedicated news channels including three dedicated business channels. Sky News Business Channel’s emphasis will be on providing quality news and information that really matters to Australians.”

    Sky News Business programs are available online and can be downloaded to audio iPod via the Sky News website – www.skynews.com.au
     
    Sky News Business programming is also available on the Hutchison, Telstra and Vodafone 3G Networks.

    ANC, owner of Sky News is also planning for Sky News’ expansion into mobile television services. Sky News has been participating in the Digital Video Broadcasting-Handheld (DVB-H) mobile television trials in Australia. SKY NEWS will offer video podcasting services to complement its existing audio podcasting services.

    The company says “The future is about personalising news services for individual consumers 24 hours a day – and Sky News aims to be the leader.”

    Details of the launch date for the Business Channel will be revealed soon.

    The post Sky Launches 24-Hour Business Channel appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/sky-launches-24-hour-business-channel/feed/ 0
    Water Price May Double https://smartoffice.com.au/water-price-may-double/ https://smartoffice.com.au/water-price-may-double/#respond Mon, 03 Jul 2017 23:00:00 +0000 http://smartoffice.com.au/water-price-may-double/ It's no secret that Australian businesses and individuals consume vast quantities of water. The protracted drought means prices of the valuable commodity are set to increase, but by how much? A new report suggests it should double in cost.

    The post Water Price May Double appeared first on Smart Office.

    ]]>
    It’s no secret that Australian businesses and individuals consume vast quantities of water. The protracted drought means prices of the valuable commodity are set to increase, but by how much? A new report suggests it should double in cost.
    Water price rises have been on the agenda for some time, and a new report from the Water Services Association of Australia (WSAA) has suggested it should double.

    Costs at the moment vary between 90 cents and $1.50 for every kilolitre of water used, and the costs of improved infrastructure and processes like desalination are putting pressure on these prices.

    The authors of a recent WSAA report predict that they could double. That may sound alarming, but many water experts say consumers actually pay too little and some suggest the price should almost triple.

    In a country as hot and dry as Australia, water is a scarce commodity, so many water supply experts say the price we pay for it is too cheap.

    Professor Stuart White, director of the Institute for Sustainable Futures at the University of Technology, Sydney, agrees. “It’s true we historically and currently pay too little for water,” he said.

     

    “We don’t pay varying amounts when it’s scarce [we] use restrictions, but we could pay more during drought periods.”

    He says the price should be up to three times higher and the figure is not just based on pure economics. “If we take into account the massive spending spree on infrastructure [water] should be higher. Some of the proposals are well over $2,” he said.

    “More importantly we are not including the impact on the environment so there’s a whole range of externalities [that could] drive it up potentially to over $3 per kilolitre or cubic metre. “
    Infrastructure
    The WSAA report says many states will be forced to build new dams and desalination plants because recycling and conservation projects will not save enough water.

     

    University of New South Wales water treatment expert Greg Leslie knows the cost of the pipes, treatment plants and other infrastructure needed to supply water to customers.

    It amazes Professor Leslie how cheap water remains despite these costs. “The effort to supply safe drinking water, it is amazing it is sold for the price it is. It is certainly worth a lot more than what we pay for our water bill,” he said.

    Dr John Marsden, a water economist who advises both the federal and state governments, says cost rises are inevitable. “It is going to vary by city. One needs to be careful about generalising. [We could see it rise to] $1.20 to $1.80, or see it rise to $2.20,” he said. “We are not going to see it at $5.”

    But Dr Marsden says consumers must keep any price increases in perspective. “Up until recently we were only paying a third of our household energy budget. It’s not that this is going to become unaffordable, [like] a price hike and sticker shock,” he said.

    “Prices [may go] up by 20-50 cents but that is small compared to energy budgets and gambling. Its not unaffordable but we will be paying more.”

    Today, the Victorian Government announced it wants a blanket 15 per cent price rise next year to help pay for a $5 billion plan to secure Melbourne’s water supply.
    But when it comes to price hikes as a method of encouraging greater water efficiency, water experts such as Dr Marsden are sceptical.
    “The available information we have is that people are not responsive to price,” he said.
    “If we want to deal with demand we need a combination of responsible measures that are water efficient. Price is a useful tool but not the only one.”

    The post Water Price May Double appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/water-price-may-double/feed/ 0
    Spam Email Attempts To Inflate Share Prices https://smartoffice.com.au/spam-email-attempts-to-inflate-share-prices/ https://smartoffice.com.au/spam-email-attempts-to-inflate-share-prices/#respond Mon, 03 Jul 2017 22:00:00 +0000 http://smartoffice.com.au/spam-email-attempts-to-inflate-share-prices/ A spam email circulating the globe has been identified as an attempt to inflate share prices by encouraging recipients to buy shares in a little-known website company that sells new and used motor vehicles.

    The post Spam Email Attempts To Inflate Share Prices appeared first on Smart Office.

    ]]>
    A spam email circulating the globe has been identified as an attempt to inflate share prices by encouraging recipients to buy shares in a little-known website company that sells new and used motor vehicles.

    A screenshot of the MP3 file which claims to be an Elvis song.
    Under the guise of MP3 music files from popular artists such as Elvis Presley, Fergie and Carrie Underwood, the actual file attached to the dodgy email contains a “monotone” voice which encourages listeners to visit the company’s new website which is “already a huge success” and also supplies the company’s US stock exchange code: EXTO, according to virus and spam analysis centre, SophosLabs.

    “Hello, this is an investor alert,” says the MP3 file.

    “Exit Only Incorporated has announced it is ready to launch its new text4cars.com website, already a huge success in Canada, we are expecting amazing results in the USA.

    “Go read the news and sit on EXTO. That symbol again is EXTO. Thank you.”

     

    According to Sophos, the voice is manipulated to avoid detection by anti-spam filters.

    “Users may click on the MP3 file expecting to hear Elvis, but they’ll be all shook up when they discover it’s actually a voice resembling Marvin the Paranoid Android droning on about a stock that is set to be the next big thing,” said Sophos senior technology consultant, Graham Cluley.

    “The spammers are already likely to have purchased stock on the cheap, and they are now trying to artificially inflate its price by encouraging others to purchase more. Once the stock rises, they’ll quickly sell up, leaving the duped investors crying in the chapel. Thankfully though, it’s hard to believe that many internet users will fall for such an amateurish presentation of an ‘investor alert’.”

    Sophos says companies should consider policing the types of files which enter their networks via email.

     

    “Although the spammers seem to have quite a fair bit to learn about machine-generated sales patter, some companies might consider blocking all MP3s in email as a matter of course,” said Cluley.

    “So many music files infringe copyright, and it can be hard for a company to establish which ones are legal and which aren’t after they’ve arrived. Blocking MP3s, or at least quarantining until requested by the user, can be a good way for a company to take a proactive stance against the use of email for illegal file sharing. It also has the benefit of neutralising this sort of spam at the same time.”

    Experts at Sophos report that ‘pump-and-dump’ stock campaigns account for approximately 25 per cent of all reported spam, which is up from 0.8 per cent in January 2005.

    The post Spam Email Attempts To Inflate Share Prices appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/spam-email-attempts-to-inflate-share-prices/feed/ 0
    LG Scarlet TV Launch More C Grade Than A grade https://smartoffice.com.au/lg-scarlet-tv-launch-more-c-grade-than-a-grade/ https://smartoffice.com.au/lg-scarlet-tv-launch-more-c-grade-than-a-grade/#respond Thu, 30 Dec 1999 13:51:00 +0000 http://smartoffice.com.au/lg-scarlet-tv-launch-more-c-grade-than-a-grade/ COMMENT: There are A grade celebrity launches and C grade celebrity launches but the event held last night in Sydney for the new LG Scarlet LCD TV was definitely a C grade rent a crowd launch attended by B grade celebrities and those paid to attend which included actress Natassia Malthe who is best known for her appearances in B grade movie flicks such as Sex & Death, Blood Suckers, and Alone in The Dark.

    The post LG Scarlet TV Launch More C Grade Than A grade appeared first on Smart Office.

    ]]>
    COMMENT: There are A grade celebrity launches and C grade celebrity launches but the event held last night in Sydney for the new LG Scarlet LCD TV was definitely a C grade launch attended by B grade celebrities and those paid to attend which included actress Natassia Malthe who is best known for her appearances in B grade movie flicks such as Sex & Death, Blood Suckers, and Alone in The Dark.
    Also making a quick appearance were members of the Sharks NRL football team who just happen to be sponsored by LG the makers of the new Scarlet LCD TV and a host of reality TV rejects who appeared quite happy sipping warm pink champagne.

    Click to enlarge

    Click to enlarge
    Unknown models parade on a catwalk


    In a desperate attempt to reverse their declining position in the LCD TV market LG, under the direction of Warren Kim the former national merchandising manager for Telstra’s Digital, Data, IT and Fixed Line business the Korean Company is spending over $100 million dollars in an attempt to take market share away from Sony, Samsung and Panasonic in the flat screen TV market.

    LG’s strategy however is flawed. Rather than be evolutionary like Sony Samsung and Panasonic LG has chosen to be revolutionary. Their strategy is wrapped around the launch of a bright red backed LCD TV called Scarlet.

    Talk to any automotive marketing manager and they will tell you that red cars do not sell and even worse is their resale value.  But to convince consumers to buy a red backed TV which in 2 years time will look so dated is a massive risk.
     

    In an attempt to jack up interest in their new Scarlet TV LG in their wise wisdom decided on a global tease campaign  the company made readers and TV viewers believe that a new movie starring Norwegian model and actress Natassia Scarlet Malthe and produced by David Nutter ? of the hit show “The Sopranos” ? was in the making.

    From billboards and bus shelter posters to online banners, Malthe has made public appearances at film premiers around the world including last night in Sydney in support of her fictitious role, while the ad copy offered no hint of LG. Also in toe was Director David Nutter who between them they are believed to be netting in excess of $15M dollars.

    Click to enlarge
    Graham Cunningham LG sales Spruikes Scarlet TV

    Click to enlarge
    LG sales boss spruiks Scarlet


    Not making a show at the local Scarlet TV launch was Aussie actors Gary Sweet or former Home and Away star Sharni Vinson who appear in the tease trailer alongside Natassia Scarlet Malthe. Also missing was recently appointed LG Marketing Director David Brand who gave the event a pass in favour of LG marketing events in New York and Paris.

    “To spend money without letting people know about our brand is really risky. But that’s the punch line of this campaign. It will change the rules of the game,” Lee Kwan-sup, vice president of LG’s Digital Display Global Brand Marketing Team, said, adding his company can’t match its bigger rivals on media spending.

    “What we really want is to increase our brand recognition. Strengthening consumers’ emotional attachment to that brand is the key to long-term success,” Lee said.
     


    The only problem is that the new Scarlet LCD TV is very ordinary up against some tough new offerings from Samsung, Panasonic and Sony the current market leader in the TV market.

    Rather than be evolutionary LG is banking on being revolutionary and like the big budget tease flick the TV lacks any substance above and beyond what LG has offered in LCD TV’s in the past. This is the same Company that 3 years ago rolled out the Internet fridge which at the time they said would be a big hit. Today I cannot find one retailer stocking the fridge let alone a consumer owning one.

    The post LG Scarlet TV Launch More C Grade Than A grade appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/lg-scarlet-tv-launch-more-c-grade-than-a-grade/feed/ 0
    Tech Companies To Benefit From Company Tax Cut https://smartoffice.com.au/tech-companies-to-benefit-from-company-tax-cut/ https://smartoffice.com.au/tech-companies-to-benefit-from-company-tax-cut/#respond Thu, 30 Dec 1999 13:50:00 +0000 http://smartoffice.com.au/tech-companies-to-benefit-from-company-tax-cut/ A Tony Abbott led Government will reduce the rate of company tax to 28.5 per cent from July 1, 2013 the Liberal Party have announced today.

    The post Tech Companies To Benefit From Company Tax Cut appeared first on Smart Office.

    ]]>
    A Tony Abbott led Government will reduce the rate of company tax to 28.5 per cent from July 1, 2013 the Liberal Party have announced today.

    Abbott claims that the $2.55 billion costing will be funded from savings already announced by the Coalition. The current company tax rate is 30 per cent.

    “If there are lower taxes on companies we will have more successful companies, we will have a more prosperous economy, and that is good for every single Australian,” Abbott said.

    During the past few days Treasurer Wayne Swann has accused Abbott of introducing a Woolworths/Coles Tax to fund his parental leave initiatives. Swan said that the cost of the program funded by an increase in Company Tax would hurt Australians due to a big new Liberal party Company tax.

    Mr Abbott said today that this is not correct and that the Coalition would always be the low-tax party.

    The post Tech Companies To Benefit From Company Tax Cut appeared first on Smart Office.

    ]]>
    https://smartoffice.com.au/tech-companies-to-benefit-from-company-tax-cut/feed/ 0