chore: centralize configuration management using a new Config class
- Replaced all direct `process.env` references with `Config` class constants. - Added `dotenv` package to manage environment variables. - Updated affected files, including schema loader, Zabbix API, resolvers, logging system, and integration points. - Improved maintainability and consistency in environment variable handling.
This commit is contained in:
parent
6312c3a2f7
commit
2a8ff989f3
10 changed files with 95 additions and 72 deletions
|
|
@ -58,6 +58,7 @@ import {ZABBIX_EDGE_DEVICE_BASE_GROUP, zabbixAPI} from "../datasources/zabbix-ap
|
|||
import {GraphQLInterfaceType, GraphQLList} from "graphql/type/index.js";
|
||||
import {isDevice} from "./resolver_helpers.js";
|
||||
import {ZabbixPermissionsHelper} from "../datasources/zabbix-permissions.js";
|
||||
import {Config} from "../common_utils.js";
|
||||
|
||||
|
||||
export function createResolvers(): Resolvers {
|
||||
|
|
@ -78,7 +79,7 @@ export function createResolvers(): Resolvers {
|
|||
return dataSources.zabbixAPI.getLocations(zabbixAuthToken, new ParsedArgs(args));
|
||||
},
|
||||
apiVersion: () => {
|
||||
return process.env.API_VERSION ?? "unknown"
|
||||
return Config.API_VERSION ?? "unknown"
|
||||
},
|
||||
zabbixVersion: async () => {
|
||||
return await new ZabbixRequest<string>("apiinfo.version").executeRequestThrowError(
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ import {readFileSync} from "fs";
|
|||
import {GraphQLSchema} from "graphql/type";
|
||||
import {createResolvers} from "./resolvers.js";
|
||||
import {readdirSync} from "node:fs";
|
||||
import {Config} from "../common_utils.js";
|
||||
|
||||
|
||||
const createZabbixHierarchicalDeviceFieldResolver =
|
||||
|
|
@ -26,15 +27,15 @@ const createZabbixHierarchicalDeviceTagsResolver =
|
|||
}
|
||||
export async function schema_loader(): Promise<GraphQLSchema> {
|
||||
const resolvers = createResolvers();
|
||||
const schemaPath = process.env.SCHEMA_PATH || './schema/';
|
||||
const schemaPath = Config.SCHEMA_PATH || './schema/';
|
||||
console.log(`Loading schema from path: ${schemaPath}, cwd=${process.cwd()}`);
|
||||
var schemaFiles = readdirSync(schemaPath).filter(fn => fn.endsWith('.graphql'));
|
||||
let typeDefs: string = "";
|
||||
for (const schemaFile of schemaFiles) {
|
||||
typeDefs += readFileSync(schemaPath + schemaFile, {encoding: 'utf-8'});
|
||||
}
|
||||
if (process.env.ADDITIONAL_SCHEMAS) {
|
||||
for (const schema of process.env.ADDITIONAL_SCHEMAS.split(",")){
|
||||
if (Config.ADDITIONAL_SCHEMAS) {
|
||||
for (const schema of Config.ADDITIONAL_SCHEMAS.split(",")){
|
||||
typeDefs += readFileSync(schema, {encoding: 'utf-8'});
|
||||
}
|
||||
}
|
||||
|
|
@ -54,8 +55,8 @@ export async function schema_loader(): Promise<GraphQLSchema> {
|
|||
GenericDevice: createZabbixHierarchicalDeviceFieldResolver("GenericDevice", originalSchema, additionalMappings),
|
||||
DeviceConfig: createZabbixHierarchicalDeviceTagsResolver("DeviceConfig", originalSchema),
|
||||
}
|
||||
if (process.env.ADDITIONAL_RESOLVERS) {
|
||||
for (const resolver of process.env.ADDITIONAL_RESOLVERS.split(",")){
|
||||
if (Config.ADDITIONAL_RESOLVERS) {
|
||||
for (const resolver of Config.ADDITIONAL_RESOLVERS.split(",")){
|
||||
genericResolvers[resolver] = createZabbixHierarchicalDeviceFieldResolver(resolver, originalSchema, additionalMappings)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,8 +1,17 @@
|
|||
export function sleep(ms: number): { promise: Promise<void>, cancel: () => void } {
|
||||
let timeoutId: NodeJS.Timeout;
|
||||
const promise = new Promise<void>((resolve) => {
|
||||
timeoutId = setTimeout(resolve, ms);
|
||||
});
|
||||
const cancel = () => clearTimeout(timeoutId);
|
||||
return { promise, cancel };
|
||||
import {configDotenv} from "dotenv";
|
||||
configDotenv();
|
||||
|
||||
export class Config {
|
||||
static readonly ZABBIX_BASE_URL = process.env.ZABBIX_BASE_URL || ""
|
||||
static readonly DRY_RUN = process.env.DRY_RUN
|
||||
static readonly API_VERSION = process.env.API_VERSION
|
||||
static readonly SCHEMA_PATH = process.env.SCHEMA_PATH || './schema/'
|
||||
static readonly ADDITIONAL_SCHEMAS = process.env.ADDITIONAL_SCHEMAS
|
||||
static readonly ADDITIONAL_RESOLVERS = process.env.ADDITIONAL_RESOLVERS
|
||||
static readonly ZABBIX_AUTH_TOKEN_FOR_REQUESTS = process.env.ZABBIX_AUTH_TOKEN_FOR_REQUESTS
|
||||
static readonly ZABBIX_AUTH_TOKEN = process.env.ZABBIX_AUTH_TOKEN
|
||||
static readonly ZABBIX_EDGE_DEVICE_BASE_GROUP = process.env.ZABBIX_EDGE_DEVICE_BASE_GROUP
|
||||
static readonly ZABBIX_ROADWORK_BASE_GROUP = process.env.ZABBIX_ROADWORK_BASE_GROUP
|
||||
static readonly ZABBIX_PERMISSION_TEMPLATE_GROUP_NAME_PREFIX = process.env.ZABBIX_PERMISSION_TEMPLATE_GROUP_NAME_PREFIX || "Permissions"
|
||||
static readonly LOG_LEVELS = process.env.LOG_LEVELS
|
||||
}
|
||||
|
|
@ -7,10 +7,11 @@ import {
|
|||
} from "@apollo/datasource-rest";
|
||||
import {logger} from "../logging/logger.js";
|
||||
import {ParsedArgs, ZabbixErrorResult, ZabbixRequest, ZabbixResult} from "./zabbix-request.js";
|
||||
import {Config} from "../common_utils.js";
|
||||
|
||||
export const zabbixRequestAuthToken = process.env.ZABBIX_AUTH_TOKEN_FOR_REQUESTS
|
||||
export const zabbixSuperAuthToken = process.env.ZABBIX_AUTH_TOKEN
|
||||
export const ZABBIX_EDGE_DEVICE_BASE_GROUP = process.env.ZABBIX_EDGE_DEVICE_BASE_GROUP || process.env.ZABBIX_ROADWORK_BASE_GROUP || "Roadwork"
|
||||
export const zabbixRequestAuthToken = Config.ZABBIX_AUTH_TOKEN_FOR_REQUESTS
|
||||
export const zabbixSuperAuthToken = Config.ZABBIX_AUTH_TOKEN
|
||||
export const ZABBIX_EDGE_DEVICE_BASE_GROUP = Config.ZABBIX_EDGE_DEVICE_BASE_GROUP || Config.ZABBIX_ROADWORK_BASE_GROUP || "Roadwork"
|
||||
export const FIND_ZABBIX_EDGE_DEVICE_BASE_GROUP_PREFIX = new RegExp(`^(${ZABBIX_EDGE_DEVICE_BASE_GROUP})\/`)
|
||||
|
||||
export class ZabbixAPI
|
||||
|
|
@ -103,4 +104,4 @@ export class ZabbixAPI
|
|||
}
|
||||
}
|
||||
|
||||
export const zabbixAPI = new ZabbixAPI(process.env.ZABBIX_BASE_URL || "")
|
||||
export const zabbixAPI = new ZabbixAPI(Config.ZABBIX_BASE_URL)
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ import {ParsedArgs, ZabbixErrorResult, ZabbixRequest, ZabbixResult} from "./zabb
|
|||
import {ZabbixAPI} from "./zabbix-api.js";
|
||||
import {InputMaybe, Permission, QueryHasPermissionsArgs, UserPermission} from "../schema/generated/graphql.js";
|
||||
import {ApiErrorCode, PermissionNumber} from "../model/model_enum_values.js";
|
||||
import {Config} from "../common_utils.js";
|
||||
|
||||
|
||||
export class ZabbixRequestWithPermissions<T extends ZabbixResult, A extends ParsedArgs = ParsedArgs> extends ZabbixRequest<T, A> {
|
||||
|
|
@ -93,7 +94,7 @@ class ZabbixQueryUserGroupPermissionsRequest extends ZabbixRequest<ZabbixUserGro
|
|||
|
||||
export class ZabbixPermissionsHelper {
|
||||
private static permissionObjectNameCache: Map<string, string | null> = new Map()
|
||||
public static ZABBIX_PERMISSION_TEMPLATE_GROUP_NAME_PREFIX = process.env.ZABBIX_PERMISSION_TEMPLATE_GROUP_NAME_PREFIX || "Permissions"
|
||||
public static ZABBIX_PERMISSION_TEMPLATE_GROUP_NAME_PREFIX = Config.ZABBIX_PERMISSION_TEMPLATE_GROUP_NAME_PREFIX
|
||||
|
||||
public static async getUserPermissions(zabbixAPI: ZabbixAPI, zabbixAuthToken?: string, cookie?: string,
|
||||
objectNames?: InputMaybe<string[]> | undefined): Promise<UserPermission[]> {
|
||||
|
|
|
|||
|
|
@ -1,11 +1,12 @@
|
|||
import {startAPi} from "./api/start.js";
|
||||
import {logger} from "./logging/logger.js";
|
||||
import {Config} from "./common_utils.js";
|
||||
|
||||
// Determine and log the operation mode first:
|
||||
// Controller and api share the same code base
|
||||
// but may run independently
|
||||
|
||||
if (process.env.DRY_RUN) {
|
||||
if (Config.DRY_RUN) {
|
||||
logger.info("Dry run mode - exiting directly without starting anything")
|
||||
process.exit(0)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
import {Config} from "../common_utils.js";
|
||||
|
||||
export enum Loglevel {
|
||||
ERROR="ERROR", WARN="WARN", INFO="INFO", TRACE="TRACE", DEBUG="DEBUG"
|
||||
}
|
||||
|
|
@ -11,7 +13,7 @@ export class Logger {
|
|||
}
|
||||
|
||||
readEnvironmentLogLevel() {
|
||||
const levels = process.env.LOG_LEVELS
|
||||
const levels = Config.LOG_LEVELS
|
||||
if (levels) {
|
||||
const enumLevels = levels.split(",").map(v=> Loglevel[v as keyof typeof Loglevel])
|
||||
this.levels = new Set<Loglevel>(enumLevels)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue