Графический вариант сервера jCjSGui

jCjSGui предназначен для запуска постов как использующих так и не использующих функционал GUI,
а также для отладки js-скриптов

cd /home/jcjs/bin

export LD_LIBRARY_PATH=/home/jcjs/lib

./jCjSGui

По умолчанию, используется главный конфигурационный файл /home/jcjs/etc/jcjs.xml
Если вас не устраивает такое положение дел, можно запустить сервер jCjS указав ему необходимую конфигурацию

cd /home/jcjs/bin

export LD_LIBRARY_PATH=/home/jcjs/lib

# Чтобы запустить несколько одновременно работающих процессов, достаточно выполнить
./jCjSGui -cfg ../stuff/tests/pluginPHP/jcjs_php.xml
./jCjSGui -cfg ../stuff/tests/SMTPClient/jcjs_SMTPClient.xml
# Главное условие одновременного запуска - разные http-порты, используемые jCjS

После запуска jCjSGui в трее появится значок правый клик мыши по которому вызовет контекстное меню

Если выбрать пункт меню jCjS v.2.4.8.345, будет открыт браузер по адресу
расположения главного поста. Например http://localhost:8080/postsTable/


Запуск в консольном варианте

Консольный вариант запуска полезен для отладки скриптов, при этом все сообщения сервера jCjS выводятся в консоль.
Запуск сервера в консольном варианте производится командой

/home/jcjs/bin/jCjSService -e

По умолчанию, используется главный конфигурационный файл /home/jcjs/etc/jcjs.xml
Если вас не устраивает такое положение дел, можно запустить сервер jCjS указав ему необходимую конфигурацию

export LD_LIBRARY_PATH=/home/jcjs/lib
/home/jcjs/bin/jCjSService -e -cfg ../stuff/postsTable/jcjs_postTable.xml
Для остановки сервера нажимаем Ctrl-C.


Запуск в виде сервиса

Второй вариант запуска в виде сервиса - с отключенным выводом в консоль. События сервера будут логироваться в файлы, расположенные в папке /home/jcjs/logs.
Прежде чем запустить службу, необходимо ее инициализировать. Выполнять команды следует с правами администратора.

cd /home/jcjs/bin

# Установка службы с дефолтным именем jCjSService и
# дефолтным конфигурацонным файлом ../etc/jcjs.xml
./jCjSService  -i
# Будет установлена службы с именем jCjSService

# Чтобы установить несколько служб, достаточно указать
# отличное от jCjSService имя и используемый конфиг службы
./jCjSService  -i -n jCjSServicePHP  -a "-cfg ../stuff/tests/pluginPHP/jcjs_php.xml"
./jCjSService  -i -n jCjSServiceSMTP -a "-cfg ../stuff/tests/SMTPClient/jcjs_SMTPClient.xml"

# Будут установлены службы с именами jCjSServicePHP и jCjSServiceSMTP
# Главное условие одновременного запуска - разные http-порты, используемые jCjS

# так-же существует возможность установки служб с принудительеным указанием http порта
./jCjSService  -i -n jCjSServicePHP  -a "-p 8081 -cfg ../stuff/tests/pluginPHP/jcjs_php.xml"
./jCjSService  -i -n jCjSServiceSMTP -a "-p 8082 -cfg ../stuff/tests/SMTPClient/jcjs_SMTPClient.xml"

После установки службы, будет сгенерирован файл /etc/jCjSService.conf

cd /home/jcjs/bin
cat /etc/jCjSService.conf
# [services]
# jCjSService\path=/home/jctrl/bin/jCjSService
# jCjSService\description=jCjS service
# jCjSService\automaticStartup=0
# jCjSService\args=
# jCjSServicePHP\path=/home/jctrl/bin/jCjSService
# jCjSServicePHP\description=jCjS service
# jCjSServicePHP\automaticStartup=0
# jCjSServicePHP\args=-cfg ../stuff/tests/pluginPHP/jcjs_php.xml
# jCjSServiceSMTP\path=/home/jctrl/bin/jCjSService
# jCjSServiceSMTP\description=jCjS service
# jCjSServiceSMTP\automaticStartup=0
# jCjSServiceSMTP\args=-cfg ../stuff/tests/SMTPClient/jcjs_SMTPClient.xml

После того, как службы установлены, их можно запустить с правами пользователя jcjs
Методику добавления пользователя jcjs можно посмотреть в разделе Добавление пользователя

export LD_LIBRARY_PATH=/home/jcjs/lib

sudo  -u  jcjs   /home/jcjs/bin/jCjSService                    # будет запущена служба с дефолтным именем jCjSService
# равноценно такой записи
sudo  -u  jcjs   /home/jcjs/bin/jCjSService -n jCjSService     # будет запущена служба с именем jCjSService

