summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--server/api/wakerequests.js17
-rw-r--r--server/package-lock.json5
-rw-r--r--server/package.json1
-rw-r--r--webapp/src/components/ConfiguratorModule.vue1
-rw-r--r--webapp/src/components/GroupModuleClientList.vue24
-rw-r--r--webapp/src/components/GroupModuleDialog.vue28
6 files changed, 64 insertions, 12 deletions
diff --git a/server/api/wakerequests.js b/server/api/wakerequests.js
new file mode 100644
index 0000000..51e49d8
--- /dev/null
+++ b/server/api/wakerequests.js
@@ -0,0 +1,17 @@
+/* global __appdir */
+var path = require('path')
+var db = require(path.join(__appdir, 'lib', 'sequelize'))
+var wol = require('node-wol')
+var express = require('express')
+const { decorateApp } = require('@awaitjs/express')
+var router = decorateApp(express.Router())
+
+router.postAsync('', async (req, res) => {
+ const clients = await db.client.findAll({ where: { id: req.body.clients } })
+ clients.forEach(client => {
+ wol.wake(client.mac, { address: client.ip.slice(0, client.ip.lastIndexOf('.') + 1) + '255' }, err => {})
+ })
+ res.status(200).end()
+})
+
+module.exports.router = router
diff --git a/server/package-lock.json b/server/package-lock.json
index ac6d4bb..204a361 100644
--- a/server/package-lock.json
+++ b/server/package-lock.json
@@ -2715,6 +2715,11 @@
"resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.4.0.tgz",
"integrity": "sha512-YoviGBJYGrPdLOKDIQB0sKxuKy/EEsxzooNkOZak4vSTKT/qH0Pa6dj3t1MJjEQGsefih61IyHDmO1WW7xOFfw=="
},
+ "node-wol": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/node-wol/-/node-wol-0.1.1.tgz",
+ "integrity": "sha1-m+F/6LeZxeAKaq1ciTb0NoTl6D0="
+ },
"nodemailer": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-4.7.0.tgz",
diff --git a/server/package.json b/server/package.json
index f74c083..9684ea1 100644
--- a/server/package.json
+++ b/server/package.json
@@ -20,6 +20,7 @@
"morgan": "^1.9.1",
"mysql": "^2.16.0",
"mysql2": "^1.6.5",
+ "node-wol": "^0.1.1",
"nodemailer": "^4.7.0",
"secure-password": "^3.1.0",
"sequelize": "^4.43.0",
diff --git a/webapp/src/components/ConfiguratorModule.vue b/webapp/src/components/ConfiguratorModule.vue
index 7562021..b336943 100644
--- a/webapp/src/components/ConfiguratorModule.vue
+++ b/webapp/src/components/ConfiguratorModule.vue
@@ -173,6 +173,7 @@ export default {
created () {
this.$store.dispatch('configurator/loadData')
this.$store.dispatch('groups/loadGroupList')
+ this.$store.dispatch('groups/loadClientList')
}
}
</script>
diff --git a/webapp/src/components/GroupModuleClientList.vue b/webapp/src/components/GroupModuleClientList.vue
index 557d664..630c968 100644
--- a/webapp/src/components/GroupModuleClientList.vue
+++ b/webapp/src/components/GroupModuleClientList.vue
@@ -6,6 +6,7 @@
"ip": "IP Address",
"mac": "MAC Address",
"uuid": "UUID",
+ "wakeClients": "Wake one client up | Wake {0} clients up",
"removeClients": "Remove one client | Remove {0} clients",
"addClients": "Add clients",
"deleteClients": "Delete one client | Delete {0} clients",
@@ -17,6 +18,7 @@
"ip": "IP Adresse",
"mac": "MAC Adresse",
"uuid": "UUID",
+ "wakeClients": "Wecke einen Client auf | Wecke {0} Clients auf",
"removeClients": "Entferne einen Client | Entferne {0} Clients",
"addClients": "Füge Clients hinzu",
"deleteClients": "Lösche einen Clients | Lösche {0} Clients",
@@ -34,18 +36,23 @@
</div>
</data-table>
</v-card>
- <div v-if="tabIndex === 0" class="text-xs-right">
- <v-btn flat color="error" @click="deleteSelected" :disabled="selected.length === 0">
- <v-icon left>delete</v-icon>{{ $tc('deleteClients', selected.length, [selected.length]) }}
+ <div class="text-xs-right">
+ <v-btn flat color="primary" @click="wake" :disabled="selected.length === 0">
+ <v-icon left>notifications_active</v-icon>{{ $tc('wakeClients', selected.length, [selected.length]) }}
</v-btn>
- <v-btn flat color="success" @click="newClient"><v-icon left>create</v-icon>{{ $t('createClient') }}</v-btn>
- </div>
- <div v-else class="text-xs-right">
+ <template v-if="tabIndex === 0">
+ <v-btn flat color="error" @click="deleteSelected" :disabled="selected.length === 0">
+ <v-icon left>delete</v-icon>{{ $tc('deleteClients', selected.length, [selected.length]) }}
+ </v-btn>
+ <v-btn flat color="success" @click="newClient"><v-icon left>create</v-icon>{{ $t('createClient') }}</v-btn>
+ </template>
+ <template v-else>
<v-btn flat color="error" @click="removeSelected" :disabled="selected.length === 0">
<v-icon left>remove_circle_outline</v-icon>{{ $tc('removeClients', selected.length, [selected.length]) }}
</v-btn>
<v-btn flat color="success" @click="addExisting"><v-icon left>add_circle_outline</v-icon>{{ $t('addClients') }}</v-btn>
- </div>
+ </template>
+ </div>
</div>
</template>
@@ -96,6 +103,9 @@ export default {
},
addExisting () {
this.setDialog({ show: true, info: { action: 'add', type: 'client', selected: this.selected, tabIndex: this.tabIndex } })
+ },
+ wake () {
+ this.setDialog({ show: true, info: { action: 'wake', type: 'client', selected: this.selected, tabIndex: this.tabIndex } })
}
}
}
diff --git a/webapp/src/components/GroupModuleDialog.vue b/webapp/src/components/GroupModuleDialog.vue
index 4e38c0b..e9bb65d 100644
--- a/webapp/src/components/GroupModuleDialog.vue
+++ b/webapp/src/components/GroupModuleDialog.vue
@@ -17,6 +17,9 @@
"select": {
"group": "Select groups",
"client": "Select clients"
+ },
+ "wake": {
+ "client": "Wake this client up? | Wake these {0} clients up?"
}
},
"success": {
@@ -41,7 +44,8 @@
"id": "ID",
"name": "Name",
"description": "Description",
- "ip": "IP Address"
+ "ip": "IP Address",
+ "wake": "Wake up"
},
"de": {
"title": {
@@ -60,6 +64,9 @@
"select": {
"group": "Gruppen auswählen",
"client": "Clients auswählen"
+ },
+ "wake": {
+ "client": "Diesen Client aufwecken? | Diese {0} Clients aufwecken?"
}
},
"success": {
@@ -84,7 +91,8 @@
"id": "ID",
"name": "Name",
"description": "Beschreibung",
- "ip": "IP Adresse"
+ "ip": "IP Adresse",
+ "wake": "Aufwecken"
}
}
</i18n>
@@ -114,7 +122,7 @@
:items="items"
:row-count="$vuetify.breakpoint.smAndDown ? -1 : undefined"
></data-table>
- <div v-else-if="action === 'remove' || action === 'delete'" class="selected-list">
+ <div v-else-if="action === 'remove' || action === 'delete' || action === 'wake'" class="selected-list">
<v-checkbox
class="delete-checkbox"
v-if="dialog.info.action === 'remove'"
@@ -161,13 +169,15 @@ export default {
'add': 'success',
'remove': 'error',
'delete': 'error',
- 'select': 'primary'
+ 'select': 'primary',
+ 'wake': 'primary'
},
actionWidthMap: {
'add': '1000px',
'remove': '500px',
'delete': '500px',
- 'select': '1000px'
+ 'select': '1000px',
+ 'wake': '500px'
}
}
},
@@ -230,6 +240,14 @@ export default {
return
}
+ if (this.action === 'wake') {
+ this.$http.post('/api/wakerequests', {
+ clients: this.dialog.info.selected.map(x => x.id)
+ })
+ this.setDialog({ show: false })
+ return
+ }
+
const actionMap = {
'delete': { 'group': 'deleteGroups', 'client': 'deleteClients' },
'remove': { 'group': 'removeSubroups', 'client': 'removeClients' },