summaryrefslogtreecommitdiffstats
path: root/server/api
diff options
context:
space:
mode:
authorChristian Hofmaier2019-04-02 18:06:39 +0200
committerChristian Hofmaier2019-04-02 18:06:39 +0200
commit9dfdf872eb03499c122ef455974ced4c047aebd6 (patch)
tree4c0c8b918d8645b61a46480590b7ebe90bec1e4a /server/api
parent[eventmanager] adjustment of config api call (diff)
downloadbas-9dfdf872eb03499c122ef455974ced4c047aebd6.tar.gz
bas-9dfdf872eb03499c122ef455974ced4c047aebd6.tar.xz
bas-9dfdf872eb03499c122ef455974ced4c047aebd6.zip
[configloader] implement time filter for events
Diffstat (limited to 'server/api')
-rw-r--r--server/api/configloader.js287
1 files changed, 155 insertions, 132 deletions
diff --git a/server/api/configloader.js b/server/api/configloader.js
index bec480d..bb8f9f5 100644
--- a/server/api/configloader.js
+++ b/server/api/configloader.js
@@ -13,144 +13,95 @@ noAuthRouter.getAsync('/:uuid', async (req, res) => {
res.setHeader('content-type', 'text/plain')
var client = await db.client.findOne({ where: { uuid: uuid }, include: ['groups', 'events'] })
- if (client !== null) {
- // Client is in db, check for registration hooks.
- if (client.registrationState !== null) {
- // client is in registration state, load scripts
- var hook = await db.registrationhook.findOne({ where: { id: client.registrationState } })
- if (hook.type === 'IPXE') res.send(hook.script)
- else if (hook.type === 'BASH') await sendFilePromise(res, path.join(__appdir, 'ipxe', 'minilinux.ipxe'))
- return
- }
- var events = []
- var blacklist = []
- var importantEvents = []
- var groupIds = []
- var result
- var now = new Date()
+ // client not known, start registration
+ if (client === null) {
+ await sendFilePromise(res, path.join(__appdir, 'ipxe', 'registration.ipxe'))
+ return
+ }
- for (let i = 0; i < client.events.length; i++) {
- let intime = true
- let times = client.events[i].times
+ // Client is in db, check for registration hooks.
+ if (client.registrationState !== null) {
+ // client is in registration state, load scripts
+ var hook = await db.registrationhook.findOne({ where: { id: client.registrationState } })
+ if (hook.type === 'IPXE') res.send(hook.script)
+ else if (hook.type === 'BASH') await sendFilePromise(res, path.join(__appdir, 'ipxe', 'minilinux.ipxe'))
+ return
+ }
- if (times.repetitive) {
- let intervalBool = true
- if (times.monthMap[now.getMonth()] && times.dayMap[((now.getDay() + 6) % 7)] && intervalBool) intime = true
- } else {
- if (times.start <= now.getTime() <= times.end) intime = true
- }
+ var events = []
+ var blacklist = []
+ var importantEvents = []
+ var groupIds = []
+ var result
- if (intime) {
- if (client.events[i].client_x_event.blacklist) blacklist.push(client.events[i].id)
- else if (client.events[i].important) importantEvents.push(client.events[i])
- else events.push(client.events[i])
- } else continue
- }
+ for (let i = 0; i < client.events.length; i++) {
+ var times = JSON.parse(client.events[i].times)
+ var intime = checkEventNow(times)
+ if (intime) {
+ console.log('Event ist intime: ' + client.events[i].name)
+ if (client.events[i].client_x_event.blacklist) blacklist.push(client.events[i].id)
+ else if (client.events[i].important) importantEvents.push(client.events[i])
+ else events.push(client.events[i])
+ } else console.log('Event ' + client.events[i].name + ' ist nicht intime' )
+ }
- importantEvents = importantEvents.filter(e => !blacklist.includes(e.id))
- importantEvents = importantEvents.map(e => e.config)
- importantEvents = importantEvents.filter(c => c !== null)
- importantEvents = importantEvents.filter(function (elem, pos, arr) { return arr.indexOf(elem) === pos })
- if (importantEvents.length === 1) {
- result = await createIpxeScript(importantEvents[0])
- res.send(result)
- return
+ importantEvents = importantEvents.filter(e => !blacklist.includes(e.id))
+ importantEvents = importantEvents.map(e => e.config)
+ importantEvents = importantEvents.filter(c => c !== null)
+ importantEvents = importantEvents.filter(function (elem, pos, arr) { return arr.indexOf(elem) === pos })
+ if (importantEvents.length === 1) {
+ result = await createIpxeScript(importantEvents[0])
+ res.send(result)
+ return
+ }
+ if (importantEvents.length > 1) {
+ result = await createDynamicMenu(importantEvents)
+ res.send(result)
+ return
+ }
+
+ events = events.filter(e => !blacklist.includes(e.id))
+ events = events.map(e => e.config)
+ events = events.filter(c => c !== null)
+ events = events.filter(function (elem, pos, arr) { return arr.indexOf(elem) === pos })
+
+ groupIds = client.groups.map(x => x.id)
+
+ var response = await fetchParentConfigs(groupIds, blacklist)
+
+ if (response.ids.length > 0) {
+ // Check if there is an important event
+ if (response.type === 'important') {
+ if (response.ids.length === 1) return res.send(await createIpxeScript(response.ids[0]))
+ if (response.ids.length > 1) return res.send(await createDynamicMenu(response.ids))
}
- if (importantEvents.length > 1) {
- result = await createDynamicMenu(importantEvents)
- res.send(result)
- return
+ // No important event, use client event if existent
+ if (events.length === 1) return res.send(await createIpxeScript(events[0]))
+ if (events.length > 1) return res.send(await createDynamicMenu(events))
+
+ // No client event, use events of lowest parents
+ if (response.type === 'event') {
+ if (response.ids.length === 1) return res.send(await createIpxeScript(response.ids[0]))
+ if (response.ids.length > 1) return res.send(await createDynamicMenu(response.ids))
}
- events = events.filter(e => !blacklist.includes(e.id))
- events = events.map(e => e.config)
- events = events.filter(c => c !== null)
- events = events.filter(function (elem, pos, arr) { return arr.indexOf(elem) === pos })
-
- groupIds = client.groups.map(x => x.id)
-
- var response = await fetchParentConfigs(groupIds, blacklist)
- if (response.ids.length > 0) {
- // Check if there is an important event
- if (response.type === 'important') {
- if (response.ids.length === 1) {
- result = await createIpxeScript(response.ids[0])
- res.send(result)
- return
- }
- if (response.ids.length > 1) {
- result = await createDynamicMenu(response.ids)
- res.send(result)
- return
- }
- }
- // No important event, use client event if existent
- if (events.length === 1) {
- result = await createIpxeScript(events[0])
- res.send(result)
- return
- }
- if (events.length > 1) {
- result = await createDynamicMenu(events)
- res.send(result)
- return
- }
- // No client event, use events of lowest parents
- if (response.type === 'event') {
- if (response.ids.length === 1) {
- result = await createIpxeScript(response.ids[0])
- res.send(result)
- return
- }
- if (response.ids.length > 1) {
- result = await createDynamicMenu(response.ids)
- res.send(result)
- return
- }
- }
- // No events, use client config
- if (client.configId !== null) {
- result = await createIpxeScript(client.configId)
- res.send(result)
- return
- }
- // No client config, use configs of lowest parents
- if (response.type === 'config') {
- if (response.ids.length === 1) {
- result = await createIpxeScript(response.ids[0])
- res.send(result)
- return
- }
- if (response.ids.length > 1) {
- result = await createDynamicMenu(response.ids)
- res.send(result)
- return
- }
- }
- } else {
- if (events.length === 1) {
- result = await createIpxeScript(events[0])
- res.send(result)
- return
- }
- if (events.length > 1) {
- result = await createDynamicMenu(events)
- res.send(result)
- return
- }
- if (client.configId !== null) {
- result = await createIpxeScript(client.configId)
- res.send(result)
- return
- }
+ // No events, use client config
+ if (client.configId !== null) return res.send(await createIpxeScript(client.configId))
+
+ // No client config, use configs of lowest parents
+ if (response.type === 'config') {
+ if (response.ids.length === 1) return res.send(await createIpxeScript(response.ids[0]))
+ if (response.ids.length > 1) return res.send(await createDynamicMenu(response.ids))
}
- // No config found, use default config
- await sendFilePromise(res, path.join(__appdir, 'ipxe', 'default.ipxe'))
} else {
- // client not known, start registration
- await sendFilePromise(res, path.join(__appdir, 'ipxe', 'registration.ipxe'))
+ if (events.length === 1) return res.send(await createIpxeScript(events[0]))
+ if (events.length > 1) return res.send(await createDynamicMenu(events))
+
+ if (client.configId !== null) return res.send(await createIpxeScript(client.configId))
}
+ // No config found, use default config
+ await sendFilePromise(res, path.join(__appdir, 'ipxe', 'default.ipxe'))
})
// load config by given id
@@ -163,6 +114,76 @@ noAuthRouter.get('/getconfig/:configId', (req, res) => {
})
})
+function checkEventNow(times) {
+ var now = new Date()
+ if (!times.repetitive) {
+ if (times.start * 1000 <= now && now < times.end * 1000) return true
+ }
+
+ if (times.repetitive) {
+ var startHourMinutes = times.startTime.split(':').map(x => parseInt(x, 10))
+ var endHourMinutes = times.endTime.split(':').map(x => parseInt(x, 10))
+ var startDate = new Date(times.startDate * 1000)
+ var endDate = new Date(times.endDate * 1000)
+ var startAtDay = new Date()
+ var endAtDay = new Date()
+ var overnight = false
+ startDate.setHours(startHourMinutes[0], startHourMinutes[1], 0, 0)
+ endDate.setHours(endHourMinutes[0], endHourMinutes[1], 0, 0)
+ startAtDay.setHours(startHourMinutes[0], startHourMinutes[1], 0, 0)
+ endAtDay.setHours(endHourMinutes[0], endHourMinutes[1], 0, 0)
+
+ if (endAtDay > now && startAtDay > now && endAtDay < startAtDay) {
+ var yesterday = new Date(now)
+ yesterday.setDate(yesterday.getDate() - 1)
+ if (checkEventInterval(startDate, yesterday, times.intervalType, times.interval)) {
+ startAtDay.setDate(startAtDay.getDate() - 1)
+ overnight = true
+ }
+ else return false
+ }
+ else if (endAtDay < now && startAtDay > now) endAtDay.setDate(endAtDay.getDate() + 1)
+ else if (endAtDay < now && startAtDay < now && endAtDay < startAtDay) endAtDay.setDate(endAtDay.getDate() + 1)
+
+ if (!(times.monthMap[now.getMonth()] && (overnight ? times.dayMap[((yesterday.getDay() + 6) % 7)] : times.dayMap[((now.getDay() + 6) % 7)]) && startDate <= now && now < endDate && startAtDay <= now && now < endAtDay)) return false
+
+ return (overnight ? true : checkEventInterval(startDate, now, times.intervalType, times.interval))
+ }
+ return false
+}
+
+function dateDiffInDays(a, b) {
+ const utc1 = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate())
+ const utc2 = Date.UTC(b.getFullYear(), b.getMonth(), b.getDate())
+ return Math.floor((utc2 - utc1) / (1000 * 3600 * 24))
+}
+
+function checkEventInterval(startDate, now, type, interval) {
+ if (type === 'day') {
+ let dateDiff = dateDiffInDays(startDate, now)
+ if (dateDiff % interval === 0) return true
+ } else if (type === 'week') {
+ var startDay = (startDate.getDay() + 6) % 7
+ var nowDay = (now.getDay() + 6) % 7
+ let diff = Math.abs(startDay - nowDay)
+ var nowSameDayAsStart = new Date()
+ if (startDay > nowDay) nowSameDayAsStart.setDate(nowSameDayAsStart.getDate() + diff)
+ else if (startDay < nowDay) nowSameDayAsStart.setDate(nowSameDayAsStart.getDate() - diff)
+ let dateDiff = dateDiffInDays(startDate, nowSameDayAsStart)
+ if (dateDiff % (7 * interval) === 0) return true
+ } else if (type === 'month') {
+ if (startDate.getFullYear() !== now.getFullYear()) {
+ var monthDiff = (12 - startDate.getMonth()) + (12 * (now.getFullYear() - startDate.getFullYear() - 1)) + now.getMonth()
+ if (!(monthDiff % interval === 0)) return false
+ } else if (!((now.getMonth() - startDate.getMonth()) % interval === 0)) return false
+ startDate.setFullYear(now.getFullYear())
+ startDate.setMonth(now.getMonth())
+ if (startDate.getMonth() !== now.getMonth()) startDate.setDate(0)
+ if (startDate.getDate() === now.getDate()) return true
+ }
+}
+
+
async function fetchParentConfigs (groupIds, blacklist) {
if (groupIds.length === 0) return { 'ids': [], 'type': '' }
@@ -180,10 +201,13 @@ async function fetchParentConfigs (groupIds, blacklist) {
parentIds.push(groups[i].parents[j].id)
}
for (let j = 0; j < groups[i].events.length; j++) {
- // Execute these 3 Lines only if event is happening right now
- if (groups[i].events[j].group_x_event.blacklist) newBlacklist.push(groups[i].events[j].id)
- else if (groups[i].events[j].important) importantEvents.push(groups[i].events[j])
- else events.push(groups[i].events[j])
+ var times = JSON.parse(groups[i].events[j].times)
+ var intime = checkEventNow(times)
+ if (intime) {
+ if (groups[i].events[j].group_x_event.blacklist) newBlacklist.push(groups[i].events[j].id)
+ else if (groups[i].events[j].important) importantEvents.push(groups[i].events[j])
+ else events.push(groups[i].events[j])
+ }
}
}
@@ -252,7 +276,6 @@ function createIpxeScript (id) {
}
// create dynamic menu to load the different given configs for a client
-// TODO: Hardcoded Chain Port?!
function createDynamicMenu (ids) {
return db.config.findAll({ where: { id: ids } }).then(configs => {
var script = ''