From 139b11e4cc13024e96e25eeeaab3a8dac8b60396 Mon Sep 17 00:00:00 2001 From: Christian Hofmaier Date: Mon, 15 Apr 2019 15:35:47 +0000 Subject: [eventmanager] integrate WoL utility - add column to db - add checkbox to frontend - implement scheduler --- server/bin/scheduler.js | 80 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 server/bin/scheduler.js (limited to 'server/bin/scheduler.js') 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)) + }) +} -- cgit v1.2.3-55-g7522