Skip to content

Commit e3f09f2

Browse files
committed
bump, adding 'no-periodic-wake' option
1 parent 90d4afd commit e3f09f2

File tree

3 files changed

+94
-26
lines changed

3 files changed

+94
-26
lines changed

Diff for: README.md

+14-8
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,25 @@ npm install -g sleep-on-lan
1616
### Help
1717

1818
```
19+
$ sleep-on-lan --help
20+
1921
Usage: sleep-on-lan [options]
2022
2123
Options:
2224
23-
-h, --help output usage information
24-
-V, --version output the version number
25-
-p, --port <port> Port to run server on (default: 57339)
26-
-H, --host <host> Interface to run server on (default: 0.0.0.0)
27-
-u, --url <url> URL to trigger sleep (default: sleep)
28-
-w, --wait <ms> Wait in milliseconds before sleeping (default: 3000)
29-
-d, --daemonize Daemonize the sleep server and send output to a file (default: log.txt)
25+
-h, --help output usage information
26+
-V, --version output the version number
27+
-p, --port <port> Port to run server on (default: 57339)
28+
-H, --host <host> Interface to run server on (default: 0.0.0.0)
29+
-u, --url <url> URL to trigger sleep (default: sleep)
30+
-w, --wait <ms> Wait in milliseconds before sleeping (default: 3000)
31+
-d, --daemonize Daemonize the sleep server
32+
-l, --log <file> Sends output to a logfile
33+
-n, --no-periodic-wake Prevents the system from waking every 2 hours for WOL compatibility (Mac OSX)
3034
```
3135

