В этом разделе перечислены свойства и методы объекта server

Свойства (property)

Пример использования:

//свойство параметра чтение/запись:
// Чтение
var prop = server.property;
// Запись
var prop = 'testString';
server.property = prop;

String server.objectName Только чтение
Возвращает имя объекта сервера (всегда "server")

var srvName = server.objectName; // srvName == "server";

int server.delayAnsMs Чтение/запись
задержка ответа с целью экономии ресурсов сервера (по умолчанию 20 ms)

var old_delay = server.delayAnsMs; // old_delay == 20;
server.delayAnsMs = 50; // Установить задержку 50 ms;

int server.http_port Только чтение
Порт сервера (Настраивается в главном конфигурационном файле. По умолчанию 8080)

var port_http = server.http_port; // port_http == 8080;

int server.https_port Только чтение
Порт сервера (Настраивается в главном конфигурационном файле. По умолчанию 8080)

var port_https = server.https_port; // port_https == 8080;

bool server.https Только чтение
Поддержка текуших настроек шифрованного соединения
(Настраивается в главном конфигурационном файле. По умолчанию false)

var enable_https = server.https;

String server.cfgFile Только чтение
Возвращает путь до главного конфигурационного файла

var pathToCfgFile = server.cfgFile;

String server.favicon Чтение/запись
Заменить эмблему сервера (по умолчанию отдается stat@favicon.png)

server.favicon = 'stuff@path/to/favicon.png';

int server.maxSizeBodyPOST Чтение/запись
Размер маусимального размера принимаемых данных в POST запросе (по умолчанию 4194304 байт (4Мб))

var maxBodySize = server.maxSizeBodyPOST; // maxBodySize == 4194304;
server.maxSizeBodyPOST = 8*1024*1024; // Установить максимальный размер принимаемых данных 8 Мб;

int server.statFileCacheSec Чтение/запись
кеш контроль времени жизни файла из папки stat (по умолчанию 0 сек)


int server.liveTimeNotUseCookieSec Чтение/запись
Время жизни куки (TTL)(по умолчанию 600 сек)


bool server.compressor Чтение/запись
Разрешить сжатие динамического содержимого (по умолчанию true)


bool server.ignoreSelfSignSsl Чтение/запись
Игнорирование самоподписанных сертификатов (по умолчанию true)


String server.auth Только чтение
Строка авторизации закодировання в base64, которую прислал браузер (если не присылал, то "")
см функции fromBase64 и toBase64


bool server.authOS Только чтение
Флаг: включена вторизация os или jcjs
см. функционал makeRegistration и authSystem


String server.sysType Только чтение
Тип операционной системы. Выводит строку 'windows' или 'unix'

var paths = [];
var path = server.envGet('PATH');

if(server.sysType == 'unix')  paths = path.split(':');
else                          paths = path.split(';');

// Перебор всех каталогов
for(var i=0; i < paths.length; ++i)
{
    ...
}

String server.sysArch Только чтение
Архитектура текущего исполняемого процесса jCjS. Возможные варианты


String server.sysArchBuild Только чтение
Архитектура текущего исполняемого процесса jCjS. Возможные варианты


int server.logTrsh Чтение/запись
Установить уровень логирования
Это свойство удобно использовать для отладки скриптов

var oldLevel = server.logTrsh
server.logTrsh = 5
post.deleteObject(o1, o2, o3)
server.logTrsh = oldLevel

Или тестирование переменной с последующим завершением jCjS

console.log(post)

server.logTrsh=0
post.evalScript("qAppQuit.js");

String server.etimer_ms миллисекунды Чтение/запись
String server.etimer_us микросекунды Чтение/запись
String server.etimer_ns наносекунды Чтение/запись
Таймер, для тестирования времени выполнения (полезно для отладки)
При записи любого числа (а также при чтении) таймер перегружается

server.etimer_ms = 0; // Сбросить тамер
var objDir = server.info('ls data@repository' + http.path, scriptEngine);
var nsec = server.etimer_ns; // Засечь время выполнения функции server.info()
//var usec = server.etimer_us;
//var msec = server.etimer_ms;

post.log('i', 'Функция выполнялась ' + nsec + ' наносекунд')

bool server.makeRegistration Чтение/запись
Флаг, используемый для уведомления всех постов, что используется глобальная авторизация
Описание работы с пользователями см здесь.

ВНИМАНИЕ!!! Если используется тип авторизации "Авторизация ОС", то это флаг всегда принимает значение true и изменить его из контекста скрипта нельзя.

Прежде чем использовать глобальную авторизацию, необходимо
подготовить посты к использованию этого функционала.
Вам нужно следовать следующим рекомендациям.

//------------------------------------------------------------
// Авторизация действий на странице поста
var r_user='Admin'
var r_pass='system'
//------------------------------------------------------------
// Разрешить глобальную регистрацию
server.makeRegistration = true;

if(server.makeRegistration) // Использовать глобальную авторизцию
    post.evalScript('registration.js');
else                        // Использовать http авторизцию
    post.r_auth = (server.auth != '')
            ? server.auth
            : server.toBase64(r_user+':'+r_pass);

// Выполнить системный скрипт
post.evalScript('jcjsHelper.js');
......
//------------------------------------------------------------
//------------------------------------------------------------
function ans()
{
    if(server.makeRegistration)
    {
        // Если в каком-то посте установлен флаг,
        // то при первом вызове будет выполнен registration.js
        if((typeof makeRegistration !== 'function'))
           post.evalScript('registration.js');

        // а теперь проверка (функция из registration.js)
        if(!makeRegistration())
            return;
    }

    // Проверка аргументов запроса
    if(http.argCnt)
    {
        // Вот пример авторизации действий
        if(http.argKeyByNum(0) == 'resetSystem')
        {
            // Проверка прав
            if(!testAuth()) // функция из jcjsHelper.js
            {
                post.log('e', http.peerAddress + ': команда перегрузки сервера отменена');
                http.respRedirect('/');
                return;
            }

            post.log('w', http.peerAddress + ': принята команда перегрузки сервера');

            http.respRedirect('/'+post.objectName+'/'); // редирект в каталог поста

            server.reset(); // перегрузить

            http.dropAlive(); // порвать соединение

            return;
        }

        switch(http.argKeyByNum(0))
        {
        case 'server':  http.respPlainText(JSON.stringify(server,   0, 2)); return;
        case 'post':    http.respPlainText(JSON.stringify(post,     0, 2)); return;
        case 'http':    http.respPlainText(JSON.stringify(http,     0, 2)); return;
        case 'this':    http.respPlainText(JSON.stringify(this,     0, 2)); return;
        }
    }

    // Отдать ресурсы из каталога поста (функция из jcjsHelper.js)
    if(jcjs_resp())
        return;

    var mess = ': не найден';
    http.respError(404, http.path + mess);
    post.log('w', http.path + mess);
    delete mess;
}
//------------------------------------------------------------
// Магия:  Если в командной функции будет ошибка,
//         браузер будет уведомлен о ней,
//         иначе он никогда не получит ответ.
try{
    ans();
}
catch(e)
{
    http.respError(500, http.path);
    post.log('e', e.fileName + ':' + e.lineNumber + ' '' + e.message + ''');
}
//------------------------------------------------------------

