Debian: Problem med ttyS0. *Löst*

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
Användarvisningsbild
JimmyAndersson
Inlägg: 26417
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Debian: Problem med ttyS0. *Löst*

Inlägg av JimmyAndersson »

Jag har en php-kod som öppnar serieporten (ttyS0) och skickar ut diverse data.
Koden fungerar på 007sweden's dator, så det är inget problem med koden.
Problemet sitter någonstans i min dator och yttrar sig så att .. tja, det händer liksom inget när jag kör php-koden. Webläsaren "'arbetar'" (ni vet, loggan åker runt runt) men inget kommer upp i webläsarfönstret.

ttyS0 finns i /devs och när jag skriver lsof /devs/ttyS* så får jag inget meddelande om att någon av dessa portar är öppen.

Jag är väldigt rostig när det gäller att använda portar såhär i Linux, så alla tips är mycket välkomna. :)


Slutligen, en liten titt på php-koden. Den består av två filer, dels:

Kod: Markera allt

<?php
include "php_serial.class.php";

$serial = new phpSerial;

$serial->deviceSet("/dev/ttyS0");
$serial->confBaudRate(9600);
$serial->confParity("none");
$serial->confStopBits(1);
$serial->confFlowControl("none");
$serial->confCharacterLength(8);
$serial->deviceOpen();
.........osv
(det finns även formulär mm längre ner i koden, men formuläret visas aldrig i webläsaren.)

och så själva php_serial.class.php , som kan hittas här.
Senast redigerad av JimmyAndersson 24 januari 2008, 18:17:53, redigerad totalt 2 gånger.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Har du lagt in användaren "www-data" i gruppen "dialout"? Eller på annat vis gjort serieporten tillgänglig för Apache?
bos
Inlägg: 2308
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: Debian: Kan inte öppna ttyS0 (serieporten).

Inlägg av bos »

JimmyAndersson skrev:ttyS0 finns i /devs och när jag skriver lsof /devs/ttyS* så får jag inget meddelande om att någon av dessa portar är öppen.
Om det är *exakt* så du skriver så har du antingen en ostandard, och trasig, lsof, eller så är det inte hela sanningen eftersom lsof ger ett felmeddelande om du skriver så. Antingen menar du nog, eller så vill du egentligen göra, "lsof | grep ttyS" för att leta upp vilken, om någon, tty som används.

Hur Apache kör sina php-script vet jag inte, men om du lyckas klura ut det så kan du köra "strace -e open -p <pid>" på den process som forkar din php-kod, och se vad som öppnas där.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Enklast borde vara att dumpa eventuella felmeddelanden i en fil i /tmp eller nått med PHP-kod.

Du kan ju även prova din kod med PHP CLI. Och händer det inte något där heller (eller får något felmeddelande) så är det ju en enkel sak att köra strace på den om inte annat.
Användarvisningsbild
JimmyAndersson
Inlägg: 26417
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Tack för svaren. :)

Användaren "www-data" fanns inte i gruppen "dialout", men nu har jag lagt till det. Tyvärr utan någon lösning på problemet.

När jag skriver lsof | grep ttyS så får jag:

apache2 2891 www-data llu CHR 4,64 1820 /dev/ttyS0

Tyvärr säger det mig inte så mycket mer än att användaren (eller gruppen? för det finns ju även en sådan) www-data använder ttyS0.

Att jag tidigare skrev lsof /dev/ttyS* beror på att det stod att man skulle skriva så, här. Första punkten under 13.13 : "lsof /dev/ttyS*" will list serial ports which are open.will list serial ports which are open.


PHP CLI har jag tyvärr inte hittat till PHP5, som jag kör. Däremot till PHP4.
Fungerar den ändå? Jag har inte vågat installera.. :)
Användarvisningsbild
JimmyAndersson
Inlägg: 26417
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

strace på php-filen:

Kod: Markera allt