36+
See [this article](http://hints.macworld.com/article.php?story=20100401103451497) for more information on the `--no-periodic-wake` option
37+
3238
### Example
3339

3440
Host A
@@ -63,7 +69,7 @@ Host A
6369
```
6470
$ crontab -e
6571
# insert the line:
66-
@reboot sleep-on-lan
72+
@reboot sleep-on-lan -d -l ~/log.txt
6773
# save and exit
6874
crontab: installing new crontab
6975
```

Diff for: package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "sleep-on-lan",
3-
"version": "0.3.2",
3+
"version": "0.4.0",
44
"main": "./server",
55
"bin": {
66
"sleep-on-lan": "./bin.js"

Diff for: server.js

+79-17
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,29 @@
11

22
var exec = require('child_process').exec;
3+
// var exec = function(cmd, cb) {
4+
// _exec(cmd, function(err, stdout, stderr) {
5+
// console.log('ran %s\nerr %s\nstdout %s\nstderr %s', cmd, err, stdout, stderr);
6+
// cb(err, stdout, stderr)
7+
// });
8+
// };
9+
310
var os = require('os');
411
var http = require('http');
12+
var util = require('util');
13+
var fs = require('fs');
14+
15+
var mac = false;
16+
var disableWOL = 'systemsetup -setwakeonnetworkaccess off';
17+
var enableWOL = disableWOL.replace('off','on');
518

6-
var command;
19+
var sleep;
720
switch(os.platform()) {
8-
case "win32":
9-
command = "rundll32.exe powrprof.dll,SetSuspendState 0,1,0";
21+
case "win32":
22+
sleep = "rundll32.exe powrprof.dll,SetSuspendState 0,1,0";
1023
break;
1124
case "darwin":
12-
command = "pmset sleepnow";
25+
mac = true;
26+
sleep = "pmset sleepnow";
1327
break;
1428
default:
1529
console.error("Operating system not supported. "+
@@ -26,45 +40,89 @@ program
2640
.option('-H, --host <host>', 'Interface to run server on (default: 0.0.0.0)', '0.0.0.0')
2741
.option('-u, --url <url>', 'URL to trigger sleep (default: sleep)', 'sleep')
2842
.option('-w, --wait <ms>', 'Wait in milliseconds before sleeping (default: 3000)', 3000)
29-
.option('-d, --daemonize', 'Daemonize the sleep server and send output to a file (default: log.txt)', 'log.txt')
43+
.option('-d, --daemonize', 'Daemonize the sleep server', false)
44+
.option('-l, --log <file>', 'Sends output to a logfile')
45+
.option('-n, --no-periodic-wake', 'Prevents the system from waking every 2 hours for WOL compatibility (Mac OSX)')
3046
.parse(process.argv);
3147

48+
//Read more about -n here http://hints.macworld.com/article.php?story=20100401103451497
49+
if(!program.periodicWake) {
50+
if(!mac) {
51+
console.log("The -n option may only be used on Mac OSX systems");
52+
process.exit(1);
53+
}
54+
55+
exec("ps -p "+process.pid+" -o ruser=", function(err, stdout) {
56+
if(!/^root/.test(stdout)) {
57+
console.log("The -n option requires you to run as root");
58+
process.exit(1);
59+
}
60+
});
61+
}
62+
63+
64+
3265
//daemonize?
3366
if(program.daemonize && program.args.indexOf('is-daemon') === -1) {
3467
var path = program.daemonize;
35-
var fs = require('fs');
3668
var spawn = require('child_process').spawn;
37-
var log = fs.openSync(path, 'a');
38-
69+
3970
var prog = process.argv[1];
4071
var args = process.argv.slice(2);
4172
args.push('is-daemon');
4273

74+
var output = program.log ? fs.openSync(program.log, 'a') : 'ignore';
75+
4376
var child = spawn(prog, args, {
4477
detached: true,
45-
stdio: [ 'ignore', log, log ]
78+
stdio: [ 'ignore', output, output ]
4679
});
4780
child.unref();
4881
process.exit(1);
4982
return;
5083
}
5184

85+
//open logfile
86+
var logfile = program.log && fs.createWriteStream(program.log, {flags:'a'});
87+
// fs.createWriteStream
88+
function log() {
89+
var output = util.format.apply(null, arguments);
90+
if(logfile)
91+
logfile.write(output+'\n');
92+
else
93+
console.log(output);
94+
}
95+
5296
//add a slash
5397
if(program.url.charAt(0) !== '/')
5498
program.url = '/'+program.url;
5599

56100
var msgId = 1;
57-
http.createServer(function (request,response) {
101+
http.createServer(function (request, response) {
58102
if(request.url.indexOf(program.url) !== 0)
59-
return response.end('not-ok');
60-
console.log("#%s:\n Sleeping in %sms\n Time: %s\n IP address: %s",
103+
return response.end('not-ok\n');
104+
log("#%s:\n Sleeping in %sms\n Time: %s\n IP address: %s",
61105
msgId++, program.wait, new Date(), request.connection.remoteAddress);
106+
107+
//enable wol *just before sleep*
108+
if(!program.periodicWake)
109+
setTimeout(function() {
110+
exec(enableWOL);
111+
}, program.wait-500);
112+
113+
//sleep wait
62114
setTimeout(function() {
63-
exec(command);
115+
exec(sleep);
64116
}, program.wait);
65-
response.end('ok');
117+
118+
response.end('ok\n');
66119
}).listen(program.port, function() {
67-
console.log('Listening at http://%s:%s%s', program.host, program.port, program.url);
120+
121+
var msg = '';
122+
if(!program.periodicWake)
123+
msg = '(Disabled periodic wake)';
124+
125+
log('Listening at http://%s:%s%s %s', program.host, program.port, program.url, msg);
68126
});
69127

70128
//if interval is late by more than 2secs, assume has just awoken
@@ -73,8 +131,12 @@ var threshold = 2000;
73131
var lastTime = Date.now();
74132
setInterval(function() {
75133
var currentTime = Date.now();
76-
if (currentTime > (lastTime + checkInterval + threshold))
77-
console.log("#%s:\n Woke\n Time: %s", msgId++, new Date());
134+
if (currentTime > (lastTime + checkInterval + threshold)) {
135+
//past threshold!
136+
log("#%s:\n Woke\n Time: %s", msgId++, new Date());
137+
if(!program.periodicWake)
138+
exec(disableWOL);
139+
}
78140
lastTime = currentTime;
79141
}, checkInterval);
80142

0 commit comments

Comments
 (0)