sudo  -u  jcjs   /home/jcjs/bin/jCjSService -n jCjSServicePHP  # будет запущена служба с именем jCjSServicePHP
sudo  -u  jcjs   /home/jcjs/bin/jCjSService -n jCjSServiceSMTP # будет запущена служба с именем jCjSServiceSMTP

# в некоторых ОС команда запуска с правами пользователя jcjs выглядит иначе
echo /home/jcjs/bin/jCjSService -n jCjSServicePHP | su jcjs
Для остановки сервера вызываем jCjSService с ключем -t
export LD_LIBRARY_PATH=/home/jcjs/lib

sudo  -u jcjs  /home/jcjs/bin/jCjSService -t                    # будет остановлена служба с дефолтным именем jCjSService

sudo  -u jcjs  /home/jcjs/bin/jCjSService -t -n jCjSServicePHP  # будет остановлена служба с именем jCjSServicePHP
sudo  -u jcjs  /home/jcjs/bin/jCjSService -t -n jCjSServiceSMTP # будет остановлена служба с именем jCjSServiceSMTP

# в некоторых ОС команда останова с правами пользователя jcjs выглядит иначе
echo /home/jcjs/bin/jCjSService -t -n jCjSServicePHP | su jcjs

# и еще один способ корректного останова служб (будут остановлены все службы)
# вниманиие!     символы `` (клавиша Ё на клавиатуре)
# отличаются от символов '' (клавиша Э на клавиатуре)
kill `pidof jCjSService`

Для автозагрузки сервера в виде демона - самый простой но не лучший вариант добавить в /etc/rc.local команду запуска:

export LD_LIBRARY_PATH=/home/jcjs/lib

sudo  -u  jcjs   /home/jcjs/bin/jCjSService

Гораздо эффективней воспользоваться сценарием генерации скриптов запуска


Добавление пользователя jcjs в систему

Категорически не рекомендуется запускать jCjS с правами пользователя root
Создайте специального пользователя с урезанными правами и без доступа к шеллу /bin/bash

# Создать группу  (ключ -f подавляет ошибку, если такая группа существует)
groupadd -f jcjs

# создать пользователя -m jcjs и  добавить его в группу -g jcjs с домашним каталогом -d /home/jcjs
useradd -r -m jcjs -g jcjs -d /home/jcjs -s /bin/true
Хорошим вариантом будет выполнение сценария /home/jcjs/bin/set.chown.sh, который добавит пользователя и выдаст права на домашний каталог jCjS

Запустить скрипт с правами администратора, указав имя пользователя

/home/jcjs/bin/set.chown.sh  jcjs


Удаление пользователя jcjs из систему

Для удаления пользователя, выполните команды указанные в листинге с правами администратора

USR_=jcjs
GRP_=jcjs
nul=/dev/null

# сначала узнать нличие удаляемого пользователя
grep -E -i -w "^${USR_}" /etc/passwd >${nul} && (
   echo -n  "Delete user \"${USR_}\" ... "
   userdel ${USR_} >${nul} 2>${nul} && echo [OK] || echo [Err]

   # обычно предыдущая команда удаляет сразу и группу пользователя, т.к.
   # в группе больше нет пользователей, но лучшим вариантом будет
   # выполнение команды удаления группы с подавлением вывода ошибок в терминал
   groupdel ${GRP_} >${nul} 2>${nul}
)


Установка прав пользователю jCjS на домашний каталог

Для правильного функционирования jCjS, необходимо выдать права на каталог /home/jcjs
Создайте в каталоге /home/jcjs/bin скрипт

#!/bin/bash

# Set right home directory to control user

# test run directory
R=`dirname $0`
if test "$R" != "." ; then
  cd $R
fi

if test -z ${1} ; then

  printf '\nUsage:\tRun script \t ./%s  userName\n\n' "`basename $0`"

  USR_=${USERNAME};
else
  USR_=${1};
fi

GRP_=${USR_};

nul=/dev/null

DIR_=`dirname $PWD`

_prn_(){
  printf "%-60s\t...\t" "$1"
}

if test "$USER" != "${USR_}" ; then

  grep -E -i -w "^${USR_}" /etc/passwd >${nul} && (
     _prn_ "Delete user \"${USR_}\""
     userdel ${USR_} >${nul} 2>${nul} && echo [OK] || echo [Err]
     groupdel ${GRP_} >${nul} 2>${nul}
  )

  _prn_ "Add   group \"${USR_}\""
  groupadd -f ${GRP_} >${nul} 2>${nul} && echo [OK] || echo [Err]

  _prn_ "Add    user \"${USR_}\""
  useradd -r -m ${USR_} -g ${GRP_} -d ${DIR_} -c "system user for ${USR_}" -s /bin/true >$nul 2>$nul && echo [OK] || echo [Err]