Дополнительную информацию можно посмотреть здесь


Работа с пользователями:
Прежде чем использовать функционал авторизации, необходимо подготовить посты.
В первом (главном посте) добавить пользователей
Вариант 1 (удобный): Добавить список пользователей в регистрационный скрипт /jCjS2/stuff/include/registration.js
// Дать знать другим постам, что используется глобальная регистрация
// Разрешить глобальную регистрацию
server.makeRegistration = true;

// Внимание!!!  Дефолтный администратор.
//              Замените перед использованием
var r_user     = "Admin"
var r_password = "system"

// Добавить данные пользователей
if(!server.authOS)
{
    if(typeof post.users !== "object")
        post.users = {}

    post.users[r_user] = [2, r_password];   // 2 - Admin

    // добавить простых "смертных"
    post.users['User']  = [1, 'userPass'];  // 1 - User
    post.users['Guest'] = [0, 'guestPass']; // 0 - Гость

    // Перевести всех пользователей в нижний регистр
    for(var key in post.users)
    {
        var user = post.users[key];
        delete post.users[key];
        key = String(key).toLowerCase();
        post.users[key] = user;
    }
}
key = user = r_user = r_password = undefined;

....


Вариант 2 (рекомендуемый):
В конфигурационном файле jcjs.xml прописать пользователей в секцию главного(первого) поста

    <post
        objectName  = "postsTable"
        description = "Список постов"
        portDebug   = "0"
        debug       = "false"
        defDirs     = "stuff@postsTable"
        >
        <handlers
            cmd  = "cmd.js"
            init = "init.js"
            end  = "end.js"
        />
        <users script = "{
          admin:    [2, 'system']   ,
          User:     [1, 'userPass'] ,
          Guest:    [0, 'guestPass']
        }"
        />
    </post>

String server.timeout_end миллисекунды Чтение/запись
Время ожидания завершения постов (по умолчанию 10000 ms. Диапазон значений от 1 до 100 секунд).

...  команды на деинициализацию оборудования
...  с последующим выполнением команды post.finished();

// Ограничить время ожидания завершения поста 5 секунд
server.timeout_end = 5000

String server.maxPendingConnections Количество соединений Чтение/запись
Устанавливает максимальное количество ожидающих принятых соединений для HTTP сервера (25 по умолчанию)


bool server.gui Чтение
тест на тип запущенного приложения
Gui = true
Service = false



Сигналы

void initialized() Сигнал

генерируется объектом server после того, как все посты инициализированы


function srv_inited(){
    // эта функция выполнится после того, как
    // будет инициализирован последний пост
    ...
    ...
}

// подсоединить функцию srv_inited к сигналу server.initialized
server.initialized.connect(srv_inited);

void stop() Сигнал

генерируется объектом server при завершении работы приложения

// подсоединить функцию srv_halt к сигналу server.stop
server.stop.connect(server, function srv_halt(){
    this.logTrsh = 0; // отключить логирование при останове приложения
});

void sig_status(int) Сигнал

генерируется объектом server при смене его статуса
значение int см. server.status()

// подсоединить функцию func_status к сигналу server.sig_status
server.sig_status.connect(function func_status(val){
    post.log('i', 'Сменился статус сервера: ' + val);
});

void serialQueue_idle(String serPortName) Сигнал
генерируется объектом server если в очереди заданий на последовательном интерфейсе нет активности (отсутствует обмен), и она помечена к удалению
Описание заданий см. SerialTaskWrap

server.serialQueue_idle.connect(function serialQueue_is_idle(comPort){
    post.log('w', comPort + ': в очереди нет активности, помечена к удалению');
});


Слоты

void server.wakeScreen() Слот
Разбудить монитор (работает только в Windows)

var timer = new Timer();

timer.start(3000); // Запустить таймер

// приконнектить к событию таймера timeout слот wakeScreen
timer.timeout.connect(server.wakeScreen);

void server.deleteLater() Слот
Выгрузить сервер jCjS
Этот слот удобно использовать для отладки скриптов

var ar = []
ar.push('idk_get_last_ban_info()')
ar.push('idk_get_worker(2048)')
ar.push('idk_get_worker(2048, \'dfdfdf\')')
ar.push('idk_get_worker(2048, "dfdfdf")')
ar.push('idk_get_worker(2048, \'dfdfdf\');fgd()')
ar.push('idk_get_worker(2048, \'dfdfdf\')\nfgd()')
ar.push('idk_get_worker(2048);')
ar.push('ddd.idk_get_worker(2048)')

try{
    var re = new RegExp('^[a-z_]+\\([\\s\\d,' + "'" + '"' + 'A-Za-z]*\\)$')
}catch(e)
{
    post.log('############################################')
    post.log("e", e.fileName + ':' + e.lineNumber + ' "' + e.message + '"');
}

post.log('############################################')
for(var i=0; i < ar.length; ++i)
{
    ar[i] = String(ar[i]).fulltrim()
    post.log(re.test(ar[i]) + '\t' + ar[i])
}
post.log('############################################')

server.logTrsh = 0;     // Отключить вывод информационных сообщений
                        //  чтобы последним выводом в консоль остались отладочные сообщения
//server.deleteLater(); // Выгрузить jCjS
post.evalScript("qAppQuit.js");

Вывод в консоль будет примерно таким