execve("/var/www/test/example.php", ["/var/www/test/example.php"], [/* 27 vars */]) = -1 EACCES
(Permission denied)
dup(2)                                  = 3
fcntl64(3, F_GETFL)                     = 0x2 (flags O_RDWR)
fstat64(3, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f6c000
_llseek(3, 0, 0xbf8e3d14, SEEK_CUR)     = -1 ESPIPE (Illegal seek)
write(3, "strace: exec: Permission denied\n", 32strace: exec: Permission denied
) = 32
close(3)                                = 0
munmap(0xb7f6c000, 4096)                = 0
exit_group(1)                           = ?
Process 4074 detached

strace på /dev/ttyS0:

Kod: Markera allt

execve("/dev/ttyS0", ["/dev/ttyS0"], [/* 27 vars */]) = -1 EACCES (Permission denied)
dup(2)                                  = 3
fcntl64(3, F_GETFL)                     = 0x2 (flags O_RDWR)
fstat64(3, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f4b000
_llseek(3, 0, 0xbfa2e834, SEEK_CUR)     = -1 ESPIPE (Illegal seek)
write(3, "strace: exec: Permission denied\n", 32strace: exec: Permission denied
) = 32
close(3)                                = 0
munmap(0xb7f4b000, 4096)                = 0
exit_group(1)                           = ?
Process 4095 detached
Bortsett från "Permission denied" så säger det mig väldigt lite tyvärr...

edit: Lade till en radbrytning så inte code-delen blev så bred.
Senast redigerad av JimmyAndersson 20 januari 2008, 18:11:12, redigerad totalt 1 gång.
bos
Inlägg: 2308
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Inlägg av bos »

Det räcker som svar på varför det inte funkar; din användare är inte behörig att öppna devicen.
Användarvisningsbild
JimmyAndersson
Inlägg: 26417
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Jo det förstår jag. Kunde du inte ha skrivit ett litet längre svar? :D
"Permission denied" betyder ju ordagrant "Tillåtelse nekad". :)

Men frågan är varför. www-data är ju den användare som apache använder.
Den tillhör gruppen dialout.

Vad jag förstått så är det gruppen dialout som är behörig att skriva till ttyS0.
Detta är inget som jag har kunnat kolla upp att det verkligen stämmer.
Jag har försökt läsa på om www-data och dialout, men inte hittat något speciellt matnyttigt på nätet.
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Har du kollat med "groups www-data" att www-data verkligen tillhör dialout?

Vem som har behörighet att skriva till ttyS0 kollar du med "ls -l /dev/ttyS0".
Användarvisningsbild
JimmyAndersson
Inlägg: 26417
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

groups www-data ger:
www-data: www-data dialout

Så långt allt ok alltså.


ls -l /dev/ttyS0 ger:
crw-rw---- 1 root dialout 4, 64 2008-01-20 00:45 /dev/ttyS0

Dvs ägaren och gruppen har läs och skrivrättigheter.
Root och dialout har behörighet till ttyS0.
Så där är allt också ok.
Användarvisningsbild
ahlsten
Inlägg: 659
Blev medlem: 12 november 2005, 00:24:14
Ort: Uppsala

Inlägg av ahlsten »

Att du får EACCES är väl inte så konstigt då varken php-filen eller ttyS* är exekverbar? strace försöker ju exekvera genom execve...
Gör som bos sa först och försök klura ut vilken aktivitet som kör php-filen (kanske httpd när nån försöker accessa den t ex) och kör en strace på den.
Om du av säkerhetskäl har nån monteringspunkt som har flaggan noexec kan du ju kolla så att det inte råkar vara där som din exekverbara ligger, det är en typisk grej som man kan missa.
Användarvisningsbild
JimmyAndersson
Inlägg: 26417
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Hur kollar man det?
Jag kan kolla ifall en exec-flagga inte är satt, men var? Dvs vilken fil?
Den enda monteringspunkt som ska användas här är väl ttyS0 ?

Jag vet tyvärr inte heller hur man tar reda på vilken aktivitet som kör php-filen.

Naturligtvis har jag googlat och fortsätter även att göra det. :)
Användarvisningsbild
ahlsten
Inlägg: 659
Blev medlem: 12 november 2005, 00:24:14
Ort: Uppsala

Inlägg av ahlsten »

Om du vet att filen laddas, t ex när du försöker ladda den i din webläsare, kan du testa att köra nått i stil med

Kod: Markera allt

lsof | grep /var/www/test/example.php
då borde applikationen dyka upp i kolumnen längst till vänster.
Den där noexec-biten är nog en lågoddsare, men det jag tänkte på var om nån partition som körbara kanske låg på var noexec, men förmodligen ligger den ju på samma som / och då är det ju knappast noexec-flagga :)
Användarvisningsbild
JimmyAndersson
Inlägg: 26417
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Försökte ladda example.php i webläsaren och skrev
lsof | grep /var/www/test/example.php

Men det gav tyvärr ingenting. Dvs "prompten" kommer bara tillbaka på nästa rad.

Samma grejj när jag försökte med php_serial.class.php istället.


grubbel grubbel... :humm:
Användarvisningsbild
ahlsten
Inlägg: 659
Blev medlem: 12 november 2005, 00:24:14
Ort: Uppsala

Inlägg av ahlsten »

Äsch, ja lsof hittar den bara om det finns en öppen ström till den... så webläsaren läser nog bara av den snabbt och sen stängs strömmen ner. Vet tyvärr inte om nått bra sätt att logga access av filer, men det borde det ju finnas någon annan här som mästrar? Man kanske kan spara ut allt som skapas i /proc/"PID"/fd..
Visst kör du nån webserver när du försöker ladda sidan? Vilken är det?
Skriv svar