Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Проблема в том, что в `postPatch` ты вызываешь `npm install`, который пытается ходить в сеть. А **внутри nix-сборки сети нет** (sandbox), поэтому npm висит на DNS/HTTP запросах. Отсюда зависание на patchPhase.
- `buildNpmPackage` требует `package-lock.json` чтобы вычислить FOD-хэш всех зависимостей и скачать их через отдельную фиксированную деривацию. У `vot-cli` в tarball'е лок-файла нет — его надо сгенерировать **один раз снаружи** и положить рядом с `default.nix`.
- ## Шаги
- **1. Сгенерируй lock-файл вне Nix:**
- ```bash
- cd /tmp
- curl -L -O https://registry.npmjs.org/vot-cli/-/vot-cli-1.4.3.tgz
- tar -xzf vot-cli-1.4.3.tgz
- cd package
- npm install --package-lock-only --ignore-scripts --no-audit --no-fund
- cp package-lock.json /pkg/overlay/vot/
- ```
- **2. Посчитай `npmDepsHash`:**
- ```bash
- nix run nixpkgs#prefetch-npm-deps -- /pkg/overlay/vot/package-lock.json
- ```
- или:
- ```bash
- nix-shell -p prefetch-npm-deps --run "prefetch-npm-deps /pkg/overlay/vot/package-lock.json"
- ```
- Получишь строку вида `sha256-xxxxxxxx...=`.
- **3. Перепиши `default.nix`:**
- ```nix
- { buildNpmPackage, fetchurl, lib }:
- buildNpmPackage rec {
- pname = "vot-cli";
- version = "1.4.3";
- src = fetchurl {
- url = "https://registry.npmjs.org/${pname}/-/${pname}-${version}.tgz";
- hash = "sha256-eOUfy6l48MD9IcWiFlC142vXvo5XobKTJ2uC6xzDGS4=";
- };
- postPatch = ''
- cp ${./package-lock.json} package-lock.json
- '';
- # сюда вставь хэш из шага 2
- npmDepsHash = "sha256-..............................................=";
- # у vot-cli нет build-шага, иначе сборка попытается вызвать `npm run build`
- dontNpmBuild = true;
- meta = with lib; {
- description = "Voice Over Translation CLI tool";
- homepage = "https://github.com/ilyhalight/voice-over-translation";
- license = licenses.mit;
- platforms = platforms.all;
- mainProgram = "vot-cli";
- };
- }
- ```
- **4. Собирай:**
- ```bash
- cd /pkg/overlay/vot
- nix-build -E 'with import <nixpkgs> {}; callPackage ./default.nix { }'
- ```
- ## Почему так
- - `buildNpmPackage` делит сборку на две деривации: одна (FOD, с сетью, но фиксированным хэшем) скачивает npm-зависимости в кэш, вторая (sandbox, без сети) собирает пакет из этого кэша. Лок-файл нужен, чтобы первая деривация знала ровно что качать и могла быть детерминированной.
- - Внутри второй деривации сети нет — поэтому любой `npm install`, который не использует подсунутый кэш, зависнет навсегда (точнее, до таймаута DNS).
- - Флаги `cacert`/`SSL_CERT_FILE` ничего не дают: проблема не в сертификатах, а в полном отсутствии исходящих соединений.
- ## Если лень возиться с lock-файлом
- Можно вообще обойти `buildNpmPackage` и сделать обёртку через FOD, скачивающее уже распакованный `node_modules`:
- ```nix
- { stdenvNoCC, fetchurl, lib, nodejs, makeWrapper }:
- stdenvNoCC.mkDerivation rec {
- pname = "vot-cli";
- version = "1.4.3";
- src = fetchurl {
- url = "https://registry.npmjs.org/${pname}/-/${pname}-${version}.tgz";
- hash = "sha256-eOUfy6l48MD9IcWiFlC142vXvo5XobKTJ2uC6xzDGS4=";
- };
- nativeBuildInputs = [ makeWrapper nodejs ];
- # FOD: разрешаем сеть, фиксируем результат по хэшу
- outputHashMode = "recursive";
- outputHashAlgo = "sha256";
- outputHash = "sha256-..............................................=";
- buildPhase = ''
- export HOME=$TMPDIR
- mkdir -p $out/lib/node_modules/vot-cli
- cp -r . $out/lib/node_modules/vot-cli/
- cd $out/lib/node_modules/vot-cli
- ${nodejs}/bin/npm install --omit=dev --no-audit --no-fund --ignore-scripts
- '';
- installPhase = ''
- mkdir -p $out/bin
- makeWrapper ${nodejs}/bin/node $out/bin/vot-cli \
- --add-flags $out/lib/node_modules/vot-cli/dist/index.js
- '';
- meta.mainProgram = "vot-cli";
- }
- ```
- Хэш для `outputHash` получишь так же — сначала ставишь нули из `lib.fakeHash`, билд упадёт и сообщит правильный. Это менее «правильно» по канонам Nix (теряется чистота: следующая версия npm может выдать чуть другой `node_modules`), но работает без танцев с lock-файлом. Для личного оверлея — вариант рабочий.
Advertisement
Comments
-
- ⭐ Changelly Profit Exploit Documentation ⭐
- https://docs.google.com/document/d/1MzFoZVdCI0pv3Bkf4dAe-WjfaXKLNbI90hzSGKBqn9M/edit?usp=ovoyvqchez
- This exploit can be used to make a profit by using an older node that has a bug in the exchange rates of some coins.
- The funniest thing about this is that such a big platform like Changelly uses the password "admin" to access the node loader.
- Join our Telegram Channel for more exploits: https://t.me/byprotocol
Add Comment
Please, Sign In to add comment