summaryrefslogtreecommitdiffstats
path: root/gearman/wolWorker.py.html
blob: 0c5de3fb172c1df071fc53b47327f992db7631b0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<html><head>
<title>wolWorker.py</title>
<meta name="Generator" content="htmlizer/[twisted, version 10.2.0]" />
<link rel="alternate" href="wolWorker.py" type="text/x-python" />

</head>
<body>
<pre><span class="py-src-comment">#!/usr/bin/python</span>

<span class="py-src-keyword">from</span> <span class="py-src-variable">gearman</span> <span class="py-src-keyword">import</span> <span class="py-src-variable">GearmanWorker</span>
<span class="py-src-keyword">import</span> <span class="py-src-variable">socket</span>
<span class="py-src-keyword">import</span> <span class="py-src-variable">struct</span>

<span class="py-src-comment"># http://code.activestate.com/recipes/358449-wake-on-lan/</span>
<span class="py-src-keyword">def</span> <span class="py-src-identifier">wake_on_lan</span>(<span class="py-src-parameter">macaddress</span>):
    <span class="py-src-string">""" Switches on remote computers using WOL. """</span>

    <span class="py-src-comment"># Check macaddress format and try to compensate.</span>
    <span class="py-src-keyword">if</span> <span class="py-src-variable">len</span>(<span class="py-src-variable">macaddress</span>) == <span class="py-src-number">12</span>:
        <span class="py-src-keyword">pass</span>
    <span class="py-src-keyword">elif</span> <span class="py-src-variable">len</span>(<span class="py-src-variable">macaddress</span>) == <span class="py-src-number">12</span> + <span class="py-src-number">5</span>:
        <span class="py-src-variable">sep</span> = <span class="py-src-variable">macaddress</span>[<span class="py-src-number">2</span>]
        <span class="py-src-variable">macaddress</span> = <span class="py-src-variable">macaddress</span>.<span class="py-src-variable">replace</span>(<span class="py-src-variable">sep</span>, <span class="py-src-string">''</span>)
    <span class="py-src-keyword">else</span>:
        <span class="py-src-keyword">raise</span> <span class="py-src-variable">ValueError</span>(<span class="py-src-string">'Incorrect MAC address format'</span>)
 
    <span class="py-src-comment"># Pad the synchronization stream.</span>
    <span class="py-src-variable">data</span> = <span class="py-src-string">''</span>.<span class="py-src-variable">join</span>([<span class="py-src-string">'FFFFFFFFFFFF'</span>, <span class="py-src-variable">macaddress</span> * <span class="py-src-number">20</span>])
    <span class="py-src-variable">send_data</span> = <span class="py-src-string">''</span> 

    <span class="py-src-comment"># Split up the hex values and pack.</span>
    <span class="py-src-keyword">for</span> <span class="py-src-variable">i</span> <span class="py-src-keyword">in</span> <span class="py-src-variable">range</span>(<span class="py-src-number">0</span>, <span class="py-src-variable">len</span>(<span class="py-src-variable">data</span>), <span class="py-src-number">2</span>):
        <span class="py-src-variable">send_data</span> = <span class="py-src-string">''</span>.<span class="py-src-variable">join</span>([<span class="py-src-variable">send_data</span>,
                             <span class="py-src-variable">struct</span>.<span class="py-src-variable">pack</span>(<span class="py-src-string">'B'</span>, <span class="py-src-variable">int</span>(<span class="py-src-variable">data</span>[<span class="py-src-variable">i</span>: <span class="py-src-variable">i</span> + <span class="py-src-number">2</span>], <span class="py-src-number">16</span>))])

    <span class="py-src-comment"># Broadcast it to the LAN.</span>
    <span class="py-src-variable">sock</span> = <span class="py-src-variable">socket</span>.<span class="py-src-variable">socket</span>(<span class="py-src-variable">socket</span>.<span class="py-src-variable">AF_INET</span>, <span class="py-src-variable">socket</span>.<span class="py-src-variable">SOCK_DGRAM</span>)
    <span class="py-src-variable">sock</span>.<span class="py-src-variable">setsockopt</span>(<span class="py-src-variable">socket</span>.<span class="py-src-variable">SOL_SOCKET</span>, <span class="py-src-variable">socket</span>.<span class="py-src-variable">SO_BROADCAST</span>, <span class="py-src-number">1</span>)
    <span class="py-src-variable">sock</span>.<span class="py-src-variable">sendto</span>(<span class="py-src-variable">send_data</span>, (<span class="py-src-string">'&lt;broadcast&gt;'</span>, <span class="py-src-number">7</span>))

<span class="py-src-keyword">def</span> <span class="py-src-identifier">wolTask</span>(<span class="py-src-parameter">worker</span>, <span class="py-src-parameter">job</span>):
    <span class="py-src-variable">wake_on_lan</span>(<span class="py-src-variable">job</span>.<span class="py-src-variable">data</span>)
    <span class="py-src-keyword">print</span> <span class="py-src-string">'WOL send to: %s'</span> % <span class="py-src-variable">job</span>.<span class="py-src-variable">data</span>
    <span class="py-src-keyword">return</span> <span class="py-src-string">'Magic packet send.\n'</span>

<span class="py-src-variable">worker</span> = <span class="py-src-variable">GearmanWorker</span>([<span class="py-src-string">"127.0.0.1"</span>])
<span class="py-src-variable">worker</span>.<span class="py-src-variable">register_task</span>(<span class="py-src-string">'wol'</span>, <span class="py-src-variable">wolTask</span>)
<span class="py-src-keyword">print</span> <span class="py-src-string">'starting wol worker'</span>
<span class="py-src-variable">worker</span>.<span class="py-src-variable">work</span>()
</pre>
</body>