Python script op QNAP TS-101?

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Rendier2710
  • Registratie: Juni 2001
  • Laatst online: 15-07 22:24
Ik wil graag mijn pc op afstand aan kunnen zetten door een Wake On Lan scriptje aan te roepen. Ik heb een Cisco ASA thuis staan met daarop een SSL VPN waar ik websites aan kan roepen.

Mijn gedachte was om php script aan te roepen welke op de QNAP staat en deze te publiceren op de SSL VPN site. Ik heb een script gevonden wat dit kan, alleen maakt deze gebruik van een socket_create, iets wat de QNAP helaas niet ondersteunt.

Ik heb inmiddels deze site gevonden, waarin iemand hetzelfde probleem heeft. Daarin wordt een oplossing gegeven middels een python script. Wat ik mij nu afvraag is hoe ik deze site aan kan roepen? Ik heb bijna geen ervaring met het bouwen van websites. Dat PHP script lukte me nog wel, maar hoe doe ik dat met dit python script? Moet ik dit in een PHP zetten en hoe doe ik dat dan?

Het gaat om deze site:

http://tech.groups.yahoo....readed=1&m=e&var=1&tidx=1

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-07 22:12
Iig zal je webserver dan Python scripting moeten ondersteunen, wat (nog) niet echt gangbaar is volgens mij.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • Thralas
  • Registratie: December 2002
  • Laatst online: 16-07 08:38
farlane schreef op zondag 02 november 2008 @ 21:52:
Iig zal je webserver dan Python scripting moeten ondersteunen, wat (nog) niet echt gangbaar is volgens mij.
Nee, de daar gegeven oplossing heeft geen python support op de webserver nodig, PHP roept python aan met exec.

Rendier2710, lees nog eens goed die tweede reply. De poster geeft als eerste het python script (opslaan dus), en als tweede een PHP functie die python aanroept met exec (kijk ook vooral even goed naar die specifieke regel). Als het je dan nog niet lukt, geef dan aan wat je precies er niet aan snapt.

Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 16-07 15:15

Gerco

Professional Newbie

Aangezien python door PHP opgestart wordt zal het wel degelijk aanwezig moeten zijn op de web server. mod_python hoeft er niet op, maar python zelf toch zeer zeker wel. Als je web server linux draait staat het er wellicht al, python is een standaard onderdeel van veel distros.

[ Voor 24% gewijzigd door Gerco op 03-11-2008 07:41 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

  • Rendier2710
  • Registratie: Juni 2001
  • Laatst online: 15-07 22:24
Python staat op de QNAP, dus dat zit wel goed. Ik heb nu een php file aangemaakt met daarin het volgende:

<?php
function wakeWithPython($host)
{
exec('/share/HDA_DATA/Qweb/wol.py '.$host,$output,$retval);
if ($retval == 0) {
echo $host. " is waking up";
} else {
echo $host. " not waken up";
}
}
?>

Ik zie alleen geen output. Waar zit nu de fout? Het scherm blijft helemaal wit als ik wol.php aanroep.

Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
Je weet dat je nog wel de functie aan moet roepen? Bijvoorbeeld door het volgende aan het PHP-bestand toe te voegen:
PHP:
1
wakeWithPython("TheHost");

Werkt dat ook niet dan is het een kwestie van debuggen...
Probeer bijvoorbeeld eens 'python' voor het pad te zetten:
PHP:
1
exec('python /share/HDA_DATA/Qweb/wol.py '.$host,$output,$retval);

Mogelijk is de executable-bit van het Python script niet gezet, dan zou dat wel moeten werken.

[ Voor 46% gewijzigd door user109731 op 03-11-2008 21:26 ]


Acties:
  • 0 Henk 'm!

  • Rendier2710
  • Registratie: Juni 2001
  • Laatst online: 15-07 22:24
Ik heb geen idee wat je precies met dat eerste stukje bedoelt. Wat is het verschil met de $host welke ik heb staan?

Python voor het pad zetten heeft niet geholpen helaas
JanDM schreef op maandag 03 november 2008 @ 21:21:
Je weet dat je nog wel de functie aan moet roepen? Bijvoorbeeld door het volgende aan het PHP-bestand toe te voegen:
PHP:
1
wakeWithPython("TheHost");

Werkt dat ook niet dan is het een kwestie van debuggen...
Probeer bijvoorbeeld eens 'python' voor het pad te zetten:
PHP:
1
exec('python /share/HDA_DATA/Qweb/wol.py '.$host,$output,$retval);

Mogelijk is de executable-bit van het Python script niet gezet, dan zou dat wel moeten werken.

Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
Rendier2710 schreef op dinsdag 04 november 2008 @ 17:46:
Ik heb geen idee wat je precies met dat eerste stukje bedoelt. Wat is het verschil met de $host welke ik heb staan?
Je hebt nu een functie staan, maar die moet je nog aanroepen om er iets zinnigs mee te doen. Dat kan door die regel van mij onderaan het bestand toe te voegen en TheHost te vervangen door het juiste ip/hostname.

Lees je anders eens in PHP in, dit is wel erg basic allemaal :)

