feat: import to docker form board, docker button on boards (#1714)

This commit is contained in:
Thomas Camlong
2023-12-30 20:11:38 +01:00
committed by GitHub
parent e13a4afdde
commit 082077ec9d
16 changed files with 234 additions and 138 deletions

View File

@@ -1,7 +1,6 @@
import { TRPCError } from '@trpc/server';
import axios, { AxiosError } from 'axios';
import { AxiosError } from 'axios';
import Consola from 'consola';
import https from 'https';
import { z } from 'zod';
import { isStatusOk } from '~/components/Dashboard/Tiles/Apps/AppPing';
import { getConfig } from '~/tools/config/getConfig';
@@ -18,7 +17,6 @@ export const appRouter = createTRPCRouter({
})
)
.query(async ({ input }) => {
const agent = new https.Agent({ rejectUnauthorized: false });
const config = getConfig(input.configName);
const app = config.apps.find((app) => app.id === input.id);
@@ -30,8 +28,16 @@ export const appRouter = createTRPCRouter({
message: `App ${input.id} was not found`,
});
}
const res = await axios
.get(app.url, { httpsAgent: agent, timeout: 10000 })
const res = await fetch(app.url, {
method: 'GET',
cache: 'force-cache',
headers: {
// Cache for 5 minutes
'Cache-Control': 'max-age=300',
'Content-Type': 'application/json',
},
})
.then((response) => ({
status: response.status,
statusText: response.statusText,

View File

@@ -41,6 +41,7 @@ export const boardRouter = createTRPCRouter({
apps: z.array(
z.object({
name: z.string(),
icon: z.string().optional(),
port: z.number().optional(),
})
),
@@ -54,7 +55,6 @@ export const boardRouter = createTRPCRouter({
});
}
const config = await getConfig(input.boardName);
const lowestWrapper = config?.wrappers.sort((a, b) => a.position - b.position)[0];
const newConfig = {
@@ -66,11 +66,14 @@ export const boardRouter = createTRPCRouter({
const address = container.port
? `http://localhost:${container.port}`
: 'http://localhost';
return {
...defaultApp,
name: container.name,
url: address,
appearance: {
...defaultApp.appearance,
iconUrl: container.icon,
},
behaviour: {
...defaultApp.behaviour,
externalUrl: address,

View File

@@ -3,6 +3,7 @@ import Dockerode from 'dockerode';
import { z } from 'zod';
import { adminProcedure, createTRPCRouter } from '../../trpc';
import { IconRespositories } from '../icon';
import DockerSingleton from './DockerSingleton';
const dockerActionSchema = z.enum(['remove', 'start', 'stop', 'restart']);
@@ -12,7 +13,27 @@ export const dockerRouter = createTRPCRouter({
try {
const docker = new Dockerode({});
const containers = await docker.listContainers({ all: true });
return containers;
const fetches = IconRespositories.map((rep) => rep.fetch());
const data = await Promise.all(fetches);
const returnedData = containers.map((container) => {
const imageParsed = container.Image.split('/');
// Remove the version
const image = imageParsed[imageParsed.length - 1].split(':')[0];
const foundIcon = data
.flatMap((repository) =>
repository.entries.map((entry) => ({
...entry,
repository: repository.name,
}))
)
.find((entry) => entry.name.toLowerCase().includes(image.toLowerCase()));
return {
...container,
icon: foundIcon?.url ?? '/public/imgs/logo/logo.svg'
};
});
return returnedData;
} catch (err) {
throw new TRPCError({
code: 'INTERNAL_SERVER_ERROR',

View File

@@ -1,36 +1,37 @@
import { GitHubIconsRepository } from '~/tools/server/images/github-icons-repository';
import { JsdelivrIconsRepository } from '~/tools/server/images/jsdelivr-icons-repository';
import { LocalIconsRepository } from '~/tools/server/images/local-icons-repository';
import { UnpkgIconsRepository } from '~/tools/server/images/unpkg-icons-repository';
import { GitHubIconsRepository } from '~/tools/server/images/github-icons-repository';
import { createTRPCRouter, publicProcedure } from '../trpc';
export const IconRespositories = [
new LocalIconsRepository(),
new GitHubIconsRepository(
GitHubIconsRepository.walkxcode,
'Walkxcode Dashboard Icons',
'Walkxcode on Github'
),
new UnpkgIconsRepository(
UnpkgIconsRepository.tablerRepository,
'Tabler Icons',
'Tabler Icons - GitHub (MIT)'
),
new JsdelivrIconsRepository(
JsdelivrIconsRepository.papirusRepository,
'Papirus Icons',
'Papirus Development Team on GitHub (Apache 2.0)'
),
new JsdelivrIconsRepository(
JsdelivrIconsRepository.homelabSvgAssetsRepository,
'Homelab Svg Assets',
'loganmarchione on GitHub (MIT)'
),
];
export const iconRouter = createTRPCRouter({
all: publicProcedure.query(async () => {
const respositories = [
new LocalIconsRepository(),
new GitHubIconsRepository(
GitHubIconsRepository.walkxcode,
'Walkxcode Dashboard Icons',
'Walkxcode on Github'
),
new UnpkgIconsRepository(
UnpkgIconsRepository.tablerRepository,
'Tabler Icons',
'Tabler Icons - GitHub (MIT)'
),
new JsdelivrIconsRepository(
JsdelivrIconsRepository.papirusRepository,
'Papirus Icons',
'Papirus Development Team on GitHub (Apache 2.0)'
),
new JsdelivrIconsRepository(
JsdelivrIconsRepository.homelabSvgAssetsRepository,
'Homelab Svg Assets',
'loganmarchione on GitHub (MIT)'
),
];
const fetches = respositories.map((rep) => rep.fetch());
const fetches = IconRespositories.map((rep) => rep.fetch());
const data = await Promise.all(fetches);
return data;
}),

View File

@@ -7,10 +7,10 @@ import { OriginalLanguage, Result } from '~/modules/overseerr/SearchResult';
import { TvShowResult } from '~/modules/overseerr/TvShow';
import { getConfig } from '~/tools/config/getConfig';
import { createTRPCRouter, publicProcedure } from '../trpc';
import { protectedProcedure, createTRPCRouter, publicProcedure } from '../trpc';
export const overseerrRouter = createTRPCRouter({
search: publicProcedure
search: protectedProcedure
.input(
z.object({
configName: z.string(),