Funkcje
Aktualizacja ccam
Ta strona została przetłumaczona maszynowo z angielskiego. Poprawki są mile widziane. Edytuj tę stronę na GitHub
ccam update pobiera wydanie ccam z GitHub, sprawdza je względem checksums.txt wydania i zastępuje działający plik binarny jedną zmianą nazwy. Używaj go, jeśli zainstalowałeś ccam skryptem instalacyjnym lub z archiwum. ccam nigdy sam nie sprawdza aktualizacji: tylko to polecenie łączy się z GitHub, więc każde inne polecenie działa tak samo bez sieci.
Użycie
ccam update # install the latest release
ccam update --check # only say whether a newer release exists
ccam update --version v0.3.0 # install that release, also an older one
ccam --dry-run update # show what would be downloaded and replaced$ ccam update --check
ccam 0.5.0 is available (you have 0.4.0). Run `ccam update`.
$ ccam --dry-run update
Would update ccam 0.4.0 → 0.5.0:
download https://github.com/jhyunwoo/ccam/releases/download/v0.5.0/ccam_linux_amd64.tar.gz
verify with https://github.com/jhyunwoo/ccam/releases/download/v0.5.0/checksums.txt
replace /home/you/.local/bin/ccam
$ ccam update
→ downloading https://github.com/jhyunwoo/ccam/releases/download/v0.5.0/ccam_linux_amd64.tar.gz
✓ Updated ccam 0.4.0 → 0.5.0 (/home/you/.local/bin/ccam)Gdy nie ma nowszego wydania, ccam wypisuje ccam 0.4.0 is up to date. i niczego nie zmienia. Z --version i wersją, której już używasz, wypisuje ccam 0.4.0 is already installed.
Opcje
| Opcja | Działanie | Domyślnie |
|---|---|---|
--check |
Tylko informuje, czy istnieje nowsze wydanie | wyłączone |
--version <tag> |
Instaluje ten tag wydania, na przykład v0.3.0, nowszy lub starszy od bieżącego |
najnowsze |
--dry-run |
Respektowana: sprawdza najnowszy tag (chyba że --version podaje konkretny), wykonuje te same sprawdzenia pliku binarnego i wypisuje adresy pobrania i sumy kontrolnej oraz ścieżkę do zastąpienia, niczego nie pobierając |
wyłączone |
--check i --version nie mogą być użyte razem. Tag musi mieć postać vMAJOR.MINOR.PATCH, z opcjonalnym przyrostkiem wersji przedpremierowej lub kompilacji; początkowe v można pominąć. Wszystko inne kończy się błędem, na przykład --version takes a release tag such as v0.3.0, not "1.2".
Zmienna środowiskowa CCAM_RELEASES_URL zastępuje https://github.com/jhyunwoo/ccam/releases, na potrzeby serwera lustrzanego lub testów. Musi mieć ten sam układ: <url>/latest przekierowuje do <url>/tag/<tag>, a zasoby są pod <url>/download/<tag>/<asset>.
Jak to działa
Kod znajduje się w internal/update, który importuje tylko ccam update. Ścieżka uruchamiania nigdy go nie wywołuje.
cli.updateCmdznajduje działający plik binarny przezos.Executablei rozwiązuje dowiązania symboliczne przezfilepath.EvalSymlinks. Zastępowana jest właśnie ta rzeczywista ścieżka.- Bez
--versionUpdater.Latestwysyła żądanie<releases>/latestbez podążania za przekierowaniem i odczytuje tag z nagłówkaLocation(…/tag/v0.5.0). Używa strony wydań zamiast API GitHub, więc nie obowiązuje limit API wynoszący 60 żądań na godzinę. Sprawdzenie ma 10 sekund. parseVersionsprawdza tag ścisłym wzorcem. Tag trafia do adresów pobierania i do wypisywanego polecenia powłoki, więc nie przechodzi nic, co zawiera/,%, spacje lub znaki powłoki.compareVersionsporównuje go z działającą wersją; wersja przedpremierowa jest sortowana przed swoim wydaniem.managed()iwritable()decydują, czy ccam w ogóle może zastąpić plik binarny (zobacz niżej).Updater.Fetchpobiera jednocześnieccam_<os>_<arch>.tar.gzichecksums.txt, z limitem 2 minut na oba. Każde pobranie jest ograniczone do 256 MB.- SHA-256 archiwum musi zgadzać się z jego wierszem w
checksums.txt, zanim stanie się cokolwiek innego. Brakujący wiersz lub inna suma kontrolna zatrzymuje aktualizację z komunikatemnothing was changed. extract()odczytuje archiwum tar i bierze pierwszy zwykły plik o nazwieccam. Foldery, linki i inne wpisy są ignorowane, a plik binarny też jest ograniczony do 256 MB.Updater.Installzapisuje nowy plik binarny przezfsutil.AtomicWrite: plik tymczasowy.ccam.tmp*obok pliku binarnego, z bitami uprawnień starego pliku, zrzucony na dysk i przemianowany w miejsce starego.
Cały proces, od sprawdzenia tagu do zmiany nazwy:
Archiwum i checksums.txt są pobierane równolegle i nic nie jest zapisywane, dopóki suma kontrolna się nie zgadza. Zmiana nazwy jest atomowa, więc awaria lub pełny dysk zostawia albo stary plik binarny, albo nowy, nigdy połowę. Polecenia skrótów, takie jak ~/.local/bin/ccwork, są dowiązaniami symbolicznymi do pliku binarnego ccam, więc uruchamiają nową wersję bez żadnych zmian.
Instalacje zarządzane przez menedżer pakietów
ccam zainstalowany z .deb należy do apt, a zastąpienie go za plecami apt zostawiłoby błędną bazę pakietów. Przed pobraniem ccam sprawdza, do kogo należy plik binarny:
- Plik binarny w
/usr/bin,/bin,/usr/sbinlub/sbinjest uznawany za zarządzany przez menedżer pakietów. - W innych miejscach, jeśli zainstalowano
dpkgidpkg -S <path>kończy się powodzeniem, plik też jest uznawany za zarządzany przez menedżer pakietów. - W przeciwnym razie ccam tworzy i usuwa tymczasowy plik
.ccam-update-*obok pliku binarnego, żeby upewnić się, że może tam zapisywać.
Dla pliku binarnego zarządzanego przez menedżer pakietów ccam zatrzymuje się i wypisuje kroki dla apt:
$ ccam update
ccam: /usr/bin/ccam was installed by a package, so `ccam update` leaves it alone.
To update the .deb, download ccam_0.5.0_linux_amd64.deb from https://github.com/jhyunwoo/ccam/releases/tag/v0.5.0 and run:
sudo apt install ./ccam_0.5.0_linux_amd64.deb
Or install a copy in ~/.local/bin with the install script:
curl -fsSL https://raw.githubusercontent.com/jhyunwoo/ccam/main/install.sh | shW systemach innych niż Linux wypisywany jest tylko wiersz ze skryptem instalacyjnym. Gdy do folderu nie da się zapisywać, ccam proponuje ponowne uruchomienie skryptu instalacyjnego, który instaluje ccam w ~/.local/bin.
Bezpieczeństwo i przypadki brzegowe
- Wersja deweloperska zgłasza swoją wersję jako
devi nie ma wydania do porównania, więcccam updateiccam update --checkją odrzucają.ccam update --version vX.Y.Zinstaluje na niej wydanie. - Nieudane pobranie, brak zasobu dla twojej platformy lub niezgodna suma kontrolna zostawiają zainstalowany plik binarny bez zmian.
- Nieistniejące wydanie kończy się błędem
there is no release <tag>. Gdy GitHub odmawia z kodem HTTP 403 lub 429, ccam informuje, że to prawdopodobnie limit zapytań, i prosi o ponowną próbę później. --checktylko odczytuje. Nie sprawdza, czy plik binarny jest zarządzany przez menedżer pakietów ani czy można do niego zapisywać.--versionze starszym tagiem to sposób na powrót do poprzedniej wersji.