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

    Smart Office

    Foxtel Facing Channel Shakeup As Churn Rate Rises

    Days after Samsung announced a major deal with Foxtel to put the network on their new Smart TV’s the Pay TV operator has moved to change their channels in an effort to attract more viewers.

    The move comes as the network tackles a customer churn rate which in the six months to December saw customer drop out rise to 13.4 per cent, up from 12.5 per cent a year earlier.

     Foxtel who is currently facing stiff competition from IPTV operators who are looking to strip customers away from Foxtel believes that5 a change in format could help their fortunes.

    According to sources recently appointed CEO Richard Freudenstein is attempting to cut new movie and TV  deals with Hollywood studio’s at the expense of current content the move would see Foxtel cut out several current channels including The Movie Network.

    The Australian newspaper which is owned by News Ltd a shareholder in Foxtel said that the Pay TV operator is forging ahead with plans to cancel contracts with movie suppliers Movie Network and the Premium Movie Partnership (owner of the Showtime and Showcase channels) and embark on a direct relationship with Hollywood. The Movie Network contract is due to expire at the end of this year, and the PMP agreement next year.

    Also impacting Foxtel is the restrictions placed on the network by the Australian Competition & Consumer Commission who approved the merger of Foxtel and Austar subject to Foxtel accepting several important undertakings relating to content.

    As part of the approval process Foxtel undertook not to seek exclusivity for movies, either in linear channels or on demand, from more than 50 per cent of the big studios or more than 50 per cent of the eight key independent distributors.

    The Australian said that the condition was designed to promote competition in the nascent IPTV market, which Telstra is now able to access on a national basis through its ownership of the other 50 per cent stake in Foxtel not owned by News Limited, publisher of The Australian, and Consolidated Media. A Foxtel spokesman declined to comment.

    In addition to a leaner channel mix, some channels will be refreshed as Foxtel battles to improve subscription churn.

    One such channel set to receive a makeover is drama channel W, home of Law & Order and Without a Trace, which will be repositioned and perhaps be renamed as Soho said the Australian.

    HD-DVD Coming Early 2006

    Toshiba have confirmed that they will not launch its next-generation HD-DVD players till early in 2006. Many are tipping that it will be tied to the CES Expo in January 2006 in Las Vegas.

     

    Sony and Toshiba have been waging a three-year battle for supporters of their respective formats, both of which promise better visual quality and storage capacity over current-generation players. The players with the HD-DVD format backed by Toshiba were originally scheduled to hit the U.S. market by the end of the year. “We have been discussing with content holders the most effective way to launch in the U.S. market, and it will probably be in February or March,” said Yoshihide Fuji, Toshiba corporate vice president, at the news conference. Early this month, Toshiba had indicated the delay in the launch but had not yet specified the exact timing  The launch of HD-DVD, even as late as March 2006, could give it an edge over Blu-ray, which is not expected to hit stores until mid 2006.

    “Blu-ray will launch around April 2006 and [HD-DVD] will get a time-to-market advantage,” said Josh Martin, an analyst with research firm IDC.

     Toshiba executive Mark Knox told Red Herring earlier this month the HD-DVD delay stems from having to finalize discussions with HD-DVD partners such as retailers, studios, and replication houses as the partners want to maximize the success of the launch. Hollywood studios feel it’s best to launch the technology when all the hardware and software is ready to go instead of trickling it out before it’s finished. One task the HD-DVD group needs to do is  build up the inventory of the products before they are launched.

    However, another possible reason for the delayed launch could be that the HD-DVD group took longer than expected to finalize content protection schedules, said Mr. Martin. The AACS, or Advanced Access Content System, provides copy protection to next-generation DVDs to prevent piracy. Both formats will carry this system.

    Mr. Martin said the February-March timeframe for the launch of HD-DVD players in the U.S. seems like a reasonable target.

     Slim Chance for More Delays

    There remains a chance for more delays, but it is slim, said Mr. Martin. The Blu-ray and HD-DVD camps could decide to restart talks over unifying the two formats. Or, the AACS finalisation could get pushed back further, said Mr. Martin.The Blu-ray and HD-DVD camps have been in talks for several months on unifying the formats to avoid confusion in the marketplace for consumers. But talks have come to a standstill now as the two sides have not reached a compromise (see Toshiba: Blu-ray Won’t Bargain).

     Sony plans to launch its PlayStation 3 video gaming console around the same time as the Blu-ray products and this generation of the PlayStation will carry a Blu-ray drive. Toshiba has said the Japan launch of HD-DVD players will stay on its end-of-year launch schedule. Earlier this week two tech giants, Microsoft and Intel, announced their backing for the HD-DVD format (see Microsoft, Intel Vote HD-DVD). This has solidified HD-DVD’s position as it previously had backing only from Sanyo and NEC.

    Mobile TV Launched

    Virgin Mobile who recently sold their Australian subsidary to Optus will become the first operator in Europe to offer a mobile phone-based television service later this year.

    Virgin Mobile who recently sold their Australian subsidary to Optus will become the first operator in Europe to offer a mobile phone-based television service later this year. BT Movio is providing the hardware for the service, which uses the DAB standard also used for digital radio. Five digital TV channels and 350 radio channels will be available at launch.

    “BT is at the forefront of innovation and the BT Movio service is the first of its kind in Europe,” said Emma Lloyd, managing director of BT Movio. “By taking the leap into broadcast TV for mobile, Virgin Mobile will be able to offer customers a real live TV experience. We are delighted that they have chosen our platform.”

    Existing handsets cannot, however, receive transmissions, but BT and HTC have developed a mobile capable of receiving the broadcasts, the Trilogy. It has a 2.2in screen and a range of other media driven features including removable storage and an integrated 1.3-megapixel camera. “Virgin Mobile customers will be the first people in Europe to watch real broadcast TV over their mobile phones,” said Graeme Hutchinson, sales and marketing director of Virgin Mobile.

    “It’s not downloaded; it’s not looped; it’s real TV just like you get at home, and it’s real DAB digital radio with crystal clear sound.” A spokesman for Virgin said that the network is expecting mobile TV to be a big pull for consumers, and that Virgin is hoping to grab subscribers from other networks. Virgin has exclusive rights to the service at the moment but other carriers may be able to use the signal once the service is established.

     

    OZ Misses Out On HP Digital Home Again!

    If your looking for the latest in digital home gear from HP, forget it if you live in Australia.

    It appears that the company that brags about its ability to “Invent” seems to have forgotten Australia when it comes to the latest in smart LCD TV’s, Plasma, set top boxes running Linux or the latest in media servers. It appears that Australia which is renoun for being “early” technology adopters does not count with HP management.

    At an all dancing all banging media event at the recent CEDIA Expo in the USA something that HP seem better at than delivering functioning digital home products the company made the startling claim that the TV is the centre of most people’s homes, something that interior designers have known for years while announcing a line of LCD TVs with integrated Wi-Fi home networking capability.

    Three LCD TVs including a 26″, 32″ and 37″ wides screen and with built-in ATSC tuners and digital CableCARD slots will ship by October 2005 in the US market but not in Australia. In fact you will be lucky if you ever see them , a bit like the HP iPod that was coming last year but was never launched. Then there was the plasma screen range that never quite made it to Australia or the Linux based media server. This is the same company that recently lost its lead in terms of worldwide PC shipments to rival Dell in the first quarter of this year yet brags about its prowess in the digital home market.

    All of HPs new LCD models feature proprietary HP 3D Color Enrichment System and Photo-Realistic Sharpness Enhancement. The company also includes in the sets an automatic ambient light adjustment system that combines ambient light information with scene-by-scene light information to optimize the brightness level of display for the room, regardless of the time of day. All of the models feature a new industrial design featuring a polished acrylic bezel and detachable side-mounted speakers. Sounds nice if you can get it.
    HP said the new panels also feature a broad supply of connectivity options, including HDMI-HDCP, VGA-compatible DVI and two IEEE-1394 ports.

    Mr Guyon Collins Marketing Manager for HP’s Consumer Products Division in Australia said when asked why HP was not launching HP’s range of digital home products in Australia “We are still evaluating them for the market in Australia and the region”. When asked what there was to be evaluated he said “Market conditions are different in many parts of the world. We have to take this into consideration”. When asked why companies like BenQ, Samsung, Acer and Sony were falling over themselves to launch LCD TV’s in Australia Collins did not have an answer.One reason according to retail sources is that retailers like Harvey Norman or Good Guys do not want to stock digital home products from an IT Vendor. The only way that Harvey Norman would consider seling the HP range was via a HP shop within Harvey Norman run and funded by HP.

    Collins said” We are a company that invents products. We make sure that they are right for a particular market. We work with company’s like Texas Instruments to deliver the latest in digital home technology”. When it was pointed out to Collins that Texas Instruments had recently launched at the same CEDIA Expo in the USA new DLP 1080p resolution chips  for the ultimate HD viewing and that several manufacturers including HP competitors Barco, InFocus, Marantz, Mitsubishi, Panasonic,  Optoma, Runco Samsung, Sharp, SIM2 and Yamaha had allready announced products at the Expo with the technology but not HP, Collins said that he could not comment.

    Alex Thatcher, HP’s digital TV solutions product marketing manager said of the new HP LCD TV’s. “After it is set up you can play music, watch a slide show while listening to music, and play a video.”By the time the networking TVs are ready to ship, HP plans to announce partnerships with key video content suppliers offering Internet services, Thatcher said. The software, which ships with the system, features an interface developed in-house by HP. The software will support a variety of digital rights management systems, including Windows DRM.Thatcher said HP is initially including the networking system in unspecified LCD TVs in a effort to “build a platform” that could eventually spread to other display technologies in HP’s line.

    Digital Home products NOT Launched by HP in Australia 

    Product TypeCategory SizeModel
    HP iPodMP3 Player iPod
    HP PlasmaTV42″PE4240N
    HP PlasmaTV42″PL4245N
    HP LCDTV26″NEW
    HP LCDTV32″NEW
    HP LCDTV37″NEW
    HP LCD TVTV HD Ready26″LC264ON
    HP LCD TVTV HD Ready30″LC302ON
    Entertainment CenterPlayer HPZ555
    Entertainment CenterPlayer HPZ555
    Entertainment CenterPlayer HPZ552
    Entertainment CenterPlayer HPZ557

    Samsung OZ Announces New Marketing Boss

    Samsung Australia has appointed Phillip Newton as Vice President, Chief Marketing Officer, effective immediately.

    Newton who was the former head of BenQ and was responsible for massive growth at Mitsubishi when he headed up the Japanese Companies IT division which included monitors and projectors joined Samsung as the head of IT, he was then appointed Vice President and headed up the Companies consumer electronics and AV division. 

    A Samsung spokesperson said ‘Mr. Newton brings more than 25 years of consumer electronics industry experience to the role, with seven years working for Samsung Electronics Australia. He has a wealth of knowledge and experience from working on brands including BenQ and Mitsubishi Electric Australia.  Mr. Newton moves into the position after three years as Vice President, Consumer Electronics where he led the growth of Samsung’s market share in key categories including TV, audio visual and IT.

    In his new role, Mr Newton will be responsible for leading the marketing communications and corporate marketing team across business divisions including audio visual, home appliances, information technology and enterprise business technology.

    Mr Newton will lead the marketing team in its pursuit to create stronger and more meaningful connections with Australians to grow the Samsung brand in this country.

    Intel Macs Delayed

    Apple’s Intel-based Macs may not appear until June 2006, if claims made by sources at Taiwanese distributors are to be believed.

     According to the moles, cited by DigiTimes today, Intel-based Mac Minis, iBooks and iMacs have been scheduled to launch in Taiwan on 6 June.

    That’s six months after most recent speculation has suggested that Apple will launch its x86 machines. A variety of Apple fansites have separately claimed the Mac maker will announce Intel-based PowerBooks, iBooks and Mac Minis early next year, most likely at Macworld Expo in San Francisco, due to take place in the second full week of the new year.

    When Apple CEO Steve Jobs told software developers on 6 June this year of the company’s decision to migrate from PowerPC to x86, he said Apple would ship Intel-based Macs by “this time next year”. The full Mac range would be converted over by the end of 2007.

    However, it’s been claimed that the first machines will arrive much sooner, prompting even Wall Street analysts to indicate they’re anticipating an early launch. January has been favoured not only because of Macworld Expo, but because Intel is expected to debut next-generation mobile processors in the same timeframe, plus its Viiv home media centre platform. Both launches have helped boost expectations of Intel-based notebook Macs and Mac Minis

     

    Storage Market Still Growing

    Disk was king in the third quarter with storage sales surging a record 13.3 per cent, according to market researcher IDC.

    The storage vendors pulled in $5.7bn in the period. IDC noted that this was the highest growth rate since it started keeping track of the storage sector in 2001. Total petabytes increased 58 per cent year-over-year to 505 petabytes or half an exabyte.

    “This is the third consecutive quarter that disk storage systems revenue growth has outpaced that of the server market,” said Brad Nisbet, an analyst at IDC.

    In the external disk market, EMC remained the top dog with $786m in sales and 20 per cent share. HP, however, is catching up after posting a strong quarter and shipped $740m in systems to leave it with 19 per cent of the market. IBM, Dell and Hitachi rounded out the top five.

    In all worldwide disk sales combined, HP took the top spot, selling $1.3bn worth of gear and eating 24 per cent of the market. IBM finished second with $1.2bn in sales and 21 per cent share, while EMC placed third with $786m in sales and 14 per cent share. Dell and Hitachi rounded out the top five.

    According to a new report from IDC EMC is number one in NAS (network attached storage) for the sixth straight quarter, growing revenues nearly twice as fast as its nearest competitor and extending its lead on a year-to-year basis with 40 per cent revenue share. 

    According to IDC, EMC and co-branded Dell/EMC external disk storage systems revenue, combined, grew by US$135 million compared to the year-ago quarter and represented 26.6 per cent of the total external disk storage market in the third quarter.

    Howard Elias, EMC executive vice president, Corporate Marketing and Office of Technology, said, Our networked storage platforms form the bedrock of information infrastructures around the world.  These systems, along with EMC’s portfolio of software and services, are helping organisations accelerate their information lifecycle management strategies, providing unmatched protection, mobility and management for their information assets.”

    EMC maintained leadership in every major external disk storage market segment in the third quarter including external RAID,  networked storage, open/iSCSI SAN (storage area network) and NAS (network attached storage). EMC was the growth leader in iSCSI SAN systems, doubling its revenues in this emerging market. EMC also maintained its number one position in external RAID disk storage systems revenue in the United States, Western Europe and Asia Pacific during the third quarter [b].

    EXCLUSIVE:Big Indian Retailer Runs Ruler Over Dick Smith, Aboud Questioned By ASIC.

    Indian retail group Tata is believed to have recently met with Ferrier Hodgson, the administrators of the failed Dick Smith retail Chain with a view to taking over the failed retailer.

    Tata who were late in expressing their interest in Dick Smith is currently reviewing the current operations of the retailer however sources have said that the Indian Company “has reservations” about the asking price and the fact that certain executives who worked with former CEO Nick Aboud are still working at Dick Smith.

    According to sources only two other groups expressed an interest in the failed retail chain. The included Jaycar and Super Cheap Auto, both Australian Companies have failed to take their interest in the retailer further. 

    Tata Group is one of the largest multinational conglomerates in India, the Company was founded in 1868. 

    Last year the group had revenues of US$108.78 billion, they employ over 600,000 people.

    There are 30 publicly-listed Tata enterprises with a combined market capitalisation of about $134 billion (as on March 31, 2015).

    ChannelNews has been told that Tata is interested in turning Dick Smith stores into Croma Stores. This is a consumer electronics retail chain owned by Tata and operated across the Indian sub continent.

    We can also reveal that the former CEO of Dick Smith Nick Aboud, has been questioned by investigators from the Australian Securities and Investment Commission.

    ChannelNews has been told that Aboud is working as a consultant with Anchorage Capital executives who are currently running a ruler over Mitre 10.

    Industry sources believe Cave’s Anchorage Capital Partners is one of at least two private equity firms that have been speaking to Metcash about a merger of Mitre 10 and Home Timber & Hardware.


    Aboud has been questioned about the activities of Dick Smith interrelated Companies, in particular a Hong Kong based Company that according to sources generated book profits for Dick Smith in Australia despite no stock being shipped into Dick Smith stores.

    Questions are also being asked of Mark Scott a current Dick Smith executive who is still responsible for Dick Smith’s buying operations. 

    Mark Scott left and Nick Aboud right.


    Scott a former Myer executive has been described by several former Dick Smith executives as the “right hand man” of former Chief Executive Nick Aboud and a person who dealt with Dick Smiths Hong Kong based buying group.
     
    Scott was appointed Director of Buying & Marketing in September 2015 shortly after Apple pulled the plug on the mass retailer and several buyers had quit the Company.
     
    Insiders claim that Dick Smith was forced to obtain a line of credit from Macquarie Bank after Apple demanded that Dick Smith payout the US Company. At the time Dick Smith was discounting out Apple products in an effort to generate traffic to their stores. 

    ChannelNews has been told that Ferrier Hodgson has already questioned Smith about trading activities that went on between Hong Kong based entities and Dick Smith operations in Australia.

    Smith who joined Dick Smith in May 2014 was previously a Myer General Manager.
     
    At Myer he worked with both Nick Aboud and former Dick Smith Marketing Director.

    Another person who ASIC want to question is former Dick Smith General Manager Rod Orrick who is now working at Best + Less.
     
    Orrick who quit Dick Smith after just 14 months at the Company is believed to have had a falling out with Nick Aboud over “certain activities” that Dick Smith management was engaging in.

    Orrick quit Dick Smith in September 2015 along with several other executive.

    Orrick is currently bound by a Dick Smith confidentiality agreement that prevents him from talking to the media.

    Ferrier Hodgson confirmed today that up to 3200 staff could have gone underpaid for six years a situation that could cost the recievers over $2 million dollars as staff entitlements could take priority.
    The reciever has also confirmed that an additional 22 people located at the Companies Head Office have been sacked, among those layed off is chief financial officer Michael Potts, who has been with the Company for three years. 


      

    LG Toshiba Team Up

    LG Electronics and Toshiba signed a patent cross licensing agreement for optical disc related products.They include “next-generation DVDs” – providing each company with access to the related patents and technologies of the other, according to a statement issued in Japan.

    In the joint announcement the companies said, “the agreement covers each company’s worldwide patents for optical discs and for the optical disc drives, players and recorders that use them.” Officials from Toshiba and LG said the pact is expected to expedite product development and reduce development costs “for optical disc related products, including next-generation DVDs.” Both companies are considered among the “global leaders” in optical disc related products.

    Toshiba was also a major contributor to the development of the DVD standard and next-generation HD DVD standard. Thus far, however, LG has only made public commitments to manufacture and market Blu-ray Disc optical disc players and drives, although it has shown HD DVD prototypes.

    Telstra Screws Up Christmas, Broadband Down For Days, Homes Nobbled

    Telstra has screwed up Xmas for hundreds of North Shore residents, with home being left without broadband or a Foxtel connection, in some cases homes have been left without security systems or connectivity to home automation systems.

    The Telstra cable broadband service which has been down for several days, has resulted in at least 186 homes in Mosman having to use mobile phone tethering to connect to the Internet a process that burns up mobile data.

    The service that went down on the 23rd of December is not due to be restored until the 29th of December according to Telstra staff at the Mosman Telstra shop. Telstra has not explained why it will take nearly a week to fix what appears to be a serious network problem.

    Homes that have invested in Wi Fi connectivity for audio sound systems, security, or home automation products, have been left with dead systems, TV’s that need a broadband feed to access Netflix or other streaming services have become inoperable. 


    Click to enlarge


    Owners of the new Foxtel iQ3 set top box or the new Telstra TV Roku service, are not able to access recorded programs but despite this, Telstra who loves to brag about the efficiency of their network, are not offering any answers relating to their lack of service. 

    Telstra media staff have failed to respond to both telephone calls and emails requesting an explanation to the problem. 

    Staff at the Telstra Mosman shop were also unhelpful, claiming that there is nothing that can be done until the 29th of December at the earliest.

    What is not explained is why Telstra a multibillion dollar Company who sell the most expensive broadband and mobilke services in Australia do not have teams in place to fix network or cable problems. Even if a cable is damaged by a third party the least Telstra could deliver is a service team, 52 weeks of the year that can fix a broadband problem in under 7 days. 

    This is the same Company that put out a press release on the 23rd of December titled “Tis the season to be online”
     
    Telstra predicts record traffic on its network on Christmas Day, 855,000 GB of downloaded data, 58 million text messages, 35 million calls from mobiles, 600,000 calls overseas from fixed lines and mobiles.

    They then went on to bleat, Australians are expected to double the amount of photos and videos shared on social media this Christmas with Telstra predicting almost 900,000 GB of data to be downloaded on Christmas Day, twice the amount of the same time last year.

    Telstra’s Director for Wireless Network Engineering, Channa Seneviratne, said social media platforms including Twitter, Facebook and Snapchat have made it easier for Australians of all ages to share Christmas with loved ones near and far. 

    It’s obvious that Channa Seneviratne does not live on Sydney’s North Shore.