[httpd + gzip (ou br)]: sbw.cgi
#1

Salut!
Au lieu de continuer à polluer ce fil, je viens présenter ici mon petit projet nommé sbw.cgi.
L'objectif est de servir des fichiers compressés plutôt que les fichiers en texte brut pour limiter l'utilisation de la bande passante. L'idéal serait de l'intégrer au code d'httpd directement, mais en attendant, c'est un script cgi.

Au départ, c'était un script shell, maintenant, c'est entièrement écrit en C. Ainsi :

* unveil est actif, ça assure davantage de sécurité, seul le dossier du site web servi peut être lu
* pledge est actif avec uniquement les promesses "stdio" et "rpath", qui permettent respectivement de gérer des flux d'entrée/sortie (du texte) et de lire des fichiers. Toutes les autres choses sont interdites.
* Il n'y a plus besoin de copier des dépendances.
* C'est plus rapide.

J'en parle un peu plus ici : https://ybad.name/Logiciel-libre/Code/sbwcgi.html

Ce fil permettra d'avoir des retours de ceux/celles qui sont peut-être intéressés Smile
Répondre
#2

s/swb.cgi/sbw.cgi ;-)

Sinon, comme je l'ai dit, perso, il me retourne une page blanche !

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre
#3

Merci, j'ai décidément la manie des inversions.
Je l'utilise actuellement sur mon site.

As-tu bien la dernière version ?
As tu bien un fichier gzippe à côté de l'original ? Par exemple file.html et file.html.gz?
(ou br si tu as édité le fichier config.h avant compilation).

Quelles sont les permissions sur tes fichiers ?
Répondre
#4

Le en-têtes retournés m'intéressent aussi (F12 puis clic sur le nom de la page avec Firefox)
Répondre
#5

s/tar xvzf sbwcgi/tar xvzf sbwcgi.tgz/

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre
#6

vu
Répondre
#7

(12-05-2020, 14:19:19)PengouinBSD a écrit :  s/tar xvzf sbwcgi/tar xvzf sbwcgi.tgz/

J'en profite pour rappeler une option méconnue dans les regex, je ne sais pas comment ça s'appelle mais appelons ça "remettre la sélection" Big Grin

la commande suivante fait la même chose, en utilisant & ça évite de retaper tout ce qui est dans la sélection.
Code :
sed 's/tar xvzf sbwcgi/&.tgz/'
Répondre
#8

oki, merci!

cf: https://www.gnu.org/software/sed/manual/...22-Command

Citation :the replacement can contain unescaped & characters which reference the whole matched portion of the pattern space.

c'est bien cela ?!

----

https://www.grymoire.com/Unix/Sed.html#uh-3
Citation :The solution requires the special character "&." It corresponds to the pattern found.

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre
#9

(12-05-2020, 23:28:24)PengouinBSD a écrit :  oki, merci!

cf: https://www.gnu.org/software/sed/manual/...22-Command

Citation :the replacement can contain unescaped & characters which reference the whole matched portion of the pattern space.

c'est bien cela ?!

----

https://www.grymoire.com/Unix/Sed.html#uh-3
Citation :The solution requires the special character "&." It corresponds to the pattern found.

Exact ! Smile
Répondre
#10

(12-05-2020, 23:28:24)PengouinBSD a écrit :  (…)
cf: https://www.gnu.org/software/sed/manual/...22-Command
(…)
https://www.grymoire.com/Unix/Sed.html#uh-3

Et aussi sans même aller sur la toile, dans le man installé sur ta propre machine :
man sed a écrit :An ampersand (‘&’) appearing in the replacement is replaced by
the string matching the regular expression.  The string ‘\#’,
where ‘#’ is a digit, is replaced by the text matched by the
corresponding backreference expression (see re_format(7)).
Répondre
#11

@eol, merci