jCjSService -e
----------------------------------------------------------------------------------------------------------------------------
jCjSService.exe | Версия ПО: jCjS v.2.5.1.374 (сборка от 19.02.2015 18:49:13) | Revision SVN 374 | Powered by Qt486-msvc2010
----------------------------------------------------------------------------------------------------------------------------
.....
.....
.....
19:38:51.304 +0 init.js:19 global() pst1: ############################################
19:38:51.305 +0 init.js:23 global() pst1: true    idk_get_last_ban_info()
19:38:51.306 +0 init.js:23 global() pst1: true    idk_get_worker(2048)
19:38:51.307 +0 init.js:23 global() pst1: true    idk_get_worker(2048, 'dfdfdf')
19:38:51.307 +0 init.js:23 global() pst1: true    idk_get_worker(2048, "dfdfdf")
19:38:51.308 +0 init.js:23 global() pst1: false   idk_get_worker(2048, 'dfdfdf');fgd()
19:38:51.308 +0 init.js:23 global() pst1: false   idk_get_worker(2048, 'dfdfdf') fgd()
19:38:51.309 +0 init.js:23 global() pst1: false   idk_get_worker(2048);
19:38:51.309 +0 init.js:23 global() pst1: false   ddd.idk_get_worker(2048)
19:38:51.310 +0 init.js:25 global() pst1: ############################################
jCjSService.exe завершился с кодом 0


Методы

Пример использования:

// Функция (возвращает некое значение)
var arg1 = 12;
var arg2 = 'text' + '/' + 'xml';
var prop = server.function(arg1, arg2, .....);

// Процедура (без возвращаемого значения)
server.proc(arg1, arg2, .....);

String server.attribute(atr1 [,atr2 ,atr3 ,atr4 ,atr5]) Функция
выдать строковое значение атрибута относительно узла "server"

//выдать значение атрибута относительно узла server
String attribute(String a0,
                 String a1 = "",
                 String a2 = "",
                 String a3 = "",
                 String a4 = "");

String server.generateCookie() Функция
Сгенерировать случайное имя(key) куки
Внимание!!! Для удобного использования написан скрипт stuff/include/cookies.js
рекомендуется использовать его. Пример использования в stuff/include/registration.js

var newCookie = server.generateCookie();

void server.deleteCookie(String key) Процедура
Удалить сохраненное значение куки по имени

server.deleteCookie('cookieName');

void server.setCookie(String key, QVariant data) Процедура
Установить значение куки

var key = 'cookieName';
var val = [1, 2, 3, 's1', 's2', 's3'];
server.setCookie(key, val);

Variant server.getCookie(String key) Функция
Взять значение куки по имени

var cookieNameVal = server.getCookie('cookieName');
var i1 = cookieNameVal[0]; // 1
var i2 = cookieNameVal[1]; // 2
var i3 = cookieNameVal[2]; // 3
var s4 = cookieNameVal[3]; // 's1'
var s5 = cookieNameVal[4]; // 's2'
var s6 = cookieNameVal[5]; // 's3'

Variant server.getCookieObj(String key) Функция
Взять структуру куки по имени

var cookieObj = server.getCookieObj('cookieName');
if(cookieObj) {
    var cookieNameVal = cookieObj.scriptData;
    var i1 = cookieNameVal[0]; // 1
    var i2 = cookieNameVal[1]; // 2
    var i3 = cookieNameVal[2]; // 3
    var s4 = cookieNameVal[3]; // 's1'
    var s5 = cookieNameVal[4]; // 's2'
    var s6 = cookieNameVal[5]; // 's3'
}

(Date or false) server.getCookieCreateTime(String key) Функция
Взять время регистрации куки на сервере

var cookieCreTime = server.getCookieCreateTime('cookieName');
if(!cookieCreTime) {
    //.... не найден key 'cookieName'
} else {
    console.log('время регистрации куки', cookieCreTime)
}

bool server.reNameCookie(String oldName, String newName) Функция
Переименовать куки

var ok = server.reNameCookie(http.cookie, server.generateCookie());
if(ok) {
    //.... найден http.cookie и переименован
} else {
    console.log('не найден', http.cookie)
}

String server.fromBase64(String) Функция
String server.toBase64(String) Функция
Вспомогательные методы кодирования Base64

// Авторизация действий на странице поста
var r_user="Admin"
var r_pass="system"

// Если в jcjs.xml настроенна HTTP-Авторизация, использовать ее
post.r_auth = server.auth != ""
        ? server.auth
        : server.toBase64(r_user+':'+r_pass);

var decodeStr = server.fromBase64(post.r_auth); //  'Admin:system'

String server.parseSpecialFileName(String sname) Функция
Возвращает полный путь к файлу по его синониму

var fullPath = server.parseSpecialFileName('stat@index.html');

bool server.specialFileNameExist(String sname) Функция
Проверить наличие файла по его синониму

var test = server.specialFileNameExist('stat@index.html');
if(test) {
    http.respFile('stat@index.html')
}

bool server.specialFileNameIsDir(String sname) Функция
Проверить является синоним директорией

var test = server.specialFileNameIsDir('stat@docs');
if(test) {
    http.respFile('stat@docs/index.html')
}

bool server.specialFileNameIsFile(String sname) Функция
Проверить является синоним файлом

var test = server.specialFileNameIsFile('stat@docs/index.html');
if(test) {
    http.respFile('stat@docs/index.html')
}

String server.specialFileNameSuffix(String sname) Функция
Взять расширение файла

var suff = server.specialFileNameSuffix('stat@docs/index.html'); // suff = 'html'

String server.readSpecialFileName(String sname) Функция
Прочитать файл в переменную, если указать директорию, то будет произведен поиск дефолтного файла

var fileContent = server.readSpecialFileName('stat@docs/index.html');

String server.findSpecialFileName(String fname) Функция
Поиск файла в директориях (см. секцию server->folders->inc в главном конфигурационном файле)

var helperFile = server.findSpecialFileName('jcjsHelper.js');

String server.findDefIndex(String dir) Функция
Поиск дефолтного файла файла в директории (см. секцию server->defFiles в главном конфигурационном файле)

var helpIndfile = server.findDefIndex('stat@docs');

String server.includeSpecialFile(String sname) Функция
Включение спецфайла. Для обработки шаблона необходимо воспользоваться функцией post.procTmplFile



bool server.postExist(String postName) Функция
Проверить наличие поста по имени


bool server.pluginExist(String pluginName) Функция
Проверить наличие плагина

var test = server.pluginExist('PluginCamera');

post.log( (test ? 'i' : 'e'), 'Плагин ' + (test ? 'найден' : 'не найден') )

bool server.isLoadedPlugin(name) Функция
Проверка, что плагин используется сервером (одним из постом)


array server.loadedPlugins() Функция
Список загруженных плагинов


String server.info(String ask) Функция
String server.info(String ask, scriptEngine) Функция
Запросить информацию у сервера.
Аргументы:

