Показать сообщение отдельно
  #1 (permalink)  
Старый 28.02.2013, 13:01
Интересующийся
Отправить личное сообщение для Jopses Посмотреть профиль Найти все сообщения от Jopses
 
Регистрация: 05.02.2013
Сообщений: 20

AJAX, PERL, запись в файл и неожиданный ответ от сервера
Здравствуйте уважаемые!
Ситуация такова. Есть кнопка (выполняет функцию обновления файла конфигурации списка устройств).
Значит, жмём, вылетает окно (плагин jConfirm). Далее OK, функция reload_fls() запускается и AJAX`ом шлёт запрос (пустой. В FireBag только reloadconfig – адрес к выполняемому действию в серверном скрипте), серверный скрипт «включается», делает все свои действия (обращается к путям устройств, к БД, раскидывает нужные данные, переписывает файл).
И если всё хорошо или не хорошо, отправляет строку по форме JSON. Конец
Вот так должно быть, но, увы и ах, не работает!
А выдаёт следующее. После подтверждения OK (по кнопке), отправляет данные и сразу же в ответ получает ошибку «500».
Сразу развею сомнения по поводу сервера. С ним всё нормально, полный доступ и подобного не наблюдалось на всей разработке программы.
Ошибка в одном из этих двух действий или где-то между ними.
Если кто знает, помогите решить головоломку. Откладывал не одну неделю решение, вот так сказать и прижало сейчас.
Заранее благодарю всех, кто откликнется!


Сама функция JQuery

function reload_fls(){
    jConfirm('Вы действительно хотите <b><font color="red">ОБНОВИТЬ КОНФИГ FLUSSONIC?</b></font><br /> Часть потоков может прерваться!', 'Подтверждение', function(r) {
        if(r){
            var cam_url = cam_control+"/cgi-bin/admin.pl?m=reloadconfig";
            $.ajax({
                type: 'GET',
                dataType: 'json',
                cache: false,
                url: cam_url,
                success: function(data){
                    if(data.error != undefined ) {
                        if(undefined != err_lang[data.error]) {
                            alert('Ошибка: '+err_lang[data.error]);
                        }else{
                            alert('Возникла неизвестная ошибка, попробуйте позже. ('+data.error+')');
                        }
                    } else {
                        jAlert('Конфиг успешно обновлён.','Информация');
                    }
                },
                error:function (xhr, ajaxOptions, thrownError, request, error){
                    alert('Возникла неизвестная ошибка, попробуйте позже. \n [ \n'+'xrs.status = ' + xhr.status + '\n' + 'thrown error = ' + thrownError + '\n' + 'xhr.statusText = '  + xhr.statusText + '\n' +
                        'request = ' + request + '\n' + 'error = ' + error+' \n ]');
                }
            });
        }
    });
}


Действие из серверного скрипта

Код:
when ("reloadconfig")  {

    my $url  = $cfg->val( "Erly", "url");
    my $user = $cfg->val( "Erly", "user");
    my $pass = $cfg->val( "Erly", "pass");
    my $file = $cfg->val( "Erly", "file");
    my $host = $cfg->val( "Erly", "host");

    #open(SLOCK,  '<', $file.'.lock') or die $!; "{\"error\": \"Can't create LOCK.\"}";

    open(STREAMS,  '>', $file)     or die "{\"error\": \"$!\"}"; #"{\"error\": \"Can't open Streams conf.\"}";
    flock(STREAMS, LOCK_EX|LOCK_NB) or die "{\"error\": \"$!\"}"; #"{\"error\": \"Can't LOCK Streams conf.\"}";

    my $config_str = '';
    
    my $sth;
    $sth = $dbh->prepare(q{
        SELECT cam_id, cam_alias
        FROM cams_list
        WHERE cam_enabled = 1
        ORDER BY cam_priority ASC
    });
    $sth->execute;

    my (@row);

    while( @row = $sth->fetchrow_array() ) {
        my($id,$talias) = @row;
        if(($talias eq '') || ($talias eq undef)) { $talias = "cam$id"; }
        $config_str = $config_str . "{stream, \"$talias\", \"$host$talias\"}.\n";
    }

    print STREAMS $config_str;

    my $curl = WWW::Curl::Easy->new;

    #$curl->setopt(CURLOPT_HEADER,1);
    $curl->setopt(CURLOPT_URL, $url);
    $curl->setopt(CURLOPT_USERPWD, $user.':'.$pass);

    # A filehandle, reference to a scalar or reference to a typeglob can be used here.
    my $response_body;
    $curl->setopt(CURLOPT_WRITEDATA,\$response_body);

    # Starts the actual request
    my $retcode = $curl->perform;

    # Looking at the results...
    if ($retcode == 0) {
        #print("\nTransfer went ok\n");
        #my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE);
        # judge result and next action based on $response_code
        # print "\n".$response_body;
        if((trim($response_body) eq 'true') || (trim($response_body) eq 'ok')) {
            print "{\"result\": \"Ok\"}";
        } else {
            print "{\"error\": \"Can't reload FLUSSONIC config.\"}";
        }
    } else {
        # Error code, type of error, error message
        print "{\"error\": \"Can't reload FLUSSONIC config. Is it running?\"}";
    }

    flock(STREAMS, LOCK_UN) or die "{\"error\": \"Can't UNLOCK FLUSSONIC conf.\"}";
    }


INI файл для серверного скрипта

Код:
[General]


[Erly]
file=/vlc/streams.conf
host=tshttp://127.0.0.1:6008/
url=http://10.240.230.22:8085/erlyvideo/api/reload
user=admin
pass=pass0

[DB]
dbhost=109.126.0.94
dbport=...
dbuser=...
dbpass=...
dbname=cams
Ответить с цитированием