Fórum Ubuntu CZ/SK
Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: karlitos 27 Října 2010, 22:08:28
-
Zdravim
Stale delam na svem projektu (http://forum.ubuntu.cz/index.php/topic,46373.0.html) a zprovoznil jsem si doma takovy maly NAS na kterem beha linux a webserver. Takze se ve svych snahach pokrocil k tomu, ze ten printserver ovladam pomoci PHP skriptu primo z webove stranky. Jeden takovy skript jsem si nasel,lehce upravul a FUNGUJE ! Parada, kliknutm muzu z Honolulu zapnout spotrebic u nas doma. Jenze ten skript je uplne zakladni a potreboval bych ho rozsirit o par veci. Takze jsem si ten formular otevrel v KompoZeru (a znalci uz zvraci) a nahazel jsem si tam nejaky elementy ... a tim vicemene skoncil.
Odhledneme od toho ze ten KompoZer je docela za trest. Ale nedari se mi zprovoznit ani zakladni funkce ktere se snazim pridat.
Tady je original : <?php
/***********************************************************************************
* Network Something - php script.
* Original idea from Praxis Doktor Andy
* (http://www.doktor-andy.de/joomla/index.php?option=com_content&task=view&id=40&Itemid=52)
* This script was created by Jason Hensler (www.colddarkness.com)
* This script is released under the GNU/GPL License.
********************************************************************************/
error_reporting(E_ALL); //turn on error reporting for debugging this can be commented out
if(!isset($_REQUEST['Submit'])) //check if user submitted form
{
//generate user input form
?>
<form id="form1" name="form1" method="post" action="">
<p>Bits to send to print server:<br>
<label><input type="checkbox" name="bit8" value="true" /></label>
<label><input type="checkbox" name="bit7" value="true" /></label>
<label><input type="checkbox" name="bit6" value="true" /></label>
<label><input type="checkbox" name="bit5" value="true" /></label>
<label><input type="checkbox" name="bit4" value="true" /></label>
<label><input type="checkbox" name="bit3" value="true" /></label>
<label><input type="checkbox" name="bit2" value="true" /></label>
<label><input type="checkbox" name="bit1" value="true" /></label>
<br>
<label>
<input type="submit" name="Submit" value="Send" />
</label>
</form>
<?php
} else {
//if user has submited data
// The raw port number for the print server
$service_port = "9100";
// The network address of the print server
// This can be an ip address or a network name
$address = gethostbyname('192.168.178.14');
Echo "Creating socket...";
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //create the socket or fail
if ($socket === false) {
echo "<br><b>socket_create() failed: reason: " .
socket_strerror(socket_last_error()) . "</b>\n";
die();
} else {
echo "OK.<br>";
}
echo "Connecting to print server: " . $address . "...";
$result = socket_connect($socket, $address, $service_port); //connect to the print server
if ($result === false) {
echo "<br><b>socket_connect() failed.\nReason: ($result) " .
socket_strerror(socket_last_error($socket)) . "</b>\n";
die();
} else {
echo "OK.<br>";
}
$out=0;
//check to see if which boxes have been checked and add thier bit value to $out
// bit num: 8 7 6 5 4 3 2 1
// value: 128 64 32 16 8 4 2 1
if(isset($_REQUEST['bit8'])) {
$out +=1;
}
if(isset($_REQUEST['bit7'])) {
$out += 2;
}
if(isset($_REQUEST['bit6'])) {
$out += 4;
}
if(isset($_REQUEST['bit5'])) {
$out += 8;
}
if(isset($_REQUEST['bit4'])) {
$out +=16;
}
if(isset($_REQUEST['bit3'])) {
$out += 32;
}
if(isset($_REQUEST['bit2'])) {
$out += 64;
}
if(isset($_REQUEST['bit1'])) {
$out += 128;
}
echo "Sending to print server...<br>";
// since php does not have byte type varables and wants to send ascii over sockets
// we use chr($out) to send the char with the matching value of the value we want to send
socket_write($socket, chr($out), strlen(chr($out)));
socket_close($socket); // close the socket
echo "Sent!<br>";
}
?>
Zakladni funkcnost je mi jasna, ale napriklad bych rad aby se IP/host dalo zadat do textoveho pole, aby tam bylo tlacitko Reset na poslani 0 (vsechny rele vypnute) atd ... tak jsem ten formluar nejdriv upravil takto :
<form id="form1" name="form1" method="post" action="">
<div style="text-align: center;"></div>
<p style="text-align: center;"><span
style="text-decoration: underline;">A simple script for driving Relays
over Printserver</span><br>
</p>
<p style="text-align: center;">Ip-adress/hostname of the printserver :</p>
<div style="text-align: center;"> Host: <input name="IP" type="text"><br></div>
<div style="text-align: center;"><button name="default_ip">Set as default adress</button></div>
<div style="text-align: center;"><button name="default_ip">set as
default adress</button></div>
<p style="text-align: center;"><br>
</p>
<hr style="width: 100%; height: 2px;">
<p style="text-align: center;">Bits to send to print server:</p>
<br>
<p style="text-align: center;">
<label><input name="bit8" value="true" type="checkbox"></label>
<label><input name="bit7" value="true" type="checkbox"></label>
<label><input name="bit6" value="true" type="checkbox"></label>
<label><input name="bit5" value="true" type="checkbox"></label>
<label><input name="bit4" value="true" type="checkbox"></label>
<label><input name="bit3" value="true" type="checkbox"></label>
<label><input name="bit2" value="true" type="checkbox"></label>
<label><input name="bit1" value="true" type="checkbox"></label>
</p>
<div style="text-align: center;"><button name="send">
Send </button> <button name="reset"> Reset </button>
<br>
</div>
</form>
Vypada to jak kdyby to programoval nekdo z dob UsssR ale OK. No a ted potrebuju aby se do promene $address ulozila IP nebo hostname z textoveho pole Host: - no a tim to cele konci
Pouzil jsem $address = gethostbyname($_POST['IP']);
ale to nejak nechce fungovat.
Ano RTFM, na druhou stranu nehodlam se PHP prilis moc zabyvat, potrebuju jen tuhle jednu vec, kdyby mi nekdo mohl dat trochu hint , budu moc rad, diky K
-
A koukal jste co se Vám odesílá v tomto $_POST['IP'] ?
-
Nekoukal, anzto nevim jak - dobre jdu googlit. Originalni skript po zaklikani tech checkboxu nacte novou stranku, kde to vypise informace ze se vytvari socket, pripojuje ... Ted to - po stisknuti Send - jenom problikne, nestane se nic.
Mimojine to bych taky rad zmenil - aby dole pod skriptem bylo okno do ktereho se ty zpravy budou vepisovat a ne aby se pokazde nacetla nova stranka.
-
originalny PHP script pravdepodobne nie je cely
-
originalny PHP script pravdepodobne nie je cely
OOOps... omlouvam se uz jsem to opravil.
No jak jsem pochopil - funguje to takto : To co je mezi tagy <form> a </form> je ten formular - tedy ty graficky prvky. Promene $service_port a $address jsou taky jasne a tam bych potreboval aby to slo zadavat z toho formulare. Pak to zkusi vytvorit socket - vyhodi to chybovou hlasku a ... ? (k cemu je to die() ? ) Kdyz se to povede napise to Ok, pak to kontroluje ktery checkboxy jsou zaskrtly a podle toho inkrementuje promennou $out a nakonci to posle prez socket data co jsou v promenne $out
No naotlik jsem tomu porozumel, ale treba nechapu jak je spojena akce - zmacknu tlacitko Send s akci ze se vytvori socket a poslou data. Natoz jak udelat jiny tlacitko ktery by poslalo $out=0; Ono by slo ze by se pomoci reset nejdriv odznacily vsechny checkboxy a pak se to teprve pomoci send potvrdilo, ale skoro je lepsi aby po kliknuti na reset to rovnou odznacilo checkboxy a poslalo data.
No a vystup do nejakeho textoveho pole ...
Snazim se neco si o tom najit, problem je ze vetsina ruznych PHP tutorialu se vztahuje na jinou syntaxi a moc jsem to zatim nepobral.
-
Rád by som pomohol, ale nejak nechápem čo vlastne potrebuješ. Skúsim si to ešte pár krát prečítať a vstrebať. S printservrom, NAS a používaním socketov nemám skúsenosti, ale PHP mi problém nerobí.
Vyzerá to zaujímavo, rád pomôžem.
-
No zatim v tom totalne bloudim, ale kdybys mohl - treba i radou, budu moc rad.
Problem mam s tim ze ten originalni PHP skript funguje ale pouze nasledujicim zpusobem :
IP/host a port je natvrdo zadane do kodu. (coz neni moc dobre reseni) Kdyz to odesle data tak se nacte nova stranka na ktere jsou vypsane informace bud o chybe nebo o tom ze je vse Ok a ze to posila/poslalo data. A pak musim kliknout na Zpet v prohlizeci abych se vratil k puvodnimu formulari.
Tak jsem si udelal novy formular - v KompoZeru :-X ale lip zatim neumim - kde jsem si udelal pole na vespani IP adresy nebo hostname.
Potrebuju aby se po stisknuti tlacitka Send nacetla ta hodnota te IP nebo hostname co je v tom textovem poli a ulozila do promenne $address. To same si asi udelam jeste pro port. No a aby jsem dole mel nejake pole kde se budou zobrazovat ty informace co ten skript generuje a nenacitalo se to v nove strance-
To v zakladu, jeste bych rad aby se zadana adresa dala ulozit jako "defaultni" Tady abych mel promennou $default_adress jejiz hodnota by byla defaultne zobrazena v tom textovem poli pro IP a kdyz zadam treba jinou a zmacknu "make default" aby se ta hodnota prepsala. Priste az se skript nacte by tam byla nova defaultni adresa...
A pak jeste tlacitko Reset ktere posle hodnotu promenne $out 0 (zadne rele sepnute) a vymaze vsechny oznacene checkboxy.
No asi tak. :) koukam ze si nejak moc vymyslim
Diky za vse K
-
<?php
/***********************************************************************************
* Network Something - php script.
* Original idea from Praxis Doktor Andy
* (http://www.doktor-andy.de/joomla/index.php?option=com_content&task=view&id=40&Itemid=52)
* This script was created by Jason Hensler (www.colddarkness.com)
* This script is released under the GNU/GPL License.
********************************************************************************/
error_reporting(E_ALL); //turn on error reporting for debugging this can be commented out
if(isset($_POST['Submit'])) {
echo "<pre>";
print_r($_POST);
echo "</pre>";
}
//generate user input form
?>
<form id="form1" name="form1" method="post" action="">
<p>Bits to send to print server:<br>
<label><input type="checkbox" name="bit8" value="true" /></label>
<label><input type="checkbox" name="bit7" value="true" /></label>
<label><input type="checkbox" name="bit6" value="true" /></label>
<label><input type="checkbox" name="bit5" value="true" /></label>
<label><input type="checkbox" name="bit4" value="true" /></label>
<label><input type="checkbox" name="bit3" value="true" /></label>
<label><input type="checkbox" name="bit2" value="true" /></label>
<label><input type="checkbox" name="bit1" value="true" /></label>
<br>
IP: <input name="ip" value="192.168.178.14">
<input type="button" value="default" onclick="document.form1.ip.value = '192.168.178.14'"><br>
PORT: <input name="port" value="9100"><br>
<input type="submit" name="Submit" value="Send" />
<input type="reset"/>
</form>
<?
if(isset($_POST['Submit'])) //check if user submitted form
{
//if user has submited data
// The raw port number for the print server
$service_port = $_POST['port'];
// The network address of the print server
// This can be an ip address or a network name
$address = gethostbyname($_POST['ip']);
Echo "Creating socket...";
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //create the socket or fail
if ($socket === false) {
echo "<br><b>socket_create() failed: reason: " .
socket_strerror(socket_last_error()) . "</b>\n";
die();
} else {
echo "OK.<br>";
}
echo "Connecting to print server: " . $address . "...";
$result = socket_connect($socket, $address, $service_port); //connect to the print server
if ($result === false) {
echo "<br><b>socket_connect() failed.\nReason: ($result) " .
socket_strerror(socket_last_error($socket)) . "</b>\n";
die();
} else {
echo "OK.<br>";
}
$out=0;
//check to see if which boxes have been checked and add thier bit value to $out
// bit num: 8 7 6 5 4 3 2 1
// value: 128 64 32 16 8 4 2 1
if(isset($_REQUEST['bit8'])) {
$out +=1;
}
if(isset($_REQUEST['bit7'])) {
$out += 2;
}
if(isset($_REQUEST['bit6'])) {
$out += 4;
}
if(isset($_REQUEST['bit5'])) {
$out += 8;
}
if(isset($_REQUEST['bit4'])) {
$out +=16;
}
if(isset($_REQUEST['bit3'])) {
$out += 32;
}
if(isset($_REQUEST['bit2'])) {
$out += 64;
}
if(isset($_REQUEST['bit1'])) {
$out += 128;
}
echo "Sending to print server...<br>";
// since php does not have byte type varables and wants to send ascii over sockets
// we use chr($out) to send the char with the matching value of the value we want to send
socket_write($socket, chr($out), strlen(chr($out)));
socket_close($socket); // close the socket
echo "Sent!<br>";
}
?>
-
;D ;D ;D
diky moc, krasne to funguje. Jen par musek :
Nahore - nad tim skriptem mi to zobrazi
Array
(
[bit6] => true
[bit5] => true
[bit4] => true
[bit3] => true
[bit2] => true
[bit1] => true
[ip] => 192.168.178.14
[port] => 9100
[Submit] => Send
)
tedy podle toho jaka rele jsou zapnuta. Jinak zbyle informace mi to krasne vypisuje pod tim formularem.
No a k te defaultni IP - ja jsem spis myslel takhle :
...
<input type="button" value="default" onclick="document.form1.ip.value = $_POST['default_host']"><br>
<input type="button" name="make default" value="?????" onclick="default_host.value = $_POST['ip']"><br>
$default_host = gethostbyname('192.168.178.14');...
$address = gethostbyname($_POST['ip']);
...
aby sla zadana IP adresa ulozit jako defaultni.
No a pak k tomu reset tlacitku - nejak moc nevim jak to udelat. Aby to onclick odoznacilo vsechny checkbox, out pripadilo 0 a poslalo to data ...
Zkusim nad tim jeste popremyslet ae moc moc diky uz tkahle je to tisickrat lepsi.
-
zajtra sa ti na to pozrem, malo by sa dat spravit vsetko z toho
-
Tak ten kód nahoře nad formulářem byl pravděpodobně přidán jenom pro debug, pro ověření, co se vlastně přesně posílá, takže ho odstraníš smaznáním:
if(isset($_POST['Submit'])) {
echo "<pre>";
print_r($_POST);
echo "</pre>";
}
Potom nevim jak to přesně chceš...předpokládám, že když odešleš formulář s nějakou novou IP adresou, tak aby příště se ti tam zobrazovala ta poslední zadaná... a potom jsou tu dvě možnosti 1) aby se ukládání poslední zadaný IP adresy vztahovalo k danému PC, ze kterého byl odeslán formulář (cookies na daném pc), nebo 2) aby se poslední zadaná IP adresa uložila globálně vrámci tohodle tvýho skriptu.
Jinak pokud ti jde o tlačítko, který by odeslalo příkaz se všemi bity v nule, pak si přidej mezi někam checkbox:
Reset All? <input type="checkbox" name="resetall" value="true" />
a potom před řádek
echo "Sending to print server...<br>";
vlož ještě tohle:
if(isset($_POST['resetall']){
$out = 0;
}
A jako poslední úpravu teďko doporučuju z důvodu bezpečnosti všechny $_REQUEST přepsat na $_POST
-
Predne vsem moc diky !
Takze jak radil Dragonn jsem zakomentoval ten kod na zacatku a uspech. Zmenil jsem vsechny REQUEST na POST a taky dobry. Pridal jsem ten checkbox - to taky jeste fungovalo jak se patri. Ale s tim
if(isset($_POST['resetall']){
$out = 0;
}
mi to zobrazi jen bilou stranku.
K tomu jeste : myslel jsem ze by bylo smyslupnejsi udelat to spis :
/if(isset($_POST['resetall']){
$out = 0;
}
else{
if(isset($_POST['bit8']))
....
Preci jenom je vice logicke neprovadet vsechny ty inkrementace - pokud chci poslat nulu. Lepereceno nedelat nejdriv nekolik souctu abych posleze promenou stejne dal rovno 0.
No ten reset bych mel radsi jako tlacitko ktere by rovnou poslalo i dana data a taky nejak poresit aby si to pamatovalo posledni stav relatek ... ale vcelku jsem vubec rad ze mi tkahle pomahate. Jinak neni nutne ziskavat IP/hostname primo z aktualniho klienta. Uplne by stacilo kdyby se ukladala do nejake globalni promenne.
Ja ted poradne zkonfiguruju server a pak udelam ucet, nastavim portforwarding, hodim sem link a muzete mi v Berline zapinat relatka do aleluja ;D ;D ;D bude legrace
-
Jo, to co navrhuješ je lepší... a funguje ti to tak? Jinak pokud chceš reset jako tlačítko tak místo toho checkboxu dáš
<input type="submit" value="Odeslat reset" name="resetall" />
Akorát si nejsem uplně jistej, jestli náhodou ti to nebude blbnout...mam takovej pocit, že dřív to v nějakejch prohlížečích fungovalo špatně, tak kdyby se ti pak nešli relátka zapínat, tak to budeš muset vrátit...ale snad ne :o).
Jinak PHP je nestavový...tzn nelze uložit nějakou globální proměnnou, kterou si to bude pamatovat. Jediný, co můžeš udělat je, že tu IP adresu uložíš do cookies a bude si to pamatovat pro každej počítač zvlášť (na implementaci jednodušší = méně příkazů), nebo jí zapíšeš třeba do souboru a pak to bude globálně. Klidně ti napíšu, jak udělat oboje, jenom si řekni, jak se ti to bude víc hodit :-)
-
Ahoj
No jak jsem psal - nefunguje ani verze 1 . - tedy :
if(isset($_POST['resetall']){
$out = 0;
}
pred radkem
echo "Sending to print server...<br>";
Vysledkem byla bila stranka. Muzu se podivat co mi lighttpd vyhodi za chyby - ...
aaaha : 2010-10-29 12:15:21: (mod_fastcgi.c.2175) FastCGI-stderr: PHP Parse error: syntax error, unexpected '{' in /shares/internal/PUBLIC/WWW/Welcome/Iprelay/index.php on line 102
...
... AAAA chybejici ) v tom kodu od tebe, uz jsem to opravill uz se to zobrazuje.
Takze testneme funkcnost ....
;D ;D ;D
bajecny.
Takze aktualni kod je :
<?php
/***********************************************************************************
* Network Something - php script.
* Original idea from Praxis Doktor Andy
* (http://www.doktor-andy.de/joomla/index.php?option=com_content&task=view&id=40&Itemid=52)
* This script was created by Jason Hensler (www.colddarkness.com)
* This script is released under the GNU/GPL License.
********************************************************************************/
error_reporting(E_ALL); //turn on error reporting for debugging this can be commented out
/*if(isset($_POST['Submit'])) {
* echo "<pre>";
* print_r($_POST);
* echo "</pre>";
*}
*/
//generate user input form
?>
<form id="form1" name="form1" method="post" action="">
<p>Bits to send to print server:<br>
<label><input type="checkbox" name="bit8" value="true" /></label>
<label><input type="checkbox" name="bit7" value="true" /></label>
<label><input type="checkbox" name="bit6" value="true" /></label>
<label><input type="checkbox" name="bit5" value="true" /></label>
<label><input type="checkbox" name="bit4" value="true" /></label>
<label><input type="checkbox" name="bit3" value="true" /></label>
<label><input type="checkbox" name="bit2" value="true" /></label>
<label><input type="checkbox" name="bit1" value="true" /></label>
Reset all <label><input type="checkbox" name="resetall" value="true" /><label>
<br>
IP: <input name="ip" value="192.168.178.14">
<input type="button" value="default" onclick="document.form1.ip.value = '192.168.178.14'"><br>
PORT: <input name="port" value="9100"><br>
<input type="submit" name="Submit" value="Send" />
<input type="reset"/>
</form>
<?
if(isset($_POST['Submit'])) //check if user submitted form
{
//if user has submited data
// The raw port number for the print server
$service_port = $_POST['port'];
// The network address of the print server
// This can be an ip address or a network name
$address = gethostbyname($_POST['ip']);
Echo "Creating socket...";
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //create the socket or fail
if ($socket === false) {
echo "<br><b>socket_create() failed: reason: " .
socket_strerror(socket_last_error()) . "</b>\n";
die();
} else {
echo "OK.<br>";
}
echo "Connecting to print server: " . $address . "...";
$result = socket_connect($socket, $address, $service_port); //connect to the print server
if ($result === false) {
echo "<br><b>socket_connect() failed.\nReason: ($result) " .
socket_strerror(socket_last_error($socket)) . "</b>\n";
die();
} else {
echo "OK.<br>";
}
$out=0;
//check to see if which boxes have been checked and add thier bit value to $out
// bit num: 8 7 6 5 4 3 2 1
// value: 128 64 32 16 8 4 2 1
//if(isset($_POST['resetall']){
// $out = 0;
//}
//else{
if(isset($_POST['bit8'])) {
$out +=1;
}
if(isset($_POST['bit7'])) {
$out += 2;
}
if(isset($_POST['bit6'])) {
$out += 4;
}
if(isset($_POST['bit5'])) {
$out += 8;
}
if(isset($_POST['bit4'])) {
$out +=16;
}
if(isset($_POST['bit3'])) {
$out += 32;
}
if(isset($_POST['bit2'])) {
$out += 64;
}
if(isset($_POST['bit1'])) {
$out += 128;
//}
}
if(isset($_POST['resetall'])){
$out = 0;
}
echo "Sending to print server...<br>";
// since php does not have byte type varables and wants to send ascii over sockets
// we use chr($out) to send the char with the matching value of the value we want to send
socket_write($socket, chr($out), strlen(chr($out)));
socket_close($socket); // close the socket
echo "Sent!<br>";
}
?>
No a co s globalnima promennyma primo v tom PHP kodu, ty nelze zmenit ? To zavani trochu perpetum mobile - program si sam upravje svuj vlastni kod - to je pomlau o strach na to pak neco pripojit, nakonec se jeste dockame Terminator 99 : vzpoura printserveru ;D
Ale koneckoncu nejaej malej .conf souborek - proc ne.
Aby si to umelo pamatovat stav tech relatek - takhle totiz kdyz zapnu 1,2,3,4,5,6,7 a chci zapnout jeste 8 musim znovu vsech 8 naklikat.
EDIT :
HOUSTNE mame tady maly problem. Kdyz kliknu do toho policka pro IP tak mi to oznacuje a odoznacuje ten checkbox pro Reset all