mirror of
https://github.com/tormachris/cf-workers-status-page.git
synced 2025-07-04 11:02:48 +02:00
feat: move gc monitors from cron schedule to deploy postCommands
This commit is contained in:
74
src/cli/gcMonitors.js
Normal file
74
src/cli/gcMonitors.js
Normal file
@ -0,0 +1,74 @@
|
||||
const yaml = require('yaml-loader')
|
||||
const fetch = require('node-fetch')
|
||||
const fs = require('fs')
|
||||
|
||||
const accountId = process.env.CF_ACCOUNT_ID
|
||||
const namespaceId = process.env.KV_NAMESPACE_ID
|
||||
const apiToken = process.env.CF_API_TOKEN
|
||||
|
||||
const kvPrefix = 's_'
|
||||
|
||||
if (!accountId || !namespaceId || !apiToken) {
|
||||
console.error("Missing required environment variables: CF_ACCOUNT_ID, KV_NAMESPACE_ID, CF_API_TOKEN")
|
||||
process.exit(0)
|
||||
}
|
||||
|
||||
async function getKvMonitors(kvPrefix) {
|
||||
const init = {
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
Authorization: `Bearer ${apiToken}`,
|
||||
},
|
||||
}
|
||||
|
||||
const res = await fetch(
|
||||
`https://api.cloudflare.com/client/v4/accounts/${accountId}/storage/kv/namespaces/${namespaceId}/keys?limit=100&prefix=${kvPrefix}`,
|
||||
init,
|
||||
)
|
||||
const json = await res.json()
|
||||
return json.result
|
||||
}
|
||||
|
||||
async function deleteKvBulk(keys) {
|
||||
const init = {
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
Authorization: `Bearer ${apiToken}`,
|
||||
},
|
||||
method: 'DELETE',
|
||||
body: JSON.stringify(keys),
|
||||
}
|
||||
|
||||
return await fetch(
|
||||
`https://api.cloudflare.com/client/v4/accounts/${accountId}/storage/kv/namespaces/${namespaceId}/bulk`,
|
||||
init,
|
||||
)
|
||||
}
|
||||
|
||||
function loadConfig() {
|
||||
const configFile = fs.readFileSync('./config.yaml', 'utf8')
|
||||
const config = yaml(configFile)
|
||||
return JSON.parse(config)
|
||||
}
|
||||
|
||||
getKvMonitors(kvPrefix).then(async kvMonitors => {
|
||||
const config = loadConfig()
|
||||
const monitors = config.monitors.map(key => {
|
||||
return key.id
|
||||
})
|
||||
const kvState = kvMonitors.map(key => {
|
||||
return key.name
|
||||
})
|
||||
const keysForRemoval = kvState.filter(
|
||||
x => !monitors.includes(x.replace(kvPrefix, '')),
|
||||
)
|
||||
|
||||
if (keysForRemoval.length > 0) {
|
||||
console.log(
|
||||
`Removing following keys from KV storage as they are no longer in the config: ${keysForRemoval.join(
|
||||
', ',
|
||||
)}`,
|
||||
)
|
||||
await deleteKvBulk(keysForRemoval)
|
||||
}
|
||||
}).catch(e => console.log(e))
|
@ -3,7 +3,6 @@ import config from '../../config.yaml'
|
||||
import {
|
||||
setKV,
|
||||
getKVWithMetadata,
|
||||
gcMonitors,
|
||||
getKV,
|
||||
notifySlack,
|
||||
} from './helpers'
|
||||
@ -70,8 +69,5 @@ export async function processCronTrigger(event) {
|
||||
const loc = res.headers.get('cf-ray').split('-')[1]
|
||||
await setKV('lastUpdate', Date.now(), { loc })
|
||||
|
||||
// gc monitor statuses
|
||||
event.waitUntil(gcMonitors(config))
|
||||
|
||||
return new Response('OK')
|
||||
}
|
||||
|
@ -56,26 +56,6 @@ export async function deleteKV(key) {
|
||||
return KV_STATUS_PAGE.delete(key)
|
||||
}
|
||||
|
||||
export async function gcMonitors(config) {
|
||||
const checkKvPrefix = 's_'
|
||||
|
||||
const monitors = config.monitors.map(key => {
|
||||
return key.id
|
||||
})
|
||||
|
||||
const kvMonitors = await listKV(checkKvPrefix)
|
||||
const kvState = kvMonitors.keys.map(key => {
|
||||
return key.metadata.id
|
||||
})
|
||||
|
||||
const keysForRemoval = kvState.filter(x => !monitors.includes(x))
|
||||
|
||||
for (const key of keysForRemoval) {
|
||||
console.log('gc: deleting ' + checkKvPrefix + key)
|
||||
await deleteKV(checkKvPrefix + key)
|
||||
}
|
||||
}
|
||||
|
||||
export async function notifySlack(monitor, newMetadata) {
|
||||
const payload = {
|
||||
attachments: [
|
||||
|
Reference in New Issue
Block a user