ask Описание возвращаемого значения
'args' Выдать аргументы переданные при запуске сервера
'ask' Выдать все поддерживаемые запросы
'bin' Выдать имя исполнительного файла
'connections', scriptEngineВыдать ip-адреса всех клиентов в виде объекта
'connections' Выдать ip-адреса всех клиентов
'cookies', scriptEngineВыдать все зарегистрированные куки в виде объекта
'cookies' Выдать все зарегистрированные куки
'vars', scriptEngine Выдать все зарегистрированные переменные в виде объекта
'vars' Выдать все зарегистрированные переменные
'cpu_count' Количество ядер процессора
'date' Текущая дата
'datetime' Текущие дата и время
'debug' Если приложение скомпилировано с отладочными символами, возвратит true
'dom' Выдать главный конфигурационный файл
'jcjs_build_time' Время компиляции проекта
'jcjs_runTime' Дата и время запуска программы
'jcjs_svn' Ревизия SVN
'jcjs_svn_date' Время фиксации SVN
'jcjs_toolchane' Подробная информация о компиляторе
'jcjs_upTime' Сколько времени работает
'jcjs_ver' Версия
'jcjs_verFull' Подробная информация о версии
'jcjs_verShort' Версия сокращенно
'jcjs_version' Подробная информация о jCjS и информация о компиляторе
'qt_ver' Версия Qt (4.8.7, 5.12.4, 5.13.0)
'qt_verInt' Версии Qt (0x040807, 0x050c04 0x050d00)<
'qt_verShort' Версия Qt сокращенно (487, 5124, 5130)
'qt_builder' Тип компилятора (msvc2017, mingw482, gcc511)
'open_tcp' Список TCP портов, открытых в jCjS на прослушивание (Listing)
'open_udp' Список UDP портов, открытых в jCjS на прослушивание (Bind)
'plugins' Выдать список используемых плагинов
'posts', scriptEngine Выдать список постов в виде объекта
'posts' Выдать список постов
'posts_count' Колличество постов
'serials', scriptEngineВыдать имена задействанных последовательных портов в виде объекта
'serials' Выдать имена задействанных последовательных портов
'serials_info' Выдать описание только задействованых программой портов
'serials_info_ext' Выдать описание не задействованых программой портов портов в сиcтеме (долгое выполнение при кол-ве портов > 8)
'serials_info_all' Выдать описание всех портов в сиcтеме (долгое выполнение при кол-ве портов > 8)
'baudRates' Запрос списка всех поддерживаемых скоростных режимов послед.портов
'system_info' Информация об операционной системе
'ifaces' Запрос локальных сетевых интерфейсов
'time' Текущее время
'web' Запрос режима встроенной поддержки Web
'webkit' - Есть встроенная поддержка QWebKit
'webengine' - Есть встроенная поддержка QWebEngine
false - отсутствует поддержка
'funcUpdateLog #' Выдать все записи из накопительной емкости лога с id > #
(см. секцию server->logMaxLenQueue в главном конфигурационном файле)
'ls|sname' Выдать список файлов из каталога (разделителем может выступать пробельный символ или |)
'ls sname', scriptEngineТоже, только в виде объекта
'ls sname|*.js' Выдать список файлов *.js из каталога
'ls sname|*.htm|*.html' Выдать список файлов *.htm *.html из каталога (разделителем может выступать пробельный символ или |)
'profiler postName #sort #full'Выдать результат профилирования поста
Аргумент #sort может принимать значения 1, 2 или 3
он влияет на столбец сортировки (Calls, Average time, Total time)
Аргумент #full может принимать значения 0 или 1
Windows only
'serviceName' запросить имя службы, если процесс работает в качестве службы
'pfull' запросить pid и path родительского процесса
'ppid' запросить pid родительского процесса
'ppath' запросить path родительского процесса
var inDirFiles = server.info('ls stat@docs');
var allClients = server.info('connections');

post.log(  JSON.stringify(server.info('serials_info'), 0, 2)  );

post.log(  JSON.stringify(server.info('system_info'), 0, 2)  );

post.log(  jsext.stringify(server.info('serials_info_all', scriptEngine))  );

Все запросы доступны через межпроцессовое взаимодействие.


cd /D c:\jCjS2\bin

# где 8080 это именованый канал (в рамках текушего пользователя)
#              открытый приложением для взаимодействия

# запрос info() у сервера
jCjSService.exe  -e -cmd 8080:ask

# запрос info() у поста postsTable
jCjSService.exe  -e -cmd 8080:postsTable:ask

# в дополнению к info()
# в межпроцессовом взаимодействии доступны дополнительные команды

# остановка приложения
jCjSService.exe  -e -cmd 8080:halt

# перегрузка приложения
jCjSService.exe  -e -cmd 8080:restart

# в Windows идентификаторы именованных каналов
# сохранены в пользовательской ветке реестра

reg Query "HKCU\Software\jCjS2\pipes"

# если не указывать имя именованого канала, то запрос будет
# адресован текущему процессу с последующим завершением

jCjSService.exe  -e -cmd ask

jCjSService.exe  -e -cmd ifaces

jCjSService.exe  -e -cmd system_info

Пример остановки всех приложений в Windows
@echo off && cls
setlocal EnableDelayedExpansion
IF ERRORLEVEL 1 (echo = line 3: Can not enable advanced processing = && pause && exit /b )

goto :start
######################################################
### ПРИМЕР ОСТАНОВА ВСЕХ JCJS ПРИЛОЖЕНИЙ В WINDOWS ###
######################################################
:start
set PATH=c:\jCjS2\bin;c:\jCjS2\utils;%PATH%

set cmd=restart
set cmd=halt

:: проверить наличие файлов
where jCjSService 2>nul >nul || ( echo  ERROR: exe  no found && pause && exit /b )
where grep        2>nul >nul || ( echo  ERROR: grep no found && pause && exit /b )

set regt=HKCU\Software\jCjS2\pipes
set tmpf="%TEMP%\regVals.txt"

set trimSpace=awk "{$1=$1;print}"
set delEmpty=grep -v "^$"
set FirstField=cut -d" " -f1

:: запросить из реестра значения каналов
reg Query "%regt%" 2>nul | grep -v HKEY | %delEmpty% | %trimSpace% |%FirstField% > %tmpf%
if NOT exist %tmpf%           ( echo  ERROR: tmpf no found && pause && exit /b )

