diff options
Diffstat (limited to 'modules-available/minilinux/page.inc.php')
-rw-r--r-- | modules-available/minilinux/page.inc.php | 119 |
1 files changed, 72 insertions, 47 deletions
diff --git a/modules-available/minilinux/page.inc.php b/modules-available/minilinux/page.inc.php index 575177a8..8004f1ab 100644 --- a/modules-available/minilinux/page.inc.php +++ b/modules-available/minilinux/page.inc.php @@ -25,47 +25,72 @@ class Page_MiniLinux extends Page } User::assertPermission('view'); - Dashboard::addSubmenu('?do=minilinux', Dictionary::translate('menu-versions', true)); - Dashboard::addSubmenu('?do=minilinux&show=sources', Dictionary::translate('menu-sources', true)); + 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)]); - // Warning - if (!MiniLinux::updateCurrentBootSetting()) { - Message::addError('default-not-installed', 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, description FROM minilinux_branch ORDER BY title ASC'); + $branches = Database::queryAll('SELECT sourceid, branchid, title, color, description FROM minilinux_branch ORDER BY title ASC'); $versions = MiniLinux::queryAllVersionsByBranch(); - // Group by branch for detailed listing + $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']]); + $branch['versionlist'] = $this->renderVersionList($versions[$branch['branchid']], $usage); } } unset($branch); - Render::addTemplate('branches', ['branches' => $branches]); + $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'); - $data = ['list' => [], 'show_refresh' => true]; + $sourceViewData = ['list' => [], 'show_refresh' => true]; $tooOld = strtotime('-7 days'); - $showRefresh = strtotime('-10 minutes'); - while ($row = $res->fetch(PDO::FETCH_ASSOC)) { + $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) { - $data['show_refresh'] = false; + $sourceViewData['show_refresh'] = false; } - $data['list'][] = $row; + $sourceViewData['list'][] = $row; } - Render::addTemplate('sources', $data); + } + // 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)); + } + if (isset($branches)) { + Render::addTemplate('branches', ['branches' => $branches]); + } elseif (isset($sourceViewData)) { + Render::addTemplate('sources', $sourceViewData); } else { Message::addError('main.invalid-action', $show); } @@ -82,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)]); } @@ -111,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'); @@ -123,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 = []; @@ -147,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']); } } @@ -155,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); } @@ -172,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)) @@ -199,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 '???'; } @@ -220,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 { @@ -242,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, @@ -251,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); } } @@ -285,15 +318,7 @@ class Page_MiniLinux extends Page Message::addError('no-such-version'); return; } - Property::set(MiniLinux::PROPERTY_DEFAULT_BOOT, $version['versionid']); - // Legacy PXELINUX boot menu (TODO: Remove this when we get rid of PXELINUX support) - $task = Taskmanager::submit('Symlink', [ - 'target' => $version['versionid'], - 'linkname' => CONFIG_HTTP_DIR . '/default', - ]); - if ($task !== false) { - Taskmanager::release($task); - } + MiniLinux::setDefaultVersion($version['versionid']); } } |