diff options
Diffstat (limited to 'modules-available/minilinux/page.inc.php')
-rw-r--r-- | modules-available/minilinux/page.inc.php | 148 |
1 files changed, 97 insertions, 51 deletions
diff --git a/modules-available/minilinux/page.inc.php b/modules-available/minilinux/page.inc.php index 7c7e3d36..8004f1ab 100644 --- a/modules-available/minilinux/page.inc.php +++ b/modules-available/minilinux/page.inc.php @@ -25,42 +25,75 @@ class Page_MiniLinux extends Page } User::assertPermission('view'); + Dashboard::addSubmenu('?do=minilinux', Dictionary::translate('menu-versions')); + Dashboard::addSubmenu('?do=minilinux&show=sources', Dictionary::translate('menu-sources')); } protected function doRender() { - Render::addTemplate('page-minilinux', ['default' => Property::get(MiniLinux::PROPERTY_DEFAULT_BOOT)]); + $show = Request::get('show', 'list', 'string'); + if ($show === 'list') { + // List branches and versions + $branches = Database::queryAll('SELECT sourceid, branchid, title, color, description FROM minilinux_branch ORDER BY title ASC'); + $versions = MiniLinux::queryAllVersionsByBranch(); + $usage = MiniLinux::getBootMenuUsage(); + $sourceList = []; + // Group by branch for detailed listing, add usage info + foreach ($branches as &$branch) { + // Little hack: We abuse the title for ordering, so if the second char is a space, assume the first one + // is just for sort order and remove it. + if ($branch['title'][1] === ' ') { + $branch['title'] = substr($branch['title'], 2); + } + $bid = 'div-' . str_replace('/', '-', $branch['branchid']); + if (!isset($sourceList[$branch['sourceid']])) { + $sourceList[$branch['sourceid']] = ['sourceid' => $branch['sourceid'], 'list' => []]; + } + $sourceList[$branch['sourceid']]['list'][] = [ + 'title' => $branch['title'], + 'color' => $branch['color'], + 'bid' => $bid + ]; + $branch['bid'] = $bid; + if (isset($versions[$branch['branchid']])) { + $branch['versionlist'] = $this->renderVersionList($versions[$branch['branchid']], $usage); + } + } + unset($branch); + $sourceList = array_values($sourceList); + } elseif ($show === 'sources') { + // List sources + $res = Database::simpleQuery('SELECT sourceid, title, url, lastupdate, pubkey FROM minilinux_source ORDER BY title, sourceid'); + $sourceViewData = ['list' => [], 'show_refresh' => true]; + $tooOld = strtotime('-7 days'); + $showRefresh = strtotime('-5 minutes'); + foreach ($res as $row) { + $row['lastupdate_s'] = Util::prettyTime($row['lastupdate']); + if ($row['lastupdate'] != 0 && $row['lastupdate'] < $tooOld) { + $row['update_class'] = 'text-danger'; + } + if ($row['lastupdate'] > $showRefresh) { + $sourceViewData['show_refresh'] = false; + } + $sourceViewData['list'][] = $row; + } + } + // Output + Render::addTemplate('page-minilinux', [ + 'default' => Property::get(MiniLinux::PROPERTY_DEFAULT_BOOT), + 'sources' => $sourceList ?? null, + ]); // Warning if (!MiniLinux::updateCurrentBootSetting()) { Message::addError('default-not-installed', Property::get(MiniLinux::PROPERTY_DEFAULT_BOOT)); } - // List branches and versions - $branches = Database::queryAll('SELECT sourceid, branchid, title FROM minilinux_branch ORDER BY title ASC'); - $versions = MiniLinux::queryAllVersionsByBranch(); - // Group by branch for detailed listing - foreach ($branches as &$branch) { - if (isset($versions[$branch['branchid']])) { - $branch['versionlist'] = $this->renderVersionList($versions[$branch['branchid']]); - } - } - unset($branch); - Render::addTemplate('branches', ['branches' => $branches]); - // List sources - $res = Database::simpleQuery('SELECT sourceid, title, url, lastupdate, pubkey FROM minilinux_source ORDER BY title, sourceid'); - $data = ['list' => [], 'show_refresh' => true]; - $tooOld = strtotime('-7 days'); - $showRefresh = strtotime('-10 minutes'); - while ($row = $res->fetch(PDO::FETCH_ASSOC)) { - $row['lastupdate_s'] = Util::prettyTime($row['lastupdate']); - if ($row['lastupdate'] != 0 && $row['lastupdate'] < $tooOld) { - $row['update_class'] = 'text-danger'; - } - if ($row['lastupdate'] > $showRefresh) { - $data['show_refresh'] = false; - } - $data['list'][] = $row; + if (isset($branches)) { + Render::addTemplate('branches', ['branches' => $branches]); + } elseif (isset($sourceViewData)) { + Render::addTemplate('sources', $sourceViewData); + } else { + Message::addError('main.invalid-action', $show); } - Render::addTemplate('sources', $data); } protected function doAjax() @@ -74,23 +107,26 @@ class Page_MiniLinux extends Page } } - private function renderVersionList($versions) + private function renderVersionList(array $versions, array $usage): string { $def = Property::get(MiniLinux::PROPERTY_DEFAULT_BOOT); - $eff = Property::get(MiniLinux::PROPERTY_DEFAULT_BOOT_EFFECTIVE); + //$eff = Property::get(MiniLinux::PROPERTY_DEFAULT_BOOT_EFFECTIVE); foreach ($versions as &$version) { $version['dateline_s'] = Util::prettyTime($version['dateline']); - $version['orphan'] = ($version['orphan'] > 2); + $version['orphan'] = ($version['orphan'] > 0 && $version['installed'] == MiniLinux::INSTALL_MISSING) || ($version['orphan'] > 1); $version['downloading'] = $version['taskid'] && Taskmanager::isRunning(Taskmanager::status($version['taskid'])); - if ($version['installed'] && $version['versionid'] !== $def) { + if ($version['installed'] != MiniLinux::INSTALL_MISSING && $version['versionid'] !== $def) { $version['showsetdefault'] = true; } if ($version['versionid'] === $def) { $version['isdefault'] = true; - if (!$version['installed']) { + if (!$version['installed'] != MiniLinux::INSTALL_OK) { $version['default_class'] = 'bg-danger'; } } + if (isset($usage[$version['versionid']])) { + $version['usage'] = $usage[$version['versionid']]; + } } return Render::parse('versionlist', ['versions' => array_values($versions)]); } @@ -103,7 +139,8 @@ class Page_MiniLinux extends Page if ($versionid === false) { die('What!'); } - $ver = Database::queryFirst('SELECT versionid, taskid, data, installed FROM minilinux_version WHERE versionid = :versionid', + $ver = Database::queryFirst('SELECT versionid, description, taskid, data, installed + FROM minilinux_version WHERE versionid = :versionid', ['versionid' => $versionid]); if ($ver === false) { die('No such version'); @@ -115,7 +152,7 @@ class Page_MiniLinux extends Page } $data['versionid'] = $versionid; $data['dltask'] = MiniLinux::validateDownloadTask($versionid, $ver['taskid']); - $data['verify_button'] = !$verify && $data['dltask'] === false; + $data['verify_button'] = !$verify && $data['dltask'] === null; if (is_array($data['files'])) { $valid = true; $sort = []; @@ -139,7 +176,7 @@ class Page_MiniLinux extends Page if (isset($file['mtime'])) { $file['mtime_s'] = Util::prettyTime($file['mtime']); } - if ($data['dltask']) { + if ($data['dltask'] !== null) { $file['fileid'] = MiniLinux::fileToId($versionid, $file['name']); } } @@ -147,14 +184,17 @@ class Page_MiniLinux extends Page array_multisort($sort, SORT_ASC, $data['files']); if (!$valid) { $data['verify_button'] = false; - $data['download_button'] = !$data['dltask']; - if ($ver['installed']) { - MiniLinux::setInstalledState($versionid, false); + if ($ver['installed'] != MiniLinux::INSTALL_MISSING) { + MiniLinux::setInstalledState($versionid, MiniLinux::INSTALL_BROKEN); } - } elseif (!$ver['installed'] && $verify) { - MiniLinux::setInstalledState($versionid, true); + } elseif ($ver['installed'] != MiniLinux::INSTALL_OK && $verify) { + MiniLinux::setInstalledState($versionid, MiniLinux::INSTALL_OK); } } + if ($data['dltask'] !== null || $ver['installed'] != MiniLinux::INSTALL_MISSING) { + MiniLinux::checkStage4($data, $data['s4_errors']); + } + $data['changelog'] = Util::markup($ver['description'] ?? ''); echo Render::parse('filelist', $data); } @@ -164,7 +204,7 @@ class Page_MiniLinux extends Page const FILE_CHECKSUM_BAD = 3; const FILE_NOT_READABLE = 4; - private function getFileState($versionid, $file, $verify) + private function getFileState(string $versionid, array $file, bool $verify): int { $path = CONFIG_HTTP_DIR . '/' . $versionid . '/' . $file['name']; if (!is_file($path)) @@ -191,15 +231,15 @@ class Page_MiniLinux extends Page { switch ($state) { case self::FILE_CHECKSUM_BAD: - return Dictionary::translate('file-checksum-bad', true); + return Dictionary::translate('file-checksum-bad'); case self::FILE_SIZE_MISMATCH: - return Dictionary::translate('file-size-mismatch', true); + return Dictionary::translate('file-size-mismatch'); case self::FILE_MISSING: - return Dictionary::translate('file-missing', true); + return Dictionary::translate('file-missing'); case self::FILE_NOT_READABLE: - return Dictionary::translate('file-not-readable', true); + return Dictionary::translate('file-not-readable'); case self::FILE_OK: - return Dictionary::translate('file-ok', true); + return Dictionary::translate('file-ok'); } return '???'; } @@ -212,7 +252,7 @@ class Page_MiniLinux extends Page die('No version'); } $task = MiniLinux::downloadVersion($version); - if ($task === false) { + if ($task === null) { Message::addError('no-such-version', $version); Message::renderList(); } else { @@ -234,7 +274,6 @@ class Page_MiniLinux extends Page Message::addError('no-such-version'); return; } - MiniLinux::setInstalledState($version['versionid'], false); $path = CONFIG_HTTP_DIR . '/' . $version['versionid']; $task = Taskmanager::submit('DeleteDirectory', [ 'path' => $path, @@ -243,8 +282,10 @@ class Page_MiniLinux extends Page if ($task !== false) { $task = Taskmanager::waitComplete($task, 2500); if (Taskmanager::isFailed($task)) { + MiniLinux::setInstalledState($version['versionid'], MiniLinux::INSTALL_BROKEN); Message::addError('delete-error', $versionid, $task['data']['error']); } else { + MiniLinux::setInstalledState($version['versionid'], MiniLinux::INSTALL_MISSING); Message::addSuccess('version-deleted', $versionid); } } @@ -252,15 +293,20 @@ class Page_MiniLinux extends Page private function updateSources() { + User::assertPermission('view'); // As it doesn't really change anything, accept view permission $ret = MiniLinux::updateList(); if ($ret > 0) { - sleep(2); - Trigger::checkCallbacks(); + for ($i = 0; $i < 6; ++$i) { + sleep(1); + if (!Trigger::checkCallbacks()) + break; + } } } private function setDefault() { + User::assertPermission('update'); $versionid = Request::post('version', false, 'string'); if ($versionid === false) { Message::addError('main.parameter-missing', 'versionid'); @@ -272,7 +318,7 @@ class Page_MiniLinux extends Page Message::addError('no-such-version'); return; } - Property::set(MiniLinux::PROPERTY_DEFAULT_BOOT, $version['versionid']); + MiniLinux::setDefaultVersion($version['versionid']); } } |