1
1
2
2
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
+
3
10
var os = require ( 'os' ) ;
4
11
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' ) ;
5
18
6
- var command ;
19
+ var sleep ;
7
20
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" ;
10
23
break ;
11
24
case "darwin" :
12
- command = "pmset sleepnow" ;
25
+ mac = true ;
26
+ sleep = "pmset sleepnow" ;
13
27
break ;
14
28
default :
15
29
console . error ( "Operating system not supported. " +
@@ -26,45 +40,89 @@ program
26
40
. option ( '-H, --host <host>' , 'Interface to run server on (default: 0.0.0.0)' , '0.0.0.0' )
27
41
. option ( '-u, --url <url>' , 'URL to trigger sleep (default: sleep)' , 'sleep' )
28
42
. 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)' )
30
46
. parse ( process . argv ) ;
31
47
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 ( ! / ^ r o o t / . test ( stdout ) ) {
57
+ console . log ( "The -n option requires you to run as root" ) ;
58
+ process . exit ( 1 ) ;
59
+ }
60
+ } ) ;
61
+ }
62
+
63
+
64
+
32
65
//daemonize?
33
66
if ( program . daemonize && program . args . indexOf ( 'is-daemon' ) === - 1 ) {
34
67
var path = program . daemonize ;
35
- var fs = require ( 'fs' ) ;
36
68
var spawn = require ( 'child_process' ) . spawn ;
37
- var log = fs . openSync ( path , 'a' ) ;
38
-
69
+
39
70
var prog = process . argv [ 1 ] ;
40
71
var args = process . argv . slice ( 2 ) ;
41
72
args . push ( 'is-daemon' ) ;
42
73
74
+ var output = program . log ? fs . openSync ( program . log , 'a' ) : 'ignore' ;
75
+
43
76
var child = spawn ( prog , args , {
44
77
detached : true ,
45
- stdio : [ 'ignore' , log , log ]
78
+ stdio : [ 'ignore' , output , output ]
46
79
} ) ;
47
80
child . unref ( ) ;
48
81
process . exit ( 1 ) ;
49
82
return ;
50
83
}
51
84
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
+
52
96
//add a slash
53
97
if ( program . url . charAt ( 0 ) !== '/' )
54
98
program . url = '/' + program . url ;
55
99
56
100
var msgId = 1 ;
57
- http . createServer ( function ( request , response ) {
101
+ http . createServer ( function ( request , response ) {
58
102
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" ,
61
105
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
62
114
setTimeout ( function ( ) {
63
- exec ( command ) ;
115
+ exec ( sleep ) ;
64
116
} , program . wait ) ;
65
- response . end ( 'ok' ) ;
117
+
118
+ response . end ( 'ok\n' ) ;
66
119
} ) . 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 ) ;
68
126
} ) ;
69
127
70
128
//if interval is late by more than 2secs, assume has just awoken
@@ -73,8 +131,12 @@ var threshold = 2000;
73
131
var lastTime = Date . now ( ) ;
74
132
setInterval ( function ( ) {
75
133
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
+ }
78
140
lastTime = currentTime ;
79
141
} , checkInterval ) ;
80
142
0 commit comments