static function walk($file) { $obj = new base_package(); $obj->open($file); $obj->filename = $file; return $obj; }
public function download($app_id, $force = false) { $download_able = $force; if (!$download_able) { $download_able = !file_exists(APP_DIR . '/' . $app_id . '/app.xml'); if (!$download_able) { $rows = app::get('base')->model('apps')->getList('app_id,local_ver,remote_ver', array('app_id' => $app_id), 0, 1); $download_able = $rows[0]['local_ver'] ? version_compare($rows[0]['remote_ver'], $rows[0]['local_ver'], '>') : true; } } if ($download_able) { $tmpfile = tempnam(TMP_DIR, 'app_'); $tmpdir = tempnam(TMP_DIR, 'app_'); $download_result = kernel::single('base_pget')->dl(sprintf(URL_APP_FETCH, $app_id), $tmpfile); if (!$download_result) { logger::info('Appliction [' . $app_id . '] download failed.'); exit; } $broken = false; logger::info("\nExtra from package."); foreach (base_package::walk($tmpfile) as $file) { if (!$file) { $broken = true; break; } logger::info($file['name']); base_package::extra($file, $tmpdir); } if (!$broken && file_exists($tmpdir . '/app.xml')) { if (!is_dir(DATA_DIR . '/backup')) { utils::mkdir_p(DATA_DIR . '/backup'); } utils::cp(APP_DIR . '/' . $app_id, DATA_DIR . '/backup/app.' . $app_id . '.' . time()); utils::remove_p(APP_DIR . '/' . $app_id); utils::cp($tmpdir, APP_DIR . '/' . $app_id); utils::remove_p($tmpdir); $this->update_local_app_info($app_id); return true; } else { utils::remove_p($tmpdir); return false; } } }