Версия SoftWLC определяется версией подавляющего количества пакетов eltex, установленных на ВМ.
Версию пакетов можно узнать при помощи следующих команд:
vagrant@ubuntu:~$ dpkg -l | grep eltex-
Если версия какого-либо установленного пакета не является актуальной (проверить можно тут Stable_versions) обновите его.
Если во время обновления что-то пойдет не так, а сервис нужно будет быстро восстановить, то запускаете клон рабочей ВМ.
Обратите внимание, что обновление контроллера рекомендуется проводить в нерабочее время, так как будет перерыв в работе сервисов.
Подготовка к обновлению
Перед обновлением сделайте дамп БД и желательно сделать snapshot системы для возможного отката в случае неудачного обновления.
Выполните backUP БД и конфигурационных файлов.
Установите пакет pv перед сохранением БД и запуском скрипта.
На вход скрипта требуется подать login/password от БД.
vagrant@ubuntu:~$ sudo apt install pv # установка пакета pv
vagrant@ubuntu:~$ sudo chmod +x backup_mysql.sh # добавление прав на исполнение файла скрипта бэкапа mysql
vagrant@ubuntu:~$ sudo ./backup_mysql.sh root root # запуск скрипта бэкапа БД mysql пользователя root, с паролем root
backup_mysql.sh
BackUP базы данных работоспособен только для вашей текущей версии SoftWLC. Условно говоря, backup от SoftWLC версии 1 не подойдет к SoftWLC версии 2.
Во время обновления в консоли Вам будут предложены варианты действий с конфигурационными файлами и базами данных.
Выполнить backup файлов текущих репозиториев
vagrant@ubuntu:~$ sudo cp /etc/apt/sources.list.d/eltex.list /etc/apt/sources.list.d/eltex.list.backup
Обновление SoftWLC
Версия SoftWLC определяется версией подавляющего количества пакетов eltex, установленных на ВМ.
Версию пакетов можно узнать при помощи следующих команд (команда 'tee' сохраняет информацию об установленных пакетах в файл):
vagrant@ubuntu:~$ dpkg -l | grep eltex- | tee eltex-packets.txt
Если версия какого-либо установленного пакета не является актуальной (проверить можно тут Stable_versions) обновите его.
Подключение репозиториев Элтекс
Для Ubuntu 18.0.4 - bionic
Заменить содержимое файла /etc/apt/sources.list.d/eltex.list и прописать в него репозитории
deb [arch=amd64] http://archive.eltex-co.ru/wireless softwlc-1.31-bionic main
deb [arch=amd64] http://archive.eltex-co.ru/wireless softwlc-1.31-common main
Для остальных ОС. Данный репозиторий нужно выбирать в зависимости от версии ОС (focal/jammy/astra-1.7)
deb [arch=amd64] http://archive.eltex-co.ru/wireless softwlc-1.31-focal main
deb [arch=amd64] http://archive.eltex-co.ru/wireless softwlc-1.31-common main
Поиск и установка обновлений пакетов
vagrant@ubuntu:~$ sudo apt-get update
Обновление tomcat и open-jdk
Сделать бэкап конфигурации tomcat8 /etc/tomcat8 и /etc/default/tomcat8, скопировав в домашнюю директорию
cp /etc/default/tomcat8 .
sudo tar -czvf tomcat_backup.tar.gz /etc/tomcat8
Удалить tomcat8. Tomcat9 установится автоматически.
Установить openjdk-17-jdk
sudo apt install openjdk-17-jdk
Прописываем использование OpenJDK 17 по умолчанию
sudo update-java-alternatives -s java-1.17.0-openjdk-amd64
Заменить содержимое файла /etc/default/tomcat9 и прописать в нем:
# The home directory of the Java development kit (JDK). You need at least
# JDK version 8. If JAVA_HOME is not set, some common directories for
# OpenJDK and the Oracle JDK are tried.
#JAVA_HOME=/usr/lib/jvm/java-8-openjdk
# You may pass JVM startup parameters to Java here. If you run Tomcat with
# Java 8 instead of 9 or newer, add "-XX:+UseG1GC" to select a suitable GC.
# If unset, the default options will be: -Djava.awt.headless=true
JAVA_OPTS="-Djava.awt.headless=true"
# To enable remote debugging uncomment the following line.
# You will then be able to use a Java debugger on port 8000.
#JAVA_OPTS="${JAVA_OPTS} -agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n"
# Java compiler to use for translating JavaServer Pages (JSPs). You can use all
# compilers that are accepted by Ant's build.compiler property.
#JSP_COMPILER=javac
# Enable the Java security manager? (true/false, default: false)
#SECURITY_MANAGER=true
# Whether to compress logfiles older than today's
#LOGFILE_COMPRESS=1
JAVA_OPTS="${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom"
JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
Добавляем ссылку для tomcat
sudo ln -s /usr/share/java/ecj.jar /var/lib/tomcat9/lib
Изменяем порт tomcat с 8080 на 8081
sudo sed -i 's/8080/8081/' /etc/tomcat9/server.xml
В скрипте /usr/libexec/tomcat9/tomcat-start.sh добавить строчку . /etc/default/tomcat9
#!/bin/sh
#
# Startup script for Apache Tomcat with systemd
#
set -e
. /etc/default/tomcat9
# Find the Java runtime and set JAVA_HOME
. /usr/libexec/tomcat9/tomcat-locate-java.sh
# Set the JSP compiler if configured in the /etc/default/tomcat9 file
[ -n "$JSP_COMPILER" ] && JAVA_OPTS="$JAVA_OPTS -Dbuild.compiler=\"$JSP_COMPILER\""
export JAVA_OPTS
# Enable the Java security manager?
SECURITY=""
[ "$TOMCAT_SECURITY" = "yes" ] && SECURITY="-security"
# Start Tomcat
cd $CATALINA_BASE && exec $CATALINA_HOME/bin/catalina.sh run $SECURITY
Перезапустить tomcat9
sudo systemctl restart tomcat9.service
Обновление схемы в БД MariaDB для службы 'eltex-ems'
sudo apt-get install eltex-ems-db
Enter your MySQL administrator login (default is 'root'): root
Enter your MySQL administrator password:
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql: [Warning] Using a password on the command line interface can be insecure.
Backup databases? (Y/n) n
Обновление модифицированной схемы в БД MariaDB для службы RADIUS
sudo apt-get install eltex-radius-db
Enter your MySQL administrator login (default is 'root'): root
Enter your MySQL administrator password:
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql: [Warning] Using a password on the command line interface can be insecure.
Backup databases? (Y/n) n
Обновление БД авторизации сервисов eltex-wifi-cab, eltex-radius-nbi, eltex-portal-constructor
sudo apt-get install eltex-auth-service-db
Enter your MySQL administrator login (default is 'root'): root
Enter your MySQL administrator password:
Обновление пакета eltex-radius-nbi для стыка SoftWLC с вышестоящими OSS/BSS
sudo apt-get install eltex-radius-nbi
Do you want to generate server certificate? [y/N]: N
Обновление пакета eltex-ems
sudo apt-get install eltex-ems
Replace /etc/default/tftpd-hpa? (type 'd' to view diff) [y/N/d]: N
Обновление пакета eltex-radius
sudo apt-get install eltex-radius
Обновление пакета eltex-ngw
sudo apt-get install eltex-ngw
Обновление пакета eltex-apb
sudo apt-get install eltex-apb
Обновление сервиса ААА (Authentication Authorization and Accounting) для Wi-Fi пользователей, подключающихся при помощи BRAS
sudo apt-get install eltex-pcrf
Обновление сервиса журналирования 'Hotspot' учетных записей
sudo apt-get install eltex-logging-service
Обновление сервиса для управления учетными записями Hotspot-пользователей
sudo apt-get install eltex-mercury
Обновление портала для авторизации клиентов WiFi в схеме 'Hotspot'
sudo apt-get install eltex-portal
Обновление конструктора порталов
sudo apt-get install eltex-portal-constructor
Обновление личного кабинета B2B, интерфейса управления
sudo apt-get install eltex-wifi-cab
Обновление пакета для интерпретации MAC-адресов в названия вендоров
sudo apt-get install eltex-oui-list
Обновление сервиса удаления сессии пользователя
sudo apt-get install eltex-disconnect-service
Обновление API для управляемого предоставления услуги Wi-Fi.
sudo apt-get install eltex-johnny
Обновление сервиса проверки подлинности пользователя через токены
sudo apt-get install eltex-doors
Keys already exist. Do you want to generate new keys? (Y/N) [N]: N
Обновление менеджера задач
sudo apt-get install eltex-bruce
Обновление сервиса выполнения задач и создания отчетов по ним
sudo apt-get install eltex-jobs
Получение конфигурации nginx
wget http://archive.eltex-co.ru/wireless/nginx/conf/softwlc_<версия_нового_softwlc>_nginx.conf -O softwlc_<версия_нового_softwlc>_nginx.conf
Копирование конфигурации nginx в нужный каталог
sudo cp softwlc_<версия_нового_softwlc>_nginx.conf /etc/nginx/conf.d/softwlc.conf
Перезапуск сервисов Nginx и tomcat9
sudo systemctl restart nginx
sudo systemctl restart tomcat9
Проверка настройки модулей SoftWLC
Далее необходимо проверить настройку модулей SoftWLC на работу с контроллером по virtual ip.
# maximum number of outgoing messages in queue for each session
sessionMessageQueueSize = 100
# cache config file path
cacheConfigFile = /etc/eltex-apb/ehcache.xml
# path to the file with permitted hosts
hostsFile = /etc/eltex-apb/hosts.json
pingJob {
# ping job interval
interval = 60s
# timeout waiting for subscribe-request after connecting the access point to the server
subscribeIdleTimeout = 60s
# timeout during that the session will stay opened without receiving any message
messageIdleTimeout = 90s
# interval of ping to be sent to the websocket session
pingIdleTimeout = 30s
}
# eltex-mercury connection properties
mercury {
host = localhost
port = 6565
poolSize = 50
}
nbi.client.login=admin
nbi.client.password=password
- Проверьте и при необходимости измените
localhost
на <virtual_ip>
в строке 24.
{
"auth.address" : "0.0.0.0",
"auth.port" : 31812,
"auth.mac.open.timeout.s" : 3600,
"auth.mac.welcome.service" : "WELCOME",
"acct.address" : "0.0.0.0",
"acct.ports" : [1813, 31813],
"lease.saver.address" : "0.0.0.0",
"lease.saver.port" : 4381,
"aaa.instances" : 5,
"aaa.host" : "127.0.0.1",
"aaa.secret" : "testing123",
"aaa.auth.port" : 1812,
"aaa.acct.port" : 1813,
"aaa.rest.port" : 7080,
"aaa.timeout" : 10,
"aaa.attempts" : 1,
"web.monitoring.port" : 7070,
"cluster.enable" : false,
"cluster.eventBusPort" : 5801,
"radius" : {
"url": "jdbc:mysql://localhost/radius?useUnicode=true&characterEncoding=utf8&connectTimeout=5000&socketTimeout=5000&autoReconnect=true&useSSL=false",
"user": "javauser",
"password": "javapassword",
"max_pool_size": 16
},
"mongo.pcrf" : {
"connection_string": "mongodb://localhost:27017/pcrf?replicaSet=<YourClasterName>&waitQueueMultiple=500&connectTimeoutMS=10000&socketTimeoutMS=0&readPreference=secondaryPreferred",
"db_name": "pcrf"
},
"mongo.ott" : {
"connection_string": "mongodb://localhost:27017/ott?replicaSet=<YourClasterName>&waitQueueMultiple=500&connectTimeoutMS=10000&socketTimeoutMS=0&readPreference=secondaryPreferred",
"db_name": "ott"
},
"session.storage" : {
"session.check.period.s" : 300,
"unauth.store.time.s" : 600,
"interval.number.expired" : 3,
"min.interval.s" : 45,
"default.interval.s" : 600
},
"bras.coa" : {
"coa.timeout" : 10,
"coa.attempts" : 1,
"remote.coa.port" : 3799,
"executor.size" : 100,
"log.clean.period.s" : 600,
"log.store.period" : {
"period" : 14,
"unit" : "D"
}
},
"sql.ems" : {
"url": "jdbc:mysql://localhost/eltex_ems?useUnicode=true&characterEncoding=utf8&connectTimeout=5000&socketTimeout=5000&autoReconnect=true&useSSL=false",
"user": "javauser",
"password": "javapassword",
"max_pool_size": 16
},
"sql.wireless" : {
"url": "jdbc:mysql://localhost/wireless?useUnicode=true&characterEncoding=utf8&connectTimeout=5000&socketTimeout=5000&autoReconnect=true&useSSL=false",
"user": "javauser",
"password": "javapassword",
"max_pool_size": 16
},
"sql.auth.service" : {
"url": "jdbc:mysql://localhost/eltex_auth_service?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&connectTimeout=5000&socketTimeout=5000&useSSL=false",
"user": "javauser",
"password": "javapassword",
"max_pool_size": 4
},
"language" : "en",
"radius.nbi" : {
"wdsl.url" : "http://localhost:8080/axis2/services/RadiusNbiService?wsdl",
"username" : "softwlc_service",
"password" : "softwlc",
"connection.timeout.ms" : 30000,
"request.timeout.ms" : 120000
},
"tariffs.update.interval" : {
"interval" : 1,
"unit" : "hours"
},
"bras.cron.update.interval": {
"interval" : 1,
"unit": "hours"
},
"filters.cache.dir" : "/var/lib/eltex-pcrf/filters/",
"clickhouse": {
"url": "jdbc:clickhouse://localhost:8123/radius",
"user_name": "javauser",
"user_password": "javapassword"
},
"accounting.options": {
"use_clickhouse": false,
"use_mysql": true,
"batch_interval_ms": 300000,
"max_queue_load": 100
}
}
mongodb://192.168.10.3:27017,192.168.10.4:27017/pcrf?replicaSet=Cluster&waitQueueMultiple=500&connectTimeoutMS=10000&socketTimeoutMS=0&readPreference=secondaryPreferred
mongodb://192.168.10.3:27017,192.168.10.4:27017/ott?replicaSet=Cluster&waitQueueMultiple=500&connectTimeoutMS=10000&socketTimeoutMS=0&readPreference=secondaryPreferred
- Проверьте и при необходимости измените
localhost
на <virtualip>
во всех строках, кроме 14-ой строки. - Проверьте и при необходимости измените
127.0.0.1
на <virtualip>
во всех строках, кроме 14-ой строки.
login {
# Количество попыток входа в панель администратора до наступления блокировки
maxAttemptsLogin = 3
maxAttemptsIP = 5
# Количество минут блокировки после достижения максимального числа попыток входа в панель администратора
blockTime = 5m
}
access {
// Временно задаём plaintext-secret прямо здесь (HMAC256), потом будем использовать путь в FS до PEM-файла (RSA256)
secret = "secret"
}
database {
host = localhost
port = 3306
name = ELTEX_PORTAL
user = javauser
password = javapassword
pool {
# Time to wait for a connection
connectionTimeout = 10s
# Time to wait for connection validation
validationTimeout = 3s
min = 1
max = 10
}
cache {
# Limit of cached simple entries count (for each query type)
maxEntries = 1000
# Limit of total cached portal resources size
maxResourceBytes = 32m
# Maximum time to retain items in the cache
expireTime = 30s
}
}
sso {
enabled = false
# Must be in double quotes
version = "1.0"
rest {
scheme = http
host = localhost
port = 80
sso_api_path = /apiman-gateway/b2b_test
}
auth {
scheme = http
host = localhost
port = 80
authentication_path = /auth/realms/b2b/protocol/openid-connect/auth
logout_path = /auth/realms/b2b/protocol/openid-connect/logout
}
params {
client_id = id
# URL of epadmin, URL must be in double quotes (!!!)
redirect_uri = "http://localhost:8080/epadmin/sso"
client_secret = secret
}
}
jetty {
http.port = 9001
https {
port = 9444
keystorePass = 12345
keystoreFile = /etc/eltex-portal-constructor/localhost.pfx
keystoreType = PKCS12
keyAlias = 1
ciphers = [
TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_AES_256_CBC_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA
]
}
multipart {
maxFileSize = 100MB
maxRequestSize = 100MB
}
}
validation {
public_key = /etc/eltex-doors/keys/public.pem
}
logging {
host = localhost
port = 9099
}
- Проверьте и при необходимости измените
localhost
на <virtualip>
в строках 15, 48, 54, 64, 95.
portal {
defaultRedirectUrl = "http://eltex-co.ru"
scheduler {
tariffCheckerPeriod = 1d
paymentsCleanerPeriod = "0 0 * * * ?"
}
}
jetty {
https {
port = 9443
keystorePass = 12345
keystoreFile = /etc/eltex-portal/localhost.pfx
keystoreType = PKCS12
keyAlias = 1
ciphers = [
TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_AES_256_CBC_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA
]
}
}
database {
host = localhost
port = 3306
name = ELTEX_PORTAL
user = javauser
password = javapassword
pool {
# Time to wait for a connection
connectionTimeout = 10s
# Time to wait for connection validation
validationTimeout = 3s
min = 1
max = 10
}
cache {
# Limit of cached simple entries count (for each query type)
maxEntries = 1000
# Limit of total cached portal resources size
maxResourceBytes = 32m
# Maximum time to retain items in the cache
expireTime = 2m
}
}
// JWT validation. You need a key from Eltex Doors.
// Or you could generate it yourself.
validation {
public_key = "etc/eltex-doors/keys/public.pem"
- Проверьте и при необходимости измените
localhost
на <virtualip>
в строке 27.
# DB radius(alias=radius)
radius.jdbc.driver=org.gjt.mm.mysql.Driver
radius.jdbc.dbUrl=jdbc:mysql://localhost/radius?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000
radius.jdbc.username=javauser
radius.jdbc.password=javapassword
radius.jdbc.maxPoolSize=48
radius.jdbc.inUse=yes
# DB radius replica(alias=radiusReplicaPool)
#TODO: Change it to replica url
radius.jdbc.replica.driver=org.gjt.mm.mysql.Driver
radius.jdbc.replica.dbUrl=jdbc:mysql://localhost/radius?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000
radius.jdbc.replica.username=javauser
radius.jdbc.replica.password=javapassword
radius.jdbc.replica.maxPoolSize=48
radius.jdbc.replica.inUse=yes
# DB ems(alias=ems)
ems.jdbc.driver=org.gjt.mm.mysql.Driver
ems.jdbc.dbUrl=jdbc:mysql://localhost/eltex_ems?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000&noAccessToProcedureBodies=true
ems.jdbc.username=javauser
ems.jdbc.password=javapassword
ems.jdbc.maxPoolSize=48
ems.jdbc.inUse=yes
# DB wireless (alias=wireless)
wireless.jdbc.driver=org.gjt.mm.mysql.Driver
wireless.jdbc.dbUrl=jdbc:mysql://localhost/wireless?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000
wireless.jdbc.username=javauser
wireless.jdbc.password=javapassword
wireless.jdbc.maxPoolSize=48
wireless.jdbc.inUse=yes
# DB logs (alias=logs)
logs.jdbc.driver=org.gjt.mm.mysql.Driver
logs.jdbc.dbUrl=jdbc:mysql://localhost/eltex_alert?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000
logs.jdbc.username=javauser
logs.jdbc.password=javapassword
logs.jdbc.maxPoolSize=48
logs.jdbc.inUse=yes
# DB logs (alias=eltex_auth_service)
eltex_auth_service.jdbc.driver=org.gjt.mm.mysql.Driver
eltex_auth_service.jdbc.dbUrl=jdbc:mysql://localhost/eltex_auth_service?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000
eltex_auth_service.jdbc.username=javauser
eltex_auth_service.jdbc.password=javapassword
eltex_auth_service.jdbc.maxPoolSize=48
eltex_auth_service.jdbc.inUse=no
# адрес ems-northbound
ems.nbi.host=127.0.0.1
ems.nbi.port=8080
ems.nbi.path=northbound
ems.nbi.protocol=http
# eltex_auth_service
auth.port=22
auth.host=127.0.0.1
auth.username=username
auth.password=password
# freeradius-domain-1
freeradius-domain-1.port=22
freeradius-domain-1.host=192.168.0.1
freeradius-domain-1.username=username
freeradius-domain-1.password=password
# freeradius-domain-2
freeradius-domain-2.port=22
freeradius-domain-2.host=192.168.0.2
freeradius-domain-2.username=username
freeradius-domain-2.password=password
# tomcat url
tomcat.host=127.0.0.1
tomcat.port=8080
# pcrf stuff
pcrf.enabled=true
pcrf.url=http://localhost:7070
pcrf.username=admin
pcrf.password=password
# pcrf mongodb connector
pcrf.mongodb.enabled=true
pcrf.mongodb.uri=mongodb://localhost:27017/pcrf?replicaSet=<YourClusterName>
# wifi-customer-cab mongodb connector
wificab.mongodb.enabled=true
wificab.mongodb.uri=mongodb://localhost:27017/wifi-customer-cab?replicaSet=<YourClusterName>
# Eltex.SORM2.replicator MongoDB 'sorm2' connect
sorm2.mongodb.enabled=false
sorm2.mongodb.uri=mongodb://localhost:27017/sorm2?replicaSet=<YourClusterName>
# wifi-customer-cab request settings
wificab.timeout=90000
# Eltex.SORM2.replicator host to use API
sorm2.enabled=false
sorm2.url=http://localhost:7071
sorm2.username=admin
sorm2.password=password
#It enables records export to SORM3 while editing wifi users
sorm3.enabled=false
# ott mongodb connector
ott.mongodb.enabled=true
ott.mongodb.uri=mongodb://localhost:27017/ott?replicaSet=<YourClusterName>
# metrics
metric.interval.s=900
###########################################################################
##########################DB ELTEX_PORTAL settings#########################
###########################################################################
portal.db.driver=com.mysql.jdbc.Driver
portal.db.url=jdbc:mysql://localhost:3306/ELTEX_PORTAL?max_allowed_packet=32362048&useUnicode=true&characterEncoding=utf8
portal.db.username=javauser
portal.db.password=javapass
Проверьте и при необходимости измените mongodb://localhost
на mongodb://ip_mongo_primary,ip_mongo_secondary
во всех строках и указать replicaSet
, который вы настроили в /etc/mongod.conf. Таким образом строка будет выглядить примерно следующим образом
pcrf.mongodb.uri=mongodb://192.168.10.3:27017,192.168.10.4:27017/pcrf?replicaSet=Cluster
wificab.mongodb.uri=mongodb://192.168.10.3:27017,192.168.10.4:27017/wifi-customer-cab?replicaSet=Cluster
sorm2.mongodb.uri=mongodb://192.168.10.3:27017,192.168.10.4:27017/sorm2?replicaSet=Cluster
ott.mongodb.uri=mongodb://192.168.10.3:27017,192.168.10.4:27017/ott?replicaSet=Cluster
- Проверьте и при необходимости измените
localhost
на <virtualip>
во всех строках. - Проверьте и при необходимости измените
127.0.0.1
на <virtualip>
во всех строках.
// Server configuration
server {
// server port
port = 8040
// number of threads in executor that executes handlers and different gateways
threads = 50
}
http {
// Timeout of http connection to the end gateway
connectionTimeout = 30s
// Number of maximum simultaneous http connections
maxConnections = 50
// Time that connection will be kept alive
keepAliveTimeout = 5s
// Whether to check SSL certificate
checkCert = true
// HTTP User Agent
userAgent = eltex-ngw
}
sms {
// Incoming (user to service) sms config
incoming.config = "smsc.conf"
// Outgoing (service to user) sms config
outgoing.config = "smsc.conf"
}
call {
// Incoming (user to service) call config
incoming.config = ""
// Outgoing (service to user) call config
outgoing.config = ""
}
email {
// Outgoing (service to user) email config
outgoing.config = ""
}
database {
host = localhost
port = 3306
name = eltex_ngw
user = javauser
password = javapassword
pool {
// Time to wait for a connection
connectionTimeout = 10s
// Time to wait for connection validation
validationTimeout = 3s
min = 1
max = 10
}
- Проверьте и при необходимости измените
localhost
на virtual_ip
в строке 44.
# Ports on which the server will listen
auth_port=1812
#acct_port=1813
inner_tunnel_port=18121
# MySQL database
db_host="localhost"
db_port=3306
db_login="radius"
db_password="radpass"
db_name="radius"
# MySQL 'wireless' database
wireless_db_host="localhost"
wireless_db_port=3306
wireless_db_login="javauser"
wireless_db_password="javapassword"
wireless_db_name="wireless"
# PCRF
# If you setting pcrf_enabled=0, then you also should enable accounting port listening in "default" server
pcrf_host="127.0.0.1"
pcrf_port=7080
pcrf_enabled=1
# EAP
ca_cert_name="local.pem"
tls_key_password="1234"
# Proxying
proxy_auth=0
proxy_domain_regex="^(.+\.)?enterprise\.root$"
proxy_host="127.0.0.1"
proxy_port=18121
proxy_secret="eltex"
# Ubiquity vendor detection
ubi_vendor_regex="Apple|Ubiquiti"
vendor_group_enabled=1
# Settings of runtime NAS discovery
dynamic_clients=false
dynamic_client_subnet=192.168.0.0/16
dynamic_client_lifetime=3600
dynamic_client_rate_limit=false
# Proxy SSID (for example to eltex-eap-tls) #139679
proxy_ssid_enabled=0
proxy_ssid_value="EAP_TLS"
proxy_ssid_host="127.0.0.1"
proxy_ssid_port=18122
proxy_ssid_secret="eltex"
- Проверьте и при необходимости измените
localhost
на <virtualip>
во всех строках. - Проверьте и при необходимости измените
127.0.0.1
на <virtualip>
во всех строках.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<entry key="mongoaddress">mongodb://localhost:27017/wifi-customer-cab?replicaSet=<YourClusterName></entry>
<entry key="nbiaddress">http://localhost:8080/axis2/services/RadiusNbiService?wsdl</entry>
<entry key="nbi.serviceLogin.user">softwlc_service</entry>
<entry key="nbi.serviceLogin.password">password</entry>
<entry key="nbi.serviceLogin.requestTimeout.sec">120</entry>
<!--Bonnie or NBI-->
<entry key="data.service.type">NBI</entry>
<entry key="bonnie.service.host">localhost</entry>
<entry key="bonnie.service.port">9070</entry>
<!--Bruce-->
<entry key="bruce.service.host">localhost</entry>
<entry key="bruce.service.port">8008</entry>
<!-- Support link -->
<entry key="support.page.enabled">false</entry>
<entry key="support.page.url">http://eltex-co.ru</entry>
<!-- DPI link -->
<entry key="dpi.page.enabled">false</entry>
<entry key="dpi.page.url">https://filter.wifi.example.org/</entry>
<!-- SSO Settings -->
<entry key="sso.enabled">false</entry>
<entry key="sso.redirectUri">http://localhost:8080/wifi-cab/sso</entry>
<entry key="sso.clientSecret"></entry>
<entry key="sso.clientId"></entry>
<!-- SSO Auth -->
<entry key="sso.auth.server.protocol">http</entry>
<entry key="sso.auth.server.address"></entry>
<entry key="sso.auth.server.port">80</entry>
<entry key="sso.auth.auth.path">/auth/realms/b2b/protocol/openid-connect/auth</entry>
<entry key="sso.auth.logout.path">/auth/realms/b2b/protocol/openid-connect/logout</entry>
<!-- SSO REST -->
<entry key="sso.rest.server.protocol">http</entry>
<entry key="sso.rest.server.address"></entry>
<entry key="sso.rest.server.port">80</entry>
<entry key="sso.rest.server.timeout.sec">10</entry>
<entry key="sso.rest.protocol.version">2.0</entry>
<entry key="sso.rest.username"></entry>
<entry key="sso.rest.password"></entry>
<entry key="sso.rest.getToken.path">/apiman-gateway/b2b_test/getToken</entry>
<entry key="sso.rest.getUserInfo.path">/apiman-gateway/b2b_test/getUserInfo</entry>
<entry key="sso.rest.addUser.path">/apiman-gateway/b2b_test/addUser</entry>
<entry key="sso.rest.updateUser.path">/apiman-gateway/b2b_test/updateUser</entry>
<entry key="sso.rest.delUser.path">/apiman-gateway/b2b_test/delUser</entry>
<entry key="sso.rest.addUserParam.path">/apiman-gateway/b2b_test/addUserParam</entry>
<entry key="sso.rest.delUserParam.path">/apiman-gateway/b2b_test/delUserParam</entry>
<entry key="sso.rest.getUserByName.path">/apiman-gateway/b2b_test/getUserByName</entry>
<entry key="sso.rest.resetPassword.path">/apiman-gateway/b2b_test/resetPassword</entry>
<entry key="sso.rest.getUserByParam.path">/apiman-gateway/b2b_test/getUserByParam</entry>
<entry key="sso.rest.getUserByEmail.path">/apiman-gateway/b2b_test/getUserByEmail</entry
</properties>
Проверьте и при необходимости измените mongodb://localhost
на mongodb://ip_mongo_primary,ip_mongo_secondary
в строке 4 и указать replicaSet
, который вы настроили в /etc/mongod.conf. Таким образом строка будет выглядить примерно следующим образом
<entry key="mongoaddress">mongodb://192.168.10.3:27017,192.168.10.4:27017/wifi-customer-cab?replicaSet=Cluster</entry>
- Проверьте и при необходимости измените
localhost
на <virtualip>
во всех строках.
# DB Event
poolName1=event
event.jdbc.driver=org.gjt.mm.mysql.Driver
event.jdbc.dbUrl=jdbc:mysql://localhost/eltex_alert?useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000
event.jdbc.username=javauser
event.jdbc.password=javapassword
event.jdbc.maxPoolSize=32
event.jdbc.inUse=yes
# remote db host access with su privileges
# event.ssh.login=
# event.ssh.password=
# event.ssh.port=
# DB Tree
poolName2=tree
tree.jdbc.driver=org.gjt.mm.mysql.Driver
tree.jdbc.dbUrl=jdbc:mysql://localhost/eltex_ems?useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000&noAccessToProcedureBodies=true
tree.jdbc.username=javauser
tree.jdbc.password=javapassword
tree.jdbc.maxPoolSize=20
tree.jdbc.inUse=yes
# DB Ont
poolName3=ont
ont.jdbc.driver=org.gjt.mm.mysql.Driver
ont.jdbc.dbUrl=jdbc:mysql://localhost/eltex_ont?useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000
ont.jdbc.username=javauser
ont.jdbc.password=javapassword
ont.jdbc.maxPoolSize=40
ont.jdbc.inUse=yes
# DB Syslog
poolName4=syslog
syslog.jdbc.driver=org.gjt.mm.mysql.Driver
syslog.jdbc.dbUrl=jdbc:mysql://localhost/Syslog?useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000
syslog.jdbc.username=javauser
syslog.jdbc.password=javapassword
syslog.jdbc.maxPoolSize=4
syslog.jdbc.inUse=yes
# remote db host access with su privileges
# syslog.ssh.login=
# syslog.ssh.password=
# syslog.ssh.port=
# DB acsmain (alias=cpe)
poolName5=cpe
cpe.jdbc.driver=org.gjt.mm.mysql.Driver
cpe.jdbc.dbUrl=jdbc:mysql://localhost/acsmain?useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000
cpe.jdbc.username=javauser
cpe.jdbc.password=javapassword
cpe.jdbc.maxPoolSize=2
cpe.jdbc.inUse=yes
# DB acscmds(alias=cmds)
poolName6=cmds
cmds.jdbc.driver=org.gjt.mm.mysql.Driver
cmds.jdbc.dbUrl=jdbc:mysql://localhost/acscmds?useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000
cmds.jdbc.username=javauser
cmds.jdbc.password=javapassword
cmds.jdbc.maxPoolSize=2
cmds.jdbc.inUse=yes
# DB acsinf(alias=inf)
poolName7=inf
inf.jdbc.driver=org.gjt.mm.mysql.Driver
inf.jdbc.dbUrl=jdbc:mysql://localhost/acsinf?useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000
inf.jdbc.username=javauser
inf.jdbc.password=javapassword
inf.jdbc.maxPoolSize=2
inf.jdbc.inUse=yes
# DB acscache(alias=cache)
poolName8=cache
cache.jdbc.driver=org.gjt.mm.mysql.Driver
cache.jdbc.dbUrl=jdbc:mysql://localhost/acscache?useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000
cache.jdbc.username=javauser
cache.jdbc.password=javapassword
cache.jdbc.maxPoolSize=2
cache.jdbc.inUse=yes
# DB radius(alias=radius)
poolName9=radius
radius.jdbc.driver=org.gjt.mm.mysql.Driver
radius.jdbc.dbUrl=jdbc:mysql://localhost/radius?useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000
radius.jdbc.username=javauser
radius.jdbc.password=javapassword
radius.jdbc.maxPoolSize=40
radius.jdbc.inUse=yes
# remote db host access with su privileges
# radius.ssh.login=
# radius.ssh.password=
# radius.ssh.port=
# ------------------------------------------- SSID ---------------------------------------------
# DB wireless (alias=wireless)
poolName10=wireless
wireless.jdbc.driver=org.gjt.mm.mysql.Driver
wireless.jdbc.dbUrl=jdbc:mysql://localhost/wireless?useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000
wireless.jdbc.username=javauser
wireless.jdbc.password=javapassword
wireless.jdbc.maxPoolSize=30
wireless.jdbc.inUse=yes
# memcached server address
#memcached_server_ip_port=127.0.0.1:11211
Проверьте и при необходимости измените localhost
на <virtualip>
в строках 4, 17, 26, 35, 48, 57, 66, 75, 84, 98.
Проверка репликации MariaDB
Для проверки :
Заходим в консоль MariaDB
Проверяем, что репликация работает: ( проверять надо на 2-х нодах)
MariaDB [(none)]> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: <ip_server1>
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.002455
Read_Master_Log_Pos: 89717415
Relay_Log_File: mysqld-relay-bin.000004
Relay_Log_Pos: 89717561
Relay_Master_Log_File: mysql-bin.002455
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Если репликация не работает - необходимо ее восстановить.
Проверка репликации Mongo
Для проверки :
Заходим в консоль mongo
Посмотреть конфигурацию Replica Set можно командой:
replica:PRIMARY> rs.status()
{
"set" : "replica",
"date" : ISODate("2023-01-10T09:30:20.890Z"),
"myState" : 1,
"term" : NumberLong(24),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1673343020, 1),
"t" : NumberLong(24)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1673343020, 1),
"t" : NumberLong(24)
},
"appliedOpTime" : {
"ts" : Timestamp(1673343020, 1),
"t" : NumberLong(24)
},
"durableOpTime" : {
"ts" : Timestamp(1673343020, 1),
"t" : NumberLong(24)
}
},
"lastStableCheckpointTimestamp" : Timestamp(1673342958, 1),
"electionCandidateMetrics" : {
"lastElectionReason" : "electionTimeout",
"lastElectionDate" : ISODate("2023-01-10T05:31:08.612Z"),
"electionTerm" : NumberLong(24),
"lastCommittedOpTimeAtElection" : {
"ts" : Timestamp(1673328656, 1),
"t" : NumberLong(22)
},
"lastSeenOpTimeAtElection" : {
"ts" : Timestamp(1673328656, 1),
"t" : NumberLong(22)
},
"numVotesNeeded" : 2,
"priorityAtElection" : 2,
"electionTimeoutMillis" : NumberLong(10000),
"numCatchUpOps" : NumberLong(0),
"newTermStartDate" : ISODate("2023-01-10T05:31:08.617Z"),
"wMajorityWriteAvailabilityDate" : ISODate("2023-01-10T05:31:09.488Z")
},
"electionParticipantMetrics" : {
"votedForCandidate" : true,
"electionTerm" : NumberLong(22),
"lastVoteDate" : ISODate("2023-01-10T04:15:15.939Z"),
"electionCandidateMemberId" : 1,
"voteReason" : "",
"lastAppliedOpTimeAtElection" : {
"ts" : Timestamp(1673324064, 1),
"t" : NumberLong(17)
},
"maxAppliedOpTimeInSet" : {
"ts" : Timestamp(1673324064, 1),
"t" : NumberLong(17)
},
"priorityAtElection" : 2
},
"members" : [
{
"_id" : 0,
"name" : "100.110.1.7:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 20400,
"optime" : {
"ts" : Timestamp(1673343020, 1),
"t" : NumberLong(24)
},
"optimeDate" : ISODate("2023-01-10T09:30:20Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1673328668, 1),
"electionDate" : ISODate("2023-01-10T05:31:08Z"),
"configVersion" : 75844,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "100.110.0.246:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 14361,
"optime" : {
"ts" : Timestamp(1673343018, 1),
"t" : NumberLong(24)
},
"optimeDurable" : {
"ts" : Timestamp(1673343018, 1),
"t" : NumberLong(24)
},
"optimeDate" : ISODate("2023-01-10T09:30:18Z"),
"optimeDurableDate" : ISODate("2023-01-10T09:30:18Z"),
"lastHeartbeat" : ISODate("2023-01-10T09:30:20.114Z"),
"lastHeartbeatRecv" : ISODate("2023-01-10T09:30:19.491Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "100.110.1.7:27017",
"syncSourceHost" : "100.110.1.7:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 75844
},
{
"_id" : 2,
"name" : "100.110.0.206:27017",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 12138,
"lastHeartbeat" : ISODate("2023-01-10T09:30:20.704Z"),
"lastHeartbeatRecv" : ISODate("2023-01-10T09:30:19.957Z"),
"pingMs" : NumberLong(1),
"lastHeartbeatMessage" : "",
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"configVersion" : 75844
}
],
"ok" : 1,
"operationTime" : Timestamp(1673343020, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1673343020, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
Для корректной работы необходимо иметь минимум 3 работающих сервера.
При отказе в работе, восстановление будет подразумевать удаление старой ноды и добавление новой.
Добавление/удаление/изменение узлов в Replica Set
Настройку узлов в Replica Set можно выполнять только на PRIMARY
Добавить в Replica Set узел Secondary:
replica_set_name:PRIMARY> rs.add("<ip_server>:27017")
{ "ok" : 1 }
Если MongoDB отвечает на эту команду ошибкой, возможно, нет связи со вторым узлом (или там прописан bindIp: 127.0.0.1), или там не настроен блок replication. Правильный ответ должен быть таким.
На втором узле приглашение консоли управления MongoDB должно смениться на:
root@swlc01-server:/# mongo
replica_set_name:SECONDARY>
Добавить в Replica Set узел Arbiter:
replica_set_name:PRIMARY> rs.add("<ip_server>:27017",true)
{ "ok" : 1 }
Удалить узел из Replica Set (выполнять на PRIMARY):
replica_set_name:PRIMARY> rs.remove("<ip_server>:27017")
{ "ok" : 1 }
Для корректировки адреса сервера выполнить следующее:
replica_set_name:PRIMARY> cfg = rs.conf()
replica_set_name:PRIMARY> cfg.members[<индекс>].host = "<ip_server>:27017"
replica_set_name:PRIMARY> rs.reconfig(cfg)
Проверка работы Eltex-PCRF в режиме кластера
Между серверами PCRF должны быть открыты порты 5701 tcp, 5801 tcp
На серверах в файлах конфигурации /etc/eltex-pcrf/hazelcast-cluster-network.xml нужно проверить адреса сетевых интерфейсов (в строках 5 и 22 в примере - адрес самого сервера, строки 14-15 - список всех членов кластера)
пример, часть конфигурации:
<network>
<!-- Write here public address of the node -->
<!-- здесь нужно указать собственный адрес сервера -->
<public-address>ip_server1</public-address>
<port auto-increment="false" port-count="100">5701</port>
<outbound-ports>
<ports>0</ports>
</outbound-ports>
<join>
<multicast enabled="false"/>
<tcp-ip enabled="true">
<!-- Перечислить IP-адреса всех членов кластера (включая этот) -->
<member>ip_server1</member>
<member>ip_server2</member>
</tcp-ip>
<discovery-strategies>
</discovery-strategies>
</join>
<interfaces enabled="true">
<!-- здесь нужно указать собственный адрес сервера -->
<interface>ip_server1</interface>
</interfaces>
В конфигурации /etc/eltex-pcrf/eltex-pcrf.json
нужно разрешить запуск кластера:
Перезапустить Eltex-PCRF командой
root@swlc01-server:/# service eltex-pcrf restart
Проверка состояния кластера
{
"data" : {
"enabled" : true,
"state" : "ACTIVE",
"members" : [ {
"address" : "ip_server1",
"local" : true,
"active" : true
}, {
"address" : "ip_server2",
"local" : false,
"active" : true
} ],
"messagesStats" : {
"received" : 45157,
"sent" : 45144
},
"mongo" : {
"available" : false,
"error" : "not running with --replSet"
}
},
"key" : "PcrfErrorCode.success",
"message" : "Success",
"code" : 0,
"args" : [ ]
}
|
Восстановление системы в случае неудачного обновления
Если используются виртуальные машины, на которых расположены сервисы SoftWLC и удалось выполнить снапшот системы, то восстановите ВМ из этого снапшота.
Если же ВМ не используются, то выполните ручное восстановление пакетов установленных на сервере, после чего восстановите backup БД Mongo и MariaDB.
Восстановление пакетов в случае неудачного обновления
Выполнить downgrade пакетов на предыдущую версию.
- tester@ubuntu:~$ sudo mv /etc/apt/sources.list.d/eltex.list.backup /etc/apt/sources.list.d/eltex.list
- tester@ubuntu:~$ sudo apt update
- Переустановить пакеты БД (eltex-auth-service-db, eltex-ems-db, eltex-radius-db и т.д.)
apt install eltex-ems-db
apt install eltex-auth-service-db
apt install eltex-radius-db
- Затем выполнить откат на предыдущую версию пакетов остальных (всех) модулей
apt install eltex-ems
apt install eltex-auth-service
apt install eltex-radius
Восстановление БД в случае неудачного обновления
Восстанавливаем последний backup БД MariaDB и Mongo БД.
Конфигурационный файл mongod.conf положите в домашний каталог откуда будете запускать скрипт mongo_update.sh
sudo chmod +x restore_mysql.sh
sudo ./restore_mysql.sh root root
restore_mysql.sh