feat: import to docker form board, docker button on boards (#1714)
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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;
|
||||
}),
|
||||
|
||||
@@ -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(),
|
||||
|
||||
Reference in New Issue
Block a user