Nic nie dzieje się po cichu
Każda zmiana w /etc/portage jest pokazana przed zapisem, a po nim aplikacja podaje dokładną ścieżkę pliku i dokładną linię, którą dodała. Każdy przycisk uruchamiający polecenie ma w podpowiedzi to polecenie w całości.
Graficzna nakładka na Portage dla Gentoo Linux. Wyszukiwanie i instalacja pakietów, flagi USE z wyjaśnieniem, do czego każda służy, maski i licencje, overlaye i cały cykl aktualizacji systemu.
Każda zmiana w /etc/portage jest pokazana przed zapisem. Interfejs nigdy nie działa jako root.
po zarejestrowaniu overlaya — patrz niżej
Nie są to hasła — z każdej z nich wynika konkretne zachowanie interfejsu, widoczne na ekranie przed każdym zapisem.
Każda zmiana w /etc/portage jest pokazana przed zapisem, a po nim aplikacja podaje dokładną ścieżkę pliku i dokładną linię, którą dodała. Każdy przycisk uruchamiający polecenie ma w podpowiedzi to polecenie w całości.
Dopisujemy linie albo zmieniamy jedną konkretną linię. Komentarze i formatowanie reszty pliku zostają nietknięte.
Wszystko, co wymaga uprawnień, idzie przez pkexec i mały, dający się przeczytać program pomocniczy.
portageNie z parsowania ebuildów. Warstwa core/ to czysty Python bez Qt — da się ją odpytać z terminala.
Kliknięcie odznaki ::repo zawęża nie tylko listę, ale też panel szczegółów, wersje i atom przekazywany emerge. Ten sam pakiet w dwóch overlayach przestaje się zlewać.
Szukanie po nazwie, kategorii i opisie. Filtry repozytoriów, lista wersji, akcje Pretend, Install i Uninstall — każda pokazuje polecenie, zanim je uruchomi.
Sześć kroków, każdy osobno: sync, wiadomości Gentoo, podgląd w formie tabeli, aktualizacja z żywym logiem i przyciskiem „Przerwij”, --depclean, pliki konfiguracyjne.
To, co masz skonfigurowane, z sekcją repos.conf dosłownie — i katalog repozytoriów Gentoo w drugiej zakładce. Włączenie overlaya to jedno kliknięcie.
Dlaczego Portage odmawia: przy masce uwaga maintainera dosłownie wraz z plikiem, z którego pochodzi; przy keywordach rozróżnienie trzech przypadków; przy licencji pełny tekst do przeczytania.
Pliki ._cfg z pakietem, który je przyniósł, i liczbą zmienionych linii. Obok różnica, a pod nią trzy odpowiedzi: zostaw moje, weź nowy, scal ręcznie.
Dwie wartości dla każdej zmiennej: ta zapisana w pliku i ta, której Portage faktycznie używa. Zmiana podmienia jedną linię. MAKEOPTS dostaje podpowiedź z liczby rdzeni i pamięci. EMERGE_DEFAULT_OPTS można tu edytować i dotyczy emerge, które uruchamiasz w terminalu — a nie tych, które uruchamia to okno; te go ignorują, żeby pokazana komenda była całą komendą.
To, co pakiety powiedziały o sobie przy instalacji — komunikaty, które przelatują w terminalu i przepadają. Każdy wpis z klasą i fazą budowania, kolor najpoważniejszej wiadomości na lewej krawędzi wiersza.
Obok siebie dwie rzeczy, które po instalacji wyglądają identycznie: pakiety, o które prosiłeś, i wszystko, co jest zainstalowane. Usunięcie wpisu nic nie odinstalowuje.
Profile z eselect, z zaznaczonym obecnym i wprost powiedzianym, co wynika ze zmiany: inne domyślne flagi USE, inne maski, przebudowa systemu.
Ctrl+1…9 przełącza ekrany, Ctrl+F wchodzi w pole szukania, Ctrl+L skacze do logu.
Dla każdej flagi widać, skąd pochodzi jej wartość — z ebuilda, z profilu, z make.conf, z package.use — oraz opis z repozytorium.
Po rozwinięciu: co dokładnie zmienia jej włączenie, jakie pakiety zostaną wciągnięte i którym wymusi tę samą flagę. Warunki REQUIRED_USE są sprawdzane na bieżąco, a zapis jest zablokowany, dopóki wybór ich nie spełnia.
Na dole panelu — dokładna linia, która pójdzie do pliku, i plik, do którego zostanie dopisana. Przed czymkolwiek.
Uruchomiony przez sudo mówi to w okienku i prosi o zamknięcie. Wszystko, co wymaga uprawnień, przechodzi przez pkexec i dwa małe programy w /usr/libexec.
Oba to pojedyncze pliki korzystające wyłącznie z biblioteki standardowej, bez importów z reszty projektu — napisane tak, żeby dały się przeczytać od początku do końca, zanim zostaną dopuszczone w pobliże roota. Warto to zrobić.
Każdy uprzywilejowany krok pyta o hasło. Obie akcje polkit to auth_admin, a nie ta forma, która pamięta odpowiedź przez kilka minut, więc sześciokrokowa aktualizacja systemu pyta sześć razy. Tamta forma pamięta nie to okno może kontynuować, tylko ten użytkownik uwierzytelnił się do tej akcji — a skorzystać z tego może wszystko, co działa na Twoim koncie.
Bez części uprzywilejowanej aplikacja nadal działa — tylko do czytania: szukanie, przeglądanie flag, emerge --pretend. Każda próba zapisu mówi wtedy, czego brakuje.
make installWybór sprowadza się do tego, czy Portage ma wiedzieć o GentStore.
Bez klonowania. Pobierz skrypt, przeczytaj go, uruchom.
curl -fsSL -O https://raw.githubusercontent.com/\ JamJan05/GentStore/main/packaging/make-overlay.sh less make-overlay.sh sudo bash make-overlay.sh emerge --ask app-portage/gentstore
Skrypt rejestruje /var/db/repos/gentstore jako synchronizowany overlay — kolejne ebuildy przychodzą zwykłym emerge --sync. Wypisuje każdy plik, który zapisuje, i nie nadpisuje niczyich. Przeczytanie go najpierw to wersja, którą projekt zaleca — 200 linii, które zaraz uruchomią się jako root.
Katalogi .qm nie są trzymane w repozytorium.
emerge --ask dev-python/pyqt6 dev-qt/qttools \ app-eselect/eselect-repository sys-auth/polkit python tools/i18n.py compile sudo make install python -m gentstore
Dostajesz wydanie oznaczone tagiem, chyba że powiesz inaczej — instalator pyta, a --stable i --live pomijają pytanie. Ebuild 9999 sortuje się powyżej każdego wydania, jakie kiedykolwiek będzie, więc wybór wydania oznacza świadome niezaakceptowanie live.
| dev-lang/python ≥ 3.12 | środowisko uruchomieniowe |
| sys-apps/portage | moduł portage — dane o pakietach |
| dev-python/pyqt6 | interfejs graficzny |
| dev-qt/qttools[linguist] | lrelease — kompilacja tłumaczeń |
| app-eselect/eselect-repository | overlaye i katalog repositories.xml |
| sys-auth/polkit | pkexec — podniesienie uprawnień |
Opcjonalnie app-portage/gentoolkit (skanowanie GLSA) i app-portage/cpuid2cpuflags. Ich brak wyłącza jedną funkcję i jest zgłaszany w interfejsie — nie kładzie aplikacji.
Warstwa core/ to czysty Python bez Qt, więc da się ją odpytać z terminala. Przydaje się, gdy lista w okienku jest pusta i trzeba wiedzieć, czy problem jest w interfejsie, czy w danych.
python -m gentstore.core.cli info python -m gentstore.core.cli repos -v python -m gentstore.core.cli search mpv python -m gentstore.core.cli show media-video/mpv python -m gentstore.core.cli show dev-libs/zydis --repo guru python -m gentstore.core.cli world
Każde polecenie przyjmuje --json i --debug. To narzędzie deweloperskie — mówi tylko po angielsku, bo nie jest częścią interfejsu.
Wszystkie dziewięć ekranów działa, a obie połowy zostały przećwiczone na żywym systemie: strona tylko do czytania — szukanie, flagi USE, maski, repozytoria, podgląd aktualizacji, pliki konfiguracyjne, make.conf, elog i @world — i ta uprzywilejowana, która zapisała prawdziwe wpisy w package.use, package.license i package.accept_keywords przez pkexec.
write_file sprawdzał, czy ścieżka leży pod repos.conf, i zapisywał, cokolwiek przyszło razem z nią — a Portage scala wszystkie pliki w tym katalogu, więc sekcja [gentoo] nie dodawała repozytorium, tylko zastępowała to, z którego pochodzi każdy pakiet w systemie. Scalanie w cfg_apply brało treść z żądania i nic nie wiązało jej z tym, co użytkownik zobaczył, więc każdy plik ._cfg czekający po aktualizacji był drogą do zapisania obok niego dowolnej treści jako root. Oba naprawione: sprawdzana jest teraz treść, nie tylko ścieżka.
QLabel zgaduje, czy dostał HTML. Atom zaczynający się od operatora mniejszości — zwykły atom z ograniczeniem wersji, jaki wypisuje emerge --autounmask — wygląda jak niezamknięty znacznik, więc panel mówiący *to zostanie zapisane* pokazywał pusty ciąg i zapisywał całość. To samo zgadywanie rysowało opisy pakietów z ebuildów jako znaczniki, przez co znacznik obrazka w takim opisie stawał się żądaniem sieciowym z programu, o którym dokumentacja mówi, że żadnych nie wysyła.
Dwa wyrażenia w parserze wyjścia emerge robiły nawroty: 200 tysięcy znaków zajmowało 128 sekund, a pkg_pretend() z ebuilda uruchamia się właśnie przy --pretend i może wypisać cokolwiek. Oba są teraz liniowe — milion znaków to milisekundy — a wyjście ma limit 16 KiB na linię, co przy okazji zatrzymuje puchnięcie bufora przez cały czas budowania z paskiem postępu.
sudo make install-system albo przeinstalowanie pakietu. Protokół helpera poszedł z 2 na 3, bo replace_line nie kompiluje już wyrażenia regularnego z żądania — ^(a+)+$ ma siedem znaków i nie kończy się nigdy, w procesie działającym jako root, któremu nie wyślesz sygnału. Starszy helper odrzuci każdą podmianę linii; okno to zauważy i powie, ale lepiej wiedzieć wcześniej.
Język bierze się z ustawień systemu; Widok → Język zmienia go bez restartu. Skala interfejsu — 100, 115 albo 130% — jest pod Widok → Rozmiar interfejsu, bo bazowa czcionka 12,5 px jest mała celowo: ekrany pokazują dużo danych naraz.
W ustawieniach także to, jak aplikacja zostaje rootem i ile kopii /etc/portage trzymać.
Skrypt zatrzymuje się przed instalacją i wypisuje polecenie. Uruchamiasz je sam.