summaryrefslogtreecommitdiffstats
path: root/server/bin
diff options
context:
space:
mode:
authorChristian Hofmaier2019-04-15 17:35:47 +0200
committerChristian Hofmaier2019-04-15 17:35:47 +0200
commit139b11e4cc13024e96e25eeeaab3a8dac8b60396 (patch)
tree8e283cb0ce4965def5c0e56b2891842e1eefb7e6 /server/bin
parentserver crash hotfix (diff)
downloadbas-139b11e4cc13024e96e25eeeaab3a8dac8b60396.tar.gz
bas-139b11e4cc13024e96e25eeeaab3a8dac8b60396.tar.xz
bas-139b11e4cc13024e96e25eeeaab3a8dac8b60396.zip
[eventmanager] integrate WoL utility
- add column to db - add checkbox to frontend - implement scheduler
Diffstat (limited to 'server/bin')
-rw-r--r--server/bin/scheduler.js80
1 files changed, 80 insertions, 0 deletions
diff --git a/server/bin/scheduler.js b/server/bin/scheduler.js
new file mode 100644
index 0000000..2ed4ed0
--- /dev/null
+++ b/server/bin/scheduler.js
@@ -0,0 +1,80 @@
+/* global __appdir */
+const path = require('path')
+global.__appdir = path.join(__dirname, '..')
+const db = require(path.join(__appdir, 'lib', 'sequelize'))
+const groupHelper = require(path.join(__appdir, 'lib', 'grouphelper'))
+const wol = require('node-wol')
+const zmq = require('zeromq')
+const socket = zmq.socket('pull')
+socket.bindSync('ipc:///tmp/bas_zeromq_events')
+socket.on('message', calcNextWake)
+
+const runningTimeouts = {}
+
+async function calcNextWake (id) {
+ id = id.toString()
+ var event = await db.event.findOne({ where: { id: id }, include: ['groups', 'clients'] })
+
+ // Event got deleted
+ if (event === null || !event.wakeonlan) {
+ clearTimeout(runningTimeouts[id])
+ delete runningTimeouts[id]
+ return
+ }
+
+ var nextWake
+ var times = JSON.parse(event.times)
+ var now = new Date()
+
+ if (!times.repetitive) {
+ var start = new Date(times.start * 1000)
+ if (start > now) {
+ // 1. Calculate next wake
+ nextWake = start - now
+
+ // 2. Set timeout
+ runningTimeouts[id] = setTimeout(function () {
+ wakeUpClients(id)
+ }, nextWake)
+ }
+ } else {
+ return false
+ /*
+ // 1. Calculate next wake
+ nextWake = 99999999999
+
+ // 2. Set timeout
+ runningTimeouts[id] = setTimeout(function () {
+ wakeUpClients(id)
+ calcNextWake(id)
+ }, nextWake)
+ */
+ }
+}
+
+// Wake all clients of event
+async function wakeUpClients (id) {
+ var event = await db.event.findOne({ where: { id: id }, include: ['groups', 'clients'] })
+ if (!event.wakeonlan) return
+
+ // 1. Fetch all clients
+ var clients = []
+ var groups = []
+ var blacklistClients = []
+ var blacklistGroups = []
+ for (let i = 0; i < event.clients.length; i++) {
+ if (event.clients[i].client_x_event.blacklist) blacklistClients.push(event.clients[i])
+ else clients.push(event.clients[i])
+ }
+ for (let i = 0; i < event.groups.length; i++) {
+ if (event.groups[i].group_x_event.blacklist) blacklistGroups.push(event.groups[i])
+ else groups.push(event.groups[i])
+ }
+ var childs = groupHelper.getAllChildren(groups, blacklistGroups, blacklistClients)
+ clients = clients.concat(childs.clients)
+
+ // 2. Wake all clients
+ clients.forEach(client => {
+ wol.wake(client.mac, { address: client.ip.slice(0, client.ip.lastIndexOf('.') + 1) + '255' }, err => console.log(err))
+ })
+}