@prx: par contre, j'ai carrément arrêté l'expérience.
Ton code me génère des erreurs 500, sans aucune raison, et surtout sans aucun message d'erreurs, dans aucun log, ni ceux de httpd, ni messages.
Donc, j'arrête ; je fais sans, et lorsque je serais bien disposé, j'installerais un "vrai" serveur web qui sait correctement les choses, sans avoir à lui installer 36 artefacts, deux serveurs en plus, histoire d'avoir quelque chose de fonctionnel vraiment - dixit, nginx !
(mais, pour l'instant, je ne suis vraiment pas dans de bonnes conditions… - pas la peine de me demander quoi que ce soit ; pas le moment)

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre
#12

Bon, repose toi alors.
Je l'utilise sur mon site perso sans soucis et sans faire de trucs extraordinaires de configuration, donc je suppose que les erreurs 500 peuvent vite être résolues. Je parie sur les permissions de ton site, (lisible par www?), mais tu ne m'as pas répondu à ce propos.
Répondre
#13

oui absolument lisible par le groupe www et le script cgi a des droits en exécution Wink

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre
#14

Bon, dans ce cas il faudra plus de détails sur ta configuration pour comprendre pourquoi ça ne veut pas chez toi (httpd, liste des fichiers servis avec permissions, slowcgi actif, dmesg...) quand tu auras envie Smile
Répondre
#15

IL n'y a rien de strictement que du banal dans ma config httpd, la seule chose qui change, c'est le nom des fichiers !
(pour l'instant, même pas de TLS, vu que je suis pas en état de m'en occuper correctement)

J'ai en frontal devant httpd, relayd de la manière que tu sais pour en avoir discuter sur un autre poste.
https://doc.huc.fr.eu.org/fr/web/httpd/r...ers-httpd/

Les droits de l'utilisateur dans le chroot sont ceux de mon id principal, suivi de celui du groupe web.
-rwxr-xr-x 1 root daemon 3387 May 9 12:19 sbw.cgi*

Le dmesg, tu le connais, c'est ton ex-mini-pc !!!

Ce qui est étonnant, c'est que slowcgi kille ni + ni moins :
Code :
May 13 21:07:45 sh1 slowcgi[14663]: caught exit of unknown child 91576
Et rien dans les logs si ce n'est que je me prends une erreur 500 :
Code :
mon-domaine.tld 127.0.0.1 - - [13/May/2020:21:07:37 +0200] "GET / HTTP/1.1" 500 0 "" "Mozilla/5.0 (X11; Linux x86_64; rv:76.0) Gecko/20100101 Firefox/76.0" 192.168.1.1 -
mon-domaine.tld 127.0.0.1 - - [13/May/2020:21:07:39 +0200] "GET /favicon.ico HTTP/1.1" 200 2238 "" "Mozilla/5.0 (X11; Linux x86_64; rv:76.0) Gecko/20100101 Firefox/76.0" 192.168.1.1 -
mon-domaine.tld 127.0.0.1 - - [13/May/2020:21:07:42 +0200] "GET / HTTP/1.1" 500 0 "" "Mozilla/5.0 (X11; Linux x86_64; rv:76.0) Gecko/20100101 Firefox/76.0" 192.168.1.1 -
mon-domaine.tld 127.0.0.1 - - [13/May/2020:21:07:45 +0200] "GET / HTTP/1.1" 500 0 "" "Mozilla/5.0 (X11; Linux x86_64; rv:76.0) Gecko/20100101 Firefox/76.0" 192.168.1.1 -

Ma config, je vais te l'envoyer de manière sécurisée, je ne veux pas qu'elle soit publiée sur le web.

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre
#16

Je ne pense pas que relayd vienne mettre le bazar.

Oui l'erreur 500 c'est "normal" quand un CGI s'arrête. C'est ce qu'on voit avec slowcgi.
Par contre, ce que fait slowcgi est très étrange... Je soupçonne maintenant unveil : c'est pour ça que je te demande le dmesg, si unveil a bloqué sbw, alors ça apparaîtra à la fin du dmesg.
Répondre
#17

Malheureusement, je viens de faire à nouveau un test, et je n'ai rien dans dmesg !

Code :
# dmesg | tail
dmesg | tail
sd1: 122104MB, 512 bytes/sector, 250069680 sectors
uhub1 at uhub0 port 4 configuration 1 interface 0 "Genesys Logic USB2.0 Hub" rev 2.00/85.36 addr 3
vscsi0 at root
scsibus3 at vscsi0: 256 targets
softraid0 at root
scsibus4 at softraid0: 256 targets
root on sd0a (2f18100544c5d963.a) swap on sd0b dump on sd0b
inteldrm0: 1024x768, 32bpp
wsdisplay0 at inteldrm0 mux 1
wsdisplay0: screen 0-5 added (std, vt100 emulation)

Et rien de plus dans les logs 'daemon', et 'messages' - je t'envoie ma conf server :p

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre
#18

J'arrive à reproduire l'erreur 500 avec :
Code :
cat httpd.conf
lan_ip="127.0.0.1"
server "default" {
    listen on $lan_ip port 80
    location "/*.txt" {
        root "/cgi-bin/sbw.cgi"
        fastcgi param realroot "/htdocs/"
    }
}
Code :
stat -f '%Sp %Su %Sg %SN' /var/www/{cgi-bin/sbw.cgi,htdocs/test.txt*}
-r-xr-xr-x www bin /var/www/cgi-bin/sbw.cgi
-r--r--r-- www www /var/www/htdocs/test.txt
-r--r--r-- www www /var/www/htdocs/test.txt.gz

httpd -dvvv a écrit :server default, client 1 (1 active), 127.0.0.1:18732 -> 127.0.0.1, empty stdout (500 Internal Server Error)
default 127.0.0.1 - - [14/May/2020:22:45:23 +0200] "HEAD /test.txt HTTP/1.1" 500 0
server default, client 3 (1 active), 127.0.0.1:40315 -> 127.0.0.1, empty stdout (500 Internal Server Error)
slowcgi -d a écrit :slowcgi: env[0], PATH_INFO=/test.txt
slowcgi: env[1], SCRIPT_NAME=
slowcgi: env[2], SCRIPT_FILENAME=/cgi-bin/sbw.cgi
slowcgi: env[3], QUERY_STRING=
slowcgi: env[4], DOCUMENT_ROOT=/cgi-bin/sbw.cgi
slowcgi: env[5], DOCUMENT_URI=/test.txt
slowcgi: env[6], GATEWAY_INTERFACE=CGI/1.1
slowcgi: env[7], HTTP_ACCEPT=*/*
slowcgi: env[8], HTTP_HOST=127.0.0.1
slowcgi: env[9], HTTP_USER_AGENT=curl/7.69.1
slowcgi: env[10], realroot=/htdocs/
slowcgi: env[11], realroot=/htdocs/
slowcgi: env[12], REMOTE_ADDR=127.0.0.1
slowcgi: env[13], REMOTE_PORT=40315
slowcgi: env[14], REQUEST_METHOD=HEAD
slowcgi: env[15], REQUEST_URI=/test.txt
slowcgi: env[16], SERVER_ADDR=127.0.0.1
slowcgi: env[17], SERVER_PORT=80
slowcgi: env[18], SERVER_NAME=default
slowcgi: env[19], SERVER_PROTOCOL=HTTP/1.1
slowcgi: env[20], SERVER_SOFTWARE=OpenBSD httpd
slowcgi: version:        1
slowcgi: type:            4
slowcgi: requestId:      1
slowcgi: contentLength:  0
slowcgi: paddingLength:  0
slowcgi: reserved:        0
slowcgi: fork: /cgi-bin/sbw.cgi
slowcgi: version:        1
slowcgi: type:            5
slowcgi: requestId:      1
slowcgi: contentLength:  0
slowcgi: paddingLength:  0
slowcgi: reserved:        0
slowcgi: wait: /cgi-bin/sbw.cgi
slowcgi: resp version:        1
slowcgi: resp type:            6
slowcgi: resp requestId:      1
slowcgi: resp contentLength:  0
slowcgi: resp paddingLength:  0
slowcgi: resp reserved:        0
slowcgi: resp version:        1
slowcgi: resp type:            7
slowcgi: resp requestId:      1
slowcgi: resp contentLength:  0
slowcgi: resp paddingLength:  0
slowcgi: resp reserved:        0
slowcgi: resp version:        1
slowcgi: resp type:            3
slowcgi: resp requestId:      1
slowcgi: resp contentLength:  8
slowcgi: resp paddingLength:  0
slowcgi: resp reserved:        0
slowcgi: resp appStatus:      6
slowcgi: resp protocolStatus:  0

Je ne sais pas si c'est important mais
Code :
slowcgi: env[10], realroot=/htdocs/
slowcgi: env[11], realroot=/htdocs/
apparaît deux fois. Si je le supprime de httpd.conf, il apparaît 0 fois,
ce n'est donc pas la solution pour éviter le doublon.
Répondre
#19

Ahhh, merci @eol de te pencher sur le problème.
Et de voir que tu arrives à reproduire ce dysfonctionnement - et en passant à expliquer comment tu fais : merci beaucoup

pour realroot, en effet nous en avons besoin. :p
mais je trouve bizarre qu'il la déclare deux fois en tant que varibles d'environnements

Et, au fait, tu as regardé si tu avais un message (pertinent?) dans dmesg ou dans les logs

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre
#20

En lançant slowcgi sous ktrace, il y a :
Code :
(…)
49815 slowcgi  GIO  fd 2 wrote 22 bytes
      "wait: /cgi-bin/sbw.cgi"
49815 slowcgi  RET  write 22/0x16
49815 slowcgi  CALL  write(2,0x7f7fffff22b0,0x1)
49815 slowcgi  GIO  fd 2 wrote 1 bytes
      "
      "
49815 slowcgi  RET  write 1
49815 slowcgi  CALL  wait4(WAIT_ANY,0x7f7fffff2b3c,0x1<WNOHANG>,0)
49815 slowcgi  RET  wait4 -1 errno 10 No child processes
(…)
À part ça, rien qui m'interpelle.

Ajout : Non rien dans les logs et lancer ktrace avec juste "-t p", la trace est vide
donc a priori, doublement pas un souci avec pledge.
Répondre
#21

S'il y a un souci avec pledge ça apparaît dans la sortie de dmesg avec le nom du processus, le numéro de pid et le pledge violé.
Répondre
#22

Je n'arrive pas à reproduire le problème sur ma machine décidément.

Les retours que tu proposes eol sont constructifs : apparemment httpd récupère un flux (stdout) vide.
Les permissions sont bonnes, il suffit de toute façon n'avoir que "lecture".

Je cherche...
(pourquoi le double "env", ça, j n'y peux rien...)
Répondre
#23

Ne te focalise par sur le doublon ;-)
Comme je le montre sur mon post, c'est ainsi généralisé.

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre
#24

Ça me fait penser à ça : https://github.com/reyk/httpd/issues/31

J'ai testé sur une autre machine, j'ai le même problème que vous.
Je n'arrive pas à comprendre pourquoi ça veut bien sur une machine et pas une autre...
Répondre
#25

Okay, j'ai trouvé.
Récupérez la dernière archive puis recompilez. J'ai modifié d'ailleurs le README pour mieux gérer les permissions avec la commande install.

Pourquoi ça ne marchait pas ? le binaire voulait aller chercher les /usr/libexec/ld.so et /usr/lib/libc*.so . (je les avais dans mon chroot suite à l'installation de symon).
Désormais, c'est compilé avec l'option "-static" : vous n'avez rien à copier dans votre chroot.

Merci de l'avoir repéré!
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)