:: отправить команду на остановку
for /F "usebackq tokens=*" %%A in (%tmpf%) do (
 set pipe=%%A

 set errorlevel=
 jCjSService  -e -cmd !pipe!:%cmd% >nul 2>nul
 set /a err=!errorlevel!

 if     !err! EQU 0  echo  jCjSService -e -cmd !pipe!:%cmd% OK
 if NOT !err! EQU 0  echo  jCjSService -e -cmd !pipe!:%cmd% ER

 :: удалить из реестра информацию о именованом канале (при успешном завершении удаляется автоматически)
 if NOT !err! EQU 0  reg Delete "%regt%" /f /v !pipe!   >nul 2>nul

)


del /Q /F %tmpf% >nul 2>nul

:finish

pause && exit /b

String server.upTime_format(int timeSec, bool shortFormat=false) Функция
Функция принимает колличество секунд и выводит в формате '146 сут. 12:43:17' (если shortFormat=true, то количество сыток преабразует в часы 3516:43:17)

var strUpTime = server.upTime_format(new Date().valueOf()/1000 );
post.log('i', 'с полуночи 1 января 1970 года прошло: ' + strUpTime)

String server.status() Функция
int server.statusInt() Функция
Статус сервера

sig_status возвращаемое значение
int String
0 Остановлен
1 Инициализируется
2 Инициализирован, работает
3 Начало останова
4 Остановлен
5 Начал перегрузку
6 В процессе перегрузки
7 Начал перегрузку
8 В процессе перегрузки
9 Начал перегрузку
10 В процессе перегрузки
11 Начало останова
12 В процессе останова
xx Неизвестное состояние
post.log('i', 'Статус сервера: ' + server.status() +' ('+  server.statusInt() + ')');

String server.status(postName) Функция
Статус поста
возвращаемое значение см. server.status()

post.log('i', 'Статус поста: ' + server.status('postsTable'));

String server.envGet( envName ) Функция
Взять значение переменной окружения

var php_suff = '';
var php_cgi_bin = '';

var paths = [];
var path = server.envGet('PATH');
if(server.sysType == 'unix')
{
                                paths = path.split(':');
} else {
                                paths = path.split(';');
                                php_suff = '.exe';
}

// Перебор всех каталогов
for(var i=0; i < paths.length; ++i)
{
    var file = paths[i] + '/php-cgi' + php_suff;
    if(server.existFile(file))
    {
        php_cgi_bin = server.getAbsPath(file);
        break;
    }
}

if(php_cgi_bin == '')
{
    post.log('e', 'Не найден php-cgi')
}
else
{
    post.log('i', 'Найден php-cgi: ' + php_cgi_bin)
}

String server.envSet( envName, Value ) Функция
Установить значение переменной окружения (только для процесса)


var path = server.envGet('PATH')

if(server.sysType == 'unix')
    server.envSet('PATH', path + ':' + server.getEnv('HOME') + '/sbin')
else
    server.envSet('PATH', path + ';' + server.getEnv('HOMEPATH') + '/AppData/Local')


String server.envSet( envName, Value ) Функция
Установить значение переменной окружения (только для процесса)


var path = server.envGet('PATH')
post.log(path)

if(server.sysType == 'unix')
    server.envSet('PATH', server.getEnv('HOME')     + '/sbin'          + ':' + path)
else
    server.envSet('PATH', server.getEnv('HOMEPATH') + '/AppData/Local' + ':' + path)

post.log(server.envGet('PATH'))

String server.envAppend( envName, Value ) Функция
Добавить к переменной окружения некое значение (только для процесса)


var path = server.envGet('PATH')
post.log(path)

// Результат следующего кода будет аналогичным как и в листинге выше
if(server.sysType == 'unix')
    server.envAppend('PATH', server.getEnv('HOME')     + '/sbin')
else
    server.envAppend('PATH', server.getEnv('HOMEPATH') + '/AppData/Local')

post.log(server.envGet('PATH'))

String server.getAbsPath( fname ) Функция
Вернуть абсолютный путь к файлу
(если в аргументе относительный путь, то поиск происходит от бинарного файлы)

var file_suff = (server.sysType == 'unix') ? '' : '.exe';

var fullPathName2Programm = server.getAbsPath( '../bin/jCjSGui' + file_suff)

// в среде Windows получим 'c:/Program Files (x86)/jCjS/bin/jCjSGui.exe'
// в среде  Unix   получим '/home/jCjS/bin/jCjSGui'

String server.getAbsDir( fname ) Функция
Вернуть абсолютный путь к директории, в которой лежит файл с именем fname
(если в аргументе относительный путь, то поиск происходит от бинарного файлы)

var file_suff = (server.sysType == 'unix') ? '' : '.exe';

var fullPathName2Programm = server.getAbsPath( '../bin/jCjSGui' + file_suff)

// в среде Windows получим 'c:/Program Files (x86)/jCjS/bin'
// в среде  Unix   получим '/home/jCjS/bin'

String server.existFile( fname ) Функция
Проверить наличие файла
(если в аргументе относительный путь, то поиск происходит от бинарного файлы)

var file_suff = (server.sysType == 'unix') ? '' : '.exe';

var fullPathName2Programm = server.getAbsPath( '../bin/jCjSGui' + file_suff)

// в среде Windows получим 'c:/Program Files (x86)/jCjS/bin/jCjSGui.exe'
// в среде  Unix   получим '/home/jCjS/bin/jCjSGui'

void server.reset() Процедура
Перегрузить сервер и все посты

server.reset();

void server.resetPost( postName ) Процедура
Перегрузить пост

server.resetPost(post.objectName);

String server.postName( num ) Функция
Взять имя поста по номеру (в порядке объявления в jcjs.xml)

var postName = server.postName( 0 )
server.resetPost(postName);   // Перегрузить первый пост

bool server.containsChild( name ) Функция
Проверка на наличие объекта с именем name у сервера

var postName = server.postName( 0 )
if(server.containsChild( postName ))
{
    // Объект с именем postName однозначно существует
}

String server.genName( pref ) Функция
Сгенерировать уникальное имя

var name = 'test'
var newName = server.genName( name ); // Сдесь будет сгенерировано уникальное имя test_XXXXXX

Object server.mime(String fileName)
Функция выводит информацию о файле
Если у файла нет расширения и указан абсолютный путь к файлу,
то будет произведен анализ внутреннего содержания

var fname = server.parseSpecialFileName('stat@img/home.png');
var mime = server.mime(fname);
console.log(mime);
/* Выведет в лог
QVariantMap: {
  "comment": "изображение PNG",
  "name": "image/png",
  "suffix: QVariantList": {
    "0": "png"
  }
}
*/

