Sida 1 av 3

Debian: Problem med ttyS0. *Löst*

Postat: 19 januari 2008, 03:42:06
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.

Postat: 19 januari 2008, 07:41:02
av speakman
Har du lagt in användaren "www-data" i gruppen "dialout"? Eller på annat vis gjort serieporten tillgänglig för Apache?

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

Postat: 19 januari 2008, 09:12:21
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.

Postat: 19 januari 2008, 13:57:39
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.

Postat: 19 januari 2008, 16:15:16
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.. :)

Postat: 20 januari 2008, 15:59:28
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.

Postat: 20 januari 2008, 16:09:53
av bos
Det räcker som svar på varför det inte funkar; din användare är inte behörig att öppna devicen.

Postat: 20 januari 2008, 16:24:29
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.

Postat: 20 januari 2008, 17:03:50
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".

Postat: 20 januari 2008, 17:20:43
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.

Postat: 20 januari 2008, 17:59:20
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.

Postat: 20 januari 2008, 18:36:12
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. :)

Postat: 20 januari 2008, 19:22:30
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 :)

Postat: 20 januari 2008, 19:56:13
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:

Postat: 20 januari 2008, 20:13:42
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?