diff --git a/Dockerfile b/Dockerfile index 93f7d8f..2d4262b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:14.5.0-alpine +FROM node:alpine COPY dist/universal-statuspage /universal-statuspage diff --git a/config.json b/config.json index d988f5c..a01e3b9 100644 --- a/config.json +++ b/config.json @@ -2,23 +2,25 @@ "authToken": "test", "title": "sp-status", "description": "Services hosted by sp-codes", - "servicesPath": "$.alerts.*", - "idPath": "$.labels.status_service", "statePath": "$.status", "stateValues": { - "operational": ["ok", "resolved"], - "maintenance": ["paused"] + "operational": ["OK"], + "maintenance": ["PAUSED"] }, "groups": [ { "id": "test", "name": "Test", - "url": "http://sp-codes.de", "services": [ { "id": "test", "name": "test", - "statePath": "$.state" + "url": "http://sp-codes.de", + "statePath": "$.state", + "stateValues": { + "operational": ["ok"], + "maintenance": ["paused"] + } } ] } diff --git a/package.json b/package.json index cff548c..90a6c9d 100644 --- a/package.json +++ b/package.json @@ -26,10 +26,10 @@ "@angular/platform-browser-dynamic": "~10.0.2", "@angular/platform-server": "~10.0.2", "@angular/router": "~10.0.2", - "@fortawesome/fontawesome-free": "^5.14.0", + "@fortawesome/fontawesome-free": "^5.13.1", "@nguniversal/express-engine": "^10.0.1", "bootstrap": "^4.5.0", - "express": "^4.17.1", + "express": "^4.15.2", "jsonpath-plus": "^4.0.0", "roboto-fontface": "^0.10.0", "rxjs": "~6.6.0", @@ -42,7 +42,7 @@ "@angular/compiler-cli": "~10.0.2", "@angular/language-service": "~10.0.2", "@nguniversal/builders": "^10.0.1", - "@types/express": "^4.17.7", + "@types/express": "^4.17.0", "@types/node": "^14.0.14", "@types/jasmine": "~3.5.11", "@types/jasminewd2": "~2.0.3", diff --git a/renovate.json b/renovate.json index 750c5c1..b10109a 100644 --- a/renovate.json +++ b/renovate.json @@ -25,7 +25,7 @@ "zone.js" ], "packagePatterns": [ - "^@angular", + "^angular", "^karma", "^jasmine" ], diff --git a/src/app/_data/data.ts b/src/app/_data/data.ts index 478dd1a..355e0dc 100644 --- a/src/app/_data/data.ts +++ b/src/app/_data/data.ts @@ -8,7 +8,6 @@ export interface CurrentStatus { export interface Group { id: string; name: string; - url?: string; state: State; services: Service[]; } @@ -16,7 +15,7 @@ export interface Group { export interface Service { id: string; name: string; - url?: string; + url: string; state: State; } diff --git a/src/app/status/status.component.html b/src/app/status/status.component.html index f0b5aa2..6ef500a 100644 --- a/src/app/status/status.component.html +++ b/src/app/status/status.component.html @@ -1,15 +1,14 @@ - - - {{group.name}} - {{group.name}} - + {{group.name}} + + + - +
{{service.name}} diff --git a/src/app/status/status.component.scss b/src/app/status/status.component.scss index 310e4f4..558a8af 100644 --- a/src/app/status/status.component.scss +++ b/src/app/status/status.component.scss @@ -13,11 +13,6 @@ a { text-decoration: none; outline: none; - color: #ffffff; - - &:hover.name, &:hover .name { - text-decoration: underline; - } } mat-panel-title { diff --git a/src/main.status.ts b/src/main.status.ts index 8b466bd..54e7f4d 100644 --- a/src/main.status.ts +++ b/src/main.status.ts @@ -12,9 +12,7 @@ interface Config { authToken: string; title: string; description: string; - servicesPath?: string; - idPath?: string; - statePath?: string; + statePath: string; stateValues: { operational: string[]; maintenance: string[]; @@ -22,26 +20,42 @@ interface Config { groups: { id: string; name: string; - url?: string; services: { id: string; name: string; - url?: string; + url: string; statePath?: string; + stateValues?: { + operational?: string[]; + maintenance?: string[]; + }; }[]; }[]; } +interface StateKey { + statePath: string; + stateValues: { + operational: string[]; + maintenance: string[]; + }; +} + const api = Router(); api.use(json()); const serviceStates = existsSync(join(process.cwd(), 'cache.json')) ? JSON.parse(readFileSync(join(process.cwd(), 'cache.json'), {encoding: 'utf-8'})) : {} as Cache; const config = JSON.parse(readFileSync(join(process.cwd(), 'config.json'), {encoding: 'utf-8'})) as Config; -const serviceStatePaths: { [service: string]: string } = config.groups +const stateKeys: { [service: string]: StateKey } = config.groups .map(g => g.services).reduce((x, y) => x.concat(y), []) - .filter(s => s.statePath) .reduce((services, service) => { - services[service.id] = service.statePath; + services[service.id] = { + statePath: service.statePath || config.statePath, + stateValues: { + operational: service.stateValues ? service.stateValues.operational || config.stateValues.operational : config.stateValues.operational, + maintenance: service.stateValues ? service.stateValues.maintenance || config.stateValues.maintenance : config.stateValues.maintenance, + } + }; return services; }, {}); @@ -54,26 +68,16 @@ api.post('/update/health', (req, res) => { return res.status(401).send('invalid token'); } const serviceId = req.query.service as string; - let services: { id: string, state: string }[] = []; - if (serviceId) { - services = [{id: serviceId, state: JSONPath({path: serviceStatePaths[serviceId], json: req.body, wrap: false})}]; - } else if (config.servicesPath && config.idPath && config.statePath) { - services = JSONPath({path: config.servicesPath, json: req.body}) - .map(s => ({ - id: JSONPath({path: config.idPath, json: s, wrap: false}), - state: JSONPath({path: config.statePath, json: s, wrap: false}) - })); - } + const keys = stateKeys[serviceId]; + const state = JSONPath({path: keys.statePath, json: req.body, wrap: false}); - services.forEach(s => { - if (config.stateValues.operational.includes(s.state)) { - serviceStates[s.id] = 'operational'; - } else if (config.stateValues.maintenance.includes(s.state)) { - serviceStates[s.id] = 'maintenance'; - } else { - serviceStates[s.id] = 'outage'; - } - }); + if (keys.stateValues.operational.includes(state)) { + serviceStates[serviceId] = 'operational'; + } else if (keys.stateValues.maintenance.includes(state)) { + serviceStates[serviceId] = 'maintenance'; + } else { + serviceStates[serviceId] = 'outage'; + } updateCache(); @@ -106,7 +110,6 @@ function updateCache(): void { return { id: group.id, name: group.name, - url: group.url, state: calculateOverallState(services.map(s => s.state)), services: services };