bool server.mime_isText(String fileName)
Без коментариев


void server.clearElevator() Процедура
Очистить элеватор заданий на последовательных портах от очередей

server.clearElevator();

bool server.exists(fname) Функция
Проверить наличие файла или директории


bool server.isFile(fname) Функция
Проверить наличие файла


bool server.isDir(fname) Функция
Проверить наличие директории


bool server.remFile(file1, [file2, ...]) Функция
bool server.remove(file1, [file2, ...]) Функция
Удалить файлы


bool server.rename(realFileName, newFileName) Функция
Переименовать файл


bool server.copyFile(realFileName, newFileName) Функция
Копирование файла


bool server.mkdir(dir1, [dir2, ...]) Функция
Создать директорию


bool server.rmdir(dir1, [dir2, ...]) Функция
Удалить директорию если в ней нет файлов


bool server.mkpath(path1, [path2, ...]) Функция
Создать директорию и все отсутствующие директории


bool server.rmpath(path1, [path2, ...]) Функция
Создать директорию и все директории которые в ней находятся


String server.separator() Функция
Разделитель директорий. В unix вернет / В Windows вернет \


String server.currentPath() Функция
Текущий каталог приложения


String server.homePath() Функция
Домашний каталог пользователя


String server.rootPath() Функция
Вернет корень файловой системы. В unix вернет / В Windows вернет C:/


String server.tempPath() Функция
Вернет временный каталог


String server.genTempFileName(String ext) Функция
Сгенерирует уникальное имя файла во временном каталоге


bool server.openUrl(String pathOrUrl, delay = 0) Функция
Открыть url, файл или каталог средствами ОС, delay - необходимая задержка перед открытием в ms

// открыть URL в браузере
var url = 'http://lesav.ru/jcjs/';
server.openUrl(url, 1000);   // открыть через 1 сек

// открыть изображение дефолтным просмоторщиком
var fname = server.parseSpecialFileName('stat@img/home.png');
server.openUrl(fname);

// открыть последний лог в текстовом редакторе
var fname = server.parseSpecialFileName('logs@') + server.info('date')+'.txt';
server.openUrl(fname);

// открыть директорию в файловом менеджере ОС (для Windows в проводнике)
var fname = server.parseSpecialFileName('logs@');
server.openUrl(fname);

Object server.storageLocations() Функция
Возвращает информацию о дефолтных путях пользователя

var obj = server.storageLocations();

console.log(obj);

/* В Windows выведет:
QVariantMap: {
    "applications": "C:/Users/Lesav.ORB/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/",
    "cache":        "C:/Users/Lesav/AppData/Local/cache/",
    "data":         "C:/jCjS2/bin/",
    "desktop":      "C:/Users/Lesav/Desktop/",
    "documents":    "C:/Users/Lesav/Documents/",
    "fonts":        "C:/WINDOWS/Fonts/",
    "home":         "C:/Users/Lesav/",
    "movies":       "C:/Users/Lesav/Videos/",
    "music":        "C:/Users/Lesav/Music/",
    "pictures":     "C:/Users/Lesav/Pictures/",
    "temp":         "C:/Users/Lesav/AppData/Local/Temp/"
}
*/

Object server.storageDisplayNames() Функция
Возвращает информацию о дефолтных путях пользователя (отображаемые в системе)

var obj = server.storageDisplayNames();

console.log(obj);

Object server.qtEnum(string qtNameSpaceEnumName) Функция
Возвращает специальный отбъект, в котором находится энумератор из именованного пространства Qt
Внимание!!! Доступны к запросу только энумераторы объявленные в QtCore/qnamespace.h с помощью макроса Q_ENUMS()

var align = server.qtEnum('Alignment');
console.trace(align);
/* Формат полученного объекта
{
  "AlignAbsolute": 16,
  "AlignBottom": 64,
  "AlignCenter": 132,
  "AlignHCenter": 4,
  "AlignHorizontal_Mask": 31,
  "AlignJustify": 8,
  "AlignLeading": 1,
  "AlignLeft": 1,
  "AlignRight": 2,
  "AlignTop": 32,
  "AlignTrailing": 2,
  "AlignVCenter": 128,
  "AlignVertical_Mask": 224,
  "function getFlag()": '[native code]'
}
*/

// для запроса значения можно воспользоваться встроенной фунцией
console.trace(align,
              align.getFlag('AlignAbsolute'), // возвратит 16
              align.getFlag('Qt::ALIGNLEFT'), // возвратит 1 (регистр не имеет значения, префикс Qt будет отброшен)
              align.getFlag(128)              // возвратит AlignVCenter
              );

String server.fromUtf(String in, codecName) Функция
Преобразует строку in из кодировки UTF-8 в кодировку codecName


String server.toUtf(String in, codecName) Функция
Преобразует строку in из кодировки codecName в кодировку UTF-8


String server.eTag(fileName) Функция
Возвращает уникальный хеш для файла (меняется при модифицировании файла или при смене пути)
Используется для проверки изменения файла


bool server.validateXML(fileName) Функция
Валидация xml файла (проверка корректности синтаксиса) bool server.validateXMLString(xmlString) Функция
Валидация xml строки (проверка корректности синтаксиса)


var xmlFileName = server.getAbsPath(server.cfgFile);

var ok = server.validateXML(xmlFileName)

post.log(ok ? 'i' : 'e',  'Валидация прошла ' + (ok ? 'успешно' : 'с ошибкой'));

timerId server.singleShot(ms, thisObj, func, extArgsArr) Функция
выполняет func с задержкой ms. При выполнении передает в функцию объект obj
Минимальное (обязательное) количество аргументов два: ms - число, func - callback функция
Аргументы могут следовать в любом порядке
thisObj - объект, который будет передан в callback функцию в качестве this при срабатывании таймера
Если объект не указывать в аргументах, то будет использован текущий this на момент вызова server.singleShot()
extArgsArr - массив дополнительных аргументов, которые будут переданы в callback функцию
bool server.singleShotCall(timerId) Функция
принудительно выполнить таймер, без ожидания времени срабатываения
bool server.singleShotKill(timerId) Функция
Отменить выполнение таймера. Если таймер не найден, возвращает 0 и оставляет сообщение в логе

