setup-apt
Version:
Setup apt packages and repositories in Debian/Ubuntu-based distributions
81 lines • 10.8 kB
JavaScript
import { tmpdir } from "os";
import { dirname, join } from "path";
import { execRootSync } from "admina";
import { error, info } from "ci-log";
import { readFile, writeFile } from "fs/promises";
import { DownloaderHelper } from "node-downloader-helper";
import which from "which";
import { hasAptGet, hasNala } from "./get-apt.js";
import { installAptPack } from "./install.js";
import { qualifiedNeededAptPackage } from "./qualify-install.js";
let binDir;
export async function setupNala(version) {
if (!hasAptGet()) {
return undefined;
}
if (typeof binDir === "string") {
return { binDir };
}
const maybeBinDir = which.sync("nala", { nothrow: true });
if (maybeBinDir !== null) {
binDir = dirname(maybeBinDir);
return { binDir };
}
await installAptPack([{ name: "python3-apt" }]);
binDir = "/usr/bin"; // eslint-disable-line require-atomic-updates
// If nala is available in the default repositories, install it
try {
const nalaPack = await qualifiedNeededAptPackage({ name: "nala", version });
if (nalaPack !== undefined) {
await installAptPack([{ name: nalaPack }]);
return { binDir };
}
}
catch (err) {
// ignore
info(`Failed to install nala: ${err}`);
}
// Nala is not available in the default repositories
// Check if the legacy version is available
try {
const nalaLegacyPack = await qualifiedNeededAptPackage({ name: "nala-legacy" });
if (nalaLegacyPack !== undefined) {
await installAptPack([{ name: nalaLegacyPack }], true);
return { binDir };
}
}
catch (err) {
// ignore
info(`Failed to install nala-legacy: ${err}`);
}
// Install via the installer script
await setupNalaViaInstaller();
return { binDir };
}
async function setupNalaViaInstaller() {
// https://gitlab.com/volian/volian-archive
const installer = new DownloaderHelper("https://gitlab.com/volian/volian-archive/-/raw/1939afc3f80638dca2bbedde74bbd86731703cc8/install-nala.sh", tmpdir(), { fileName: "install-nala.sh" });
installer.on("error", (err) => {
throw new Error(`Failed to download install-nala.sh: ${err}`);
});
await installer.start();
const installerPath = join(tmpdir(), "install-nala.sh");
// Patch the installer script to not use sudo explicitly
const script = await readFile(installerPath, "utf8");
await writeFile(installerPath, script.replace(/sudo/g, ""));
await installAptPack([{ name: "wget" }]);
try {
execRootSync("bash", [installerPath]);
}
catch (err) {
error(`Failed to install nala via installer: ${err}`);
execRootSync("apt", ["install", "-y", "-t", "nala", "nala"]);
}
}
export function bashWithNala(script) {
if (hasNala()) {
return `apt-get() { nala $@; }; export -f apt-get; ${script}; unset -f apt-get`;
}
return script;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFsYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9uYWxhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxJQUFJLENBQUE7QUFDM0IsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDcEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUNyQyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUNwQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUNqRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUN6RCxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUE7QUFDekIsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDakQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUM3QyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUVoRSxJQUFJLE1BQTBCLENBQUE7QUFFOUIsTUFBTSxDQUFDLEtBQUssVUFBVSxTQUFTLENBQUMsT0FBZ0I7SUFDOUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7UUFDakIsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztJQUNELElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDL0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFBO0lBQ25CLENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQ3pELElBQUksV0FBVyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3pCLE1BQU0sR0FBRyxPQUFP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QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FBQyxNQUFjO0lBQ3pDLElBQUksT0FBTyxFQUFFLEVBQUUsQ0FBQztRQUNkLE9BQU8sOENBQThDLE1BQU0sb0JBQW9CLENBQUE7SUFDakYsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJvc1wiXG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSBcInBhdGhcIlxuaW1wb3J0IHsgZXhlY1Jvb3RTeW5jIH0gZnJvbSBcImFkbWluYVwiXG5pbXBvcnQgeyBlcnJvciwgaW5mbyB9IGZyb20gXCJjaS1sb2dcIlxuaW1wb3J0IHsgcmVhZEZpbGUsIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiXG5pbXBvcnQgeyBEb3dubG9hZGVySGVscGVyIH0gZnJvbSBcIm5vZGUtZG93bmxvYWRlci1oZWxwZXJcIlxuaW1wb3J0IHdoaWNoIGZyb20gXCJ3aGljaFwiXG5pbXBvcnQgeyBoYXNBcHRHZXQsIGhhc05hbGEgfSBmcm9tIFwiLi9nZXQtYXB0LmpzXCJcbmltcG9ydCB7IGluc3RhbGxBcHRQYWNrIH0gZnJvbSBcIi4vaW5zdGFsbC5qc1wiXG5pbXBvcnQgeyBxdWFsaWZpZWROZWVkZWRBcHRQYWNrYWdlIH0gZnJvbSBcIi4vcXVhbGlmeS1pbnN0YWxsLmpzXCJcblxubGV0IGJpbkRpcjogc3RyaW5nIHwgdW5kZWZpbmVkXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cE5hbGEodmVyc2lvbj86IHN0cmluZykge1xuICBpZiAoIWhhc0FwdEdldCgpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG4gIGlmICh0eXBlb2YgYmluRGlyID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHsgYmluRGlyIH1cbiAgfVxuXG4gIGNvbnN0IG1heWJlQmluRGlyID0gd2hpY2guc3luYyhcIm5hbGFcIiwgeyBub3Rocm93OiB0cnVlIH0pXG4gIGlmIChtYXliZUJpbkRpciAhPT0gbnVsbCkge1xuICAgIGJpbkRpciA9IGRpcm5hbWUobWF5YmVCaW5EaXIpXG4gICAgcmV0dXJuIHsgYmluRGlyIH1cbiAgfVxuXG4gIGF3YWl0IGluc3RhbGxBcHRQYWNrKFt7IG5hbWU6IFwicHl0aG9uMy1hcHRcIiB9XSlcblxuICBiaW5EaXIgPSBcIi91c3IvYmluXCIgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWF0b21pYy11cGRhdGVzXG5cbiAgLy8gSWYgbmFsYSBpcyBhdmFpbGFibGUgaW4gdGhlIGRlZmF1bHQgcmVwb3NpdG9yaWVzLCBpbnN0YWxsIGl0XG4gIHRyeSB7XG4gICAgY29uc3QgbmFsYVBhY2sgPSBhd2FpdCBxdWFsaWZpZWROZWVkZWRBcHRQYWNrYWdlKHsgbmFtZTogXCJuYWxhXCIsIHZlcnNpb24gfSlcbiAgICBpZiAobmFsYVBhY2sgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXdhaXQgaW5zdGFsbEFwdFBhY2soW3sgbmFtZTogbmFsYVBhY2sgfV0pXG4gICAgICByZXR1cm4geyBiaW5EaXIgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gaWdub3JlXG4gICAgaW5mbyhgRmFpbGVkIHRvIGluc3RhbGwgbmFsYTogJHtlcnJ9YClcbiAgfVxuXG4gIC8vIE5hbGEgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgZGVmYXVsdCByZXBvc2l0b3JpZXNcbiAgLy8gQ2hlY2sgaWYgdGhlIGxlZ2FjeSB2ZXJzaW9uIGlzIGF2YWlsYWJsZVxuICB0cnkge1xuICAgIGNvbnN0IG5hbGFMZWdhY3lQYWNrID0gYXdhaXQgcXVhbGlmaWVkTmVlZGVkQXB0UGFja2FnZSh7IG5hbWU6IFwibmFsYS1sZWdhY3lcIiB9KVxuICAgIGlmIChuYWxhTGVnYWN5UGFjayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhd2FpdCBpbnN0YWxsQXB0UGFjayhbeyBuYW1lOiBuYWxhTGVnYWN5UGFjayB9XSwgdHJ1ZSlcbiAgICAgIHJldHVybiB7IGJpbkRpciB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBpZ25vcmVcbiAgICBpbmZvKGBGYWlsZWQgdG8gaW5zdGFsbCBuYWxhLWxlZ2FjeTogJHtlcnJ9YClcbiAgfVxuXG4gIC8vIEluc3RhbGwgdmlhIHRoZSBpbnN0YWxsZXIgc2NyaXB0XG4gIGF3YWl0IHNldHVwTmFsYVZpYUluc3RhbGxlcigpXG5cbiAgcmV0dXJuIHsgYmluRGlyIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBOYWxhVmlhSW5zdGFsbGVyKCkge1xuICAvLyBodHRwczovL2dpdGxhYi5jb20vdm9saWFuL3ZvbGlhbi1hcmNoaXZlXG4gIGNvbnN0IGluc3RhbGxlciA9IG5ldyBEb3dubG9hZGVySGVscGVyKFxuICAgIFwiaHR0cHM6Ly9naXRsYWIuY29tL3ZvbGlhbi92b2xpYW4tYXJjaGl2ZS8tL3Jhdy8xOTM5YWZjM2Y4MDYzOGRjYTJiYmVkZGU3NGJiZDg2NzMxNzAzY2M4L2luc3RhbGwtbmFsYS5zaFwiLFxuICAgIHRtcGRpcigpLFxuICAgIHsgZmlsZU5hbWU6IFwiaW5zdGFsbC1uYWxhLnNoXCIgfSxcbiAgKVxuICBpbnN0YWxsZXIub24oXCJlcnJvclwiLCAoZXJyKSA9PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZG93bmxvYWQgaW5zdGFsbC1uYWxhLnNoOiAke2Vycn1gKVxuICB9KVxuICBhd2FpdCBpbnN0YWxsZXIuc3RhcnQoKVxuXG4gIGNvbnN0IGluc3RhbGxlclBhdGggPSBqb2luKHRtcGRpcigpLCBcImluc3RhbGwtbmFsYS5zaFwiKVxuXG4gIC8vIFBhdGNoIHRoZSBpbnN0YWxsZXIgc2NyaXB0IHRvIG5vdCB1c2Ugc3VkbyBleHBsaWNpdGx5XG4gIGNvbnN0IHNjcmlwdCA9IGF3YWl0IHJlYWRGaWxlKGluc3RhbGxlclBhdGgsIFwidXRmOFwiKVxuICBhd2FpdCB3cml0ZUZpbGUoaW5zdGFsbGVyUGF0aCwgc2NyaXB0LnJlcGxhY2UoL3N1ZG8vZywgXCJcIikpXG5cbiAgYXdhaXQgaW5zdGFsbEFwdFBhY2soW3sgbmFtZTogXCJ3Z2V0XCIgfV0pXG5cbiAgdHJ5IHtcbiAgICBleGVjUm9vdFN5bmMoXCJiYXNoXCIsIFtpbnN0YWxsZXJQYXRoXSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyb3IoYEZhaWxlZCB0byBpbnN0YWxsIG5hbGEgdmlhIGluc3RhbGxlcjogJHtlcnJ9YClcbiAgICBleGVjUm9vdFN5bmMoXCJhcHRcIiwgW1wiaW5zdGFsbFwiLCBcIi15XCIsIFwiLXRcIiwgXCJuYWxhXCIsIFwibmFsYVwiXSlcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYmFzaFdpdGhOYWxhKHNjcmlwdDogc3RyaW5nKSB7XG4gIGlmIChoYXNOYWxhKCkpIHtcbiAgICByZXR1cm4gYGFwdC1nZXQoKSB7IG5hbGEgJEA7IH07IGV4cG9ydCAtZiBhcHQtZ2V0OyAke3NjcmlwdH07IHVuc2V0IC1mIGFwdC1nZXRgXG4gIH1cbiAgcmV0dXJuIHNjcmlwdFxufVxuIl19