LINUX.ORG.RU

CGI-скрипт принимающий POST-запросы

 , ,


1

1

Ни разу не писал CGI-скрипты, обходился PHP, но тут понадобилось сделать совсем маленький скриптик, ради которого устанавливать php на роутер не охото. В общем нужно чтобы-бы скрипт принимал POST-запрос с всего одной переменной и кидал значение этой переменной в /dev/ttyACM0, где обитает Arduino. Все, больше ничего этот скрипт делать не должен. Я понимаю, что для знающих людей проблемы в этом нет, но у меня абсолютно нет идей по этому поводу. На роутере OpenWRT, там есть:ash, awk, lua. Заранее спасибо...

весь post кидается в stdin. далее нужно только раскодировать его. если только латиница, то просто заменить %20 на пробелы сером. ну и потереть varname=

derlafff ★★★★★
()
Ответ на: комментарий от derlafff

Накропал следующее:

#!/bin/bash
POST_DATA=$(</dev/stdin)
echo "${POST_DATA}"
Выдает

The CGI process did not produce any response

Запрос отправляю такой формой:

<form method="POST" action="/cgi-bin/serial.cgi">
<input type="text" name="var" value="foo" />
<input type="submit" value="send" />
</form>

strangerx
() автор топика

Посмотри в моем профиле ссылки на велосипеды на гуглокоде и сосфорже. Можешь поковыряться в рабочих веб-мордах с CGI. А еще там есть недописанная (но работающая) CGI-библиотека.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от strangerx

Пример на sh:

#!/bin/sh

if test $REQUEST_METHOD = 'POST'; then
    QUERY_STRING=`cat -`
fi

if test 'POST' = $REQUEST_METHOD; then
        SET_MODE=`echo $QUERY_STRING | sed -n 's/^.*curmode=\([^&]*\).*$/\1/p'`
        IP=`echo $QUERY_STRING | sed -n 's/^.*ip=\([^&]*\).*$/\1/p'`
        MASK=`echo $QUERY_STRING | sed -n 's/^.*mask=\([^&]*\).*$/\1/p'`
        GATE=`echo $QUERY_STRING | sed -n 's/^.*gate=\([^&]*\).*$/\1/p'`
        #MASK1=`ipcalc -ms 192.168.10.253/$MASK | sed -n 's/^NETMASK=//p'`
Пример на C:
if (0 == strcmp(getenv("REQUEST_METHOD"), "POST")) {
    char *query, ip[INET_ADDRSTRLEN], mask[INET_ADDRSTRLEN],
        gate[INET_ADDRSTRLEN];
    int r, qlen;
    struct in_addr  set_ip, set_mask, set_gate;

    if (!(qlen = atoi(getenv("CONTENT_LENGTH"))))
        JSON_ERROR("Can't get query length!");

    if (qlen > MAX_QUERY)
        JSON_ERROR("Query to long");

    query = calloc(++qlen, sizeof(char));
    fgets(query, qlen, stdin);
    if (NULL == query) {
        free(query);
        JSON_ERROR("Can't get query string!");
    }

    r = sscanf(query, "ip=%[0-9.]&netmask=%[0-9.]&gateway=%[0-9.]",
                    ip, mask, gate);
    if (r != 3) {
        free(query);
        JSON_ERROR("Can't get all parameters!");
    }
    free(query);

imb ★★
()
Ответ на: комментарий от Kalashnikov

Вот это то что доктор прописал! Разве что httpd заменен на uhttpd, но сути дела не меняет. Всем спасибо большое за помощь...

strangerx
() автор топика
Ответ на: комментарий от strangerx

тебе нужно ещё хедеры в ответ генерить. Хотя бы echo -e «echo Content-type: text/html», а после хедеров пустую строку. и далее echo «OK!» :)

true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.