function _reg_form_(){ //отправить страницу с формой регистрации
    if(server.singleShot){
        var thisObj =  post.moveConnectionToDelay();

        var timerId = server.singleShot(thisObj, ['a1','a2','a3'], 1000, function(arg1,arg2,arg3){

            server.singleShotExist(timerId) // здесь возвратит 0

            // здесь объект (this === thisObj)  true
            //               arg1 === 'a1', arg2 === 'a2', arg3 === 'a3'
            post.setGlobalObject('http', this);
            this.respTmplFile("stuff@include/registration.html");
            post.removeDelayConnection(this);
        });

        server.singleShotExist(timerId) // здесь возвратит значение timerId

        return;
    }
    http.respTmplFile("stuff@include/registration.html");
}

//----------------------------------------
// вариант без указания obj
var tid = server.singleShot(10000, function(){ // выгрузить сервер через 10 сек
    // здесь объект this является тем-же, что и на момент вызова server.singleShot()
    server.logTrsh = 0;
    server.deleteLater();
});

// следующий код поясняет предыдущий
function haltServer() {
    // здесь объект  this === server
    var tid = this.singleShot(10000, function(){ // выгрузить сервер через 10 сек
        // здесь объект this является тем-же, что и на момент вызова server.singleShot()
        this.logTrsh = 0;
        this.deleteLater();
    });
}

// вызвать функцию haltServer и передать ей server в качестве this
haltServer.call(server);
//----------------------------------------


//server.singleShotCall(tid);   // принудительное выполнение без ожидания
//server.singleShotKill(tid);   // отменить выполнение
timerId server.singleShotExist(timerId) Функция
Проверить наличие запущенного таймера. Возвращает timerId переданный в аргументе, при наличии таймера. Если таймер не найден, возвращает 0 и оставляет сообщение в логе


timerId server.singleShotExist(timerId) Функция
Проверить наличие запущенного таймера. Возвращает timerId переданный в аргументе, при наличии таймера. Если таймер не найден, возвращает 0


Object server.authSystem(user, pass) Функция 1
Object server.authSystem(obj, func) Функция 2
Функция 1: Проверить учетные данные
Функция 2: Заменить функцию server.authSystem (коснется всех постов), obj - это объект который будет передан в функцию в качестве this
см. функционал makeRegistration и authOS


function myAuthFunc(user, pass){
    var domain = 'LOCAL';

    // Стандартная функция server.authSystem(user, pass) возвращает объект
    // нужно повторить ее ответ в точности. Где:
    // level  2 - 'Администратор'
    // level  1 - 'Пользователь'
    // level  0 - 'Без доступа'
    // level -1 - не найден пользователь
    var res = {
        user:   domain + '\\' + user,
        err:    1,
        errStr: '',
        auth:   false,
        level: -1
    }

    if(пользователь найден и он админ) {
        delete res.err;
        res.auth = true;
        res.level = 2;
        res.toCookies = {us_level: 3};
        //  информация из toCookies сохраняется в куки для дальнейшего использования
        // (реализавано в include/registration.js), и в cmd.js будет доступна
        // Пример:   var us_level = cookies.getVal('us_level')
        return  res;
    }

    if(пользователь найден и он user) {
        delete res.err;
        res.auth = true;
        res.level = 1;
        res.toCookies = {us_level: 2};
        return  res;
    }

    if(пользователь найден и он operator) {
        delete res.err;
        res.auth = true;
        res.level = 1;
        res.toCookies = {us_level: 1};
        return  res;
    }

    if(пользователь не имеет прав на вход) {
        res.err = true;
        res.auth = true;
        res.level = 0;
        res.errStr = 'пользователь не имеет прав на вход';
        return  res;
    }

    res.err = true;
    res.auth = false;
    res.level = -1;
    res.errStr = 'пользователь не найден';
    return  res;
}


// Заменить функцию на свою
server.authSystem(post, myAuthFunc);

.....


// Теперь в любом посте можно использовать единый функционал авторизации

var objAuth = server.authSystem(user, pass)

if(objAuth.level >0) ... доступ есть
else                 ... post.log('e', objAuth.errStr)      < 'пользователь не найден'


StringList server.libraryPaths() Функция
Возврашает список каталогов, в которых приложение ищет библиотеки .dll и .so


void server.addLibraryPath(String) Процедура
Добавить каталог в список поиска библиотек .dll и .so
Процедура может принимать аргумент относительно приложения '../lib'


void server.removeLibraryPath(String) Процедура
Удалить каталог из списока поиска библиотек .dll и .so
Процедура может принимать аргумент относительно приложения '../lib'


String server.getAbsPath(path, fromDir = '') Функция

String server.getRelPath(path, fromDir = '') Функция
getAbsPath - Преобразует относительный путь в абсолютный
getRelPath - Преобразует абсолютный путь в относительный
Если аргумент fromDir не указан, то будет использована директория с исполнительным файлом,
В случае отсутствия файла, поиск будет продолжен в корне приложения jCjS


bool server.setFileCreation(fName, Date) Функция

bool server.setFileLastAccess(fName, Date) Функция

bool server.setFileLastWrite(fName, Date) Функция

bool server.setFileTime(fName, Date) Функция
setFileCreation - Установить время создания файла
setFileLastAccess - Установить время последнего обращения к файлу
setFileLastWrite - Установить время изменения файла
setFileTime - Установить время создания и обращения и изменения файла

ВНИМАНИЕ!!! Функции работают только в среде Windows


bool server.setSystemDateTime(Date) Функция
Устанавливает текущее системное время и дату в ОС

ВНИМАНИЕ!!! Работает если у пользователя установлено право изменения системного времени
В среде UNIX необходимо остановить службу ntpd перед установкой времени


int server.getFreeTcpPort() Функция

int server.getFreeUdpPort() Функция
Запросить у операционной системы номер свободного порта
UDP - будет доступен для Listen
TCP - будет доступен для Bind


