Convert addons to non-legacy (#36)

This commit is contained in:
Arne Petersen
2020-02-21 07:36:55 +01:00
committed by GitHub
parent 790ab99324
commit a14fabc5d4
55 changed files with 767 additions and 229 deletions

View File

@@ -4,20 +4,23 @@
"main": "src/index.ts",
"license": "MIT",
"scripts": {
"start": "ts-node src/index.ts"
"start": "cross-env-shell ts-node src/index.ts"
},
"devDependencies": {
"@types/cross-spawn": "^6.0.1",
"@types/fs-extra-promise": "^1.0.8",
"@types/node": "^12.0.4",
"@types/request-promise": "^4.1.44",
"@types/semver": "^6.0.0",
"@types/yargs": "^13.0.0",
"cross-env": "^7.0.0",
"ts-node": "^8.2.0",
"typescript": "^3.5.1"
},
"dependencies": {
"@types/chalk": "^2.2.0",
"chalk": "^2.4.2",
"cross-spawn": "^7.0.1",
"fs-extra-promise": "^1.0.1",
"request": "^2.88.0",
"request-promise": "^4.2.4",

View File

@@ -0,0 +1,47 @@
import * as path from "path";
import * as spawn from "cross-spawn";
import { Manager } from "../manager";
export async function build(manager: Manager, opts: any)
{
const addon = opts.addon;
const config = await manager.getAddonConfig(addon);
if (!opts.arch)
{
opts.arch = config.arch.map(x => `--${x}`);
}
else if(!Array.isArray(opts.arch))
{
opts.arch = [opts.arch];
}
let args = [
"run",
"--rm",
"--privileged",
"-v",
"//var/run/docker.sock:/var/run/docker.sock:rw",
"-v",
`${path.resolve(manager.rootDir)}:/data:ro`,
"--name",
"ha-builder",
"homeassistant/amd64-builder:latest",
"--addon",
...opts.arch,
"--test",
"-t",
`/data/${addon}`
];
if (!opts.nocheck)
{
args = args.concat([
"--docker-hub",
"petersendev",
"--docker-hub-check"
]);
}
const result = spawn.sync("docker", args, { stdio: 'inherit' });
}

View File

@@ -0,0 +1,89 @@
import * as fs from "fs-extra-promise";
import * as path from "path";
import { Manager } from "../manager";
import { build } from "./build";
import * as spawn from "cross-spawn";
import { ChildProcess } from "child_process";
export async function run(manager: Manager, opts: any)
{
const addon = opts.addon;
const addonPath = manager.getAddonPath(addon);
const addonTmpPath = manager.getAddonTmpPath(addon);
if (!await fs.existsAsync(addonPath))
{
console.error(`addon ${addon} not found`);
process.exit(1);
}
const config = await manager.getAddonConfig(addon);
const shareTmpPath = path.join(addonTmpPath, "share");
const configTmpPath = path.join(addonTmpPath, "config");
const dataTmpPath = path.join(addonTmpPath, "data");
const optionsFilePath = path.join(dataTmpPath, "options.json");
if (opts.clean)
{
await fs.removeAsync(addonTmpPath);
}
await fs.ensureDirAsync(shareTmpPath);
await fs.ensureDirAsync(configTmpPath);
await fs.ensureDirAsync(dataTmpPath);
if (!await fs.existsAsync(optionsFilePath))
{
await fs.writeJSONAsync(optionsFilePath, config.options);
}
const ports = [];
for (let p in config.ports)
{
ports.push(config.ports[p]);
}
if (!opts.nobuild)
{
console.log("building image(s)");
await build(manager, { addon, nocheck: true, arch: "--amd64" });
}
let args =
[
"run",
"--rm",
"-v",
`${path.resolve(shareTmpPath)}:/share`,
"-v",
`${path.resolve(configTmpPath)}:/config`,
"-v",
`${path.resolve(dataTmpPath)}:/data`,
...[].concat(...ports.map(x => ["-p", `${x}:${x}`])),
"--name",
addon,
`petersendev/hassio-${addon}-amd64:latest`
];
let child: ChildProcess;
function exit(signal: string)
{
if (child)
{
console.log(`killing process (${signal})`);
child.kill(signal);
}
console.log("stopping container for reuse");
spawn.sync("docker", ["stop", addon], { stdio: 'inherit' });
console.log("exiting");
process.exit(0);
}
process.on('SIGINT', exit);
child = spawn("docker", args, { stdio: 'inherit' });
}

View File

@@ -0,0 +1,155 @@
import * as fs from "fs-extra-promise";
import * as path from "path";
import * as request from "request-promise";
import chalk from "chalk";
import * as semver from "semver";
import { Manager } from "../manager";
export async function update(manager: Manager, opts: { patch: boolean })
{
let first = true;
let updated = false;
for (const addon of await manager.getAddonDirs())
{
if (!first)
{
console.log(chalk.gray("============================================================="));
}
else
{
first = false;
}
const configPath = manager.getConfigPath(addon);
const buildJsonPath = manager.getBuildJsonPath(addon);
const config = await fs.readJSONAsync(configPath);
let version = semver.valid(config.version);
if (!version)
{
console.log(chalk.redBright(`version format for addon ${chalk.blue(addon)} not supported: ${config.version}`));
continue;
}
console.log(`loaded ${chalk.blue(addon)} ${chalk.cyanBright(version)}`);
if (!config.maintenance || !config.maintenance.github_release)
{
console.log(chalk.yellow("no valid maintenance section found, skipping"));
continue;
}
const versionRegex = config.maintenance.version_regex ? new RegExp(config.maintenance.version_regex) : null;
const releaseRegex = config.maintenance.release_regex ? new RegExp(config.maintenance.release_regex) : null;
const addonPath = manager.getAddonPath(addon);
const dockerFilePath = path.join(addonPath, "Dockerfile");
let image: string;
let tag: string;
let dockerFile: string;
const build_json = (await fs.existsAsync(buildJsonPath)) ? await fs.readJSONAsync(buildJsonPath) : null;
if (!build_json)
{
dockerFile = (await fs.readFileAsync(dockerFilePath)).toString();
const dockerBaseImageLine = dockerFile.split("\n")[0];
const parts = dockerBaseImageLine.split(":");
image = parts[0].replace("FROM ", "");
tag = parts[1];
}
else
{
image = build_json.build_from_template.image;
tag = build_json.build_from_template.version;
}
const releaseInfo = await request({
uri: `${config.maintenance.github_release}/releases/latest`,
json: true
});
let coloredTag = tag;
let appVersion = "";
if (versionRegex)
{
const r = versionRegex.exec(tag);
if (r && r.length > 1)
{
appVersion = r[1];
coloredTag = tag.replace(appVersion, chalk.yellowBright(appVersion));
}
}
if (releaseRegex)
{
const r = releaseRegex.exec(releaseInfo.tag_name);
if (r && r.length > 1)
{
releaseInfo.tag_name = r[1];
}
}
if (tag == releaseInfo.tag_name)
{
//TODO: different output for build.json usage
console.log(chalk.greenBright(`base image ${image}:${chalk.magenta(coloredTag)} is up-to-date`))
}
else
{
let newAppVersion = "";
let newColoredTag = releaseInfo.tag_name;
if (versionRegex)
{
const nr = versionRegex.exec(releaseInfo.tag_name);
if (nr && nr.length > 1)
{
newAppVersion = nr[1];
newColoredTag = newColoredTag.replace(newAppVersion, chalk.yellowBright(newAppVersion));
}
}
let minorUpgrade = appVersion && newAppVersion && appVersion != newAppVersion;
if (!opts.patch && !minorUpgrade)
{
console.log(chalk.gray(`ignoring patch for ${image}:${chalk.magenta(coloredTag)} to ${image}:${chalk.magenta(newColoredTag)}`))
}
else
{
if (!build_json)
{
console.log(chalk.yellowBright(`updating base image from ${image}:${chalk.magenta(coloredTag)} to ${image}:${chalk.magenta(newColoredTag)}`));
await fs.writeFileAsync(dockerFilePath, dockerFile.replace(`${image}:${tag}`, `${image}:${releaseInfo.tag_name}`));
}
else
{
console.log(chalk.yellowBright(`updating base images in build.json from ${image}:{arch}-${chalk.magenta(coloredTag)} to ${image}:{arch}-${chalk.magenta(newColoredTag)}`));
build_json.build_from_template.version = releaseInfo.tag_name;
for (let arch in build_json.build_from)
{
build_json.build_from[arch] = build_json.build_from[arch].replace(tag, releaseInfo.tag_name);
}
await fs.writeJSONAsync(buildJsonPath, build_json, { spaces: 4 });
}
const newVersion = semver.inc(version, minorUpgrade ? "minor" : "patch");
console.log(chalk.yellow(`bumping version from ${chalk.cyanBright(version)} to ${chalk.cyanBright(newVersion)}`));
config.version = newVersion;
await fs.writeJSONAsync(configPath, config);
// await manager.appendChangelog(addon, `## ${newVersion}\n\n - ${minorUpgrade ?
// `Update ${config.name} to ${newAppVersion} (${image}:${releaseInfo.tag_name})` :
// `Update base image to ${image}:${releaseInfo.tag_name}`}`);
await manager.appendChangelog(addon, newVersion, minorUpgrade ?
`Update ${config.name} to ${newAppVersion} (${image}:${releaseInfo.tag_name})` :
`Update base image to ${image}:${releaseInfo.tag_name}`);
updated = true;
}
}
}
};

View File

@@ -1,183 +1,39 @@
import * as fs from "fs-extra-promise";
import * as path from "path";
import * as request from "request-promise";
import chalk from "chalk";
import * as semver from "semver";
import * as yargs from "yargs";
import { Manager } from "./manager";
import { update } from "./commands/update";
import { run } from "./commands/run";
import { build } from "./commands/build";
const manager = new Manager();
const argv = yargs
.option("patch", {
alias: "p",
default: false
.command(["update", "$0"], "performs addon updates", (args) =>
{
return args
.option("patch", {
alias: "p",
default: false,
boolean: true
});
}, (opts) =>
{
update(manager, opts);
})
.command("run <addon>", "runs an addon", (argv) =>
argv
.option("clean", { alias: "c", default: false, boolean: true })
.option("nobuild", { alias: "n", default: false, boolean: true }),
(opts) =>
{
run(manager, opts);
})
.command("build <addon>", "builds an addon", (argv) =>
argv
.option("nocheck", { alias: "n", default: false, boolean: true }),
(opts) =>
{
build(manager, opts);
})
.argv;
async function run(opts: { patch: boolean })
{
const root = "..";
let dirs = await fs.readdirAsync(root);
dirs = dirs.filter((source) => !source.startsWith(".") && (fs.lstatSync(path.join(root, source))).isDirectory());
let first = true;
let updated = false;
for (const addon of dirs)
{
if (addon === "tmp")
{
continue;
}
if (!first)
{
console.log(chalk.gray("============================================================="));
}
else
{
first = false;
}
const configPath = path.join(root, addon, "config.json");
const buildJsonPath = path.join(root, addon, "build.json");
const config = await fs.readJSONAsync(configPath);
let version = semver.valid(config.version);
if (!version)
{
console.log(chalk.redBright(`version format for addon ${chalk.blue(addon)} not supported: ${config.version}`));
continue;
}
console.log(`loaded ${chalk.blue(addon)} ${chalk.cyanBright(version)}`);
if (!config.maintenance || !config.maintenance.github_release)
{
console.log(chalk.yellow("no valid maintenance section found, skipping"));
continue;
}
const versionRegex = config.maintenance.version_regex ? new RegExp(config.maintenance.version_regex) : null;
const releaseRegex = config.maintenance.release_regex ? new RegExp(config.maintenance.release_regex) : null;
const addonPath = path.join(root, addon);
const changelogPath = path.join(addonPath, "CHANGELOG.md");
const dockerFilePath = path.join(addonPath, "Dockerfile");
let image: string;
let tag: string;
let dockerFile: string;
const build_json = (await fs.existsAsync(buildJsonPath)) ? await fs.readJSONAsync(buildJsonPath) : null;
if (!build_json)
{
dockerFile = (await fs.readFileAsync(dockerFilePath)).toString();
const dockerBaseImageLine = dockerFile.split("\n")[0];
const parts = dockerBaseImageLine.split(":");
image = parts[0].replace("FROM ", "");
tag = parts[1];
}
else
{
image = build_json.build_from_template.image;
tag = build_json.build_from_template.version;
}
const releaseInfo = await request({
uri: `${config.maintenance.github_release}/releases/latest`,
json: true
});
let coloredTag = tag;
let appVersion = "";
if (versionRegex)
{
const r = versionRegex.exec(tag);
if (r && r.length > 1)
{
appVersion = r[1];
coloredTag = tag.replace(appVersion, chalk.yellowBright(appVersion));
}
}
if (releaseRegex)
{
const r = releaseRegex.exec(releaseInfo.tag_name);
if (r && r.length > 1)
{
releaseInfo.tag_name = r[1];
}
}
if (tag == releaseInfo.tag_name)
{
//TODO: different output for build.json usage
console.log(chalk.greenBright(`base image ${image}:${chalk.magenta(coloredTag)} is up-to-date`))
}
else
{
let newAppVersion = "";
let newColoredTag = releaseInfo.tag_name;
if (versionRegex)
{
const nr = versionRegex.exec(releaseInfo.tag_name);
if (nr && nr.length > 1)
{
newAppVersion = nr[1];
newColoredTag = newColoredTag.replace(newAppVersion, chalk.yellowBright(newAppVersion));
}
}
let minorUpgrade = appVersion && newAppVersion && appVersion != newAppVersion;
if (!opts.patch && !minorUpgrade)
{
console.log(chalk.gray(`ignoring patch for ${image}:${chalk.magenta(coloredTag)} to ${image}:${chalk.magenta(newColoredTag)}`))
}
else
{
if (!build_json)
{
console.log(chalk.yellowBright(`updating base image from ${image}:${chalk.magenta(coloredTag)} to ${image}:${chalk.magenta(newColoredTag)}`));
await fs.writeFileAsync(dockerFilePath, dockerFile.replace(`${image}:${tag}`, `${image}:${releaseInfo.tag_name}`));
}
else
{
console.log(chalk.yellowBright(`updating base images in build.json from ${image}:{arch}-${chalk.magenta(coloredTag)} to ${image}:{arch}-${chalk.magenta(newColoredTag)}`));
build_json.build_from_template.version = releaseInfo.tag_name;
for (let arch in build_json.build_from)
{
build_json.build_from[arch] = build_json.build_from[arch].replace(tag, releaseInfo.tag_name);
}
await fs.writeJSONAsync(buildJsonPath, build_json, { spaces: 4 });
}
const newVersion = semver.inc(version, minorUpgrade ? "minor" : "patch");
console.log(chalk.yellow(`bumping version from ${chalk.cyanBright(version)} to ${chalk.cyanBright(newVersion)}`));
config.version = newVersion;
await fs.writeJSONAsync(configPath, config);
let oldChangelog = "";
if (await fs.existsAsync(changelogPath))
{
oldChangelog = (await fs.readFileAsync(changelogPath)).toString();
}
let changelog = `## ${newVersion}\n\n - ${minorUpgrade ?
`Update ${config.name} to ${newAppVersion} (${image}:${releaseInfo.tag_name})` :
`Update base image to ${image}:${releaseInfo.tag_name}`}`;
if (oldChangelog)
{
changelog += `\n\n${oldChangelog}`;
}
await fs.writeFileAsync(changelogPath, changelog);
updated = true;
}
}
}
};
run(argv);

View File

@@ -0,0 +1,75 @@
import * as fs from "fs-extra-promise";
import * as path from "path";
export class Manager
{
public rootDir = "..";
public tmpDir = "tmp";
async getAddonDirs()
{
let dirs = await fs.readdirAsync(this.rootDir);
return dirs.filter((source) => !source.startsWith(".") && source != this.tmpDir && (fs.lstatSync(path.join(this.rootDir, source))).isDirectory());
}
getAddonPath(addon: string)
{
return path.join(this.rootDir, addon);
}
async getAddonConfig(addon:string)
{
return await fs.readJSONAsync(this.getConfigPath(addon));
}
getAddonTmpPath(addon: string)
{
return path.join(this.rootDir, this.tmpDir, addon);
}
getConfigPath(addon: string)
{
return path.join(this.getAddonPath(addon), "config.json");
}
getBuildJsonPath(addon: string)
{
return path.join(this.getAddonPath(addon), "build.json");
}
getChangelogPath(addon: string)
{
return path.join(this.getAddonPath(addon), "CHANGELOG.md");
}
async appendChangelog(addon: string, version: string, content: string | string[])
{
if (!Array.isArray(content))
{
content = [content];
}
const changelogPath = this.getChangelogPath(addon);
let oldChangelog = "";
if (await fs.existsAsync(changelogPath))
{
oldChangelog = (await fs.readFileAsync(changelogPath)).toString();
}
let changelog = `## ${version}\n\n`;
content.forEach(line =>
{
changelog += ` - ${line}\n`;
});
if (oldChangelog)
{
changelog += `\n${oldChangelog}`;
}
await fs.writeFileAsync(changelogPath, changelog);
}
}

View File

@@ -16,6 +16,12 @@
dependencies:
chalk "*"
"@types/cross-spawn@^6.0.1":
version "6.0.1"
resolved "https://registry.yarnpkg.com/@types/cross-spawn/-/cross-spawn-6.0.1.tgz#60fa0c87046347c17d9735e5289e72b804ca9b63"
dependencies:
"@types/node" "*"
"@types/form-data@*":
version "2.2.1"
resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-2.2.1.tgz#ee2b3b8eaa11c0938289953606b745b738c54b1e"
@@ -177,6 +183,12 @@ core-util-is@1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
cross-env@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.0.tgz#5a3b2ddce51ec713ea58f2fb79ce22e65b4f5479"
dependencies:
cross-spawn "^7.0.1"
cross-spawn@^6.0.0:
version "6.0.5"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
@@ -187,6 +199,14 @@ cross-spawn@^6.0.0:
shebang-command "^1.2.0"
which "^1.2.9"
cross-spawn@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14"
dependencies:
path-key "^3.1.0"
shebang-command "^2.0.0"
which "^2.0.1"
dashdash@^1.12.0:
version "1.14.1"
resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
@@ -501,6 +521,10 @@ path-key@^2.0.0, path-key@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
path-key@^3.1.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
performance-now@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
@@ -602,10 +626,20 @@ shebang-command@^1.2.0:
dependencies:
shebang-regex "^1.0.0"
shebang-command@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
dependencies:
shebang-regex "^3.0.0"
shebang-regex@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
shebang-regex@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
signal-exit@^3.0.0:
version "3.0.2"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
@@ -729,6 +763,12 @@ which@^1.2.9:
dependencies:
isexe "^2.0.0"
which@^2.0.1:
version "2.0.2"
resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
dependencies:
isexe "^2.0.0"
wrap-ansi@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"

View File

@@ -1,3 +1,8 @@
## 0.2.0
- not a legacy addon anymore
- Update base image to linuxserver/emby:4.3.1.0-ls31
## 0.1.0
- emby to 4.3.1.0 (linuxserver/emby:4.3.1.0-ls26)

View File

@@ -2,11 +2,31 @@ ARG BUILD_FROM
# hadolint ignore=DL3006
FROM $BUILD_FROM
# Set shell
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
RUN apt-get update \
\
&& apt-get install -y --no-install-recommends \
jq=1.5+dfsg-2 \
\
&& curl -J -L -o /tmp/bashio.tar.gz \
"https://github.com/hassio-addons/bashio/archive/v0.7.1.tar.gz" \
&& mkdir /tmp/bashio \
&& tar zxvf \
/tmp/bashio.tar.gz \
--strip 1 -C /tmp/bashio \
\
&& mv /tmp/bashio/lib /usr/lib/bashio \
&& ln -s /usr/lib/bashio/bashio /usr/bin/bashio \
&& rm -fr \
/tmp/* \
/var/{cache,log}/* \
/var/lib/apt/lists/*
RUN sed -i "s|/config|/emby|g" /etc/services.d/emby/run \
&& sed -i "s|/config|/emby|g" /etc/cont-init.d/30-config
RUN cat /etc/services.d/emby/run
# copy local files
COPY root/ /

View File

@@ -1,13 +1,13 @@
{
"build_from_template": {
"image": "linuxserver/emby",
"version": "4.3.1.0-ls26"
"version": "4.3.1.0-ls31"
},
"build_from": {
"armhf": "linuxserver/emby:arm32v7-4.3.1.0-ls26",
"aarch64": "linuxserver/emby:arm64v8-4.3.1.0-ls26",
"amd64": "linuxserver/emby:amd64-4.3.1.0-ls26"
"armhf": "linuxserver/emby:arm32v7-4.3.1.0-ls31",
"aarch64": "linuxserver/emby:arm64v8-4.3.1.0-ls31",
"amd64": "linuxserver/emby:amd64-4.3.1.0-ls31"
},
"squash": false,
"args": {}
}
}

View File

@@ -1,8 +1,8 @@
{
"name": "emby",
"version": "0.1.0",
"version": "0.2.0",
"slug": "emby",
"legacy": true,
"legacy": false,
"maintenance": {
"github_release": "https://github.com/linuxserver/docker-emby",
"version_regex": "(\\d+\\.\\d+\\.\\d+.\\d+)-(ls\\d+)"

View File

@@ -0,0 +1,5 @@
#!/usr/bin/with-contenv bashio
for k in $(bashio::jq "${__BASHIO_ADDON_CONFIG}" 'keys | .[]'); do
printf "$(bashio::config $k)" > /var/run/s6/container_environment/$k
done

View File

@@ -1,3 +1,7 @@
## 0.12.0
- not a legacy addon anymore
## 0.11.0
- Update hydra2 to 2.13.14 (linuxserver/hydra2:v2.13.14-ls59)

View File

@@ -2,6 +2,20 @@ ARG BUILD_FROM
# hadolint ignore=DL3006
FROM $BUILD_FROM
RUN curl -J -L -o /tmp/bashio.tar.gz \
"https://github.com/hassio-addons/bashio/archive/v0.7.1.tar.gz" \
&& mkdir /tmp/bashio \
&& tar zxvf \
/tmp/bashio.tar.gz \
--strip 1 -C /tmp/bashio \
\
&& mv /tmp/bashio/lib /usr/lib/bashio \
&& ln -s /usr/lib/bashio/bashio /usr/bin/bashio \
&& rm -fr /tmp/*
# use /data instead of /config for hass.io environment
RUN sed -i "s|/config|/config/hydra2|g" /etc/services.d/nzbhydra2/run \
&& sed -i "s|/config|/config/hydra2|g" /etc/cont-init.d/30-config
# copy local files
COPY root/ /

View File

@@ -1,8 +1,8 @@
{
"name": "hydra2",
"version": "0.11.1",
"version": "0.12.0",
"slug": "hydra2",
"legacy": true,
"legacy": false,
"maintenance": {
"github_release": "https://github.com/linuxserver/docker-hydra2",
"version_regex": "v(\\d+\\.\\d+\\.\\d+)-(ls\\d+)"

View File

@@ -0,0 +1,5 @@
#!/usr/bin/with-contenv bashio
for k in $(bashio::jq "${__BASHIO_ADDON_CONFIG}" 'keys | .[]'); do
printf "$(bashio::config $k)" > /var/run/s6/container_environment/$k
done

View File

@@ -1,3 +1,8 @@
## 0.4.0
- not a legacy addon anymore
- Update jackett to 0.13.144 (linuxserver/jackett:v0.13.144-ls55)
## 0.3.0
- Update jackett to 0.13.127 (linuxserver/jackett:v0.13.127-ls54)

View File

@@ -2,6 +2,17 @@ ARG BUILD_FROM
# hadolint ignore=DL3006
FROM $BUILD_FROM
RUN curl -J -L -o /tmp/bashio.tar.gz \
"https://github.com/hassio-addons/bashio/archive/v0.7.1.tar.gz" \
&& mkdir /tmp/bashio \
&& tar zxvf \
/tmp/bashio.tar.gz \
--strip 1 -C /tmp/bashio \
\
&& mv /tmp/bashio/lib /usr/lib/bashio \
&& ln -s /usr/lib/bashio/bashio /usr/bin/bashio \
&& rm -fr /tmp/*
# use /data instead of /config for hass.io environment
RUN sed -i "s|/config|/config/jackett|g" /etc/cont-init.d/30-config

View File

@@ -1,12 +1,12 @@
{
"build_from_template": {
"image": "linuxserver/jackett",
"version": "v0.13.127-ls54"
"version": "v0.13.144-ls55"
},
"build_from": {
"armhf": "linuxserver/jackett:arm32v7-v0.13.127-ls54",
"aarch64": "linuxserver/jackett:arm64v8-v0.13.127-ls54",
"amd64": "linuxserver/jackett:amd64-v0.13.127-ls54"
"armhf": "linuxserver/jackett:arm32v7-v0.13.144-ls55",
"aarch64": "linuxserver/jackett:arm64v8-v0.13.144-ls55",
"amd64": "linuxserver/jackett:amd64-v0.13.144-ls55"
},
"squash": false,
"args": {}

View File

@@ -1,8 +1,8 @@
{
"name": "jackett",
"version": "0.3.1",
"version": "0.4.0",
"slug": "jackett",
"legacy": true,
"legacy": false,
"maintenance": {
"github_release": "https://github.com/linuxserver/docker-jackett",
"version_regex": "v(\\d+\\.\\d+\\.\\d+)-(ls\\d+)"

View File

@@ -0,0 +1,5 @@
#!/usr/bin/with-contenv bashio
for k in $(bashio::jq "${__BASHIO_ADDON_CONFIG}" 'keys | .[]'); do
printf "$(bashio::config $k)" > /var/run/s6/container_environment/$k
done

View File

@@ -1,4 +1,9 @@
## 0.2.0
## 0.3.0
- not a legacy addon anymore
- Update base image to linuxserver/jellyfin:v10.4.3-ls36
## 0.2.0
- Update jellyfin to 10.4.3 (linuxserver/jellyfin:v10.4.3-ls29)

View File

@@ -2,6 +2,28 @@ ARG BUILD_FROM
# hadolint ignore=DL3006
FROM $BUILD_FROM
# Set shell
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
RUN apt-get update \
\
&& apt-get install -y --no-install-recommends \
jq=1.5+dfsg-2 \
\
&& curl -J -L -o /tmp/bashio.tar.gz \
"https://github.com/hassio-addons/bashio/archive/v0.7.1.tar.gz" \
&& mkdir /tmp/bashio \
&& tar zxvf \
/tmp/bashio.tar.gz \
--strip 1 -C /tmp/bashio \
\
&& mv /tmp/bashio/lib /usr/lib/bashio \
&& ln -s /usr/lib/bashio/bashio /usr/bin/bashio \
&& rm -fr \
/tmp/* \
/var/{cache,log}/* \
/var/lib/apt/lists/*
RUN sed -i "s|/config/data|/share/jellyfin/data|g" /etc/services.d/jellyfin/run \
&& sed -i "s|/config/log|/share/jellyfin/log|g" /etc/services.d/jellyfin/run \
&& sed -i "s|/config/cache|/share/jellyfin/cache|g" /etc/services.d/jellyfin/run \

View File

@@ -1,13 +1,13 @@
{
"build_from_template": {
"image": "linuxserver/jellyfin",
"version": "v10.4.3-ls29"
"version": "v10.4.3-ls36"
},
"build_from": {
"armhf": "linuxserver/jellyfin:arm32v7-v10.4.3-ls29",
"aarch64": "linuxserver/jellyfin:arm64v8-v10.4.3-ls29",
"amd64": "linuxserver/jellyfin:amd64-v10.4.3-ls29"
"armhf": "linuxserver/jellyfin:arm32v7-v10.4.3-ls36",
"aarch64": "linuxserver/jellyfin:arm64v8-v10.4.3-ls36",
"amd64": "linuxserver/jellyfin:amd64-v10.4.3-ls36"
},
"squash": false,
"args": {}
}
}

View File

@@ -1,8 +1,8 @@
{
"name": "jellyfin",
"version": "0.2.0",
"version": "0.3.0",
"slug": "jellyfin",
"legacy": true,
"legacy": false,
"maintenance": {
"github_release": "https://github.com/linuxserver/docker-jellyfin",
"version_regex": "v(\\d+\\.\\d+\\.\\d+)-(ls\\d+)"

View File

@@ -0,0 +1,5 @@
#!/usr/bin/with-contenv bashio
for k in $(bashio::jq "${__BASHIO_ADDON_CONFIG}" 'keys | .[]'); do
printf "$(bashio::config $k)" > /var/run/s6/container_environment/$k
done

3
nzbget/CHANGELOG.md Normal file
View File

@@ -0,0 +1,3 @@
## 0.2.0
- not a legacy addon anymore

View File

@@ -2,6 +2,21 @@ ARG BUILD_FROM
# hadolint ignore=DL3006
FROM $BUILD_FROM
RUN apk add --no-cache \
jq=1.6-r0 \
&& curl -J -L -o /tmp/bashio.tar.gz \
"https://github.com/hassio-addons/bashio/archive/v0.8.0.tar.gz" \
&& mkdir /tmp/bashio \
&& tar zxvf \
/tmp/bashio.tar.gz \
--strip 1 -C /tmp/bashio \
\
&& mv /tmp/bashio/lib /usr/lib/bashio \
&& ln -s /usr/lib/bashio/bashio /usr/bin/bashio \
\
&& rm -f -r \
/tmp/*
# use /data instead of /config for hass.io environment
RUN sed -i "s|/config|/config/nzbget|g" /etc/services.d/nzbget/run \
&& sed -i "s|/config|/config/nzbget|g" /etc/cont-init.d/30-config \

View File

@@ -1,12 +1,12 @@
{
"build_from_template": {
"image": "linuxserver/nzbget",
"version": "v21.0-ls16"
"version": "v21.0-ls41"
},
"build_from": {
"armhf": "linuxserver/nzbget:arm32v7-v21.0-ls16",
"aarch64": "linuxserver/nzbget:arm64v8-v21.0-ls16",
"amd64": "linuxserver/nzbget:amd64-v21.0-ls16"
"armhf": "linuxserver/nzbget:arm32v7-v21.0-ls41",
"aarch64": "linuxserver/nzbget:arm64v8-v21.0-ls41",
"amd64": "linuxserver/nzbget:amd64-v21.0-ls41"
},
"squash": false,
"args": {}

View File

@@ -1,8 +1,8 @@
{
"name": "nzbget",
"version": "0.1.2",
"version": "0.2.0",
"slug": "nzbget",
"legacy": true,
"legacy": false,
"maintenance": {
"github_release": "https://github.com/linuxserver/docker-nzbget",
"version_regex": "v(\\d+\\.\\d+\\.?\\d*)-(ls\\d+)"

View File

@@ -0,0 +1,5 @@
#!/usr/bin/with-contenv bashio
for k in $(bashio::jq "${__BASHIO_ADDON_CONFIG}" 'keys | .[]'); do
printf "$(bashio::config $k)" > /var/run/s6/container_environment/$k
done

View File

@@ -1,4 +1,8 @@
## 0.4.0
## 0.5.0
- not a legacy addon anymore
## 0.4.0
- Update radarr to 0.2.0.1480 (linuxserver/radarr:v0.2.0.1480-ls51)

View File

@@ -2,6 +2,17 @@ ARG BUILD_FROM
# hadolint ignore=DL3006
FROM $BUILD_FROM
RUN curl -J -L -o /tmp/bashio.tar.gz \
"https://github.com/hassio-addons/bashio/archive/v0.7.1.tar.gz" \
&& mkdir /tmp/bashio \
&& tar zxvf \
/tmp/bashio.tar.gz \
--strip 1 -C /tmp/bashio \
\
&& mv /tmp/bashio/lib /usr/lib/bashio \
&& ln -s /usr/lib/bashio/bashio /usr/bin/bashio \
&& rm -fr /tmp/*
# use /data instead of /config for hass.io environment
RUN sed -i "s|/config|/config/radarr|g" /etc/services.d/radarr/run \
&& sed -i "s|/config|/config/radarr|g" /etc/cont-init.d/30-config

View File

@@ -1,8 +1,8 @@
{
"name": "radarr",
"version": "0.4.1",
"version": "0.5.0",
"slug": "radarr",
"legacy": true,
"legacy": false,
"maintenance": {
"github_release": "https://github.com/linuxserver/docker-radarr",
"version_regex": "v(\\d+\\.\\d+\\.\\d+\\.\\d+)-(ls\\d+)"

View File

@@ -0,0 +1,5 @@
#!/usr/bin/with-contenv bashio
for k in $(bashio::jq "${__BASHIO_ADDON_CONFIG}" 'keys | .[]'); do
printf "$(bashio::config $k)" > /var/run/s6/container_environment/$k
done

View File

@@ -1,3 +1,8 @@
## 0.3.0
- not a legacy addon anymore
- Update base image to linuxserver/sonarr:2.0.0.5338-ls50
## 0.2.2
- set snapshot_exclude for logs and MediaCover

View File

@@ -2,6 +2,17 @@ ARG BUILD_FROM
# hadolint ignore=DL3006
FROM $BUILD_FROM
RUN curl -J -L -o /tmp/bashio.tar.gz \
"https://github.com/hassio-addons/bashio/archive/v0.7.1.tar.gz" \
&& mkdir /tmp/bashio \
&& tar zxvf \
/tmp/bashio.tar.gz \
--strip 1 -C /tmp/bashio \
\
&& mv /tmp/bashio/lib /usr/lib/bashio \
&& ln -s /usr/lib/bashio/bashio /usr/bin/bashio \
&& rm -fr /tmp/*
# use /data instead of /config for hass.io environment
RUN sed -i "s|/config|/config/sonarr|g" /etc/services.d/sonarr/run \
&& sed -i "s|/config|/config/sonarr|g" /etc/cont-init.d/30-config

View File

@@ -1,13 +1,13 @@
{
"build_from_template": {
"image": "linuxserver/sonarr",
"version": "2.0.0.5338-ls31"
"version": "2.0.0.5338-ls50"
},
"build_from": {
"armhf": "linuxserver/sonarr:arm32v7-2.0.0.5338-ls31",
"aarch64": "linuxserver/sonarr:arm64v8-2.0.0.5338-ls31",
"amd64": "linuxserver/sonarr:amd64-2.0.0.5338-ls31"
"armhf": "linuxserver/sonarr:arm32v7-2.0.0.5338-ls50",
"aarch64": "linuxserver/sonarr:arm64v8-2.0.0.5338-ls50",
"amd64": "linuxserver/sonarr:amd64-2.0.0.5338-ls50"
},
"squash": false,
"args": {}
}
}

View File

@@ -1,8 +1,8 @@
{
"name": "sonarr",
"version": "0.2.2",
"version": "0.3.0",
"slug": "sonarr",
"legacy": true,
"legacy": false,
"maintenance": {
"github_release": "https://github.com/linuxserver/docker-sonarr",
"version_regex": "(\\d+\\.\\d+\\.\\d+\\.\\d+)-(ls\\d+)"

View File

@@ -0,0 +1,5 @@
#!/usr/bin/with-contenv bashio
for k in $(bashio::jq "${__BASHIO_ADDON_CONFIG}" 'keys | .[]'); do
printf "$(bashio::config $k)" > /var/run/s6/container_environment/$k
done

View File

@@ -1,3 +1,7 @@
## 0.2.0
- not a legacy addon anymore
## 0.1.2
- transmission-magnet-redirect 0.1.2 (petersendev/transmission-magnet-redirect:0.1.2)

View File

@@ -1,3 +1,41 @@
ARG BUILD_FROM
# hadolint ignore=DL3006
FROM $BUILD_FROM
FROM $BUILD_FROM
# Set shell
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
ARG BUILD_ARCH=amd64
RUN apt-get update \
\
&& apt-get install -y --no-install-recommends \
jq=1.5+dfsg-2+b1 \
\
&& S6_ARCH="${BUILD_ARCH}" \
&& if [ "${BUILD_ARCH}" = "i386" ]; then S6_ARCH="x86"; fi \
&& if [ "${BUILD_ARCH}" = "armv7" ]; then S6_ARCH="arm"; fi \
\
&& curl -L -s "https://github.com/just-containers/s6-overlay/releases/download/v1.22.1.0/s6-overlay-${S6_ARCH}.tar.gz" \
| tar zxvf - -C / \
\
&& mkdir -p /etc/fix-attrs.d \
&& mkdir -p /etc/services.d \
\
&& curl -J -L -o /tmp/bashio.tar.gz \
"https://github.com/hassio-addons/bashio/archive/v0.7.1.tar.gz" \
&& mkdir /tmp/bashio \
&& tar zxvf \
/tmp/bashio.tar.gz \
--strip 1 -C /tmp/bashio \
\
&& mv /tmp/bashio/lib /usr/lib/bashio \
&& ln -s /usr/lib/bashio/bashio /usr/bin/bashio \
&& rm -fr \
/tmp/* \
/var/{cache,log}/* \
/var/lib/apt/lists/*
# copy local files
COPY root/ /
ENTRYPOINT [ "/init" ]

View File

@@ -1,8 +1,8 @@
{
"name": "transmission-magnet-redirect",
"version": "0.1.2",
"version": "0.2.0",
"slug": "transmission-magnet-redirect",
"legacy": true,
"legacy": false,
"maintenance": {
"github_release": "https://github.com/petersendev/docker-transmission-magnet-redirect",
"version_regex": "(\\d+\\.\\d\\.\\d)"

View File

@@ -0,0 +1,5 @@
#!/usr/bin/with-contenv bashio
for k in $(bashio::jq "${__BASHIO_ADDON_CONFIG}" 'keys | .[]'); do
printf "$(bashio::config $k)" > /var/run/s6/container_environment/$k
done

View File

@@ -0,0 +1,6 @@
#!/usr/bin/execlineb -S0
if -n { s6-test $# -ne 0 }
if -n { s6-test ${1} -eq 256 }
s6-svscanctl -t /var/run/s6/services

View File

@@ -0,0 +1,6 @@
#!/usr/bin/with-contenv bashio
bashio::log.info 'Starting transmission-magnet-redirect...'
cd /app
exec dotnet TransmissionMagnetRedirect.dll

View File

@@ -1,3 +1,7 @@
## 0.3.0
- not a legacy addon anymore
## 0.2.2
- Added transmission environment variables to options validation

View File

@@ -2,6 +2,17 @@ ARG BUILD_FROM
# hadolint ignore=DL3006
FROM $BUILD_FROM
RUN curl -J -L -o /tmp/bashio.tar.gz \
"https://github.com/hassio-addons/bashio/archive/v0.7.1.tar.gz" \
&& mkdir /tmp/bashio \
&& tar zxvf \
/tmp/bashio.tar.gz \
--strip 1 -C /tmp/bashio \
\
&& mv /tmp/bashio/lib /usr/lib/bashio \
&& ln -s /usr/lib/bashio/bashio /usr/bin/bashio \
&& rm -fr /tmp/*
RUN usermod -d /config-internal abc \
&& sed -i "s|/config|/config-internal|g" /etc/openvpn/adjustConfigs.sh \
&& sed -i "s|/config|/config-internal|g" /etc/openvpn/updateConfigs.sh \

View File

@@ -1,8 +1,8 @@
{
"name": "transmission-openvpn",
"version": "0.2.2",
"version": "0.3.0",
"slug": "transmission-openvpn",
"legacy": true,
"legacy": false,
"maintenance": {
"github_release": "https://github.com/haugene/docker-transmission-openvpn",
"version_regex": "(\\d+\\.\\d+)",

View File

@@ -1,4 +1,4 @@
#!/bin/bash
#!/usr/bin/bashio
if [ ! -d /config/transmission-openvpn ]; then
echo "Creating /config/transmission-openvpn"
@@ -11,4 +11,8 @@ if [ -d /config/transmission-openvpn/openvpn ]; then
cp -R /config/transmission-openvpn/openvpn/* /etc/openvpn/
fi
for k in $(bashio::jq "${__BASHIO_ADDON_CONFIG}" 'keys | .[]'); do
export $k=$(bashio::config $k)
done
/etc/openvpn/start.sh

View File

@@ -1,3 +1,7 @@
## 0.4.0
- not a legacy addon anymore
## 0.3.0
- Update znc to 1.7.5 (linuxserver/znc:znc-1.7.5-ls23)

View File

@@ -2,6 +2,22 @@ ARG BUILD_FROM
# hadolint ignore=DL3006
FROM $BUILD_FROM
RUN apk add --no-cache \
curl=7.67.0-r0 \
jq=1.6-r0 \
&& curl -J -L -o /tmp/bashio.tar.gz \
"https://github.com/hassio-addons/bashio/archive/v0.8.0.tar.gz" \
&& mkdir /tmp/bashio \
&& tar zxvf \
/tmp/bashio.tar.gz \
--strip 1 -C /tmp/bashio \
\
&& mv /tmp/bashio/lib /usr/lib/bashio \
&& ln -s /usr/lib/bashio/bashio /usr/bin/bashio \
\
&& rm -f -r \
/tmp/*
# use /data instead of /config for hass.io environment
RUN sed -i "s|/config|/config/znc|g" /etc/services.d/znc/run \
&& sed -i "s|/config|/config/znc|g" /etc/cont-init.d/20-config \

View File

@@ -1,12 +1,12 @@
{
"build_from_template": {
"image": "linuxserver/znc",
"version": "znc-1.7.5-ls23"
"version": "znc-1.7.5-ls28"
},
"build_from": {
"armhf": "linuxserver/znc:arm32v7-znc-1.7.5-ls23",
"aarch64": "linuxserver/znc:arm64v8-znc-1.7.5-ls23",
"amd64": "linuxserver/znc:amd64-znc-1.7.5-ls23"
"armhf": "linuxserver/znc:arm32v7-znc-1.7.5-ls28",
"aarch64": "linuxserver/znc:arm64v8-znc-1.7.5-ls28",
"amd64": "linuxserver/znc:amd64-znc-1.7.5-ls28"
},
"squash": false,
"args": {}

View File

@@ -1,8 +1,8 @@
{
"name": "znc",
"version": "0.3.0",
"version": "0.4.0",
"slug": "znc",
"legacy": true,
"legacy": false,
"maintenance": {
"github_release": "https://github.com/linuxserver/docker-znc",
"version_regex": "(\\d+\\.\\d+\\.\\d+-?\\w*)-(ls\\d+)"

View File

@@ -0,0 +1,5 @@
#!/usr/bin/with-contenv bashio
for k in $(bashio::jq "${__BASHIO_ADDON_CONFIG}" 'keys | .[]'); do
printf "$(bashio::config $k)" > /var/run/s6/container_environment/$k
done