В этом разделе перечислены свойства и методы объекта server
Пример использования:
//свойство параметра чтение/запись: // Чтение 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 + ''');
}
//------------------------------------------------------------
Дополнительную информацию можно посмотреть здесь
// Дать знать другим постам, что используется глобальная регистрация
// Разрешить глобальную регистрацию
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) Функция
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
Аргументы: (первых два обязательные, остальные в любой последовательности)
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
ВНИМАНИЕ!!!
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')
}
ВНИМАНИЕ!!!
server.dialogCritical('Ошибка. Приложение будет завершено');
server.logTrsh = 0; post.delay = 100;
post.evalScript("qAppQuit.js");
Пользователю будет выведено окно
// Если 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'));
ВНИМАНИЕ!!!
Для отправки команды необходимо знать идентификатор, по которому происходит доставка сообщения.
Его можно посмотреть в логе, и он будет иметь такую запись
2018-11-29-11:45:15.996 +1 открыт канал для приема команд с идентификатором '8080'
Теперь можно запусть jCjS и в аргументах указать команду для передачи (в формате id:command)
Дополнительный процесс передаст команду основному и сразу завершит свою работу
cd /D c:\jCjS2\bin jCjSService.exe -e -cmd 8080:restart