fi

_prn_ "Set chmod 700 to directory \"`basename ${DIR_}`\""
find ${DIR_} -type d -exec chmod 700 {} \; >${nul} && echo [OK] || echo [Err]

_prn_ "Set access to directory \"`basename ${DIR_}`\" for the user \"${USR_}\""
chown -R ${USR_}:${GRP_} ${DIR_} >${nul} && echo [OK] || echo [Err]

usermod -d ${DIR_} ${USR_} >${nul} 2>${nul}

# открыть доступ к последовательным портам
usermod -G dialout ${USR_} >${nul} 2>${nul}

Запустить скрипт с правами администратора, указав имя пользователя

/home/jcjs/bin/set.chown.sh  jcjs


Установка прав чтения/записи в последовательные порты

# для доступа к портам выполните
sudo usermod -G dialout jcjs

# проверка, что права на запись в порт есть
echo "dadadadasdadasdadsads" > /dev/ttyUSB0


Генерация скриптов запуска

Для правильного пуска jCjSService, необходимо сгенерировать скрипты запуска, передав в аргументах имя домашнего каталога и имя пользователя.

/home/jcjs/etc/init.d/make_scripts.sh  /home/jcjs  jcjs

# Make script   /home/jcjs/etc/init.d/jCjS.debian    ...     [OK]
# Make script   /home/jcjs/etc/init.d/jCjS.generic   ...     [OK]
# Make script   /home/jcjs/etc/init.d/jCjS.gentoo    ...     [OK]
# Make script   /home/jcjs/etc/init.d/jCjS.mandrake  ...     [OK]
# Make script   /home/jcjs/etc/init.d/jCjS.slackware ...     [OK]
# Make script   /home/jcjs/etc/init.d/jCjS.suse      ...     [OK]

После работы сценария make_scripts.sh, скопировать необходимый скрипт в системный каталог /etc/init.d и воспользоваться инструментами ОС для установки службы. Можно вручную сделать символьные ссылки в каталоги запуска по указанным ниже рекомендациям.


Методика установки службы jCjSService в UNIX

Все скрипты запускаемых служб в Linux располагаются в /etc/rc.d/init.d или /etc/init.d в зависимости от дистрибутива. Прежде чем приступать к установке службы, проверьте работоспособность сценария

cd /home/jcjs/etc/init.d

./jCjS.mandrake start
# Starting jCjS server:                                          [  OK  ]
./jCjS.mandrake status
# The service jCjSService is not installed and running
./jCjS.mandrake stop
# Stopping jCjS server:                                          [  OK  ]
./jCjS.mandrake start
# Starting jCjS server:                                          [  OK  ]
./jCjS.mandrake restart
# Stopping jCjS server:                                          [  OK  ]
# Starting jCjS server:                                          [  OK  ]

Теперь можно приступить к установке службы. Сперва нужно ее установить а затем добавить в автозагрузку

srvName=jCjSServiceSMTP

# Инсталировать службы с именем $srvName
./jCjSService  -i -n $srvName  -a "-cfg ../stuff/tests/SMTPClient/jcjs_SMTPClient.xml"

# скопировать скрипт запуска в системный каталог
cp -f /home/jcjs/etc/init.d/jCjS.mandrake  /etc/init.d/$srvName

# добавить службу в автозагрузку
chkconfig --add  $srvName

# провериь текущий статус
chkconfig --list $srvName
# jCjSServiceSMTP    0:выкл  1:выкл  2:выкл  3:вкл   4:вкл   5:вкл   6:выкл


Описание методики запуска служб в UNIX

В системах UNIX есть несколько режимов запуска служб


Запуск сценарием init.d (Устарел. Используйте Systemd)

Этот метод считается устаревшим и замещается более современными средствами запуска (см. Systemd), но все ещё поддерживается современными ОС

Для того, чтобы скрипт запускался автоматически во время запуска системы, надо создать символическую ссылку на скрипт и разместить её в каталоге /etc/rc.d/rcN.d или /etc/rc.d/rcN.d, где N – соответствует уровню выполнения скрипта.