Acties:
  • 0 Henk 'm!

  • Rendier2710
  • Registratie: Juni 2001
  • Laatst online: 15-07 22:24
Gelukkig heb ik meer op met Ciscootjes ;)

Ik begrijp niet wat het verschil is met jou regel en hetgeen ik nu heb staan;

<?php
function wakeWithPython($host)
{
exec('/share/HDA_DATA/Qweb/wol.py '.$host,$output,$retval);
if ($retval == 0) {
echo $host. " is waking up";
} else {
echo $host. " not waken up";
}
}
?>


Daarin roep ik toch die funtion als aan (regel 2)?

Met alle respect, ik ben geen php man en ik zal het ook nooit worden. Ik ben nu al een paar maanden bezig om dit werkend te krijgen, maar wat ik ook probeer, het wil gewoon niet. Diverse php sites doorgenomen (hello world krijg ik dan nog wel voor elkaar), maar voor de rest... Ik wil gewoon graag weten hoe ik het voor elkaar kan krijgen om mijn machine middels een dergelijk script wakker kan maken. Vanaf dan kan ik weer lekker met mijn ASA verder knoeien >:)

Acties:
  • 0 Henk 'm!

  • GrooV
  • Registratie: September 2004
  • Laatst online: 02-07 16:56
Rendier2710 schreef op dinsdag 04 november 2008 @ 21:28:
Gelukkig heb ik meer op met Ciscootjes ;)

Ik begrijp niet wat het verschil is met jou regel en hetgeen ik nu heb staan;

<?php
function wakeWithPython($host)
{
exec('/share/HDA_DATA/Qweb/wol.py '.$host,$output,$retval);
if ($retval == 0) {
echo $host. " is waking up";
} else {
echo $host. " not waken up";
}
}
?>


Daarin roep ik toch die funtion als aan (regel 2)?

Met alle respect, ik ben geen php man en ik zal het ook nooit worden. Ik ben nu al een paar maanden bezig om dit werkend te krijgen, maar wat ik ook probeer, het wil gewoon niet. Diverse php sites doorgenomen (hello world krijg ik dan nog wel voor elkaar), maar voor de rest... Ik wil gewoon graag weten hoe ik het voor elkaar kan krijgen om mijn machine middels een dergelijk script wakker kan maken. Vanaf dan kan ik weer lekker met mijn ASA verder knoeien >:)
Je functie heet wakeWithPyton, dus die moet je eerst aanroepen zoals hierboven al genoemd is. Als je dat niet snapt ( :X ) dan haal je
function wakeWithPython($host)
{

en de laatste } weg en dan werkt het ook

Acties:
  • 0 Henk 'm!

  • Rendier2710
  • Registratie: Juni 2001
  • Laatst online: 15-07 22:24
Vandaag maar weer eens bezig, maar lukt nog steeds niet.

Ik heb nu het volgende;

wol.php

<?php
exec('/share/HDA_DATA/Qweb/wol.py '.$host,$output,$retval);
if ($retval == 0) {
echo $host. " is waking up";
} else {
echo $host. " not waken up";
}
?>

wol.py

#!/mnt/ext/usr/bin/python
import socket, sys

def createmagicpacket(mac):
packet = "\x00\x11\xd8\x5e\xd3\xbb"
i = 16;
while (i):
packet+=mac
i-=1
return packet

host = '192.168.1.20' # Bind to all interfaces
port = 9

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
s.bind((host, port))
s.connect(('192.168.1.255',10000))

wakeupmac=sys.argv[1]
s.send(createmagicpacket(wakeupmac))
s.close()
</code>

Ik krijg nu wel reactie terug op het moment dat ik het php script aanroep (not waken up), maar zie in mijn sniffer geen wol pakket voorbij komen. De paden kloppen wel. Iemand een idee hoe ik dit het beste kan troubleshooten?

Acties:
  • 0 Henk 'm!

  • TweakPino
  • Registratie: September 2005
  • Laatst online: 09:01
Om te zien wat je python script doet kun je op verschillende regels onderstaande toevoegen om te zien wat er uitgevoerd wordt:
Python:
1
print "DEBUG line 1, 2, 3"


Het script heeft in ieder geval nog een parameter nodig, omdat sys.argv[1] in de python code staat.

Ook kun je proberen om je python script direct uit te voeren via:
./wol.py parameter (in de directory waar je wol.py bestand staat)

Misschien moet je ook nog het MAC adres van de computer die je wit starten aanpassen (packet = "\x00\x11\xd8\x5e\xd3\xbb"), of de port (port = 9) of het broadcast IP (host = '192.168.1.20').

En probeer je vorige post nog even te editen en de code-tags te gebruiken, die laten de opmaak van je python code zien (In python bepaalt de opmaak (indenting) wat wel en niet in een loop / functie zit).

