feat: watch config file for external edits

This commit is contained in:
Aarnav Tale 2024-03-30 02:53:51 -04:00
parent 02e5e3e92a
commit cc1427882f
No known key found for this signature in database
4 changed files with 23 additions and 4 deletions

View File

@ -10,7 +10,7 @@ import {
import { ErrorPopup } from '~/components/Error'
import Toaster from '~/components/Toaster'
import stylesheet from '~/tailwind.css?url'
import { getContext } from '~/utils/config'
import { getContext, registerConfigWatcher } from '~/utils/config'
export const meta: MetaFunction = () => [
{ title: 'Headplane' },
@ -23,6 +23,7 @@ export const links: LinksFunction = () => [
export async function loader() {
await getContext()
registerConfigWatcher()
if (!process.env.HEADSCALE_URL) {
throw new Error('The HEADSCALE_URL environment variable is required')

View File

@ -1,6 +1,7 @@
import { access, constants, readFile, stat, writeFile } from 'node:fs/promises'
import { access, constants, readFile, writeFile } from 'node:fs/promises'
import { resolve } from 'node:path'
import { type FSWatcher, watch } from 'chokidar'
import { type Document, parseDocument } from 'yaml'
type Duration = `${string}s` | `${string}h` | `${string}m` | `${string}d` | `${string}y`
@ -120,8 +121,8 @@ type Config = {
let config: Document
export async function getConfig() {
if (!config) {
export async function getConfig(force = false) {
if (!config || force) {
const path = resolve(process.env.CONFIG_FILE ?? '/etc/headscale/config.yaml')
const data = await readFile(path, 'utf8')
config = parseDocument(data)
@ -140,6 +141,19 @@ export async function patchConfig(partial: Record<string, unknown>) {
await writeFile(path, config.toString(), 'utf8')
}
let watcher: FSWatcher
export function registerConfigWatcher() {
if (watcher) {
return
}
const path = resolve(process.env.CONFIG_FILE ?? '/etc/headscale/config.yaml')
watcher = watch(path).on('change', async () => {
await getConfig(true)
})
}
type Context = {
hasDockerSock: boolean;
hasConfig: boolean;

View File

@ -20,6 +20,7 @@
"@remix-run/node": "^2.8.1",
"@remix-run/react": "^2.8.1",
"@remix-run/serve": "^2.8.1",
"chokidar": "^3.6.0",
"clsx": "^2.1.0",
"isbot": "^4.1.0",
"oauth4webapi": "^2.10.3",

View File

@ -32,6 +32,9 @@ dependencies:
'@remix-run/serve':
specifier: ^2.8.1
version: 2.8.1(typescript@5.4.3)
chokidar:
specifier: ^3.6.0
version: 3.6.0
clsx:
specifier: ^2.1.0
version: 2.1.0