59 lines
1.3 KiB
TypeScript
59 lines
1.3 KiB
TypeScript
import docker from './docker'
|
|
import proc from './proc'
|
|
|
|
export interface Integration {
|
|
name: string
|
|
preflight: () => Promise<boolean>
|
|
sighup?: () => Promise<void>
|
|
restart?: () => Promise<void>
|
|
}
|
|
|
|
// Because we previously supported the Docker integration by
|
|
// checking for the HEADSCALE_CONTAINER variable, we need to
|
|
// check for it here as well.
|
|
//
|
|
// This ensures that when people upgrade from older versions
|
|
// of Headplane, they don't explicitly need to define the new
|
|
// HEADSCALE_INTEGRATION variable that is needed to configure
|
|
// an integration.
|
|
export async function checkIntegration() {
|
|
let integration = process.env.HEADSCALE_INTEGRATION
|
|
?.trim()
|
|
.toLowerCase()
|
|
|
|
// Old HEADSCALE_CONTAINER variable upgrade path
|
|
if (!integration && process.env.HEADSCALE_CONTAINER) {
|
|
integration = 'docker'
|
|
}
|
|
|
|
if (!integration) {
|
|
console.log('Running Headplane without any integrations')
|
|
return
|
|
}
|
|
|
|
let module: Integration | undefined
|
|
try {
|
|
module = getIntegration(integration)
|
|
await module.preflight()
|
|
} catch (error) {
|
|
console.error('Failed to load integration', error)
|
|
return
|
|
}
|
|
|
|
return module
|
|
}
|
|
|
|
function getIntegration(name: string) {
|
|
switch (name) {
|
|
case 'docker': {
|
|
return docker
|
|
}
|
|
case 'proc': {
|
|
return proc
|
|
}
|
|
default: {
|
|
throw new Error(`Unknown integration: ${name}`)
|
|
}
|
|
}
|
|
}
|