bool server.createLnk(target, lnkFile [argsArray, defDir, lnkDesc, icoFile, icoIndex, boolHidden]) Процедура
Создать ярлык windows .lnk
Аргументы: (первых два обязательные, остальные в любой последовательности)

  • target - на что нацелен ярлык
  • lnkFile - полное имя ярлыка
  • argsArray - массив аргументов для запуска target
  • lnkDesc - описание ярлыка
  • defDir - путь запуска target
  • icoFile - полный путь к файлу содержащем иконку ярлыка
  • icoIndex - индекс иконки если их несколько в файле
  • boolHidden - запуск в свернутом окне
  • 
    var target  = server.getAbsPath('./jCjSService.exe')
    var lnkFile = server.storageLocations().desktop + '/Ярлык для запуска jCjSService.lnk';
    var defDir  = server.getAbsPath('./');
    //r icoFile = server.parseSpecialFileName('stat@img/jcjs1.ico');
    var icoFile = 'C:/Windows/system32/shell32.dll';
    var icoIndex= 26;  // по умолчанию 0
    
    var ret = server.createLnk(target,
                               lnkFile,
                               'Запуск программы jCjSService',
                               defDir,
                               ['-e', '-p', 18080, '-ps', 18443,  '"аргумент с пробельными символами"'],
                               icoFile, icoIndex,
                               true); // true - свернутое окно
    
    server.dialogMessage(ret
                         ? 'На рабочем столе создан ярлык'
                         : 'Ошибка создания ярлыка');
    

    bool server.loadCaCert(crtFileName) функция
    Установить корневой сертификат в список используемых


    int32 server.random_int(int32 limit) функция

    double server.random_dbl(random_dbl) функция
    Генераторы чисел
    random_int - генерация от 0x00 до 0xFFFFFFFF
    random_dbl - генерация от 0.0 до 1.0



    Общие Переменные для межпостового взаимодействия

    ВНИМАНИЕ!!!

  • Общие Переменные не сохраняются.
  • При отображении диалога выполнение в JS контексте приостанавливается и ожидается реакция пользователя.
  • Если не указывать title, то в заголовке диалога будет указана детальная информация о версии jCjS и имя поста, в котором вызван метод.
  • void server.deleteVar(String key) Процедура
    Удалить сохраненное значение переменной по имени

    server.deleteVar('varName');
    

    void server.setVar(String key, QVariant data) Процедура
    Установить значение переменной (после перегрузки сервера все переменные теряются)

    var key = 'varName';
    var val = [1, 2, 3, 's1', 's2', 's3'];
    server.setVar(key, val);
    

    Variant server.getVar(String key) Функция
    Взять значение переменной по имени

    var varNameVal = server.getVar('varName');
    var i1 = varNameVal[0]; // 1
    var i2 = varNameVal[1]; // 2
    var i3 = varNameVal[2]; // 3
    var s4 = varNameVal[3]; // 's1'
    var s5 = varNameVal[4]; // 's2'
    var s6 = varNameVal[5]; // 's3'
    

    Variant server.getVarObj(String key) Функция
    Взять структуру переменной по имени

    var varObj = server.getVarObj('varName');
    if(varObj) {
        var varNameVal = varObj.scriptData;
        var i1 = varNameVal[0]; // 1
        var i2 = varNameVal[1]; // 2
        var i3 = varNameVal[2]; // 3
        var s4 = varNameVal[3]; // 's1'
        var s5 = varNameVal[4]; // 's2'
        var s6 = varNameVal[5]; // 's3'
    }
    

    (Date or false) server.getVarCreateTime(String key) Функция
    Взять время регистрации переменной на сервере

    var varCreTime = server.getVarCreateTime('varName');
    if(!varCreTime) {
        //.... не найден key 'varName'
    } else {
        console.log('время регистрации переменной', varCreTime)
    }
    

    bool server.reNameVar(String oldName, String newName) Функция
    Переименовать переменную

    var ok = server.reNameVar('varName', 'varName2');
    if(ok) {
        //.... найден 'varName' и переименован
    } else {
        post.log('не найден varName')
    }
    


    Диалоги

    ВНИМАНИЕ!!!

  • Диалоги доступны только в jCjSGui.
  • При отображении диалога выполнение в JS контексте приостанавливается и ожидается реакция пользователя.
  • Если не указывать title, то в заголовке диалога будет указана детальная информация о версии jCjS и имя поста, в котором вызван метод.
  • void dialogInformation(message, title = '')
    void dialogQuestion(message, title = '')
    void dialogWarning(message, title = '')
    void dialogCritical(message, title = '')
    server.dialogCritical('Ошибка. Приложение будет завершено');
    
    server.logTrsh = 0;   post.delay = 100;
    post.evalScript("qAppQuit.js");
    

    Пользователю будет выведено окно


    Выбор файла или директории

    String getExistingDirectory(defDir, title = '')
    String getOpenFileName(defDir, title = '', mask = '*.*')
    
    // Если defDir == '' то будет выбран домашний каталог пользователя
    
    var userDirChange = server.getExistingDirectory('', 'Выбор директории в домашнем каталоге пользователя');
    if(!userDirChange)
      post.log('w', 'Директория не выбрана')
    
    var userFileChange = server.getOpenFileName('', 'Выбор файла в домашнем каталоге пользователя', '*.doc, docx');
    if(!userFileChange)
      post.log('w', 'Файл не выбран')
    
    


    void dialogMessage(message, title = '')
    Вывод сообщения пользователю без блокировки выволнения в JS контексте.

    void trayMessage (message[, title = ''[, ms = 2500]])
    void trayInformation (message[, title = ''[, ms = 2500]])
    void trayWarning (message[, title = ''[, ms = 2500]])
    void trayCritical (message[, title = ''[, ms = 2500]])
    Вывод всплывающего сообщения пользователю без блокировки выволнения в JS контексте.
    Аргументы могут следовать в любой последовательности, но message должен предшествовать title


    void trayToolTipe(message)
    Вывод всплывающего сообщения при наведении курсора мыши на иконку в трее.
    Есть особенность. Смена сообщения возможна только после инициализации всех постов

    server.initialized.connect(function initialized(){
        server.trayToolTipe(server.info('brand') + ' Новое заголовок в трее');
    })
    


    void trayIco(icoFileName)
    Замена иконки в трее.

    server.trayIco(server.parseSpecialFileName('stat@img/home.png'));
    


    Межпроцессовые команды

    ВНИМАНИЕ!!!

  • Команды могут быть доставлены jCjS только если они работают под одним пользователем
  • Поддерживаются команды 'halt' и 'restart' (выгрузка и перегрузка основного процесса)
  • Команды передается дополнительным процессом jCjS для основного (передающий завершает свою работу)
  • Для отправки команды необходимо знать идентификатор, по которому происходит доставка сообщения. Его можно посмотреть в логе, и он будет иметь такую запись
    2018-11-29-11:45:15.996 +1 открыт канал для приема команд с идентификатором '8080'

    Теперь можно запусть jCjS и в аргументах указать команду для передачи (в формате id:command)
    Дополнительный процесс передаст команду основному и сразу завершит свою работу

    cd /D c:\jCjS2\bin
    
    jCjSService.exe  -e -cmd 8080:restart
    


  • Описание объектов