]>
git.wh0rd.org - chrome-ext/wake-on-lan.git/blob - js/main.js
bfe3530bb3c144464b6b818ddb998404a92af6b4
1 // Written by Mike Frysinger <vapier@gmail.com>.
2 // Released into the public domain.
5 $$('[name=status]').innerText
= msg
;
8 // Create a packet following the spec:
9 // https://en.wikipedia.org/wiki/Wake-on-LAN#Magic_packet
10 function magicpacket(mac
, pass
) {
11 var data
= new ArrayBuffer(6 + 16 * 6 + 6 + 6);
12 var bytes
= new Uint8Array(data
);
15 // First 6 bytes should be all 0xFF.
16 for (i
= 0; i
< 6; ++i
)
17 bytes
[base
+ i
] = 0xff;
20 // Then the MAC address is repeated 16 times.
21 for (i
= 0; i
< 6; ++i
)
22 for (j
= 0; j
< 16 * 6; j
+= 6)
23 bytes
[base
+ j
+ i
] = mac
[i
];
26 // Then 6 bytes before the pass should be 0xFF.
27 for (i
= 0; i
< 6; ++i
)
28 bytes
[base
+ i
] = 0xff;
31 // Finally the 6 bytes of the password.
32 for (i
= 0; i
< 6; ++i
)
33 bytes
[base
+ i
] = pass
[i
];
38 function split_data(v
) {
42 window
['sync_' + v
]();
44 for (i
= 0; i
< 6; ++i
) {
45 idata
= $$('input[name=' + v
+ i
+ ']');
46 if (!/^[0-9a-fA-F]?[0-9a-fA-F]$/.test(idata
.value
.replace(' ', ''))) {
47 status(v
+ ' byte ' + i
+ ' is invalid; must be 2 hex characters');
49 idata
.setSelectionRange(0, idata
.value
.length
);
52 data
[i
] = parseInt(idata
.value
, 16);
59 status('initializing');
61 var form
= $$('form[name=settings]');
62 var shost
= '0.0.0.0';
63 var dhost
= form
.host
.value
;
64 var port
= parseInt(form
.port
.value
);
66 // Get the MAC address & password to convert to packet data.
67 var mac
= split_data('mac');
68 var pass
= split_data('pass');
69 var data
= magicpacket(mac
, pass
);
70 console
.log('packet', new Uint8Array(data
));
72 var checkresult = function(s
, step
, result
) {
74 status('error in ' + step
+ ': ' + net_error_list
[result
]);
75 chrome
.sockets
.udp
.close(s
, nullcb
);
81 // Create the socket ...
82 chrome
.sockets
.udp
.create({}, function(createInfo
) {
83 var s
= createInfo
.socketId
;
85 console
.log('[create] socketInfo', createInfo
);
86 status('binding ' + shost
);
88 // Bind it locally ...
89 chrome
.sockets
.udp
.bind(s
, shost
, 0, function(result
) {
90 console
.log('[bind] result', result
);
92 if (!checkresult(s
, 'bind', result
))
95 status('enabling broadcast');
97 // Turn on broadcast support ...
98 chrome
.sockets
.udp
.setBroadcast(s
, true, function(result
) {
99 console
.log('[setBroadcast] result', result
);
101 if (!checkresult(s
, 'broadcast', result
))
104 status('sending to ' + dhost
+ ':' + port
);
106 // Send the backet ...
107 chrome
.sockets
.udp
.send(s
, data
, dhost
, port
, function(sendInfo
) {
108 console
.log('[send] sendInfo', sendInfo
);
110 if (!checkresult(s
, 'send', sendInfo
.resultCode
))
116 chrome
.sockets
.udp
.close(s
, function() {
117 status('sent to ' + dhost
+ ':' + port
);
125 // Keep the form from submitting.
129 function sync_it(v
) {
130 var smany
= $$('span[name=' + v
+ '-many]');
131 var sone
= $$('span[name=' + v
+ '-one]');
133 // Sync the two sets of fields.
136 var idata
= $$('input[name=' + v
+ ']');
137 var data
= idata
.value
.split(':');
139 if (data
.length
!= 6) {
140 data
= idata
.value
.replace(/[ :]/g, '');
141 if (data
.length
!= 6 * 2) {
142 status('invalid ' + v
+ '; please fix');
145 data
= data
.match(/../g);
147 for (i
= 0; i
< 6; ++i
)
148 if (data
[i
].length
> 2) {
149 status('invalid ' + v
+ ' please fix');
154 for (i
= 0; i
< 6; ++i
)
155 $$('input[name=' + v
+ i
+ ']').value
= data
[i
];
159 for (i
= 0; i
< 6; ++i
) {
160 data
+= $$('input[name=' + v
+ i
+ ']').value
;
165 $$('input[name=' + v
+ ']').value
= data
;
168 function sync_mac() { return sync_it('mac'); }
169 function sync_pass() { return sync_it('pass'); }
172 function paste_mac() {
175 var smany
= $$('span[name=mac-many]');
176 var sone
= $$('span[name=mac-one]');
177 smany
.hidden
= !smany
.hidden
;
178 sone
.hidden
= !sone
.hidden
;
183 function paste_pass() {
186 var smany
= $$('span[name=pass-many]');
187 var sone
= $$('span[name=pass-one]');
188 smany
.hidden
= !smany
.hidden
;
189 sone
.hidden
= !sone
.hidden
;
197 var settings_keys
= [
205 var default_theme
= 'dark';
206 var default_host
= '192.168.0.255';
207 var default_port
= '40000';
208 var default_mac
= '20:00:00:00:00:00';
209 var default_pass
= '00:00:00:00:00:00';
211 function load_settings() {
212 var storage
= chrome
.storage
.local
;
214 chrome
.storage
.local
.get(settings_keys
, function(settings
) {
215 set_theme(settings
['theme'] || default_theme
);
216 var form
= $$('form[name=settings]');
217 form
.host
.value
= settings
['host'] || default_host
;
218 form
.port
.value
= settings
['port'] || default_port
;
219 // We assume we only get called during init.
221 form
.mac
.value
= settings
['mac'] || default_mac
;
224 form
.pass
.value
= settings
['pass'] || default_pass
;
229 function store_settings() {
230 var form
= $$('form[name=settings]');
234 'host': form
.host
.value
,
235 'mac': form
.mac
.value
,
236 'pass': form
.pass
.value
,
237 'port': form
.port
.value
,
240 chrome
.storage
.local
.set(settings
);
246 window
.onload = function() {
247 $$('form[name=settings]').onsubmit
= send
;
248 $$('a[name=mac-paste]').onclick
= paste_mac
;
249 $$('a[name=pass-paste]').onclick
= paste_pass
;
250 $$('input[name=theme]').onclick
= toggle_theme
;