Чаще всего во время загрузке система использует уровни загрузки 3 или 5. Однако есть некоторая хитрость в названии самой символической ссылки. Например: /etc/rc.d/rc0.d/K60crond и /etc/rc.d/rc3.d/S40crond, указывающие на один скрипт /etc/init.d/crond службы системного журнала. Скрипт, начинающийся с "K" соответствует останову службы, а "S" - запуску. Числа, следующие перед именем службы задают порядок запуска скриптов в директории. Например, скрипт /etc/rc.d/rc3.d/S34syslogd будет запущен до скрипта /etc/rc.d/rc3.d/S40crond, тогда как /etc/rc.d/rc3.d/K60crond до /etc/rc.d/rc3.d/K66syslogd. Можно заметить, что сумма чисел для одной службы равна 100 - это позволяет упорядочить все скрипты в порядке старта, обратном порядку завершения. Создавать самому символические ссылки весьма утомительно, и для этого лучше использовать специальную утилиту chkconfig.

Синтаксис её использования весьма прост:

chkconfig --list [имя сервиса]
chkconfig --add <имя сервиса>
chkconfig --del <имя сервиса>
chkconfig [--level <уровни>] <имя сервиса>  < on|off|reset|resetpriorities >

Где имя сервиса - это имя исполняемого скрипта находящегося в /etc/rc.d/init.d


Запуск с помощью Systemd

Этот метод используется современными ОС (например Astra Linux v >= 1.5).
Он замещает устаревший механизм запуска служб (см. init.d)

TODO: Добавить описание запуска служб


Удаление службы

Для удаления службы необходимо выполнить несколько команд


  chkconfig --list jCjS
  # jCjS            0:выкл  1:выкл  2:выкл  3:вкл   4:вкл   5:вкл   6:выкл
  chkconfig --del  jCjS
  chkconfig --list jCjS
  # jCjS            0:выкл  1:выкл  2:выкл  3:выкл  4:выкл  5:выкл  6:выкл

  cd /home/jcjs/bin

  # Удаление службы с дефолтным именем jCjSService
  ./jCjSService  -t
  ./jCjSService  -u

  # Чтобы удалить службы выборочно, достаточно указать
  # отличное от jCjSService имя
  ./jCjSService  -t -n jCjSServicePHP
  ./jCjSService  -u -n jCjSServicePHP
  ./jCjSService  -t -n jCjSServiceSMTP
  ./jCjSService  -u -n jCjSServiceSMTP
  cd /D c:\jCjS2\bin

  # 1 Остановить службы
  jCjSService.exe  -t
  jCjSService.exe  -t -n newServiceName1
  jCjSService.exe  -t -n newServiceName2

  # 2 Удалить службы
  jCjSService.exe  -u
  jCjSService.exe  -u -n newServiceName1
  jCjSService.exe  -u -n newServiceName2

  # Будут удалены службы с именами jCjSService, newServiceName1 и newServiceName2


Вывод помощи

export LD_LIBRARY_PATH=/home/jcjs/lib
cd /home/jcjs/bin

./jCjSService  -h

# Выведет:
#jCjSService.exe -[a|e|h|i|n|s|u|v|q]
#        -i(nstall) [account] [password]      : Install the service, optionally using given account and password
#        -i(nstall) [-n(ame) serviceName]     : Install the service, optionally using the required service name
#        -i(nstall) [-a(rgs) "all args"]      : Install the service, optionally using the required arguments
#        -u(ninstall)                         : Uninstall the service.
#        -u(ninstall) [-n(ame) serviceName]   : Uninstall the service, optionally using the required service name.
#        -e(xec)                              : Run as a regular application. Useful for debugging.
#        -t(erminate)                         : Stop the service.
#        -t(erminate) [-n(ame) serviceName]   : Stop the service, optionally using the required service name.
#        -c(ommand) num                       : Send command code num to the service.
#        -c(ommand) num [-n(ame) serviceName] : Send command code num to the service using the required service name.
#        -d(irectory installation)            : installation directory.
#        -v(ersion)                           : Print version.
#        -p(ause)  [-n(ame) serviceName]      : Pause.
#        -r(esume) [-n(ame) serviceName]      : Resume.
#        -s(tatus)                            : Status service (default service name 'jCjSService').
#        -s(tatus) [-n(ame) serviceName]      : Status service, optionally using the required service name.
#        -Q(uery)                             : Get the status of all installed services from this instance.
#        -q(uery)                             : Get the status of all installed services from this instance without a title.
#        -Qa(ll)                              : Get state all installed services.
#        -qa(ll)                              : Get state all installed services without a title.
#        No arguments [-n(ame) serviceName]   : Start the service, optionally using the required service name.
#        -h(elp)                              : Show this help
#
#example:
# install service
# jCjSHttpsProxy  -i  -n newServiceName   -a "-p 9080 -ps 9081"
# start service
# jCjSHttpsProxy      -n newServiceName
# stop service
# jCjSHttpsProxy  -t  -n newServiceName
# uninstall service
# jCjSHttpsProxy  -u  -n newServiceName


Далее