Возможности
Обновление ccam
Эта страница переведена с английского машинным способом. Исправления приветствуются. Редактировать эту страницу на GitHub
ccam update скачивает выпуск ccam с GitHub, проверяет его по checksums.txt выпуска и заменяет работающий исполняемый файл одним переименованием. Используйте его, если вы установили ccam скриптом установки или из архива. ccam никогда не проверяет обновления сам: к GitHub обращается только эта команда, поэтому все остальные команды работают без сети точно так же.
Использование
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)Если более нового выпуска нет, ccam выводит ccam 0.4.0 is up to date. и ничего не меняет. Если с --version указана версия, которая уже запущена, выводится ccam 0.4.0 is already installed.
Параметры
| Параметр | Действие | По умолчанию |
|---|---|---|
--check |
Только сообщить, есть ли более новый выпуск | выкл. |
--version <tag> |
Установить этот тег выпуска, например v0.3.0, новее или старше текущего |
последний |
--dry-run |
Учитывается: находит последний тег (если --version не указывает другой), выполняет те же проверки исполняемого файла и выводит пути загрузки, контрольной суммы и замены, ничего не скачивая |
выкл. |
--check и --version нельзя использовать вместе. Тег должен иметь вид vMAJOR.MINOR.PATCH с необязательным суффиксом предварительного выпуска или сборки; начальную v можно опустить. Всё остальное завершается ошибкой, например --version takes a release tag such as v0.3.0, not "1.2".
Переменная окружения CCAM_RELEASES_URL заменяет https://github.com/jhyunwoo/ccam/releases, например для зеркала или для тестов. Структура должна быть такой же: <url>/latest перенаправляет на <url>/tag/<tag>, а файлы выпуска находятся по адресу <url>/download/<tag>/<asset>.
Как это работает
Код находится в internal/update, который импортирует только ccam update. Путь запуска никогда его не вызывает.
cli.updateCmdнаходит работающий исполняемый файл черезos.Executableи разрешает символические ссылки черезfilepath.EvalSymlinks. Заменяется именно этот реальный путь.- Без
--versionUpdater.Latestзапрашивает<releases>/latest, не переходя по перенаправлению, и читает тег из заголовкаLocation(…/tag/v0.5.0). Используется страница выпусков, а не GitHub API, поэтому ограничение API в 60 запросов в час не действует. На поиск отводится 10 секунд. parseVersionпроверяет тег по строгому шаблону. Тег попадает в адреса загрузки и в выводимую команду оболочки, поэтому ничто с/,%, пробелами или символами оболочки не проходит.compareVersionsсравнивает его с работающей версией; предварительный выпуск считается более ранним, чем сам выпуск.managed()иwritable()решают, может ли ccam вообще заменить исполняемый файл (см. ниже).Updater.Fetchодновременно скачиваетccam_<os>_<arch>.tar.gzиchecksums.txt, отводя на обе загрузки 2 минуты. Каждая загрузка ограничена 256 МБ.- SHA-256 архива должен совпасть с его строкой в
checksums.txt, прежде чем произойдёт что-либо ещё. Отсутствующая строка или другая контрольная сумма останавливают обновление с сообщениемnothing was changed. extract()читает tar и берёт первый обычный файл с именемccam. Папки, ссылки и другие записи игнорируются, а исполняемый файл тоже ограничен 256 МБ.Updater.Installзаписывает новый исполняемый файл черезfsutil.AtomicWrite: временный файл.ccam.tmp*рядом с исполняемым файлом, с битами прав старого файла, сбрасывается на диск и переименовывается поверх старого.
Весь процесс, от поиска тега до переименования:
Архив и checksums.txt скачиваются параллельно, и ничего не записывается, пока контрольная сумма не совпадёт. Переименование атомарно, поэтому сбой или заполненный диск оставляют либо старый исполняемый файл, либо новый, но никогда не половину. Короткие команды, например ~/.local/bin/ccwork, являются символическими ссылками на исполняемый файл ccam, поэтому они запускают новую версию без каких-либо изменений.
Установка из пакета
ccam, установленный из .deb, принадлежит apt, и если заменить его в обход apt, база данных пакетов станет неверной. Перед загрузкой ccam проверяет, кому принадлежит исполняемый файл:
- Исполняемый файл в
/usr/bin,/bin,/usr/sbinили/sbinсчитается управляемым пакетным менеджером. - В остальных местах, если установлен
dpkgиdpkg -S <path>выполняется успешно, файл тоже считается управляемым пакетным менеджером. - Иначе ccam создаёт и удаляет временный файл
.ccam-update-*рядом с исполняемым файлом, чтобы убедиться, что может туда записывать.
Для исполняемого файла, управляемого пакетным менеджером, ccam останавливается и выводит шаги для 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 | shВ системах, отличных от Linux, выводится только строка со скриптом установки. Если в папку нельзя записывать, ccam предлагает заново запустить скрипт установки, который устанавливает ccam в ~/.local/bin.
Безопасность и особые случаи
- Сборка для разработки сообщает версию
devи не имеет выпуска для сравнения, поэтомуccam updateиccam update --checkеё отклоняют.ccam update --version vX.Y.Zустанавливает выпуск поверх неё. - Неудачная загрузка, отсутствующий файл для вашей платформы или несовпадение контрольной суммы оставляют установленный исполняемый файл как был.
- Несуществующий выпуск завершается ошибкой
there is no release <tag>. Если GitHub отвечает отказом HTTP 403 или 429, ccam сообщает, что это, вероятно, ограничение частоты запросов, и предлагает повторить попытку позже. --checkтолько читает. Он не проверяет, управляется ли исполняемый файл пакетным менеджером и доступен ли он для записи.--versionс более старым тегом позволяет откатиться на предыдущую версию.