Acties:
  • 0 Henk 'm!

  • Rendier2710
  • Registratie: Juni 2001
  • Laatst online: 15-07 22:24
Ik ben inmiddels al verder door de tips!

Als ik nu het php script aanroep, wordt er een pakket verstuurd. Enig probleem is dat dit pakket maar 1 keer mijn mac-adres bevat en voor de rest een ander mac-adres. Het lijkt dus ergens in die 16 keer aan elkaar plakken fout te gaan.

php:

<?php
exec('python /share/HDA_DATA/Qweb/wol.py 255.255.255.255'.$retval);
if ($retval == 0) {
echo $host. " is waking up";
} else {
echo $host. " not waken up";
}
?>


py:

#!/mnt/ext/usr/bin/python
import socket, sys

def createmagicpacket(mac):
packet = "\x00\x11\xd8\x5e\xd3\xbb"
i = 16;
while (i):
packet+=mac
i-=1
return packet
host = '' # Bind to all interfaces
port = 51423

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
s.bind((host, port))
s.connect(('255.255.255.255',9))

wakeupmac=sys.argv[1]
s.send(createmagicpacket(wakeupmac))
s.close()

uitkomst:
0000 00 11 d8 5e d3 bb 32 35 35 2e 32 35 35 2e 32 35 ...^..255.255.25
0010 35 2e 32 35 35 32 35 35 2e 32 35 35 2e 32 35 35 5.255255.255.255
0020 2e 32 35 35 32 35 35 2e 32 35 35 2e 32 35 35 2e .255255.255.255.
0030 32 35 35 32 35 35 2e 32 35 35 2e 32 35 35 2e 32 255255.255.255.2
0040 35 35 32 35 35 2e 32 35 35 2e 32 35 35 2e 32 35 55255.255.255.25
0050 35 32 35 35 2e 32 35 35 2e 32 35 35 2e 32 35 35 5255.255.255.255
0060 32 35 35 2e 32 35 35 2e 32 35 35 2e 32 35 35 32 255.255.255.2552
0070 35 35 2e 32 35 35 2e 32 35 35 2e 32 35 35 32 35 55.255.255.25525
0080 35 2e 32 35 35 2e 32 35 35 2e 32 35 35 32 35 35 5.255.255.255255
0090 2e 32 35 35 2e 32 35 35 2e 32 35 35 32 35 35 2e .255.255.255255.
00a0 32 35 35 2e 32 35 35 2e 32 35 35 32 35 35 2e 32 255.255.255255.2
00b0 35 35 2e 32 35 35 2e 32 35 35 32 35 35 2e 32 35 55.255.255255.25
00c0 35 2e 32 35 35 2e 32 35 35 32 35 35 2e 32 35 35 5.255.255255.255
00d0 2e 32 35 35 2e 32 35 35 32 35 35 2e 32 35 35 2e .255.255255.255.
00e0 32 35 35 2e 32 35 35 32 35 35 2e 32 35 35 2e 32 255.255255.255.2
00f0 35 35 2e 32 35 35 55.255

ik zie niet waar dit fout gaat...

Acties:
  • 0 Henk 'm!

  • TweakPino
  • Registratie: September 2005
  • Laatst online: 09:01
Als ik kijk op wikipedia dan ziet een magic packet voor Wake on Lan eruit als eerst 6 maal 0xFF en dan 16 maal het MAC adres.
Ik weet niet hoe je hex waarden in een php string geeft, maar als je de parameter vergeet en het MAC adres vast in de python code zet, wordt de code als volgt:
PHP:
1
2
3
4
5
6
7
8
<?php
    exec('python /share/HDA_DATA/Qweb/wol.py'.$retval);
    if ($retval == 0) {
        echo $host. " is waking up";
    } else {
        echo $host. " not waken up";
    }
?>

Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/mnt/ext/usr/bin/python
import socket, sys

def createmagicpacket(mac):
    mac = "\x00\x11\xd8\x5e\xd3\xbb"    #no parameter or arguments, just a hard-coded mac address
    packet = "\xFF"*6   #WOL magic packet starts with 6 times 0xFF...
    i = 16;
    while (i):          #... and then 16 times the MAC address
        packet+=mac
        i-=1
    return packet
    host = '' # Bind to all interfaces
    port = 51423

    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
    s.bind((host, port))
    s.connect(('255.255.255.255',9))

    wakeupmac=sys.argv[1]
    s.send(createmagicpacket(wakeupmac))
    s.close()

Werkt het zo beter?

Acties:
  • 0 Henk 'm!

  • The Milkman
  • Registratie: Maart 2004
  • Laatst online: 24-06 21:51

The Milkman

█████░░░░░ 50%

Ik doe -als ik even zo vrij mag zijn-, een schop...
Ik wil dit namelijk ook bereiken, en was benieuwd of de TS het al is gelukt?

𓆑 𓆑 𓆑 𓆑 𓆑 𓆑

Pagina: 1