Merge branch 'develop' into feature/phone-input
# Conflicts: # packages/components/index.js
This commit is contained in:
commit
41261e64b9
42
.github/workflows/4testing-multi-build.yml
vendored
Normal file
42
.github/workflows/4testing-multi-build.yml
vendored
Normal file
@ -0,0 +1,42 @@
|
||||
name: 4testing multiarch-build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "develop" ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
platform: [linux/amd64]
|
||||
steps:
|
||||
-
|
||||
name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
-
|
||||
name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v2
|
||||
-
|
||||
name: Set up Docker Buildx
|
||||
id: buildx
|
||||
uses: docker/setup-buildx-action@v1
|
||||
-
|
||||
name: Login to DockerHub
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
-
|
||||
name: Build 4testing
|
||||
run: |
|
||||
cd ./build/install/docker
|
||||
REPO="onlyoffice" \
|
||||
DOCKER_IMAGE_PREFIX="4testing-docspace" \
|
||||
DOCKER_TAG="develop" \
|
||||
DOCKERFILE="Dockerfile.app" \
|
||||
docker buildx bake -f build.yml \
|
||||
--set *.args.GIT_BRANCH="develop" \
|
||||
--set *.platform=linux/amd64 \
|
||||
--push
|
||||
shell: bash
|
@ -48,7 +48,8 @@ DIST="";
|
||||
REV="";
|
||||
KERNEL="";
|
||||
|
||||
INSTALL_KAFKA="true";
|
||||
INSTALL_REDIS="true";
|
||||
INSTALL_RABBITMQ="true";
|
||||
INSTALL_MYSQL_SERVER="true";
|
||||
INSTALL_DOCUMENT_SERVER="true";
|
||||
INSTALL_PRODUCT="true";
|
||||
@ -58,6 +59,7 @@ HUB="";
|
||||
USERNAME="";
|
||||
PASSWORD="";
|
||||
|
||||
MYSQL_VERSION=""
|
||||
MYSQL_DATABASE=""
|
||||
MYSQL_USER=""
|
||||
MYSQL_PASSWORD=""
|
||||
@ -65,19 +67,17 @@ MYSQL_ROOT_PASSWORD=""
|
||||
MYSQL_HOST=""
|
||||
DATABASE_MIGRATION="true"
|
||||
|
||||
ZOO_PORT=""
|
||||
ZOO_HOST=""
|
||||
KAFKA_HOST=""
|
||||
|
||||
ELK_VERSION=""
|
||||
ELK_HOST=""
|
||||
|
||||
DOCUMENT_SERVER_IMAGE_NAME=onlyoffice/4testing-documentserver-ee:latest
|
||||
DOCUMENT_SERVER_JWT_SECRET=""
|
||||
DOCUMENT_SERVER_JWT_HEADER=""
|
||||
DOCUMENT_SERVER_HOST=""
|
||||
|
||||
APP_CORE_BASE_DOMAIN=""
|
||||
APP_CORE_MACHINEKEY=""
|
||||
APP_DOTNET_ENV=""
|
||||
ENV_EXTENSION=""
|
||||
|
||||
HELP_TARGET="install-Docker.sh";
|
||||
|
||||
@ -138,9 +138,16 @@ while [ "$1" != "" ]; do
|
||||
fi
|
||||
;;
|
||||
|
||||
-ikafka | --installkafka )
|
||||
-ira | --installrabbitmq )
|
||||
if [ "$2" != "" ]; then
|
||||
INSTALL_KAFKA=$2
|
||||
INSTALL_RABBITMQ=$2
|
||||
shift
|
||||
fi
|
||||
;;
|
||||
|
||||
-ire | --installredis )
|
||||
if [ "$2" != "" ]; then
|
||||
INSTALL_REDIS=$2
|
||||
shift
|
||||
fi
|
||||
;;
|
||||
@ -187,27 +194,6 @@ while [ "$1" != "" ]; do
|
||||
fi
|
||||
;;
|
||||
|
||||
-zp | --zookeeperport )
|
||||
if [ "$2" != "" ]; then
|
||||
ZOO_PORT=$2
|
||||
shift
|
||||
fi
|
||||
;;
|
||||
|
||||
-zh | --zookeeperhost )
|
||||
if [ "$2" != "" ]; then
|
||||
ZOO_HOST=$2
|
||||
shift
|
||||
fi
|
||||
;;
|
||||
|
||||
-kh | --kafkahost )
|
||||
if [ "$2" != "" ]; then
|
||||
KAFKA_HOST=$2
|
||||
shift
|
||||
fi
|
||||
;;
|
||||
|
||||
-esh | --elasticsearchhost )
|
||||
if [ "$2" != "" ]; then
|
||||
ELK_HOST=$2
|
||||
@ -252,7 +238,7 @@ while [ "$1" != "" ]; do
|
||||
|
||||
-env | --environment )
|
||||
if [ "$2" != "" ]; then
|
||||
APP_DOTNET_ENV=$2
|
||||
ENV_EXTENSION=$2
|
||||
shift
|
||||
fi
|
||||
;;
|
||||
@ -311,16 +297,14 @@ while [ "$1" != "" ]; do
|
||||
echo " -ids, --installdocumentserver install or update document server (true|false)"
|
||||
echo " -di, --documentserverimage document server image name"
|
||||
echo " -imysql, --installmysql install or update mysql (true|false)"
|
||||
echo " -ikafka, --installkafka install or update kafka (true|false)"
|
||||
echo " -ira, --installrabbitmq install or update rabbitmq (true|false)"
|
||||
echo " -ire, --installredis install or update redis (true|false)"
|
||||
echo " -mysqlrp, --mysqlrootpassword mysql server root password"
|
||||
echo " -mysqld, --mysqldatabase $PRODUCT database name"
|
||||
echo " -mysqlu, --mysqluser $PRODUCT database user"
|
||||
echo " -mysqlp, --mysqlpassword $PRODUCT database password"
|
||||
echo " -mysqlh, --mysqlhost mysql server host"
|
||||
echo " -dsh, --docspdcehost $PRODUCT host"
|
||||
echo " -zp, --zookeeperport zookeeper port (default value 2181)"
|
||||
echo " -zh, --zookeeperhost zookeeper host"
|
||||
echo " -kh, --kafkahost kafka host"
|
||||
echo " -esh, --elasticsearchhost elasticsearch host"
|
||||
echo " -env, --environment $PRODUCT environment"
|
||||
echo " -skiphc, --skiphardwarecheck skip hardware check (true|false)"
|
||||
@ -826,6 +810,7 @@ install_mysql_server () {
|
||||
MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:-"$MYSQL_PASSWORD"}
|
||||
fi
|
||||
|
||||
reconfigure MYSQL_VERSION ${MYSQL_VERSION}
|
||||
reconfigure MYSQL_DATABASE ${MYSQL_DATABASE}
|
||||
reconfigure MYSQL_USER ${MYSQL_USER}
|
||||
reconfigure MYSQL_PASSWORD ${MYSQL_PASSWORD}
|
||||
@ -842,35 +827,47 @@ install_document_server () {
|
||||
fi
|
||||
|
||||
reconfigure DOCUMENT_SERVER_IMAGE_NAME ${DOCUMENT_SERVER_IMAGE_NAME}
|
||||
reconfigure DOCUMENT_SERVER_JWT_HEADER ${DOCUMENT_SERVER_JWT_HEADER}
|
||||
reconfigure DOCUMENT_SERVER_JWT_SECRET ${DOCUMENT_SERVER_JWT_SECRET}
|
||||
reconfigure DOCUMENT_SERVER_HOST ${DOCUMENT_SERVER_HOST}
|
||||
|
||||
docker-compose -f $BASE_DIR/ds.yml up -d
|
||||
}
|
||||
|
||||
install_kafka () {
|
||||
reconfigure ZOO_PORT ${ZOO_PORT}
|
||||
reconfigure ZOO_HOST ${ZOO_HOST}
|
||||
reconfigure KAFKA_HOST ${KAFKA_HOST}
|
||||
install_rabbitmq () {
|
||||
if ! command_exists docker-compose; then
|
||||
install_docker_compose
|
||||
fi
|
||||
|
||||
docker-compose -f $BASE_DIR/kafka.yml up -d
|
||||
docker-compose -f $BASE_DIR/rabbitmq.yml up -d
|
||||
}
|
||||
|
||||
install_redis () {
|
||||
if ! command_exists docker-compose; then
|
||||
install_docker_compose
|
||||
fi
|
||||
|
||||
docker-compose -f $BASE_DIR/redis.yml up -d
|
||||
}
|
||||
|
||||
install_product () {
|
||||
if ! command_exists docker-compose; then
|
||||
install_docker_compose
|
||||
fi
|
||||
reconfigure ENV_EXTENSION ${ENV_EXTENSION}
|
||||
reconfigure ELK_HOST ${ELK_HOST}
|
||||
reconfigure ELK_VERSION ${ELK_VERSION}
|
||||
reconfigure SERVICE_PORT ${SERVICE_PORT}
|
||||
reconfigure APP_CORE_MACHINEKEY ${APP_CORE_MACHINEKEY}
|
||||
reconfigure APP_CORE_BASE_DOMAIN ${APP_CORE_BASE_DOMAIN}
|
||||
reconfigure DOCKER_TAG ${DOCKER_TAG}
|
||||
|
||||
if [[ -n $EXTERNAL_PORT ]]; then
|
||||
sed -i "s/8092:8092/${EXTERNAL_PORT}:8092/g" $BASE_DIR/$PRODUCT.yml
|
||||
sed -i "s/8092:8092/${EXTERNAL_PORT}:8092/g" $BASE_DIR/appserver.yml
|
||||
fi
|
||||
|
||||
docker-compose -f $BASE_DIR/$PRODUCT.yml up -d
|
||||
docker-compose -f $BASE_DIR/migration-runner.yml up -d
|
||||
docker-compose -f $BASE_DIR/appserver.yml up -d
|
||||
docker-compose -f $BASE_DIR/notify.yml up -d
|
||||
}
|
||||
|
||||
@ -903,7 +900,7 @@ check_image_RepoDigest() {
|
||||
}
|
||||
|
||||
docker_image_update() {
|
||||
docker-compose -f $BASE_DIR/notify.yml -f $BASE_DIR/$PRODUCT.yml down --volumes
|
||||
docker-compose -f $BASE_DIR/notify.yml -f $BASE_DIR/appserver.yml down --volumes
|
||||
docker-compose -f $BASE_DIR/build.yml pull
|
||||
}
|
||||
|
||||
@ -943,16 +940,14 @@ save_parameters_from_configs() {
|
||||
MYSQL_ROOT_PASSWORD=$(save_parameter MYSQL_ROOT_PASSWORD $MYSQL_ROOT_PASSWORD)
|
||||
MYSQL_HOST=$(save_parameter MYSQL_HOST $MYSQL_HOST)
|
||||
DOCUMENT_SERVER_JWT_SECRET=$(save_parameter DOCUMENT_SERVER_JWT_SECRET $DOCUMENT_SERVER_JWT_SECRET)
|
||||
DOCUMENT_SERVER_JWT_HEADER=$(save_parameter DOCUMENT_SERVER_JWT_HEADER $DOCUMENT_SERVER_JWT_HEADER)
|
||||
DOCUMENT_SERVER_HOST=$(save_parameter DOCUMENT_SERVER_HOST $DOCUMENT_SERVER_HOST)
|
||||
ZOO_PORT=$(save_parameter ZOO_PORT $ZOO_PORT)
|
||||
ZOO_HOST=$(save_parameter ZOO_HOST $ZOO_HOST)
|
||||
KAFKA_HOST=$(save_parameter KAFKA_HOST $KAFKA_HOST)
|
||||
ELK_HOST=$(save_parameter ELK_HOST $ELK_HOST)
|
||||
SERVICE_PORT=$(save_parameter SERVICE_PORT $SERVICE_PORT)
|
||||
APP_CORE_MACHINEKEY=$(save_parameter APP_CORE_MACHINEKEY $APP_CORE_MACHINEKEY)
|
||||
APP_CORE_BASE_DOMAIN=$(save_parameter APP_CORE_BASE_DOMAIN $APP_CORE_BASE_DOMAIN)
|
||||
if [ ${EXTERNAL_PORT} = "8092" ]; then
|
||||
EXTERNAL_PORT=$(grep -oP '(?<=- ).*?(?=:8092)' /app/onlyoffice/$PRODUCT.yml)
|
||||
EXTERNAL_PORT=$(grep -oP '(?<=- ).*?(?=:8092)' /app/onlyoffice/appserver.yml)
|
||||
fi
|
||||
}
|
||||
|
||||
@ -1004,8 +999,12 @@ start_installation () {
|
||||
install_document_server
|
||||
fi
|
||||
|
||||
if [ "$INSTALL_KAFKA" == "true" ]; then
|
||||
install_kafka
|
||||
if [ "$INSTALL_RABBITMQ" == "true" ]; then
|
||||
install_rabbitmq
|
||||
fi
|
||||
|
||||
if [ "$INSTALL_REDIS" == "true" ]; then
|
||||
install_redis
|
||||
fi
|
||||
|
||||
if [ "$INSTALL_PRODUCT" == "true" ]; then
|
||||
|
@ -4,19 +4,19 @@ set -e
|
||||
|
||||
PRODUCT="docspace"
|
||||
ENVIRONMENT="production"
|
||||
PACKAGE_SYSNAME="onlyoffice"
|
||||
|
||||
APP_DIR="/etc/onlyoffice/${PRODUCT}"
|
||||
APP_DIR="/etc/${PACKAGE_SYSNAME}/${PRODUCT}"
|
||||
PRODUCT_DIR="/var/www/${PRODUCT}"
|
||||
USER_CONF="$APP_DIR/appsettings.$ENVIRONMENT.json"
|
||||
|
||||
NGINX_DIR="/etc/nginx"
|
||||
NGINX_CONF="${NGINX_DIR}/conf.d"
|
||||
SYSTEMD_DIR="/lib/systemd/system"
|
||||
|
||||
MYSQL=""
|
||||
DB_HOST=""
|
||||
DB_HOST="localhost"
|
||||
DB_PORT="3306"
|
||||
DB_NAME=""
|
||||
DB_USER=""
|
||||
DB_NAME="${PACKAGE_SYSNAME}"
|
||||
DB_USER="root"
|
||||
DB_PWD=""
|
||||
|
||||
APP_HOST="localhost"
|
||||
@ -31,7 +31,8 @@ ELK_PORT="9200"
|
||||
|
||||
RABBITMQ_HOST="localhost"
|
||||
RABBITMQ_USER="guest"
|
||||
RABBITMQ_PWD="guest"
|
||||
RABBITMQ_PASSWORD="guest"
|
||||
RABBITMQ_PORT="5672"
|
||||
|
||||
REDIS_HOST="localhost"
|
||||
REDIS_PORT="6379"
|
||||
@ -156,12 +157,19 @@ while [ "$1" != "" ]; do
|
||||
fi
|
||||
;;
|
||||
|
||||
-rbp | --rabbitmqpassword )
|
||||
-rbpw | --rabbitmqpassword )
|
||||
if [ "$2" != "" ]; then
|
||||
RABBITMQ_PASSWORD=$2
|
||||
shift
|
||||
fi
|
||||
;;
|
||||
|
||||
-rbp | --rabbitmqport )
|
||||
if [ "$2" != "" ]; then
|
||||
RABBITMQ_PORT=$2
|
||||
shift
|
||||
fi
|
||||
;;
|
||||
|
||||
-? | -h | --help )
|
||||
echo " Usage: bash ${PRODUCT}-configuration.sh [PARAMETER] [[PARAMETER], ...]"
|
||||
@ -176,8 +184,9 @@ while [ "$1" != "" ]; do
|
||||
echo " -rdh, --redishost redis ip"
|
||||
echo " -rdp, --redisport redis port (default 6379)"
|
||||
echo " -rbh, --rabbitmqhost rabbitmq ip"
|
||||
echo " -rbp, --rabbitmqport rabbitmq port"
|
||||
echo " -rbu, --rabbitmquser rabbitmq user"
|
||||
echo " -rbp, --rabbitmqpassword rabbitmq password"
|
||||
echo " -rbpw, --rabbitmqpassword rabbitmq password"
|
||||
echo " -mysqlh, --mysqlhost mysql server host"
|
||||
echo " -mysqld, --mysqldatabase ${PRODUCT} database name"
|
||||
echo " -mysqlu, --mysqluser ${PRODUCT} database user"
|
||||
@ -216,7 +225,7 @@ install_json() {
|
||||
#Creating a user-defined .json
|
||||
if [ ! -e $USER_CONF ]; then
|
||||
echo "{}" >> $USER_CONF
|
||||
chown onlyoffice:onlyoffice $USER_CONF
|
||||
chown ${PACKAGE_SYSNAME}:${PACKAGE_SYSNAME} $USER_CONF
|
||||
|
||||
set_core_machinekey
|
||||
$JSON_USERCONF "this.core={'base-domain': \"$APP_HOST\", 'machinekey': \"$CORE_MACHINEKEY\" }" >/dev/null 2>&1
|
||||
@ -224,14 +233,16 @@ install_json() {
|
||||
}
|
||||
|
||||
restart_services() {
|
||||
echo -n "Restarting services... "
|
||||
|
||||
sed -e "s/ENVIRONMENT=.*/ENVIRONMENT=$ENVIRONMENT/" -e "s/environment=.*/environment=$ENVIRONMENT/" -i $SYSTEMD_DIR/${PRODUCT}*.service >/dev/null 2>&1
|
||||
sed -e "s/ENVIRONMENT=.*/ENVIRONMENT=$ENVIRONMENT/" -e "s/environment=.*/environment=$ENVIRONMENT/" -i /lib/systemd/system/${PRODUCT}*.service >/dev/null 2>&1
|
||||
systemctl daemon-reload
|
||||
|
||||
systemctl start ${PRODUCT}-migration-runner || true
|
||||
echo -n "Updating database... "
|
||||
systemctl start ${PRODUCT}-migration-runner >/dev/null 2>&1 || true
|
||||
sleep 15
|
||||
echo "OK"
|
||||
|
||||
for SVC in api urlshortener socket studio-notify notify \
|
||||
echo -n "Restarting services... "
|
||||
for SVC in login api urlshortener socket studio-notify notify \
|
||||
people-server files files-services studio backup telegram-service \
|
||||
webhooks-service clear-events backup-background migration ssoauth doceditor
|
||||
do
|
||||
@ -412,7 +423,7 @@ setup_nginx(){
|
||||
|
||||
# Remove default nginx website
|
||||
rm -f $NGINX_CONF/default.conf >/dev/null 2>&1 || rm -f $NGINX_DIR/sites-enabled/default >/dev/null 2>&1
|
||||
sed -i "s/listen.*;/listen $APP_PORT;/" $NGINX_CONF/onlyoffice.conf
|
||||
sed -i "s/listen.*;/listen $APP_PORT;/" $NGINX_CONF/${PACKAGE_SYSNAME}.conf
|
||||
|
||||
if [ "$DIST" = "RedHat" ]; then
|
||||
# Remove default nginx settings
|
||||
@ -427,12 +438,26 @@ setup_nginx(){
|
||||
if $(getenforce) >/dev/null 2>&1; then
|
||||
case $(getenforce) in
|
||||
enforcing|permissive)
|
||||
PORTS+=('8081') #Storybook
|
||||
PORTS+=("$DOCUMENT_SERVER_PORT")
|
||||
PORTS+=('5001') #ASC.Web.Studio
|
||||
PORTS+=('5002') #ASC.People
|
||||
PORTS+=('5008') #ASC.Files/client
|
||||
PORTS+=('5000') #ASC.Web.Api
|
||||
PORTS+=('5001') #client
|
||||
PORTS+=('5003') #ASC.Web.Studio
|
||||
PORTS+=('5004') #ASC.People
|
||||
PORTS+=('5005') #ASC.Notify
|
||||
PORTS+=('5006') #ASC.Studio.Notify
|
||||
PORTS+=('5007') #ASC.Files/server
|
||||
PORTS+=('5009') #ASC.Files/service
|
||||
PORTS+=('5011') #ASC.Login
|
||||
PORTS+=('5012') #ASC.Data.Backup
|
||||
PORTS+=('5013') #ASC.Files/editor
|
||||
PORTS+=('5018') #ASC.Migration
|
||||
PORTS+=('5027') #ASC.ClearEvents
|
||||
PORTS+=('5028') #ASC.Socket.IO
|
||||
PORTS+=('5029') #ASC.UrlShortener
|
||||
PORTS+=('5031') #ASC.Webhooks.Service
|
||||
PORTS+=('5032') #ASC.Data.Backup.BackgroundTasks
|
||||
PORTS+=('8081') #Storybook
|
||||
PORTS+=('9834') #ASC.SsoAuth
|
||||
PORTS+=('51702') #ASC.TelegramService
|
||||
setsebool -P httpd_can_network_connect on
|
||||
;;
|
||||
disabled)
|
||||
@ -448,7 +473,6 @@ setup_nginx(){
|
||||
fi
|
||||
fi
|
||||
chown nginx:nginx /etc/nginx/* -R
|
||||
sudo sed -e 's/#//' -i $NGINX_CONF/onlyoffice.conf
|
||||
systemctl enable nginx >/dev/null 2>&1
|
||||
systemctl restart nginx
|
||||
echo "OK"
|
||||
@ -456,13 +480,13 @@ setup_nginx(){
|
||||
|
||||
setup_docs() {
|
||||
echo -n "Configuring Docs... "
|
||||
local DS_CONF="/etc/onlyoffice/documentserver/local.json"
|
||||
local DS_CONF="/etc/${PACKAGE_SYSNAME}/documentserver/local.json"
|
||||
local JSON_DSCONF="$JSON $DS_CONF -e"
|
||||
|
||||
#Changing the Docs port in nginx conf
|
||||
sed -i "s/0.0.0.0:.*;/0.0.0.0:$DOCUMENT_SERVER_PORT;/" $NGINX_CONF/ds.conf
|
||||
sed -i "s/]:.*;/]:$DOCUMENT_SERVER_PORT default_server;/g" $NGINX_CONF/ds.conf
|
||||
sed "0,/proxy_pass .*;/{s/proxy_pass .*;/proxy_pass http:\/\/${DOCUMENT_SERVER_HOST}:${DOCUMENT_SERVER_PORT};/}" -i $NGINX_CONF/onlyoffice.conf
|
||||
sed "0,/proxy_pass .*;/{s/proxy_pass .*;/proxy_pass http:\/\/${DOCUMENT_SERVER_HOST}:${DOCUMENT_SERVER_PORT};/}" -i $NGINX_CONF/${PACKAGE_SYSNAME}.conf
|
||||
|
||||
#Enable JWT validation for Docs
|
||||
$JSON_DSCONF "this.services.CoAuthoring.token.enable.browser='true'" >/dev/null 2>&1
|
||||
@ -475,7 +499,7 @@ setup_docs() {
|
||||
#Save Docs address and JWT in .json
|
||||
$JSON_USERCONF "this.files={'docservice': {\
|
||||
'secret': {'value': \"$DOCUMENT_SERVER_JWT_SECRET\",'header': \"$DOCUMENT_SERVER_JWT_HEADER\"}, \
|
||||
'url': {'public': '/ds-vpath/','internal': \"http://${DOCUMENT_SERVER_HOST}:${DOCUMENT_SERVER_PORT}\",'portal': \"http://$APP_HOST:$APP_PORT\"}}}" >/dev/null 2>&1
|
||||
'url': {'public': \"http://${DOCUMENT_SERVER_HOST}:${DOCUMENT_SERVER_PORT}\", 'internal': \"http://${DOCUMENT_SERVER_HOST}:${DOCUMENT_SERVER_PORT}\",'portal': \"http://$APP_HOST:$APP_PORT\"}}}" >/dev/null 2>&1
|
||||
|
||||
#Docs Database Migration
|
||||
local DOCUMENT_SERVER_DB_HOST=$(json -f ${DS_CONF} services.CoAuthoring.sql.dbHost)
|
||||
@ -485,7 +509,7 @@ setup_docs() {
|
||||
local DOCUMENT_SERVER_DB_PASSWORD=$(json -f ${DS_CONF} services.CoAuthoring.sql.dbPass)
|
||||
local DS_CONNECTION_STRING="Host=${DOCUMENT_SERVER_DB_HOST};Port=${DOCUMENT_SERVER_DB_PORT};Database=${DOCUMENT_SERVER_DB_NAME};Username=${DOCUMENT_SERVER_DB_USERNAME};Password=${DOCUMENT_SERVER_DB_PASSWORD};"
|
||||
|
||||
sed "s/Host=.*/$DS_CONNECTION_STRING;\"/g" -i $PRODUCT_DIR/services/ASC.Migration.Runner/appsettings.json
|
||||
sed "s/Host=.*/$DS_CONNECTION_STRING\"/g" -i $PRODUCT_DIR/services/ASC.Migration.Runner/appsettings.json
|
||||
|
||||
echo "OK"
|
||||
}
|
||||
@ -576,7 +600,7 @@ setup_redis() {
|
||||
setup_rabbitmq() {
|
||||
echo -n "Configuring rabbitmq... "
|
||||
|
||||
$JSON $APP_DIR/rabbitmq.json -e "this.RabbitMQ={'Hostname': \"${RABBITMQ_HOST}\",'UserName': \"${RABBITMQ_USER}\",'Password': \"${RABBITMQ_PASSWORD}\" }" >/dev/null 2>&1
|
||||
$JSON $APP_DIR/rabbitmq.json -e "this.RabbitMQ={'Hostname': \"${RABBITMQ_HOST}\",'UserName': \"${RABBITMQ_USER}\",'Password': \"${RABBITMQ_PASSWORD}\",'Port': \"${RABBITMQ_PORT}\",'VirtualHost': \"/\" }" >/dev/null 2>&1
|
||||
|
||||
systemctl enable rabbitmq-server >/dev/null 2>&1
|
||||
systemctl restart rabbitmq-server
|
||||
@ -607,7 +631,7 @@ if $PACKAGE_MANAGER nginx >/dev/null 2>&1; then
|
||||
setup_nginx
|
||||
fi
|
||||
|
||||
if $PACKAGE_MANAGER onlyoffice-documentserver >/dev/null 2>&1 || $PACKAGE_MANAGER onlyoffice-documentserver-de >/dev/null 2>&1 || $PACKAGE_MANAGER onlyoffice-documentserver-ee >/dev/null 2>&1; then
|
||||
if $PACKAGE_MANAGER ${PACKAGE_SYSNAME}-documentserver >/dev/null 2>&1 || $PACKAGE_MANAGER ${PACKAGE_SYSNAME}-documentserver-de >/dev/null 2>&1 || $PACKAGE_MANAGER ${PACKAGE_SYSNAME}-documentserver-ee >/dev/null 2>&1; then
|
||||
setup_docs
|
||||
fi
|
||||
|
||||
|
@ -61,6 +61,7 @@ SERVICE_NAME=(
|
||||
migration
|
||||
doceditor
|
||||
migration-runner
|
||||
login
|
||||
)
|
||||
|
||||
reassign_values (){
|
||||
@ -154,24 +155,32 @@ reassign_values (){
|
||||
WORK_DIR="${BASE_DIR}/services/ASC.Migration.Runner/"
|
||||
EXEC_FILE="ASC.Migration.Runner.dll"
|
||||
;;
|
||||
login )
|
||||
SERVICE_PORT="5011"
|
||||
WORK_DIR="${BASE_DIR}/products/ASC.Login/login/"
|
||||
EXEC_FILE="server.js"
|
||||
;;
|
||||
esac
|
||||
SERVICE_NAME="$1"
|
||||
if [[ "${EXEC_FILE}" == *".js" ]]; then
|
||||
SERVICE_TYPE="simple"
|
||||
SERVICE_TYPE="simple"
|
||||
RESTART="always"
|
||||
EXEC_START="${NODE_RUN} ${WORK_DIR}${EXEC_FILE} --app.port=${SERVICE_PORT} --app.appsettings=${PATH_TO_CONF} --app.environment=${ENVIRONMENT}"
|
||||
elif [[ "${SERVICE_NAME}" = "migration-runner" ]]; then
|
||||
SERVICE_TYPE="notify"
|
||||
SERVICE_TYPE="simple"
|
||||
RESTART="no"
|
||||
EXEC_START="${DOTNET_RUN} ${WORK_DIR}${EXEC_FILE}"
|
||||
else
|
||||
SERVICE_TYPE="notify"
|
||||
SERVICE_TYPE="notify"
|
||||
RESTART="always"
|
||||
EXEC_START="${DOTNET_RUN} ${WORK_DIR}${EXEC_FILE} --urls=${APP_URLS}:${SERVICE_PORT} --pathToConf=${PATH_TO_CONF} \
|
||||
--'\$STORAGE_ROOT'=${STORAGE_ROOT} --log:dir=${LOG_DIR} --log:name=${SERVICE_NAME}${CORE}${ENVIRONMENT}"
|
||||
fi
|
||||
}
|
||||
|
||||
write_to_file () {
|
||||
sed -i -e 's#${SERVICE_NAME}#'$SERVICE_NAME'#g' -e 's#${WORK_DIR}#'$WORK_DIR'#g' -e \
|
||||
"s#\${EXEC_START}#$EXEC_START#g" -e "s#\${SERVICE_TYPE}#$SERVICE_TYPE#g" $BUILD_PATH/${PRODUCT}-${SERVICE_NAME[$i]}.service
|
||||
sed -i -e 's#${SERVICE_NAME}#'$SERVICE_NAME'#g' -e 's#${WORK_DIR}#'$WORK_DIR'#g' -e "s#\${RESTART}#$RESTART#g" \
|
||||
-e "s#\${EXEC_START}#$EXEC_START#g" -e "s#\${SERVICE_TYPE}#$SERVICE_TYPE#g" $BUILD_PATH/${PRODUCT}-${SERVICE_NAME[$i]}.service
|
||||
}
|
||||
|
||||
mkdir -p $BUILD_PATH
|
||||
|
@ -10,7 +10,7 @@ WorkingDirectory=${WORK_DIR}
|
||||
ExecStart=${EXEC_START}
|
||||
TimeoutSec=600
|
||||
|
||||
Restart=always
|
||||
Restart=${RESTART}
|
||||
PrivateTmp=false
|
||||
|
||||
[Install]
|
||||
|
@ -17,6 +17,7 @@ db_input medium {{product}}/redis-port || true
|
||||
|
||||
db_input medium {{product}}/rabbitmq-host || true
|
||||
db_input medium {{product}}/rabbitmq-user || true
|
||||
db_input medium {{product}}/rabbitmq-port || true
|
||||
db_input medium {{product}}/rabbitmq-password || true
|
||||
|
||||
db_input medium {{product}}/db-host || true
|
||||
|
@ -16,6 +16,7 @@ Depends: {{product}}-api (= {{package_header_tag_version}}),
|
||||
{{product}}-doceditor(= {{package_header_tag_version}}),
|
||||
{{product}}-files (= {{package_header_tag_version}}),
|
||||
{{product}}-files-services (= {{package_header_tag_version}}),
|
||||
{{product}}-login (= {{package_header_tag_version}}),
|
||||
{{product}}-migration (= {{package_header_tag_version}}),
|
||||
{{product}}-migration-runner (= {{package_header_tag_version}}),
|
||||
{{product}}-notify (= {{package_header_tag_version}}),
|
||||
@ -192,3 +193,11 @@ Depends: {{product}}-common (= {{package_header_tag_version}}),
|
||||
${misc:Depends},
|
||||
${shlibs:Depends}
|
||||
Description: Description
|
||||
|
||||
Package: {{product}}-login
|
||||
Architecture: any
|
||||
Depends: {{product}}-common (= {{package_header_tag_version}}),
|
||||
nodejs (>=14),
|
||||
${misc:Depends},
|
||||
${shlibs:Depends}
|
||||
Description: Description
|
||||
|
@ -31,6 +31,8 @@ case "$1" in
|
||||
RABBITMQ_HOST="$RET"
|
||||
db_get {{product}}/rabbitmq-user || true
|
||||
RABBITMQ_USER="$RET"
|
||||
db_get {{product}}/rabbitmq-port || true
|
||||
RABBITMQ_PORT="$RET"
|
||||
db_get {{product}}/rabbitmq-password || true
|
||||
RABBITMQ_PASSWORD="$RET"
|
||||
|
||||
@ -46,8 +48,8 @@ case "$1" in
|
||||
db_get onlyoffice/ds-port || true
|
||||
DOCUMENT_SERVER_PORT="$RET"
|
||||
|
||||
bash /usr/bin/{{product}}-configuration.sh -e $ENVIRONMENT -mysqlh $DB_HOST -mysqld $DB_NAME -mysqlu $DB_USER -mysqlp $DB_PWD -ash $APP_HOST -asp $APP_PORT \
|
||||
-dsh $DOCUMENT_SERVER_HOST -dsp $DOCUMENT_SERVER_PORT -rdh $REDIS_HOST -rdp $REDIS_PORT -rbh $RABBITMQ_HOST -rbu $RABBITMQ_USER -rbp $RABBITMQ_PASSWORD -ess $ELK_SHEME -esh $ELK_HOST -esp $ELK_PORT
|
||||
bash /usr/bin/{{product}}-configuration.sh -e $ENVIRONMENT -mysqlh $DB_HOST -mysqld $DB_NAME -mysqlu $DB_USER -mysqlp $DB_PWD -ash $APP_HOST -asp $APP_PORT -dsh $DOCUMENT_SERVER_HOST \
|
||||
-dsp $DOCUMENT_SERVER_PORT -rdh $REDIS_HOST -rdp $REDIS_PORT -rbh $RABBITMQ_HOST -rbp $RABBITMQ_PORT -rbu $RABBITMQ_USER -rbpw $RABBITMQ_PASSWORD -ess $ELK_SHEME -esh $ELK_HOST -esp $ELK_PORT
|
||||
;;
|
||||
|
||||
abort-upgrade|abort-remove|abort-deconfigure)
|
||||
|
1
build/install/deb/debian/product-login.install
Normal file
1
build/install/deb/debian/product-login.install
Normal file
@ -0,0 +1 @@
|
||||
../../../build/deploy/login/* var/www/{{product}}/products/ASC.Login/login
|
@ -3,4 +3,3 @@
|
||||
../../../config/nginx/includes/onlyoffice*.conf etc/nginx/includes
|
||||
../../../build/deploy/public/* var/www/{{product}}/public
|
||||
../../../build/deploy/client/* var/www/{{product}}/client
|
||||
../../../build/deploy/login/* var/www/{{product}}/login
|
||||
|
@ -32,6 +32,7 @@ override_dh_auto_build:
|
||||
bash build-backend.sh -sp ${SRC_PATH}; \
|
||||
bash publish-backend.sh -sp ${SRC_PATH}
|
||||
|
||||
rm ${SRC_PATH}/config/nginx/onlyoffice-login.conf
|
||||
sed -i "s@var/www@var/www/${PRODUCT}@g" ${SRC_PATH}/config/nginx/*.conf
|
||||
sed -i "s@var/www@var/www/${PRODUCT}@g" ${SRC_PATH}/config/nginx/includes/*.conf
|
||||
|
||||
|
@ -63,6 +63,11 @@ Type: string
|
||||
Default: localhost
|
||||
Description: RabbitMQ host:
|
||||
|
||||
Template: {{product}}/rabbitmq-port
|
||||
Type: string
|
||||
Default: 5672
|
||||
Description: RabbitMQ port:
|
||||
|
||||
Template: {{product}}/rabbitmq-user
|
||||
Type: string
|
||||
Default: guest
|
||||
|
@ -2,12 +2,13 @@
|
||||
PRODUCT=onlyoffice
|
||||
REPO=${PRODUCT}
|
||||
STATUS=""
|
||||
DOCKER_IMAGE_PREFIX=${STATUS}docspace
|
||||
DOCKER_TAG=latest
|
||||
CONTAINER_PREFIX=${PRODUCT}-
|
||||
MYSQL_VERSION=8.0.18
|
||||
ELK_VERSION=7.13.1
|
||||
SERVICE_PORT=5050
|
||||
CONTAINER_PREFIX=${PRODUCT}-
|
||||
DOCUMENT_SERVER_IMAGE_NAME=onlyoffice/4testing-documentserver-ee:latest
|
||||
DOCKER_TAG=latest
|
||||
DOCKERFILE=Dockerfile.app
|
||||
|
||||
# zookeeper #
|
||||
@ -69,6 +70,7 @@
|
||||
MIGRATION_RUNNER_HOST=${CONTAINER_PREFIX}migration-runner
|
||||
PROXY_HOST=${CONTAINER_PREFIX}proxy
|
||||
DOCEDITOR_HOST=${CONTAINER_PREFIX}doceditor
|
||||
LOGIN_HOST=${CONTAINER_PREFIX}login
|
||||
|
||||
# proxy upstream environment #
|
||||
SERVICE_API_SYSTEM=${API_SYSTEM_HOST}:${SERVICE_PORT}
|
||||
@ -91,5 +93,6 @@
|
||||
SERVICE_STUDIO=${STUDIO_HOST}:${SERVICE_PORT}
|
||||
SERVICE_SSOAUTH=${SSOAUTH_HOST}:${SERVICE_PORT}
|
||||
SERVICE_DOCEDITOR=${DOCEDITOR_HOST}:5013
|
||||
SERVICE_LOGIN=${LOGIN_HOST}:5011
|
||||
|
||||
NETWORK_NAME=${PRODUCT}
|
||||
|
@ -23,20 +23,19 @@ ENV LANG=en_US.UTF-8 \
|
||||
LC_ALL=en_US.UTF-8
|
||||
|
||||
RUN apt-get -y update && \
|
||||
apt-get -y upgrade && \
|
||||
apt-get -y dist-upgrade && \
|
||||
apt-get install -yq sudo locales && \
|
||||
addgroup --system --gid 107 onlyoffice && \
|
||||
adduser -uid 104 --quiet --home /var/www/onlyoffice --system --gid 107 onlyoffice && \
|
||||
apt-get install -yq \
|
||||
sudo \
|
||||
locales \
|
||||
git \
|
||||
npm && \
|
||||
locale-gen en_US.UTF-8 && \
|
||||
apt-get -y update && \
|
||||
apt-get install -yq git apt-utils npm && \
|
||||
npm install --global yarn && \
|
||||
curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash - && \
|
||||
apt-get install -y nodejs
|
||||
apt-get install -y nodejs && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
RUN echo ${GIT_BRANCH} && \
|
||||
git clone --recurse-submodules -b ${GIT_BRANCH} https://github.com/ONLYOFFICE/AppServer.git ${SRC_PATH}
|
||||
git clone --depth 1 --recurse-submodules -b ${GIT_BRANCH} https://github.com/ONLYOFFICE/DocSpace.git ${SRC_PATH}
|
||||
|
||||
RUN cd ${SRC_PATH} && \
|
||||
# mkdir -p /app/onlyoffice/config/ && cp -rf config/* /app/onlyoffice/config/ && \
|
||||
@ -62,9 +61,7 @@ RUN cd ${SRC_PATH} && \
|
||||
|
||||
COPY config/mysql/conf.d/mysql.cnf /etc/mysql/conf.d/mysql.cnf
|
||||
|
||||
RUN rm -rf /var/lib/apt/lists/*
|
||||
|
||||
FROM $DOTNET_RUN as builder
|
||||
FROM $DOTNET_RUN as dotnetrun
|
||||
ARG BUILD_PATH
|
||||
ARG SRC_PATH
|
||||
ENV BUILD_PATH=${BUILD_PATH}
|
||||
@ -79,10 +76,15 @@ RUN mkdir -p /var/log/onlyoffice && \
|
||||
chown onlyoffice:onlyoffice /var/log -R && \
|
||||
chown onlyoffice:onlyoffice /var/www -R && \
|
||||
apt-get -y update && \
|
||||
apt-get -y upgrade && \
|
||||
apt-get install -yq sudo nano curl vim python3-pip && \
|
||||
apt-get install -yq libgdiplus && \
|
||||
pip3 install --upgrade jsonpath-ng multipledispatch
|
||||
apt-get install -yq \
|
||||
sudo \
|
||||
nano \
|
||||
curl \
|
||||
vim \
|
||||
python3-pip \
|
||||
libgdiplus && \
|
||||
pip3 install --upgrade jsonpath-ng multipledispatch && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
COPY --from=base --chown=onlyoffice:onlyoffice /app/onlyoffice/config/* /app/onlyoffice/config/
|
||||
|
||||
@ -90,7 +92,7 @@ COPY --from=base --chown=onlyoffice:onlyoffice /app/onlyoffice/config/* /app/onl
|
||||
EXPOSE 5050
|
||||
ENTRYPOINT ["python3", "docker-entrypoint.py"]
|
||||
|
||||
FROM node:16.16-slim as nodeBuild
|
||||
FROM node:16.16-slim as noderun
|
||||
ARG BUILD_PATH
|
||||
ARG SRC_PATH
|
||||
ENV BUILD_PATH=${BUILD_PATH}
|
||||
@ -104,9 +106,14 @@ RUN mkdir -p /var/log/onlyoffice && \
|
||||
chown onlyoffice:onlyoffice /var/log -R && \
|
||||
chown onlyoffice:onlyoffice /var/www -R && \
|
||||
apt-get -y update && \
|
||||
apt-get -y upgrade && \
|
||||
apt-get install -yq sudo nano curl vim python3-pip && \
|
||||
pip3 install --upgrade jsonpath-ng multipledispatch
|
||||
apt-get install -yq \
|
||||
sudo \
|
||||
nano \
|
||||
curl \
|
||||
vim \
|
||||
python3-pip && \
|
||||
pip3 install --upgrade jsonpath-ng multipledispatch && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
COPY --from=base --chown=onlyoffice:onlyoffice /app/onlyoffice/config/* /app/onlyoffice/config/
|
||||
|
||||
@ -114,7 +121,7 @@ EXPOSE 5050
|
||||
ENTRYPOINT ["python3", "docker-entrypoint.py"]
|
||||
|
||||
## Nginx image ##
|
||||
FROM nginx AS web
|
||||
FROM nginx AS proxy
|
||||
ARG SRC_PATH
|
||||
ARG BUILD_PATH
|
||||
ARG COUNT_WORKER_CONNECTIONS=1024
|
||||
@ -123,16 +130,14 @@ ENV DNS_NAMESERVER=127.0.0.11 \
|
||||
MAP_HASH_BUCKET_SIZE=""
|
||||
|
||||
RUN apt-get -y update && \
|
||||
apt-get -y upgrade && \
|
||||
apt-get install -yq vim && \
|
||||
# Remove default nginx website
|
||||
rm -rf /var/lib/apt/lists/* && \
|
||||
rm -rf /usr/share/nginx/html/*
|
||||
|
||||
# copy static services files and config values
|
||||
COPY --from=base /etc/nginx/conf.d /etc/nginx/conf.d
|
||||
COPY --from=base /etc/nginx/includes /etc/nginx/includes
|
||||
COPY --from=base ${SRC_PATH}/build/deploy/client ${BUILD_PATH}/client
|
||||
COPY --from=base ${SRC_PATH}/build/deploy/login ${BUILD_PATH}/login
|
||||
COPY --from=base ${SRC_PATH}/build/deploy/public ${BUILD_PATH}/public
|
||||
COPY /config/nginx/templates/upstream.conf.template /etc/nginx/templates/upstream.conf.template
|
||||
COPY /config/nginx/templates/nginx.conf.template /etc/nginx/nginx.conf.template
|
||||
@ -142,33 +147,40 @@ COPY prepare-nginx-proxy.sh /docker-entrypoint.d/prepare-nginx-proxy.sh
|
||||
RUN chown nginx:nginx /etc/nginx/* -R && \
|
||||
chown nginx:nginx /docker-entrypoint.d/* && \
|
||||
# changes for upstream configure
|
||||
sed -i 's/localhost:5010/$service_api_system/' /etc/nginx/conf.d/onlyoffice.conf && \
|
||||
sed -i 's/localhost:5012/$service_backup/' /etc/nginx/conf.d/onlyoffice.conf && \
|
||||
sed -i 's/localhost:5021/$service_crm/' /etc/nginx/conf.d/onlyoffice.conf && \
|
||||
sed -i 's/localhost:5007/$service_files/' /etc/nginx/conf.d/onlyoffice.conf && \
|
||||
sed -i 's/localhost:5004/$service_people_server/' /etc/nginx/conf.d/onlyoffice.conf && \
|
||||
sed -i 's/localhost:5020/$service_projects_server/' /etc/nginx/conf.d/onlyoffice.conf && \
|
||||
sed -i 's/localhost:5000/$service_api/' /etc/nginx/conf.d/onlyoffice.conf && \
|
||||
sed -i 's/localhost:5003/$service_studio/' /etc/nginx/conf.d/onlyoffice.conf && \
|
||||
sed -i 's/localhost:5023/$service_calendar/' /etc/nginx/conf.d/onlyoffice.conf && \
|
||||
sed -i 's/localhost:9899/$service_socket/' /etc/nginx/conf.d/onlyoffice.conf && \
|
||||
sed -i 's/localhost:9834/$service_sso/' /etc/nginx/conf.d/onlyoffice.conf && \
|
||||
sed -i 's/localhost:5022/$service_mail/' /etc/nginx/conf.d/onlyoffice.conf && \
|
||||
sed -i 's/localhost:9999/$service_urlshortener/' /etc/nginx/conf.d/onlyoffice.conf && \
|
||||
sed -i 's/localhost:5034/$service_migration/' /etc/nginx/conf.d/onlyoffice.conf && \
|
||||
sed -i 's/localhost:5013/$service_doceditor/' /etc/nginx/conf.d/onlyoffice.conf && \
|
||||
sed -i 's/127.0.0.1:5010/$service_api_system/' /etc/nginx/conf.d/onlyoffice.conf && \
|
||||
sed -i 's/127.0.0.1:5012/$service_backup/' /etc/nginx/conf.d/onlyoffice.conf && \
|
||||
sed -i 's/127.0.0.1:5021/$service_crm/' /etc/nginx/conf.d/onlyoffice.conf && \
|
||||
sed -i 's/127.0.0.1:5007/$service_files/' /etc/nginx/conf.d/onlyoffice.conf && \
|
||||
sed -i 's/127.0.0.1:5004/$service_people_server/' /etc/nginx/conf.d/onlyoffice.conf && \
|
||||
sed -i 's/127.0.0.1:5020/$service_projects_server/' /etc/nginx/conf.d/onlyoffice.conf && \
|
||||
sed -i 's/127.0.0.1:5000/$service_api/' /etc/nginx/conf.d/onlyoffice.conf && \
|
||||
sed -i 's/127.0.0.1:5003/$service_studio/' /etc/nginx/conf.d/onlyoffice.conf && \
|
||||
sed -i 's/127.0.0.1:5023/$service_calendar/' /etc/nginx/conf.d/onlyoffice.conf && \
|
||||
sed -i 's/127.0.0.1:9899/$service_socket/' /etc/nginx/conf.d/onlyoffice.conf && \
|
||||
sed -i 's/127.0.0.1:9834/$service_sso/' /etc/nginx/conf.d/onlyoffice.conf && \
|
||||
sed -i 's/127.0.0.1:5022/$service_mail/' /etc/nginx/conf.d/onlyoffice.conf && \
|
||||
sed -i 's/127.0.0.1:9999/$service_urlshortener/' /etc/nginx/conf.d/onlyoffice.conf && \
|
||||
sed -i 's/127.0.0.1:5034/$service_migration/' /etc/nginx/conf.d/onlyoffice.conf && \
|
||||
sed -i 's/127.0.0.1:5013/$service_doceditor/' /etc/nginx/conf.d/onlyoffice.conf && \
|
||||
sed -i 's/127.0.0.1:5011/$service_login/' /etc/nginx/conf.d/onlyoffice.conf && \
|
||||
sed -i 's/172.*/$document_server;/' /etc/nginx/conf.d/onlyoffice.conf
|
||||
|
||||
## Doceditor ##
|
||||
FROM nodeBuild as doceditor
|
||||
FROM noderun as doceditor
|
||||
WORKDIR ${BUILD_PATH}/products/ASC.Files/editor
|
||||
|
||||
COPY --from=base --chown=onlyoffice:onlyoffice ${SRC_PATH}/build/deploy/editor/ .
|
||||
EXPOSE 5013
|
||||
ENTRYPOINT ["node", "server.js"]
|
||||
|
||||
## Login ##
|
||||
FROM noderun as login
|
||||
WORKDIR ${BUILD_PATH}/products/ASC.Login/login
|
||||
|
||||
COPY --from=base --chown=onlyoffice:onlyoffice ${SRC_PATH}/build/deploy/login/ .
|
||||
ENTRYPOINT ["node", "server.js"]
|
||||
|
||||
## ASC.Data.Backup.BackgroundTasks ##
|
||||
FROM builder AS backup_background
|
||||
FROM dotnetrun AS backup_background
|
||||
WORKDIR ${BUILD_PATH}/services/ASC.Data.Backup.BackgroundTasks/
|
||||
|
||||
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
|
||||
@ -177,7 +189,7 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Data.B
|
||||
CMD ["ASC.Data.Backup.BackgroundTasks.dll", "ASC.Data.Backup.BackgroundTasks"]
|
||||
|
||||
## ASC.ClearEvents ##
|
||||
FROM builder AS clear-events
|
||||
FROM dotnetrun AS clear-events
|
||||
WORKDIR ${BUILD_PATH}/services/ASC.ClearEvents/
|
||||
|
||||
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
|
||||
@ -186,7 +198,7 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.ClearE
|
||||
CMD ["ASC.ClearEvents.dll", "ASC.ClearEvents"]
|
||||
|
||||
## ASC.Migration ##
|
||||
FROM builder AS migration
|
||||
FROM dotnetrun AS migration
|
||||
WORKDIR ${BUILD_PATH}/services/ASC.Migration/
|
||||
|
||||
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
|
||||
@ -195,7 +207,7 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Migrat
|
||||
CMD ["ASC.Migration.dll", "ASC.Migration"]
|
||||
|
||||
## ASC.Data.Backup ##
|
||||
FROM builder AS backup
|
||||
FROM dotnetrun AS backup
|
||||
WORKDIR ${BUILD_PATH}/services/ASC.Data.Backup/
|
||||
|
||||
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
|
||||
@ -204,7 +216,7 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Data.B
|
||||
CMD ["ASC.Data.Backup.dll", "ASC.Data.Backup"]
|
||||
|
||||
## ASC.Files ##
|
||||
FROM builder AS files
|
||||
FROM dotnetrun AS files
|
||||
WORKDIR ${BUILD_PATH}/products/ASC.Files/server/
|
||||
|
||||
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
|
||||
@ -213,7 +225,7 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/products/ASC.Files/
|
||||
CMD ["ASC.Files.dll", "ASC.Files"]
|
||||
|
||||
## ASC.Files.Service ##
|
||||
FROM builder AS files_services
|
||||
FROM dotnetrun AS files_services
|
||||
WORKDIR ${BUILD_PATH}/products/ASC.Files/service/
|
||||
|
||||
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
|
||||
@ -222,7 +234,7 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Files.
|
||||
CMD ["ASC.Files.Service.dll", "ASC.Files.Service"]
|
||||
|
||||
## ASC.Notify ##
|
||||
FROM builder AS notify
|
||||
FROM dotnetrun AS notify
|
||||
WORKDIR ${BUILD_PATH}/services/ASC.Notify/service
|
||||
|
||||
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
|
||||
@ -231,7 +243,7 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Notify
|
||||
CMD ["ASC.Notify.dll", "ASC.Notify"]
|
||||
|
||||
## ASC.People ##
|
||||
FROM builder AS people_server
|
||||
FROM dotnetrun AS people_server
|
||||
WORKDIR ${BUILD_PATH}/products/ASC.People/server/
|
||||
|
||||
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
|
||||
@ -240,7 +252,7 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/products/ASC.People
|
||||
CMD ["ASC.People.dll", "ASC.People"]
|
||||
|
||||
## ASC.Socket.IO ##
|
||||
FROM nodeBuild AS socket
|
||||
FROM noderun AS socket
|
||||
WORKDIR ${BUILD_PATH}/services/ASC.Socket.IO/
|
||||
|
||||
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
|
||||
@ -249,7 +261,7 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Socket
|
||||
CMD ["server.js", "ASC.Socket.IO"]
|
||||
|
||||
## ASC.SsoAuth ##
|
||||
FROM nodeBuild AS ssoauth
|
||||
FROM noderun AS ssoauth
|
||||
WORKDIR ${BUILD_PATH}/services/ASC.SsoAuth/
|
||||
|
||||
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
|
||||
@ -258,7 +270,7 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.SsoAu
|
||||
CMD ["app.js", "ASC.SsoAuth"]
|
||||
|
||||
## ASC.Studio.Notify ##
|
||||
FROM builder AS studio_notify
|
||||
FROM dotnetrun AS studio_notify
|
||||
WORKDIR ${BUILD_PATH}/services/ASC.Studio.Notify/service/
|
||||
|
||||
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
|
||||
@ -267,7 +279,7 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Studio
|
||||
CMD ["ASC.Studio.Notify.dll", "ASC.Studio.Notify"]
|
||||
|
||||
## ASC.TelegramService ##
|
||||
FROM builder AS telegram_service
|
||||
FROM dotnetrun AS telegram_service
|
||||
WORKDIR ${BUILD_PATH}/services/ASC.TelegramService/
|
||||
|
||||
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
|
||||
@ -276,7 +288,7 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Telegr
|
||||
CMD ["ASC.TelegramService.dll", "ASC.TelegramService"]
|
||||
|
||||
## ASC.UrlShortener ##
|
||||
FROM nodeBuild AS urlshortener
|
||||
FROM noderun AS urlshortener
|
||||
WORKDIR ${BUILD_PATH}/services/ASC.UrlShortener/service/
|
||||
|
||||
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
|
||||
@ -285,7 +297,7 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.UrlSh
|
||||
CMD ["index.js", "ASC.UrlShortener"]
|
||||
|
||||
## ASC.Web.Api ##
|
||||
FROM builder AS api
|
||||
FROM dotnetrun AS api
|
||||
WORKDIR ${BUILD_PATH}/studio/ASC.Web.Api/
|
||||
|
||||
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
|
||||
@ -294,7 +306,7 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Web.Ap
|
||||
CMD ["ASC.Web.Api.dll", "ASC.Web.Api"]
|
||||
|
||||
## ASC.Webhooks.Service ##
|
||||
FROM builder AS webhooks-service
|
||||
FROM dotnetrun AS webhooks-service
|
||||
WORKDIR ${BUILD_PATH}/services/ASC.Webhooks.Service/
|
||||
|
||||
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
|
||||
@ -303,7 +315,7 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Webhoo
|
||||
CMD ["ASC.Webhooks.Service.dll", "ASC.Webhooks.Service"]
|
||||
|
||||
## ASC.Web.Studio ##
|
||||
FROM builder AS studio
|
||||
FROM dotnetrun AS studio
|
||||
WORKDIR ${BUILD_PATH}/studio/ASC.Web.Studio/
|
||||
|
||||
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
|
||||
|
@ -51,59 +51,59 @@ services:
|
||||
- "9300"
|
||||
onlyoffice-backup-background-tasks:
|
||||
<<: *x-service-base
|
||||
image: "${REPO}/${STATUS}appserver-backup-background:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-backup-background:${DOCKER_TAG}"
|
||||
container_name: ${BACKUP_BACKGRUOND_TASKS_HOST}
|
||||
|
||||
onlyoffice-backup:
|
||||
<<: *x-service-base
|
||||
image: "${REPO}/${STATUS}appserver-backup:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-backup:${DOCKER_TAG}"
|
||||
container_name: ${BACKUP_HOST}
|
||||
|
||||
onlyoffice-clear-events:
|
||||
<<: *x-service-base
|
||||
image: "${REPO}/${STATUS}appserver-clear-events:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-clear-events:${DOCKER_TAG}"
|
||||
container_name: ${CLEAR_EVENTS_HOST}
|
||||
|
||||
onlyoffice-migration:
|
||||
<<: *x-service-base
|
||||
image: "${REPO}/${STATUS}appserver-migration:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-migration:${DOCKER_TAG}"
|
||||
container_name: ${MIGRATION_HOST}
|
||||
|
||||
onlyoffice-files:
|
||||
<<: *x-service-base
|
||||
image: "${REPO}/${STATUS}appserver-files:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-files:${DOCKER_TAG}"
|
||||
container_name: ${FILES_HOST}
|
||||
|
||||
onlyoffice-files-services:
|
||||
<<: *x-service-base
|
||||
image: "${REPO}/${STATUS}appserver-files-services:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-files-services:${DOCKER_TAG}"
|
||||
container_name: ${FILES_SERVICES_HOST}
|
||||
|
||||
onlyoffice-people-server:
|
||||
<<: *x-service-base
|
||||
image: "${REPO}/${STATUS}appserver-people-server:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-people-server:${DOCKER_TAG}"
|
||||
container_name: ${PEOPLE_SERVER_HOST}
|
||||
|
||||
onlyoffice-socket:
|
||||
<<: *x-service-base
|
||||
image: "${REPO}/${STATUS}appserver-socket:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-socket:${DOCKER_TAG}"
|
||||
container_name: ${SOCKET_HOST}
|
||||
expose:
|
||||
- ${SERVICE_PORT}
|
||||
|
||||
onlyoffice-studio-notify:
|
||||
<<: *x-service-base
|
||||
image: "${REPO}/${STATUS}appserver-studio-notify:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-studio-notify:${DOCKER_TAG}"
|
||||
container_name: ${STUDIO_NOTIFY_HOST}
|
||||
|
||||
onlyoffice-telegram-service:
|
||||
<<: *x-service-base
|
||||
image: "${REPO}/${STATUS}appserver-telegram-service:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-telegram-service:${DOCKER_TAG}"
|
||||
container_name: ${TELEGRAM_SERVICE_HOST}
|
||||
|
||||
onlyoffice-urlshortener:
|
||||
<<: *x-service-base
|
||||
image: "${REPO}/${STATUS}appserver-urlshortener:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-urlshortener:${DOCKER_TAG}"
|
||||
container_name: ${URLSHORTENER_HOST}
|
||||
expose:
|
||||
- ${SERVICE_PORT}
|
||||
@ -111,17 +111,17 @@ services:
|
||||
|
||||
onlyoffice-api:
|
||||
<<: *x-service-base
|
||||
image: "${REPO}/${STATUS}appserver-api:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-api:${DOCKER_TAG}"
|
||||
container_name: ${API_HOST}
|
||||
|
||||
onlyoffice-studio:
|
||||
<<: *x-service-base
|
||||
image: "${REPO}/${STATUS}appserver-studio:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-studio:${DOCKER_TAG}"
|
||||
container_name: ${STUDIO_HOST}
|
||||
|
||||
onlyoffice-ssoauth:
|
||||
<<: *x-service-base
|
||||
image: "${REPO}/${STATUS}appserver-ssoauth:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-ssoauth:${DOCKER_TAG}"
|
||||
container_name: ${SSOAUTH_HOST}
|
||||
expose:
|
||||
- ${SERVICE_PORT}
|
||||
@ -129,18 +129,25 @@ services:
|
||||
|
||||
onlyoffice-webhooks-service:
|
||||
<<: *x-service-base
|
||||
image: "${REPO}/${STATUS}appserver-webhooks-service:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-webhooks-service:${DOCKER_TAG}"
|
||||
container_name: ${WEBHOOKS_SERVICE_HOST}
|
||||
|
||||
onlyoffice-doceditor:
|
||||
image: "${REPO}/${STATUS}appserver-doceditor:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-doceditor:${DOCKER_TAG}"
|
||||
container_name: ${DOCEDITOR_HOST}
|
||||
restart: always
|
||||
expose:
|
||||
- "5013"
|
||||
|
||||
onlyoffice-login:
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-login:${DOCKER_TAG}"
|
||||
container_name: ${LOGIN_HOST}
|
||||
restart: always
|
||||
expose:
|
||||
- "5011"
|
||||
|
||||
onlyoffice-proxy:
|
||||
image: "${REPO}/${STATUS}appserver-proxy:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-proxy:${DOCKER_TAG}"
|
||||
container_name: ${PROXY_HOST}
|
||||
restart: always
|
||||
expose:
|
||||
@ -165,6 +172,8 @@ services:
|
||||
- onlyoffice-api
|
||||
- onlyoffice-studio
|
||||
- onlyoffice-ssoauth
|
||||
- onlyoffice-doceditor
|
||||
- onlyoffice-login
|
||||
environment:
|
||||
- SERVICE_BACKUP=${SERVICE_BACKUP}
|
||||
- SERVICE_FILES=${SERVICE_FILES}
|
||||
@ -182,6 +191,7 @@ services:
|
||||
- SERVICE_STUDIO=${SERVICE_STUDIO}
|
||||
- SERVICE_SSOAUTH=${SERVICE_SSOAUTH}
|
||||
- SERVICE_DOCEDITOR=${SERVICE_DOCEDITOR}
|
||||
- SERVICE_LOGIN=${SERVICE_LOGIN}
|
||||
- DOCUMENT_SERVER=${DOCUMENT_SERVER_HOST}
|
||||
- SERVICE_PORT=${SERVICE_PORT}
|
||||
volumes:
|
||||
|
@ -6,144 +6,151 @@ services:
|
||||
context: ./
|
||||
dockerfile: "${DOCKERFILE}"
|
||||
target: backup_background
|
||||
image: "${REPO}/${STATUS}appserver-backup-background:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-backup-background:${DOCKER_TAG}"
|
||||
|
||||
onlyoffice-clear-events:
|
||||
build:
|
||||
context: ./
|
||||
dockerfile: "${DOCKERFILE}"
|
||||
target: clear-events
|
||||
image: "${REPO}/${STATUS}appserver-clear-events:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-clear-events:${DOCKER_TAG}"
|
||||
|
||||
onlyoffice-migration:
|
||||
build:
|
||||
context: ./
|
||||
dockerfile: "${DOCKERFILE}"
|
||||
target: migration
|
||||
image: "${REPO}/${STATUS}appserver-migration:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-migration:${DOCKER_TAG}"
|
||||
|
||||
onlyoffice-backup:
|
||||
build:
|
||||
context: ./
|
||||
dockerfile: "${DOCKERFILE}"
|
||||
target: backup
|
||||
image: "${REPO}/${STATUS}appserver-backup:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-backup:${DOCKER_TAG}"
|
||||
|
||||
onlyoffice-files:
|
||||
build:
|
||||
context: ./
|
||||
dockerfile: "${DOCKERFILE}"
|
||||
target: files
|
||||
image: "${REPO}/${STATUS}appserver-files:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-files:${DOCKER_TAG}"
|
||||
|
||||
onlyoffice-files-services:
|
||||
build:
|
||||
context: ./
|
||||
dockerfile: "${DOCKERFILE}"
|
||||
target: files_services
|
||||
image: "${REPO}/${STATUS}appserver-files-services:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-files-services:${DOCKER_TAG}"
|
||||
|
||||
onlyoffice-notify:
|
||||
build:
|
||||
context: ./
|
||||
dockerfile: "${DOCKERFILE}"
|
||||
target: notify
|
||||
image: "${REPO}/${STATUS}appserver-notify:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-notify:${DOCKER_TAG}"
|
||||
|
||||
onlyoffice-people-server:
|
||||
build:
|
||||
context: ./
|
||||
dockerfile: "${DOCKERFILE}"
|
||||
target: people_server
|
||||
image: "${REPO}/${STATUS}appserver-people-server:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-people-server:${DOCKER_TAG}"
|
||||
|
||||
onlyoffice-socket:
|
||||
build:
|
||||
context: ./
|
||||
dockerfile: "${DOCKERFILE}"
|
||||
target: socket
|
||||
image: "${REPO}/${STATUS}appserver-socket:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-socket:${DOCKER_TAG}"
|
||||
|
||||
onlyoffice-studio-notify:
|
||||
build:
|
||||
context: ./
|
||||
dockerfile: "${DOCKERFILE}"
|
||||
target: studio_notify
|
||||
image: "${REPO}/${STATUS}appserver-studio-notify:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-studio-notify:${DOCKER_TAG}"
|
||||
|
||||
onlyoffice-telegram-service:
|
||||
build:
|
||||
context: ./
|
||||
dockerfile: "${DOCKERFILE}"
|
||||
target: telegram_service
|
||||
image: "${REPO}/${STATUS}appserver-telegram-service:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-telegram-service:${DOCKER_TAG}"
|
||||
|
||||
onlyoffice-urlshortener:
|
||||
build:
|
||||
context: ./
|
||||
dockerfile: "${DOCKERFILE}"
|
||||
target: urlshortener
|
||||
image: "${REPO}/${STATUS}appserver-urlshortener:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-urlshortener:${DOCKER_TAG}"
|
||||
|
||||
onlyoffice-api:
|
||||
build:
|
||||
context: ./
|
||||
dockerfile: "${DOCKERFILE}"
|
||||
target: api
|
||||
image: "${REPO}/${STATUS}appserver-api:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-api:${DOCKER_TAG}"
|
||||
|
||||
onlyoffice-studio:
|
||||
build:
|
||||
context: ./
|
||||
dockerfile: "${DOCKERFILE}"
|
||||
target: studio
|
||||
image: "${REPO}/${STATUS}appserver-studio:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-studio:${DOCKER_TAG}"
|
||||
|
||||
onlyoffice-ssoauth:
|
||||
build:
|
||||
context: ./
|
||||
dockerfile: "${DOCKERFILE}"
|
||||
target: ssoauth
|
||||
image: "${REPO}/${STATUS}appserver-ssoauth:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-ssoauth:${DOCKER_TAG}"
|
||||
|
||||
onlyoffice-webhooks-service:
|
||||
build:
|
||||
context: ./
|
||||
dockerfile: "${DOCKERFILE}"
|
||||
target: webhooks-service
|
||||
image: "${REPO}/${STATUS}appserver-webhooks-service:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-webhooks-service:${DOCKER_TAG}"
|
||||
|
||||
onlyoffice-bin-share:
|
||||
build:
|
||||
context: ./
|
||||
dockerfile: "${DOCKERFILE}"
|
||||
target: bin_share
|
||||
image: "${REPO}/${STATUS}appserver-bin-share:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-bin-share:${DOCKER_TAG}"
|
||||
|
||||
onlyoffice-wait-bin-share:
|
||||
build:
|
||||
context: ./
|
||||
dockerfile: "${DOCKERFILE}"
|
||||
target: wait_bin_share
|
||||
image: "${REPO}/${STATUS}appserver-wait-bin-share:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-wait-bin-share:${DOCKER_TAG}"
|
||||
|
||||
onlyoffice-doceditor:
|
||||
build:
|
||||
context: ./
|
||||
dockerfile: "${DOCKERFILE}"
|
||||
target: doceditor
|
||||
image: "${REPO}/${STATUS}appserver-doceditor:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-doceditor:${DOCKER_TAG}"
|
||||
|
||||
onlyoffice-login:
|
||||
build:
|
||||
context: ./
|
||||
dockerfile: "${DOCKERFILE}"
|
||||
target: login
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-login:${DOCKER_TAG}"
|
||||
|
||||
onlyoffice-proxy:
|
||||
build:
|
||||
context: ./
|
||||
dockerfile: "${DOCKERFILE}"
|
||||
target: web
|
||||
image: "${REPO}/${STATUS}appserver-proxy:${DOCKER_TAG}"
|
||||
target: proxy
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-proxy:${DOCKER_TAG}"
|
||||
|
||||
onlyoffice-migration-runner:
|
||||
build:
|
||||
context: ./
|
||||
dockerfile: "${DOCKERFILE}"
|
||||
target: onlyoffice-migration-runner
|
||||
image: "${REPO}/${STATUS}appserver-migration-runner:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-migration-runner:${DOCKER_TAG}"
|
||||
|
@ -1,5 +1,10 @@
|
||||
resolver $DNS_NAMESERVER valid=30s;
|
||||
|
||||
map $SERVICE_LOGIN $service_login {
|
||||
volatile;
|
||||
$SERVICE_LOGIN $SERVICE_LOGIN;
|
||||
}
|
||||
|
||||
map $SERVICE_DOCEDITOR $service_doceditor {
|
||||
volatile;
|
||||
$SERVICE_DOCEDITOR $SERVICE_DOCEDITOR;
|
||||
|
@ -1,6 +1,7 @@
|
||||
#!/bin/bash
|
||||
export DOCKER_TAG=$DOCKER_TAG
|
||||
BUILD_NUMBER="$(date "+%Y%m%d%H")"
|
||||
|
||||
docker-compose -f build.yml build \
|
||||
--build-arg GIT_BRANCH=$SOURCE_BRANCH \
|
||||
--build-arg PRODUCT_VERSION=$PRODUCT_VERSION \
|
||||
|
@ -1,11 +1,10 @@
|
||||
#!/bin/bash
|
||||
export DOCKER_TAG=$DOCKER_TAG
|
||||
BASE_NAME="appserver"
|
||||
BUILD_NUMBER="$(date "+%Y%m%d%H")"
|
||||
|
||||
docker-compose -f build.yml push
|
||||
|
||||
# Get docker images name to array
|
||||
arrayImagesName=($(docker image ls | grep "$DOCKER_TAG" | grep "$STATUS" | grep "$BASE_NAME" | awk '{print $1}' ))
|
||||
arrayImagesName=($(docker image ls | grep "$DOCKER_TAG" | grep "$DOCKER_IMAGE_PREFIX" | awk '{print $1}' ))
|
||||
|
||||
# Modify docker image tag
|
||||
for i in ${!arrayImagesName[@]}; do
|
||||
|
@ -2,7 +2,7 @@ version: "3.8"
|
||||
|
||||
services:
|
||||
onlyoffice-migration-runner:
|
||||
image: "${REPO}/${STATUS}appserver-migration-runner:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-migration-runner:${DOCKER_TAG}"
|
||||
container_name: ${MIGRATION_RUNNER_HOST}
|
||||
restart: "no"
|
||||
environment:
|
||||
|
@ -31,7 +31,7 @@ x-service:
|
||||
services:
|
||||
onlyoffice-notify:
|
||||
<<: *x-service-base
|
||||
image: "${REPO}/${STATUS}appserver-notify:${DOCKER_TAG}"
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-notify:${DOCKER_TAG}"
|
||||
container_name: ${NOTIFY_HOST}
|
||||
|
||||
networks:
|
||||
|
@ -7,7 +7,7 @@ bash build/install/common/build-backend.sh --srcpath %{_builddir}/%{sourcename}
|
||||
bash build/install/common/publish-backend.sh --srcpath %{_builddir}/%{sourcename}
|
||||
rename -f -v "s/product([^\/]*)$/%{product}\$1/g" build/install/common/*.sh
|
||||
|
||||
sed -i "s@var/www@var/www/%{product}@g" config/nginx/*.conf && sed -i "s@var/www@var/www/%{product}@g" config/nginx/includes/*.conf
|
||||
sed -i "s@var/www@var/www/%{product}@g" config/nginx/*.conf && sed -i "s@var/www@var/www/%{product}@g" config/nginx/includes/*.conf && rm config/nginx/onlyoffice-login.conf
|
||||
|
||||
json -I -f %{_builddir}/%{sourcename}/config/appsettings.services.json -e "this.logPath=\"/var/log/onlyoffice/%{product}\"" \
|
||||
-e "this.urlshortener={ 'path': '../ASC.UrlShortener/index.js' }" -e "this.thumb={ 'path': '../ASC.Thumbnails/' }" -e "this.socket={ 'path': '../ASC.Socket.IO/' }" \
|
||||
|
@ -74,7 +74,6 @@
|
||||
%{_sysconfdir}/nginx/conf.d/*
|
||||
%{buildpath}/public/
|
||||
%{buildpath}/client/
|
||||
%{buildpath}/login/
|
||||
|
||||
%files studio-notify
|
||||
%defattr(-, onlyoffice, onlyoffice, -)
|
||||
@ -189,3 +188,10 @@
|
||||
%{buildpath}/services/ASC.Migration.Runner/
|
||||
/usr/lib/systemd/system/%{product}-migration-runner.service
|
||||
%dir %{buildpath}/services/
|
||||
|
||||
%files login
|
||||
%defattr(-, onlyoffice, onlyoffice, -)
|
||||
%{buildpath}/products/ASC.Login/login
|
||||
/usr/lib/systemd/system/%{product}-login.service
|
||||
%dir %{buildpath}/products/
|
||||
%dir %{buildpath}/products/ASC.Login/
|
||||
|
@ -29,13 +29,13 @@ mkdir -p "%{buildroot}%{buildpath}/studio/ASC.Web.Api/"
|
||||
mkdir -p "%{buildroot}%{buildpath}/studio/ASC.Web.Studio/"
|
||||
mkdir -p "%{buildroot}%{buildpath}/public/"
|
||||
mkdir -p "%{buildroot}%{buildpath}/client/"
|
||||
mkdir -p "%{buildroot}%{buildpath}/login/"
|
||||
mkdir -p "%{buildroot}%{buildpath}/products/ASC.Login/login/"
|
||||
mkdir -p "%{buildroot}/usr/lib/systemd/system/"
|
||||
cp -rf %{_builddir}/%{sourcename}/ASC.Migration.Runner/service/* "%{buildroot}%{buildpath}/services/ASC.Migration.Runner/"
|
||||
cp -rf %{_builddir}/%{sourcename}/build/deploy/editor/* "%{buildroot}%{buildpath}/products/ASC.Files/editor/"
|
||||
cp -rf %{_builddir}/%{sourcename}/build/deploy/public/* "%{buildroot}%{buildpath}/public/"
|
||||
cp -rf %{_builddir}/%{sourcename}/build/deploy/client/* "%{buildroot}%{buildpath}/client/"
|
||||
cp -rf %{_builddir}/%{sourcename}/build/deploy/login/* "%{buildroot}%{buildpath}/login/"
|
||||
cp -rf %{_builddir}/%{sourcename}/build/deploy/login/* "%{buildroot}%{buildpath}/products/ASC.Login/login/"
|
||||
cp -rf %{_builddir}/%{sourcename}/build/install/RadicalePlugins/* "%{buildroot}%{buildpath}/Tools/radicale/plugins/"
|
||||
cp -rf %{_builddir}/%{sourcename}/build/install/common/%{product}-configuration.sh "%{buildroot}%{_bindir}/"
|
||||
cp -rf %{_builddir}/%{sourcename}/build/install/common/systemd/modules/* "%{buildroot}/usr/lib/systemd/system/"
|
||||
|
@ -163,3 +163,11 @@ Requires: %name-common = %version-%release
|
||||
Requires: dotnet-sdk-6.0
|
||||
AutoReqProv: no
|
||||
%description migration-runner
|
||||
|
||||
%package login
|
||||
Summary: login
|
||||
Group: Applications/Internet
|
||||
Requires: %name-common = %version-%release
|
||||
Requires: nodejs >= 14.0
|
||||
AutoReqProv: no
|
||||
%description login
|
||||
|
@ -30,6 +30,7 @@ Requires: %name-clear-events = %version-%release
|
||||
Requires: %name-doceditor = %version-%release
|
||||
Requires: %name-files = %version-%release
|
||||
Requires: %name-files-services = %version-%release
|
||||
Requires: %name-login = %version-%release
|
||||
Requires: %name-migration = %version-%release
|
||||
Requires: %name-migration-runner = %version-%release
|
||||
Requires: %name-notify = %version-%release
|
||||
|
@ -1,266 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<DOCUMENT Type="Advanced Installer" CreateVersion="18.6" version="18.7" Modules="enterprise" RootPath="." Language="en" Id="{2D2C7C0E-FA78-4158-A222-DA463E882AAC}">
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiPropsComponent">
|
||||
<ROW Property="AI_BITMAP_DISPLAY_MODE" Value="0"/>
|
||||
<ROW Property="AI_CURRENT_YEAR" Value="2022" ValueLocId="-"/>
|
||||
<ROW Property="AI_PREDEF_LCONDS_PROPS" Value="AI_DETECTED_INTERNET_CONNECTION"/>
|
||||
<ROW Property="AI_PRODUCTNAME_ARP" Value="Apache Kafka"/>
|
||||
<ROW Property="AI_UNINSTALLER" Value="msiexec.exe"/>
|
||||
<ROW Property="ALLUSERS" Value="1"/>
|
||||
<ROW Property="ARPNOMODIFY" MultiBuildValue="DefaultBuild:1"/>
|
||||
<ROW Property="ARPNOREPAIR" Value="1"/>
|
||||
<ROW Property="ARPSYSTEMCOMPONENT" Value="1"/>
|
||||
<ROW Property="Manufacturer" Value="Apache"/>
|
||||
<ROW Property="ProductCode" Value="1033:{79F55836-69B9-46CE-B03D-7679D38C0AD4} " Type="16"/>
|
||||
<ROW Property="ProductLanguage" Value="1033"/>
|
||||
<ROW Property="ProductName" Value="Apache Kafka"/>
|
||||
<ROW Property="ProductVersion" Value="1.0.0"/>
|
||||
<ROW Property="SecureCustomProperties" Value="OLDPRODUCTS;AI_NEWERPRODUCTFOUND"/>
|
||||
<ROW Property="ServiceName_Apache_Kafka" Value="Apache Kafka"/>
|
||||
<ROW Property="ServiceName_Apache_ZooKeeper" Value="Apache ZooKeeper"/>
|
||||
<ROW Property="UpgradeCode" Value="{9202447D-B999-4041-B479-B3789A872456}"/>
|
||||
<ROW Property="WindowsType9X" MultiBuildValue="DefaultBuild:Windows 9x/ME" ValueLocId="-"/>
|
||||
<ROW Property="WindowsType9XDisplay" MultiBuildValue="DefaultBuild:Windows 9x/ME" ValueLocId="-"/>
|
||||
<ROW Property="WindowsTypeNT40" MultiBuildValue="DefaultBuild:Windows NT 4.0" ValueLocId="-"/>
|
||||
<ROW Property="WindowsTypeNT40Display" MultiBuildValue="DefaultBuild:Windows NT 4.0" ValueLocId="-"/>
|
||||
<ROW Property="WindowsTypeNT50" MultiBuildValue="DefaultBuild:Windows 2000" ValueLocId="-"/>
|
||||
<ROW Property="WindowsTypeNT50Display" MultiBuildValue="DefaultBuild:Windows 2000" ValueLocId="-"/>
|
||||
<ROW Property="WindowsTypeNT5X" MultiBuildValue="DefaultBuild:Windows XP/2003" ValueLocId="-"/>
|
||||
<ROW Property="WindowsTypeNT5XDisplay" MultiBuildValue="DefaultBuild:Windows XP/2003" ValueLocId="-"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiDirsComponent">
|
||||
<ROW Directory="APPDIR" Directory_Parent="TARGETDIR" DefaultDir="APPDIR:." IsPseudoRoot="1"/>
|
||||
<ROW Directory="TARGETDIR" DefaultDir="SourceDir"/>
|
||||
<ROW Directory="WindowsVolume" Directory_Parent="TARGETDIR" DefaultDir="WINDOW~1|WindowsVolume" IsPseudoRoot="1"/>
|
||||
<ROW Directory="kafka_2.122.8.0_Dir" Directory_Parent="kafkazookeeper_Dir" DefaultDir="kafka"/>
|
||||
<ROW Directory="kafkazookeeper_Dir" Directory_Parent="WindowsVolume" DefaultDir="Apache"/>
|
||||
<ROW Directory="tools_Dir" Directory_Parent="kafka_2.122.8.0_Dir" DefaultDir="tools"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiCompsComponent">
|
||||
<ROW Component="AI_CustomARPName" ComponentId="{0A28214B-8B18-41A6-8221-28805AFC74D8}" Directory_="APPDIR" Attributes="4" KeyPath="DisplayName" Options="1"/>
|
||||
<ROW Component="AI_DisableModify" ComponentId="{9AEFD4E1-809A-4BA7-8210-A26107288AD8}" Directory_="APPDIR" Attributes="4" KeyPath="NoModify" Options="1"/>
|
||||
<ROW Component="APPDIR" ComponentId="{65AA756C-1422-4BF9-9839-FC3C55E40801}" Directory_="APPDIR" Attributes="0"/>
|
||||
<ROW Component="Apache" ComponentId="{AD0BEF35-DD7E-47D2-8E16-10F0066B56D7}" Directory_="kafkazookeeper_Dir" Attributes="0"/>
|
||||
<ROW Component="ProductInformation" ComponentId="{0A3116F5-AD20-4DBA-A42B-68B3CE9DB645}" Directory_="APPDIR" Attributes="4" KeyPath="Version"/>
|
||||
<ROW Component="kafka.exe" ComponentId="{193EC233-51DE-4D1E-9528-A22252F0661E}" Directory_="tools_Dir" Attributes="0" KeyPath="kafka.exe"/>
|
||||
<ROW Component="kafka.xml" ComponentId="{531D2348-5D97-434D-9AC6-2B73961605F4}" Directory_="tools_Dir" Attributes="0" KeyPath="kafka.xml" Type="0"/>
|
||||
<ROW Component="zookeeper.exe" ComponentId="{2E8D451F-F3A5-46E8-B3A5-E4087EABB148}" Directory_="tools_Dir" Attributes="0" KeyPath="zookeeper.exe"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiFeatsComponent">
|
||||
<ROW Feature="MainFeature" Title="MainFeature" Description="Description" Display="1" Level="1" Directory_="APPDIR" Attributes="0"/>
|
||||
<ATTRIBUTE name="CurrentFeature" value="MainFeature"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiFilesComponent">
|
||||
<ROW File="kafka.exe" Component_="kafka.exe" FileName="kafka.exe" Attributes="0" SourcePath="kafka-zookeeper\kafka\tools\kafka.exe" SelfReg="false" DigSign="true"/>
|
||||
<ROW File="kafka.xml" Component_="kafka.xml" FileName="kafka.xml" Attributes="0" SourcePath="kafka-zookeeper\kafka\tools\kafka.xml" SelfReg="false"/>
|
||||
<ROW File="zookeeper.exe" Component_="zookeeper.exe" FileName="ZOOKEE~1.EXE|zookeeper.exe" Attributes="0" SourcePath="kafka-zookeeper\kafka\tools\zookeeper.exe" SelfReg="false" DigSign="true"/>
|
||||
<ROW File="zookeeper.xml" Component_="kafka.xml" FileName="ZOOKEE~1.XML|zookeeper.xml" Attributes="0" SourcePath="kafka-zookeeper\kafka\tools\zookeeper.xml" SelfReg="false"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.BootstrOptComponent">
|
||||
<ROW BootstrOptKey="GlobalOptions" DownloadFolder="[AppDataFolder][|Manufacturer]\[|ProductName]\prerequisites" Options="2"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.BootstrapperUISequenceComponent">
|
||||
<ROW Action="AI_DetectSoftware" Sequence="151"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.BuildComponent">
|
||||
<ROW BuildKey="DefaultBuild" BuildName="DefaultBuild" BuildOrder="1" BuildType="0" PackageFolder="publish" PackageFileName="[|ProductName]" Languages="en" InstallationType="4" UseLargeSchema="true" Unicode="true" UACExecutionLevel="2"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.DictionaryComponent">
|
||||
<ROW Path="<AI_DICTS>ui.ail"/>
|
||||
<ROW Path="<AI_DICTS>ui_en.ail"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.FragmentComponent">
|
||||
<ROW Fragment="CommonUI.aip" Path="<AI_FRAGS>CommonUI.aip"/>
|
||||
<ROW Fragment="FolderDlg.aip" Path="<AI_THEMES>classic\fragments\FolderDlg.aip"/>
|
||||
<ROW Fragment="MaintenanceTypeDlg.aip" Path="<AI_THEMES>classic\fragments\MaintenanceTypeDlg.aip"/>
|
||||
<ROW Fragment="MaintenanceWelcomeDlg.aip" Path="<AI_THEMES>classic\fragments\MaintenanceWelcomeDlg.aip"/>
|
||||
<ROW Fragment="SequenceDialogs.aip" Path="<AI_THEMES>classic\fragments\SequenceDialogs.aip"/>
|
||||
<ROW Fragment="Sequences.aip" Path="<AI_FRAGS>Sequences.aip"/>
|
||||
<ROW Fragment="StaticUIStrings.aip" Path="<AI_FRAGS>StaticUIStrings.aip"/>
|
||||
<ROW Fragment="UI.aip" Path="<AI_THEMES>classic\fragments\UI.aip"/>
|
||||
<ROW Fragment="Validation.aip" Path="<AI_FRAGS>Validation.aip"/>
|
||||
<ROW Fragment="VerifyRemoveDlg.aip" Path="<AI_THEMES>classic\fragments\VerifyRemoveDlg.aip"/>
|
||||
<ROW Fragment="VerifyRepairDlg.aip" Path="<AI_THEMES>classic\fragments\VerifyRepairDlg.aip"/>
|
||||
<ROW Fragment="WelcomeDlg.aip" Path="<AI_THEMES>classic\fragments\WelcomeDlg.aip"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiActionTextComponent">
|
||||
<ROW Action="AI_ConfigFailActions" Description="Configure service failure actions" DescriptionLocId="ActionText.Description.AI_ConfigFailActions" Template="Service: [1]" TemplateLocId="ActionText.Template.AI_ConfigFailActions"/>
|
||||
<ROW Action="AI_ProcessFailActions" Description="Generating actions to configure service failure actions" DescriptionLocId="ActionText.Description.AI_ProcessFailActions" Template="Service: [1]" TemplateLocId="ActionText.Template.AI_ProcessFailActions"/>
|
||||
<ROW Action="AI_TxtUpdaterCommit" Description="Commit text file changes." DescriptionLocId="ActionText.Description.AI_TxtUpdaterCommit" Template="Commit text file changes." TemplateLocId="ActionText.Template.AI_TxtUpdaterCommit"/>
|
||||
<ROW Action="AI_TxtUpdaterConfig" Description="Executing text file updates" DescriptionLocId="ActionText.Description.AI_TxtUpdaterConfig" Template="Updating text file: "[1]"" TemplateLocId="ActionText.Template.AI_TxtUpdaterConfig"/>
|
||||
<ROW Action="AI_TxtUpdaterInstall" Description="Generating actions to configure text files updates" DescriptionLocId="ActionText.Description.AI_TxtUpdaterInstall"/>
|
||||
<ROW Action="AI_TxtUpdaterRollback" Description="Rolling back text file changes." DescriptionLocId="ActionText.Description.AI_TxtUpdaterRollback" Template="Rolling back text file changes." TemplateLocId="ActionText.Template.AI_TxtUpdaterRollback"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiBinaryComponent">
|
||||
<ROW Name="PowerShellScriptLauncher.dll" SourcePath="<AI_CUSTACTS>PowerShellScriptLauncher.dll"/>
|
||||
<ROW Name="SoftwareDetector.dll" SourcePath="<AI_CUSTACTS>SoftwareDetector.dll"/>
|
||||
<ROW Name="TxtUpdater.dll" SourcePath="<AI_CUSTACTS>TxtUpdater.dll"/>
|
||||
<ROW Name="aicustact.dll" SourcePath="<AI_CUSTACTS>aicustact.dll"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiControlEventComponent">
|
||||
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL" Ordering="1"/>
|
||||
<ROW Dialog_="FolderDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_INSTALL" Ordering="201"/>
|
||||
<ROW Dialog_="FolderDlg" Control_="Back" Event="NewDialog" Argument="WelcomeDlg" Condition="AI_INSTALL" Ordering="1"/>
|
||||
<ROW Dialog_="VerifyReadyDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_INSTALL" Ordering="197"/>
|
||||
<ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL" Ordering="201"/>
|
||||
<ROW Dialog_="MaintenanceWelcomeDlg" Control_="Next" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT" Ordering="99"/>
|
||||
<ROW Dialog_="CustomizeDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_MAINT" Ordering="101"/>
|
||||
<ROW Dialog_="CustomizeDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT" Ordering="1"/>
|
||||
<ROW Dialog_="VerifyReadyDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_MAINT" Ordering="198"/>
|
||||
<ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="CustomizeDlg" Condition="AI_MAINT" Ordering="202"/>
|
||||
<ROW Dialog_="MaintenanceTypeDlg" Control_="ChangeButton" Event="NewDialog" Argument="CustomizeDlg" Condition="AI_MAINT" Ordering="501"/>
|
||||
<ROW Dialog_="MaintenanceTypeDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceWelcomeDlg" Condition="AI_MAINT" Ordering="1"/>
|
||||
<ROW Dialog_="MaintenanceTypeDlg" Control_="RemoveButton" Event="NewDialog" Argument="VerifyRemoveDlg" Condition="AI_MAINT AND InstallMode="Remove"" Ordering="601"/>
|
||||
<ROW Dialog_="VerifyRemoveDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT AND InstallMode="Remove"" Ordering="1"/>
|
||||
<ROW Dialog_="MaintenanceTypeDlg" Control_="RepairButton" Event="NewDialog" Argument="VerifyRepairDlg" Condition="AI_MAINT AND InstallMode="Repair"" Ordering="601"/>
|
||||
<ROW Dialog_="VerifyRepairDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT AND InstallMode="Repair"" Ordering="1"/>
|
||||
<ROW Dialog_="VerifyRepairDlg" Control_="Repair" Event="EndDialog" Argument="Return" Condition="AI_MAINT AND InstallMode="Repair"" Ordering="399" Options="1"/>
|
||||
<ROW Dialog_="VerifyRemoveDlg" Control_="Remove" Event="EndDialog" Argument="Return" Condition="AI_MAINT AND InstallMode="Remove"" Ordering="299" Options="1"/>
|
||||
<ROW Dialog_="PatchWelcomeDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_PATCH" Ordering="201"/>
|
||||
<ROW Dialog_="ResumeDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_RESUME" Ordering="299"/>
|
||||
<ROW Dialog_="VerifyReadyDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_PATCH" Ordering="199"/>
|
||||
<ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="PatchWelcomeDlg" Condition="AI_PATCH" Ordering="203"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiCreateFolderComponent">
|
||||
<ROW Directory_="APPDIR" Component_="APPDIR" ManualDelete="true"/>
|
||||
<ROW Directory_="kafkazookeeper_Dir" Component_="Apache" ManualDelete="false"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiCustActComponent">
|
||||
<ROW Action="AI_BACKUP_AI_SETUPEXEPATH" Type="51" Source="AI_SETUPEXEPATH_ORIGINAL" Target="[AI_SETUPEXEPATH]"/>
|
||||
<ROW Action="AI_ConfigFailActions" Type="11265" Source="aicustact.dll" Target="ConfigureServFailActions" WithoutSeq="true"/>
|
||||
<ROW Action="AI_DATA_SETTER" Type="51" Source="CustomActionData" Target="AEQAaQBnAGkAdABhAGwAbAB5AFMAaQBnAG4AUwBjAHIAaQBwAHQAAgABAEYAbABhAGcAcwACADYAAQBQAGEAcgBhAG0AcwACAAEAUwBjAHIAaQBwAHQAAgAjAFIAZQBxAHUAaQByAGUAcwAgAC0AdgBlAHIAcwBpAG8AbgAgADMADQAKAFAAYQByAGEAbQAoACkADQAKAA0ACgAkAEEAUABQAEQASQBSACAAPQAgAEEASQBfAEcAZQB0AE0AcwBpAFAAcgBvAHAAZQByAHQAeQAgAEEAUABQAEQASQBSAA0ACgAkAE0AQQBJAE4ARABJAFIAIAA9ACAAJABBAFAAUABEAEkAUgAuAFQAbwBTAHQAcgBpAG4AZwAoACkAIAArACAAIgAuAC4AIgANAAoAUgBlAG0AbwB2AGUALQBJAHQAZQBtACAAJABNAEEASQBOAEQASQBSACAALQBSAGUAYwB1AHIAcwBl"/>
|
||||
<ROW Action="AI_DATA_SETTER_1" Type="51" Source="CustomActionData" Target="[~]"/>
|
||||
<ROW Action="AI_DOWNGRADE" Type="19" Target="4010"/>
|
||||
<ROW Action="AI_DetectSoftware" Type="257" Source="SoftwareDetector.dll" Target="OnDetectSoftware"/>
|
||||
<ROW Action="AI_DpiContentScale" Type="1" Source="aicustact.dll" Target="DpiContentScale"/>
|
||||
<ROW Action="AI_EnableDebugLog" Type="321" Source="aicustact.dll" Target="EnableDebugLog"/>
|
||||
<ROW Action="AI_GetArpIconPath" Type="1" Source="aicustact.dll" Target="GetArpIconPath"/>
|
||||
<ROW Action="AI_InstallModeCheck" Type="1" Source="aicustact.dll" Target="UpdateInstallMode" WithoutSeq="true"/>
|
||||
<ROW Action="AI_PREPARE_UPGRADE" Type="65" Source="aicustact.dll" Target="PrepareUpgrade"/>
|
||||
<ROW Action="AI_ProcessFailActions" Type="1" Source="aicustact.dll" Target="ProcessFailActions" AdditionalSeq="AI_DATA_SETTER_1"/>
|
||||
<ROW Action="AI_RESTORE_AI_SETUPEXEPATH" Type="51" Source="AI_SETUPEXEPATH" Target="[AI_SETUPEXEPATH_ORIGINAL]"/>
|
||||
<ROW Action="AI_RESTORE_LOCATION" Type="65" Source="aicustact.dll" Target="RestoreLocation"/>
|
||||
<ROW Action="AI_ResolveKnownFolders" Type="1" Source="aicustact.dll" Target="AI_ResolveKnownFolders"/>
|
||||
<ROW Action="AI_RestartElevated" Type="1" Source="aicustact.dll" Target="RestartElevated"/>
|
||||
<ROW Action="AI_SHOW_LOG" Type="65" Source="aicustact.dll" Target="LaunchLogFile" WithoutSeq="true"/>
|
||||
<ROW Action="AI_STORE_LOCATION" Type="51" Source="ARPINSTALLLOCATION" Target="[APPDIR]"/>
|
||||
<ROW Action="AI_TxtUpdaterCommit" Type="11777" Source="TxtUpdater.dll" Target="OnTxtUpdaterCommit" WithoutSeq="true"/>
|
||||
<ROW Action="AI_TxtUpdaterConfig" Type="11265" Source="TxtUpdater.dll" Target="OnTxtUpdaterConfig" WithoutSeq="true"/>
|
||||
<ROW Action="AI_TxtUpdaterInstall" Type="1" Source="TxtUpdater.dll" Target="OnTxtUpdaterInstall"/>
|
||||
<ROW Action="AI_TxtUpdaterRollback" Type="11521" Source="TxtUpdater.dll" Target="OnTxtUpdaterRollback" WithoutSeq="true"/>
|
||||
<ROW Action="RemoveManufactorDir" Type="65" Source="PowerShellScriptLauncher.dll" Target="RunPowerShellScript" Options="1" AdditionalSeq="AI_DATA_SETTER"/>
|
||||
<ROW Action="SET_APPDIR" Type="307" Source="APPDIR" Target="[ProgramFilesFolder][Manufacturer]\[ProductName]"/>
|
||||
<ROW Action="SET_SHORTCUTDIR" Type="307" Source="SHORTCUTDIR" Target="[ProgramMenuFolder][ProductName]"/>
|
||||
<ROW Action="SET_TARGETDIR_TO_APPDIR" Type="51" Source="TARGETDIR" Target="[APPDIR]"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiEnvComponent">
|
||||
<ROW Environment="JAVA_HOME" Name="=-*JAVA_HOME" Value="[PATH_TO_JAVA]" Component_="Apache"/>
|
||||
<ROW Environment="Path" Name="=*Path" Value="[~];%JAVA_HOME%\bin" Component_="Apache"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiFeatCompsComponent">
|
||||
<ROW Feature_="MainFeature" Component_="APPDIR"/>
|
||||
<ROW Feature_="MainFeature" Component_="ProductInformation"/>
|
||||
<ROW Feature_="MainFeature" Component_="Apache"/>
|
||||
<ROW Feature_="MainFeature" Component_="kafka.exe"/>
|
||||
<ROW Feature_="MainFeature" Component_="kafka.xml"/>
|
||||
<ROW Feature_="MainFeature" Component_="zookeeper.exe"/>
|
||||
<ROW Feature_="MainFeature" Component_="AI_CustomARPName"/>
|
||||
<ROW Feature_="MainFeature" Component_="AI_DisableModify"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiInstExSeqComponent">
|
||||
<ROW Action="AI_DOWNGRADE" Condition="AI_NEWERPRODUCTFOUND AND (UILevel <> 5)" Sequence="210"/>
|
||||
<ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=""" Sequence="749"/>
|
||||
<ROW Action="AI_STORE_LOCATION" Condition="(Not Installed) OR REINSTALL" Sequence="1501"/>
|
||||
<ROW Action="AI_PREPARE_UPGRADE" Condition="AI_UPGRADE="No" AND (Not Installed)" Sequence="1397"/>
|
||||
<ROW Action="AI_ResolveKnownFolders" Sequence="52"/>
|
||||
<ROW Action="AI_EnableDebugLog" Sequence="51"/>
|
||||
<ROW Action="RemoveManufactorDir" Condition="( NOT Installed )" Sequence="6602"/>
|
||||
<ROW Action="AI_DATA_SETTER" Condition="( NOT Installed )" Sequence="6601"/>
|
||||
<ROW Action="AI_ProcessFailActions" Sequence="5848"/>
|
||||
<ROW Action="AI_DATA_SETTER_1" Sequence="5847"/>
|
||||
<ROW Action="AI_TxtUpdaterInstall" Sequence="5101"/>
|
||||
<ROW Action="AI_DetectSoftware" Sequence="101"/>
|
||||
<ROW Action="AI_GetArpIconPath" Sequence="1401"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiInstallUISequenceComponent">
|
||||
<ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=""" Sequence="749"/>
|
||||
<ROW Action="AI_ResolveKnownFolders" Sequence="54"/>
|
||||
<ROW Action="AI_DpiContentScale" Sequence="53"/>
|
||||
<ROW Action="AI_EnableDebugLog" Sequence="52"/>
|
||||
<ROW Action="AI_BACKUP_AI_SETUPEXEPATH" Sequence="99"/>
|
||||
<ROW Action="AI_RESTORE_AI_SETUPEXEPATH" Condition="AI_SETUPEXEPATH_ORIGINAL" Sequence="102"/>
|
||||
<ROW Action="AI_DetectSoftware" Sequence="101"/>
|
||||
<ROW Action="AI_RestartElevated" Sequence="51" Builds="DefaultBuild"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiLaunchConditionsComponent">
|
||||
<ROW Condition="((VersionNT <> 501) AND (VersionNT <> 502))" Description="[ProductName] cannot be installed on [WindowsTypeNT5XDisplay]." DescriptionLocId="AI.LaunchCondition.NoNT5X" IsPredefined="true" Builds="DefaultBuild"/>
|
||||
<ROW Condition="(VersionNT <> 400)" Description="[ProductName] cannot be installed on [WindowsTypeNT40Display]." DescriptionLocId="AI.LaunchCondition.NoNT40" IsPredefined="true" Builds="DefaultBuild"/>
|
||||
<ROW Condition="(VersionNT <> 500)" Description="[ProductName] cannot be installed on [WindowsTypeNT50Display]." DescriptionLocId="AI.LaunchCondition.NoNT50" IsPredefined="true" Builds="DefaultBuild"/>
|
||||
<ROW Condition="AI_DETECTED_INTERNET_CONNECTION" Description="[ProductName] requires an active Internet connection for installation. Please check your network configuration and proxy settings." DescriptionLocId="AI.LaunchCondition.Internet" IsPredefined="true" Builds="DefaultBuild"/>
|
||||
<ROW Condition="VersionNT" Description="[ProductName] cannot be installed on [WindowsType9XDisplay]." DescriptionLocId="AI.LaunchCondition.No9X" IsPredefined="true" Builds="DefaultBuild"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiRegsComponent">
|
||||
<ROW Registry="Comments" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="Comments" Value="[ARPCOMMENTS]" Component_="AI_CustomARPName"/>
|
||||
<ROW Registry="Contact" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="Contact" Value="[ARPCONTACT]" Component_="AI_CustomARPName"/>
|
||||
<ROW Registry="CurrentVersion" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion" Name="\"/>
|
||||
<ROW Registry="DisplayIcon" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="DisplayIcon" Value="[ARP_ICON_PATH]" Component_="AI_CustomARPName"/>
|
||||
<ROW Registry="DisplayName" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="DisplayName" Value="[AI_PRODUCTNAME_ARP]" Component_="AI_CustomARPName"/>
|
||||
<ROW Registry="DisplayVersion" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="DisplayVersion" Value="[ProductVersion]" Component_="AI_CustomARPName"/>
|
||||
<ROW Registry="EstimatedSize" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="EstimatedSize" Value="#[AI_ARP_SIZE]" Component_="AI_CustomARPName" VirtualValue="#"/>
|
||||
<ROW Registry="HelpLink" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="HelpLink" Value="[ARPHELPLINK]" Component_="AI_CustomARPName"/>
|
||||
<ROW Registry="HelpTelephone" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="HelpTelephone" Value="[ARPHELPTELEPHONE]" Component_="AI_CustomARPName"/>
|
||||
<ROW Registry="InstallLocation" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="InstallLocation" Value="[APPDIR]" Component_="AI_CustomARPName"/>
|
||||
<ROW Registry="Manufacturer" Root="-1" Key="Software\[Manufacturer]" Name="\"/>
|
||||
<ROW Registry="Microsoft" Root="-1" Key="Software\Microsoft" Name="\"/>
|
||||
<ROW Registry="ModifyPath" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="ModifyPath" Value="[AI_UNINSTALLER] /i [ProductCode] AI_UNINSTALLER_CTP=1" Component_="AI_CustomARPName"/>
|
||||
<ROW Registry="NoModify" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="NoModify" Value="#1" Component_="AI_DisableModify" VirtualValue="#"/>
|
||||
<ROW Registry="NoRepair" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="NoRepair" Value="#1" Component_="AI_CustomARPName" VirtualValue="#"/>
|
||||
<ROW Registry="Path" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="Path" Value="[APPDIR]" Component_="ProductInformation"/>
|
||||
<ROW Registry="ProductName" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="\"/>
|
||||
<ROW Registry="ProductNameProductVersion" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="\"/>
|
||||
<ROW Registry="Publisher" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="Publisher" Value="[Manufacturer]" Component_="AI_CustomARPName"/>
|
||||
<ROW Registry="Readme" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="Readme" Value="[ARPREADME]" Component_="AI_CustomARPName"/>
|
||||
<ROW Registry="Software" Root="-1" Key="Software" Name="\"/>
|
||||
<ROW Registry="URLInfoAbout" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="URLInfoAbout" Value="[ARPURLINFOABOUT]" Component_="AI_CustomARPName"/>
|
||||
<ROW Registry="URLUpdateInfo" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="URLUpdateInfo" Value="[ARPURLUPDATEINFO]" Component_="AI_CustomARPName"/>
|
||||
<ROW Registry="Uninstall" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall" Name="\"/>
|
||||
<ROW Registry="UninstallPath" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="UninstallPath" Value="[AI_UNINSTALLER] /x [ProductCode] AI_UNINSTALLER_CTP=1" Component_="AI_CustomARPName"/>
|
||||
<ROW Registry="UninstallString" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="UninstallString" Value="[AI_UNINSTALLER] /x [ProductCode] AI_UNINSTALLER_CTP=1" Component_="AI_CustomARPName"/>
|
||||
<ROW Registry="Version" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="Version" Value="[ProductVersion]" Component_="ProductInformation"/>
|
||||
<ROW Registry="VersionMajor" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="VersionMajor" Value="#1" Component_="AI_CustomARPName" VirtualValue="#"/>
|
||||
<ROW Registry="VersionMinor" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="VersionMinor" Value="#0" Component_="AI_CustomARPName" VirtualValue="#"/>
|
||||
<ROW Registry="Windows" Root="-1" Key="Software\Microsoft\Windows" Name="\"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiServConfigComponent">
|
||||
<ROW MsiServiceConfig="Apache_Kafka" Name="[ServiceName_Apache_Kafka]" Event="1" ConfigType="3" Argument="1" Component_="kafka.exe"/>
|
||||
<ROW MsiServiceConfig="Apache_ZooKeeper" Name="[ServiceName_Apache_ZooKeeper]" Event="1" ConfigType="3" Argument="1" Component_="zookeeper.exe"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiServConfigFailureActionsComponent">
|
||||
<ROW MsiServiceConfigFailureActions="Apache_Kafka" Name="[ServiceName_Apache_Kafka]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="kafka.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="Apache_ZooKeeper" Name="[ServiceName_Apache_ZooKeeper]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="zookeeper.exe"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiServCtrlComponent">
|
||||
<ROW ServiceControl="Apache_Kafka" Name="[ServiceName_Apache_Kafka]" Event="161" Wait="1" Component_="kafka.exe"/>
|
||||
<ROW ServiceControl="Apache_ZooKeeper" Name="[ServiceName_Apache_ZooKeeper]" Event="161" Wait="1" Component_="zookeeper.exe"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiServInstComponent">
|
||||
<ROW ServiceInstall="Apache_Kafka" Name="[ServiceName_Apache_Kafka]" DisplayName="[ServiceName_Apache_Kafka]" ServiceType="16" StartType="2" ErrorControl="1" Component_="kafka.exe"/>
|
||||
<ROW ServiceInstall="Apache_ZooKeeper" Name="[ServiceName_Apache_ZooKeeper]" DisplayName="[ServiceName_Apache_ZooKeeper]" ServiceType="16" StartType="2" ErrorControl="1" Component_="zookeeper.exe"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiThemeComponent">
|
||||
<ATTRIBUTE name="UsedTheme" value="classic"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiUpgradeComponent">
|
||||
<ROW UpgradeCode="[|UpgradeCode]" VersionMin="0.0.1" VersionMax="[|ProductVersion]" Attributes="257" ActionProperty="OLDPRODUCTS"/>
|
||||
<ROW UpgradeCode="[|UpgradeCode]" VersionMin="[|ProductVersion]" Attributes="2" ActionProperty="AI_NEWERPRODUCTFOUND"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.SynchronizedFolderComponent">
|
||||
<ROW Directory_="kafka_2.122.8.0_Dir" SourcePath="kafka-zookeeper\kafka" Feature="MainFeature" ExcludePattern="*~|#*#|%*%|._|CVS|.cvsignore|SCCS|vssver.scc|mssccprj.scc|vssver2.scc|.svn|.DS_Store" ExcludeFlags="6" FileAddOptions="4"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.TxtUpdateComponent">
|
||||
<ROW Name="ReplaceWinVol" TxtUpdateSet="xml" FindPattern="{WindowsVolume}" ReplacePattern="[WindowsVolume]" Options="2" Order="0" FileEncoding="-1"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.TxtUpdateSetComponent">
|
||||
<ROW Key="xml" Component="zookeeper.exe" FileName="*.xml" Directory="tools_Dir" Options="17"/>
|
||||
</COMPONENT>
|
||||
</DOCUMENT>
|
@ -1,197 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<DOCUMENT Type="Advanced Installer" CreateVersion="18.6.1" version="18.7" Modules="enterprise" RootPath="." Language="en" Id="{93F1E21E-F074-444A-9756-659088E0DA02}">
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiPropsComponent">
|
||||
<ROW Property="AI_BITMAP_DISPLAY_MODE" Value="0"/>
|
||||
<ROW Property="AI_CURRENT_YEAR" Value="2022" ValueLocId="-"/>
|
||||
<ROW Property="AI_PRODUCTNAME_ARP" Value="Apache ZooKeeper"/>
|
||||
<ROW Property="AI_UNINSTALLER" Value="msiexec.exe"/>
|
||||
<ROW Property="ALLUSERS" Value="1"/>
|
||||
<ROW Property="ARPNOMODIFY" MultiBuildValue="DefaultBuild:1"/>
|
||||
<ROW Property="ARPNOREPAIR" Value="1"/>
|
||||
<ROW Property="ARPSYSTEMCOMPONENT" Value="1"/>
|
||||
<ROW Property="Manufacturer" Value="Apache"/>
|
||||
<ROW Property="ProductCode" Value="1033:{DA471CF9-78DC-4D13-AB18-87B4604538FA} " Type="16"/>
|
||||
<ROW Property="ProductLanguage" Value="1033"/>
|
||||
<ROW Property="ProductName" Value="Apache ZooKeeper"/>
|
||||
<ROW Property="ProductVersion" Value="1.0.0" Type="32"/>
|
||||
<ROW Property="SecureCustomProperties" Value="OLDPRODUCTS;AI_NEWERPRODUCTFOUND"/>
|
||||
<ROW Property="UpgradeCode" Value="{5CB34BEC-536C-45BA-8C86-77E055EF4325}"/>
|
||||
<ROW Property="WindowsType9X" MultiBuildValue="DefaultBuild:Windows 9x/ME" ValueLocId="-"/>
|
||||
<ROW Property="WindowsType9XDisplay" MultiBuildValue="DefaultBuild:Windows 9x/ME" ValueLocId="-"/>
|
||||
<ROW Property="WindowsTypeNT40" MultiBuildValue="DefaultBuild:Windows NT 4.0" ValueLocId="-"/>
|
||||
<ROW Property="WindowsTypeNT40Display" MultiBuildValue="DefaultBuild:Windows NT 4.0" ValueLocId="-"/>
|
||||
<ROW Property="WindowsTypeNT50" MultiBuildValue="DefaultBuild:Windows 2000" ValueLocId="-"/>
|
||||
<ROW Property="WindowsTypeNT50Display" MultiBuildValue="DefaultBuild:Windows 2000" ValueLocId="-"/>
|
||||
<ROW Property="WindowsTypeNT5X" MultiBuildValue="DefaultBuild:Windows XP/2003" ValueLocId="-"/>
|
||||
<ROW Property="WindowsTypeNT5XDisplay" MultiBuildValue="DefaultBuild:Windows XP/2003" ValueLocId="-"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiDirsComponent">
|
||||
<ROW Directory="APPDIR" Directory_Parent="TARGETDIR" DefaultDir="APPDIR:." IsPseudoRoot="1"/>
|
||||
<ROW Directory="TARGETDIR" DefaultDir="SourceDir"/>
|
||||
<ROW Directory="WindowsVolume" Directory_Parent="TARGETDIR" DefaultDir="WINDOW~1|WindowsVolume" IsPseudoRoot="1"/>
|
||||
<ROW Directory="apachezookeeper3.7.0bin_Dir" Directory_Parent="kafkazookeeper_Dir" DefaultDir="ZOOKEE~1|zookeeper"/>
|
||||
<ROW Directory="kafkazookeeper_Dir" Directory_Parent="WindowsVolume" DefaultDir="Apache"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiCompsComponent">
|
||||
<ROW Component="AI_CustomARPName" ComponentId="{DA50695D-FCFD-46A6-90BD-50D219311605}" Directory_="APPDIR" Attributes="4" KeyPath="DisplayName" Options="1"/>
|
||||
<ROW Component="AI_DisableModify" ComponentId="{01A44BB2-4D9C-4BE1-A645-EDB8A011DC61}" Directory_="APPDIR" Attributes="4" KeyPath="NoModify" Options="1"/>
|
||||
<ROW Component="APPDIR" ComponentId="{7C252C97-43D5-4EE8-884E-1BF7D1A2D490}" Directory_="APPDIR" Attributes="0"/>
|
||||
<ROW Component="ProductInformation" ComponentId="{0903BE7F-28BE-4981-B82B-2D9A86C43A63}" Directory_="APPDIR" Attributes="4" KeyPath="Version"/>
|
||||
<ROW Component="zookeeper" ComponentId="{F2EFFE90-2C47-4BAF-9541-143E8ADF5B4B}" Directory_="apachezookeeper3.7.0bin_Dir" Attributes="0"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiFeatsComponent">
|
||||
<ROW Feature="MainFeature" Title="MainFeature" Description="Description" Display="1" Level="1" Directory_="APPDIR" Attributes="0"/>
|
||||
<ATTRIBUTE name="CurrentFeature" value="MainFeature"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.BootstrOptComponent">
|
||||
<ROW BootstrOptKey="GlobalOptions" DownloadFolder="[AppDataFolder][|Manufacturer]\[|ProductName]\prerequisites" Options="2"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.BuildComponent">
|
||||
<ROW BuildKey="DefaultBuild" BuildName="DefaultBuild" BuildOrder="1" BuildType="0" PackageFolder="publish" PackageFileName="[|ProductName]" Languages="en" InstallationType="4" UseLargeSchema="true" Unicode="true" UACExecutionLevel="2"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.DictionaryComponent">
|
||||
<ROW Path="<AI_DICTS>ui.ail"/>
|
||||
<ROW Path="<AI_DICTS>ui_en.ail"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.FragmentComponent">
|
||||
<ROW Fragment="CommonUI.aip" Path="<AI_FRAGS>CommonUI.aip"/>
|
||||
<ROW Fragment="FolderDlg.aip" Path="<AI_THEMES>classic\fragments\FolderDlg.aip"/>
|
||||
<ROW Fragment="MaintenanceTypeDlg.aip" Path="<AI_THEMES>classic\fragments\MaintenanceTypeDlg.aip"/>
|
||||
<ROW Fragment="MaintenanceWelcomeDlg.aip" Path="<AI_THEMES>classic\fragments\MaintenanceWelcomeDlg.aip"/>
|
||||
<ROW Fragment="SequenceDialogs.aip" Path="<AI_THEMES>classic\fragments\SequenceDialogs.aip"/>
|
||||
<ROW Fragment="Sequences.aip" Path="<AI_FRAGS>Sequences.aip"/>
|
||||
<ROW Fragment="StaticUIStrings.aip" Path="<AI_FRAGS>StaticUIStrings.aip"/>
|
||||
<ROW Fragment="UI.aip" Path="<AI_THEMES>classic\fragments\UI.aip"/>
|
||||
<ROW Fragment="Validation.aip" Path="<AI_FRAGS>Validation.aip"/>
|
||||
<ROW Fragment="VerifyRemoveDlg.aip" Path="<AI_THEMES>classic\fragments\VerifyRemoveDlg.aip"/>
|
||||
<ROW Fragment="VerifyRepairDlg.aip" Path="<AI_THEMES>classic\fragments\VerifyRepairDlg.aip"/>
|
||||
<ROW Fragment="WelcomeDlg.aip" Path="<AI_THEMES>classic\fragments\WelcomeDlg.aip"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiBinaryComponent">
|
||||
<ROW Name="PowerShellScriptLauncher.dll" SourcePath="<AI_CUSTACTS>PowerShellScriptLauncher.dll"/>
|
||||
<ROW Name="aicustact.dll" SourcePath="<AI_CUSTACTS>aicustact.dll"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiControlEventComponent">
|
||||
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL" Ordering="1"/>
|
||||
<ROW Dialog_="FolderDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_INSTALL" Ordering="201"/>
|
||||
<ROW Dialog_="FolderDlg" Control_="Back" Event="NewDialog" Argument="WelcomeDlg" Condition="AI_INSTALL" Ordering="1"/>
|
||||
<ROW Dialog_="VerifyReadyDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_INSTALL" Ordering="197"/>
|
||||
<ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL" Ordering="201"/>
|
||||
<ROW Dialog_="MaintenanceWelcomeDlg" Control_="Next" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT" Ordering="99"/>
|
||||
<ROW Dialog_="CustomizeDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_MAINT" Ordering="101"/>
|
||||
<ROW Dialog_="CustomizeDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT" Ordering="1"/>
|
||||
<ROW Dialog_="VerifyReadyDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_MAINT" Ordering="198"/>
|
||||
<ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="CustomizeDlg" Condition="AI_MAINT" Ordering="202"/>
|
||||
<ROW Dialog_="MaintenanceTypeDlg" Control_="ChangeButton" Event="NewDialog" Argument="CustomizeDlg" Condition="AI_MAINT" Ordering="501"/>
|
||||
<ROW Dialog_="MaintenanceTypeDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceWelcomeDlg" Condition="AI_MAINT" Ordering="1"/>
|
||||
<ROW Dialog_="MaintenanceTypeDlg" Control_="RemoveButton" Event="NewDialog" Argument="VerifyRemoveDlg" Condition="AI_MAINT AND InstallMode="Remove"" Ordering="601"/>
|
||||
<ROW Dialog_="VerifyRemoveDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT AND InstallMode="Remove"" Ordering="1"/>
|
||||
<ROW Dialog_="MaintenanceTypeDlg" Control_="RepairButton" Event="NewDialog" Argument="VerifyRepairDlg" Condition="AI_MAINT AND InstallMode="Repair"" Ordering="601"/>
|
||||
<ROW Dialog_="VerifyRepairDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT AND InstallMode="Repair"" Ordering="1"/>
|
||||
<ROW Dialog_="VerifyRepairDlg" Control_="Repair" Event="EndDialog" Argument="Return" Condition="AI_MAINT AND InstallMode="Repair"" Ordering="399" Options="1"/>
|
||||
<ROW Dialog_="VerifyRemoveDlg" Control_="Remove" Event="EndDialog" Argument="Return" Condition="AI_MAINT AND InstallMode="Remove"" Ordering="299" Options="1"/>
|
||||
<ROW Dialog_="PatchWelcomeDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_PATCH" Ordering="201"/>
|
||||
<ROW Dialog_="ResumeDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_RESUME" Ordering="299"/>
|
||||
<ROW Dialog_="VerifyReadyDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_PATCH" Ordering="199"/>
|
||||
<ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="PatchWelcomeDlg" Condition="AI_PATCH" Ordering="203"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiCreateFolderComponent">
|
||||
<ROW Directory_="APPDIR" Component_="APPDIR" ManualDelete="true"/>
|
||||
<ROW Directory_="apachezookeeper3.7.0bin_Dir" Component_="zookeeper" ManualDelete="false"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiCustActComponent">
|
||||
<ROW Action="AI_BACKUP_AI_SETUPEXEPATH" Type="51" Source="AI_SETUPEXEPATH_ORIGINAL" Target="[AI_SETUPEXEPATH]"/>
|
||||
<ROW Action="AI_DATA_SETTER_2" Type="51" Source="CustomActionData" Target="AEQAaQBnAGkAdABhAGwAbAB5AFMAaQBnAG4AUwBjAHIAaQBwAHQAAgABAEYAbABhAGcAcwACADYAAQBQAGEAcgBhAG0AcwACAAEAUwBjAHIAaQBwAHQAAgAjAFIAZQBxAHUAaQByAGUAcwAgAC0AdgBlAHIAcwBpAG8AbgAgADMADQAKAFAAYQByAGEAbQAoACkADQAKAA0ACgAkAEEAUABQAEQASQBSACAAPQAgAEEASQBfAEcAZQB0AE0AcwBpAFAAcgBvAHAAZQByAHQAeQAgAEEAUABQAEQASQBSAA0ACgAkAE0AQQBJAE4ARABJAFIAIAA9ACAAJABBAFAAUABEAEkAUgAuAFQAbwBTAHQAcgBpAG4AZwAoACkAIAArACAAIgAuAC4AIgANAAoAUgBlAG0AbwB2AGUALQBJAHQAZQBtACAAJABNAEEASQBOAEQASQBSACAALQBSAGUAYwB1AHIAcwBl"/>
|
||||
<ROW Action="AI_DOWNGRADE" Type="19" Target="4010"/>
|
||||
<ROW Action="AI_DpiContentScale" Type="1" Source="aicustact.dll" Target="DpiContentScale"/>
|
||||
<ROW Action="AI_EnableDebugLog" Type="321" Source="aicustact.dll" Target="EnableDebugLog"/>
|
||||
<ROW Action="AI_GetArpIconPath" Type="1" Source="aicustact.dll" Target="GetArpIconPath"/>
|
||||
<ROW Action="AI_InstallModeCheck" Type="1" Source="aicustact.dll" Target="UpdateInstallMode" WithoutSeq="true"/>
|
||||
<ROW Action="AI_PREPARE_UPGRADE" Type="65" Source="aicustact.dll" Target="PrepareUpgrade"/>
|
||||
<ROW Action="AI_RESTORE_AI_SETUPEXEPATH" Type="51" Source="AI_SETUPEXEPATH" Target="[AI_SETUPEXEPATH_ORIGINAL]"/>
|
||||
<ROW Action="AI_RESTORE_LOCATION" Type="65" Source="aicustact.dll" Target="RestoreLocation"/>
|
||||
<ROW Action="AI_ResolveKnownFolders" Type="1" Source="aicustact.dll" Target="AI_ResolveKnownFolders"/>
|
||||
<ROW Action="AI_RestartElevated" Type="1" Source="aicustact.dll" Target="RestartElevated"/>
|
||||
<ROW Action="AI_SHOW_LOG" Type="65" Source="aicustact.dll" Target="LaunchLogFile" WithoutSeq="true"/>
|
||||
<ROW Action="AI_STORE_LOCATION" Type="51" Source="ARPINSTALLLOCATION" Target="[APPDIR]"/>
|
||||
<ROW Action="RemoveManufactorDir" Type="65" Source="PowerShellScriptLauncher.dll" Target="RunPowerShellScript" Options="1" AdditionalSeq="AI_DATA_SETTER_2"/>
|
||||
<ROW Action="SET_APPDIR" Type="307" Source="APPDIR" Target="[ProgramFilesFolder][Manufacturer]\[ProductName]"/>
|
||||
<ROW Action="SET_SHORTCUTDIR" Type="307" Source="SHORTCUTDIR" Target="[ProgramMenuFolder][ProductName]"/>
|
||||
<ROW Action="SET_TARGETDIR_TO_APPDIR" Type="51" Source="TARGETDIR" Target="[APPDIR]"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiFeatCompsComponent">
|
||||
<ROW Feature_="MainFeature" Component_="APPDIR"/>
|
||||
<ROW Feature_="MainFeature" Component_="ProductInformation"/>
|
||||
<ROW Feature_="MainFeature" Component_="zookeeper"/>
|
||||
<ROW Feature_="MainFeature" Component_="AI_CustomARPName"/>
|
||||
<ROW Feature_="MainFeature" Component_="AI_DisableModify"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiInstExSeqComponent">
|
||||
<ROW Action="AI_DOWNGRADE" Condition="AI_NEWERPRODUCTFOUND AND (UILevel <> 5)" Sequence="210"/>
|
||||
<ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=""" Sequence="749"/>
|
||||
<ROW Action="AI_STORE_LOCATION" Condition="(Not Installed) OR REINSTALL" Sequence="1501"/>
|
||||
<ROW Action="AI_PREPARE_UPGRADE" Condition="AI_UPGRADE="No" AND (Not Installed)" Sequence="1397"/>
|
||||
<ROW Action="AI_ResolveKnownFolders" Sequence="52"/>
|
||||
<ROW Action="AI_EnableDebugLog" Sequence="51"/>
|
||||
<ROW Action="RemoveManufactorDir" Condition="( NOT Installed )" Sequence="6602"/>
|
||||
<ROW Action="AI_DATA_SETTER_2" Condition="( NOT Installed )" Sequence="6601"/>
|
||||
<ROW Action="AI_GetArpIconPath" Sequence="1401"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiInstallUISequenceComponent">
|
||||
<ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=""" Sequence="749"/>
|
||||
<ROW Action="AI_ResolveKnownFolders" Sequence="54"/>
|
||||
<ROW Action="AI_DpiContentScale" Sequence="53"/>
|
||||
<ROW Action="AI_EnableDebugLog" Sequence="52"/>
|
||||
<ROW Action="AI_BACKUP_AI_SETUPEXEPATH" Sequence="99"/>
|
||||
<ROW Action="AI_RESTORE_AI_SETUPEXEPATH" Condition="AI_SETUPEXEPATH_ORIGINAL" Sequence="101"/>
|
||||
<ROW Action="AI_RestartElevated" Sequence="51" Builds="DefaultBuild"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiLaunchConditionsComponent">
|
||||
<ROW Condition="((VersionNT <> 501) AND (VersionNT <> 502))" Description="[ProductName] cannot be installed on [WindowsTypeNT5XDisplay]." DescriptionLocId="AI.LaunchCondition.NoNT5X" IsPredefined="true" Builds="DefaultBuild"/>
|
||||
<ROW Condition="(VersionNT <> 400)" Description="[ProductName] cannot be installed on [WindowsTypeNT40Display]." DescriptionLocId="AI.LaunchCondition.NoNT40" IsPredefined="true" Builds="DefaultBuild"/>
|
||||
<ROW Condition="(VersionNT <> 500)" Description="[ProductName] cannot be installed on [WindowsTypeNT50Display]." DescriptionLocId="AI.LaunchCondition.NoNT50" IsPredefined="true" Builds="DefaultBuild"/>
|
||||
<ROW Condition="VersionNT" Description="[ProductName] cannot be installed on [WindowsType9XDisplay]." DescriptionLocId="AI.LaunchCondition.No9X" IsPredefined="true" Builds="DefaultBuild"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiRegsComponent">
|
||||
<ROW Registry="Comments" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="Comments" Value="[ARPCOMMENTS]" Component_="AI_CustomARPName"/>
|
||||
<ROW Registry="Contact" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="Contact" Value="[ARPCONTACT]" Component_="AI_CustomARPName"/>
|
||||
<ROW Registry="CurrentVersion" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion" Name="\"/>
|
||||
<ROW Registry="DisplayIcon" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="DisplayIcon" Value="[ARP_ICON_PATH]" Component_="AI_CustomARPName"/>
|
||||
<ROW Registry="DisplayName" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="DisplayName" Value="[AI_PRODUCTNAME_ARP]" Component_="AI_CustomARPName"/>
|
||||
<ROW Registry="DisplayVersion" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="DisplayVersion" Value="[ProductVersion]" Component_="AI_CustomARPName"/>
|
||||
<ROW Registry="EstimatedSize" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="EstimatedSize" Value="#[AI_ARP_SIZE]" Component_="AI_CustomARPName" VirtualValue="#"/>
|
||||
<ROW Registry="HelpLink" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="HelpLink" Value="[ARPHELPLINK]" Component_="AI_CustomARPName"/>
|
||||
<ROW Registry="HelpTelephone" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="HelpTelephone" Value="[ARPHELPTELEPHONE]" Component_="AI_CustomARPName"/>
|
||||
<ROW Registry="InstallLocation" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="InstallLocation" Value="[APPDIR]" Component_="AI_CustomARPName"/>
|
||||
<ROW Registry="Manufacturer" Root="-1" Key="Software\[Manufacturer]" Name="\"/>
|
||||
<ROW Registry="Microsoft" Root="-1" Key="Software\Microsoft" Name="\"/>
|
||||
<ROW Registry="ModifyPath" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="ModifyPath" Value="[AI_UNINSTALLER] /i [ProductCode] AI_UNINSTALLER_CTP=1" Component_="AI_CustomARPName"/>
|
||||
<ROW Registry="NoModify" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="NoModify" Value="#1" Component_="AI_DisableModify" VirtualValue="#"/>
|
||||
<ROW Registry="NoRepair" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="NoRepair" Value="#1" Component_="AI_CustomARPName" VirtualValue="#"/>
|
||||
<ROW Registry="Path" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="Path" Value="[APPDIR]" Component_="ProductInformation"/>
|
||||
<ROW Registry="ProductName" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="\"/>
|
||||
<ROW Registry="ProductNameProductVersion" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="\"/>
|
||||
<ROW Registry="Publisher" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="Publisher" Value="[Manufacturer]" Component_="AI_CustomARPName"/>
|
||||
<ROW Registry="Readme" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="Readme" Value="[ARPREADME]" Component_="AI_CustomARPName"/>
|
||||
<ROW Registry="Software" Root="-1" Key="Software" Name="\"/>
|
||||
<ROW Registry="URLInfoAbout" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="URLInfoAbout" Value="[ARPURLINFOABOUT]" Component_="AI_CustomARPName"/>
|
||||
<ROW Registry="URLUpdateInfo" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="URLUpdateInfo" Value="[ARPURLUPDATEINFO]" Component_="AI_CustomARPName"/>
|
||||
<ROW Registry="Uninstall" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall" Name="\"/>
|
||||
<ROW Registry="UninstallPath" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="UninstallPath" Value="[AI_UNINSTALLER] /x [ProductCode] AI_UNINSTALLER_CTP=1" Component_="AI_CustomARPName"/>
|
||||
<ROW Registry="UninstallString" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="UninstallString" Value="[AI_UNINSTALLER] /x [ProductCode] AI_UNINSTALLER_CTP=1" Component_="AI_CustomARPName"/>
|
||||
<ROW Registry="Version" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="Version" Value="[ProductVersion]" Component_="ProductInformation"/>
|
||||
<ROW Registry="VersionMajor" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="VersionMajor" Value="#1" Component_="AI_CustomARPName" VirtualValue="#"/>
|
||||
<ROW Registry="VersionMinor" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="VersionMinor" Value="#0" Component_="AI_CustomARPName" VirtualValue="#"/>
|
||||
<ROW Registry="Windows" Root="-1" Key="Software\Microsoft\Windows" Name="\"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiThemeComponent">
|
||||
<ATTRIBUTE name="UsedTheme" value="classic"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiUpgradeComponent">
|
||||
<ROW UpgradeCode="[|UpgradeCode]" VersionMin="0.0.1" VersionMax="[|ProductVersion]" Attributes="257" ActionProperty="OLDPRODUCTS"/>
|
||||
<ROW UpgradeCode="[|UpgradeCode]" VersionMin="[|ProductVersion]" Attributes="2" ActionProperty="AI_NEWERPRODUCTFOUND"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.SynchronizedFolderComponent">
|
||||
<ROW Directory_="apachezookeeper3.7.0bin_Dir" SourcePath="kafka-zookeeper\zookeeper" Feature="MainFeature" ExcludePattern="*~|#*#|%*%|._|CVS|.cvsignore|SCCS|vssver.scc|mssccprj.scc|vssver2.scc|.svn|.DS_Store" ExcludeFlags="6" FileAddOptions="4"/>
|
||||
</COMPONENT>
|
||||
</DOCUMENT>
|
@ -1,11 +1,113 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Web;
|
||||
using System.Net.Sockets;
|
||||
using Microsoft.Deployment.WindowsInstaller;
|
||||
using RabbitMQ.Client;
|
||||
|
||||
namespace Utils
|
||||
{
|
||||
public class CustomActions
|
||||
{
|
||||
public static string CreateAuthToken(string pkey, string machinekey)
|
||||
{
|
||||
using (var hasher = new System.Security.Cryptography.HMACSHA1(Encoding.UTF8.GetBytes(machinekey)))
|
||||
{
|
||||
var now = DateTime.UtcNow.ToString("yyyyMMddHHmmss");
|
||||
var hash = System.Web.HttpServerUtility.UrlTokenEncode(hasher.ComputeHash(Encoding.UTF8.GetBytes(string.Join("\n", now, pkey))));
|
||||
return string.Format("ASC {0}:{1}:{2}", pkey, now, hash);
|
||||
}
|
||||
}
|
||||
|
||||
[CustomAction]
|
||||
public static ActionResult SetVersionReleaseDateSign(Session session)
|
||||
{
|
||||
var pkey = Convert.ToString(session["VERSION.RELEASE_DATE"]);
|
||||
var machineKey = Convert.ToString(session["MACHINE_KEY"]);
|
||||
|
||||
session.Log("SetVersionReleaseDateSign: pkey {0}, machineKey {1}", pkey, machineKey);
|
||||
|
||||
session["VERSION.RELEASE_DATE.SIGN"] = CreateAuthToken(pkey, machineKey);
|
||||
|
||||
session.Log("SetVersionReleaseDateSign End: {0}", session["VERSION.RELEASE_DATE.SIGN"]);
|
||||
|
||||
return ActionResult.Success;
|
||||
}
|
||||
|
||||
|
||||
[CustomAction]
|
||||
public static ActionResult TestRedisServerConnection(Session session)
|
||||
{
|
||||
try
|
||||
{
|
||||
using (var redis = new Redis(session["REDIS_HOST_PROP"], Convert.ToInt32(session["REDIS_PORT_PROP"])))
|
||||
{
|
||||
|
||||
if (!String.IsNullOrEmpty(session["REDIS_PASSWORD_PROP"].Trim()))
|
||||
redis.Password = session["REDIS_PASSWORD_PROP"];
|
||||
|
||||
var pong = redis.Ping("ONLYOFFICE");
|
||||
|
||||
session.Log("Redis Status: IsConnected is {0}", !String.IsNullOrEmpty(pong));
|
||||
session["RedisServerConnectionError"] = !String.IsNullOrEmpty(pong) ? "" : String.Format("Connection Refused HOST:{0},PORT:{1},PASS:{2}", session["REDIS_HOST_PROP"], session["REDIS_PORT_PROP"], session["REDIS_PASSWORD_PROP"]);
|
||||
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
session.Log("RedisConnectionException '{0}'", ex.Message);
|
||||
session["RedisServerConnectionError"] = String.Format("Connection Refused HOST:{0},PORT:{1},PASS:{2}", session["REDIS_HOST_PROP"], session["REDIS_PORT_PROP"], session["REDIS_PASSWORD_PROP"]);
|
||||
}
|
||||
|
||||
return ActionResult.Success;
|
||||
}
|
||||
|
||||
|
||||
[CustomAction]
|
||||
public static ActionResult TestRabbitMQConnection(Session session)
|
||||
{
|
||||
ConnectionFactory factory = new ConnectionFactory();
|
||||
|
||||
factory.HostName = session["RABBITMQ_HOSTNAME_PROP"];
|
||||
factory.Port = Convert.ToInt32(session["RABBITMQ_PORT_PROP"]);
|
||||
factory.VirtualHost = session["RABBITMQ_VIRTUALHOST_PROP"];
|
||||
factory.UserName = session["RABBITMQ_USERNAME_PROP"];
|
||||
factory.Password = session["RABBITMQ_PASSWORD_PROP"];
|
||||
|
||||
try
|
||||
{
|
||||
using (IConnection conn = factory.CreateConnection())
|
||||
{
|
||||
session.Log("RabbitMQ Status: IsConnected is {0}", conn.IsOpen);
|
||||
|
||||
session["RabbitMQServerConnectionError"] = conn.IsOpen ? "" : String.Format("Connection Refused HOST:{0}, PORT:{1}, VirtualHost:{2}, UserName:{3}, PASS:{4}",
|
||||
session["RABBITMQ_HOSTNAME_PROP"],
|
||||
session["RABBITMQ_PORT_PROP"],
|
||||
session["RABBITMQ_VIRTUALHOST_PROP"],
|
||||
session["RABBITMQ_USERNAME_PROP"],
|
||||
session["RABBITMQ_PASSWORD_PROP"]
|
||||
);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
session.Log("RabbitMQ.Client.Exceptions.BrokerUnreachableException {0}", ex.Message);
|
||||
session["RabbitMQServerConnectionError"] = String.Format("Connection Refused HOST:{0}, PORT:{1}, VirtualHost:{2}, UserName:{3}, PASS:{4}",
|
||||
session["RABBITMQ_HOSTNAME_PROP"],
|
||||
session["RABBITMQ_PORT_PROP"],
|
||||
session["RABBITMQ_VIRTUALHOST_PROP"],
|
||||
session["RABBITMQ_USERNAME_PROP"],
|
||||
session["RABBITMQ_PASSWORD_PROP"]
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
return ActionResult.Success;
|
||||
|
||||
}
|
||||
|
||||
[CustomAction]
|
||||
public static ActionResult CheckTCPAvailability(Session session)
|
||||
{
|
||||
|
@ -1,4 +1,5 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
|
@ -32,6 +32,9 @@
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="RabbitMQ.Client">
|
||||
<HintPath>packages\RabbitMQ.Client.3.6.5\lib\net45\RabbitMQ.Client.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.IO.Compression" />
|
||||
@ -46,8 +49,12 @@
|
||||
<ItemGroup>
|
||||
<Compile Include="CustomAction.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="redis-sharp.cs" />
|
||||
<Content Include="CustomAction.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<Import Project="$(WixCATargetsPath)" />
|
||||
</Project>
|
4
build/install/win/CustomActions/C#/Utils/packages.config
Normal file
4
build/install/win/CustomActions/C#/Utils/packages.config
Normal file
@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="RabbitMQ.Client" version="3.6.5" targetFramework="net45" />
|
||||
</packages>
|
937
build/install/win/CustomActions/C#/Utils/redis-sharp.cs
Normal file
937
build/install/win/CustomActions/C#/Utils/redis-sharp.cs
Normal file
@ -0,0 +1,937 @@
|
||||
//
|
||||
// redis-sharp.cs: ECMA CLI Binding to the Redis key-value storage system
|
||||
//
|
||||
// Authors:
|
||||
// Miguel de Icaza (miguel@gnome.org)
|
||||
//
|
||||
// Copyright 2010 Novell, Inc.
|
||||
//
|
||||
// Licensed under the same terms of reddis: new BSD license.
|
||||
//
|
||||
#define DEBUG
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Collections.Generic;
|
||||
using System.Net.Sockets;
|
||||
using System.Text;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
|
||||
public class Redis : IDisposable {
|
||||
Socket socket;
|
||||
BufferedStream bstream;
|
||||
|
||||
public enum KeyType {
|
||||
None, String, List, Set
|
||||
}
|
||||
|
||||
public class ResponseException : Exception {
|
||||
public ResponseException (string code) : base ("Response error")
|
||||
{
|
||||
Code = code;
|
||||
}
|
||||
|
||||
public string Code { get; private set; }
|
||||
}
|
||||
|
||||
public Redis (string host, int port)
|
||||
{
|
||||
if (host == null)
|
||||
throw new ArgumentNullException ("host");
|
||||
|
||||
Host = host;
|
||||
Port = port;
|
||||
SendTimeout = -1;
|
||||
}
|
||||
|
||||
public Redis (string host) : this (host, 6379)
|
||||
{
|
||||
}
|
||||
|
||||
public Redis () : this ("localhost", 6379)
|
||||
{
|
||||
}
|
||||
|
||||
public string Host { get; private set; }
|
||||
public int Port { get; private set; }
|
||||
public int RetryTimeout { get; set; }
|
||||
public int RetryCount { get; set; }
|
||||
public int SendTimeout { get; set; }
|
||||
public string Password { get; set; }
|
||||
|
||||
int db;
|
||||
public int Db {
|
||||
get {
|
||||
return db;
|
||||
}
|
||||
|
||||
set {
|
||||
db = value;
|
||||
SendExpectSuccess ("SELECT", db);
|
||||
}
|
||||
}
|
||||
|
||||
public string this [string key] {
|
||||
get { return GetString (key); }
|
||||
set { Set (key, value); }
|
||||
}
|
||||
|
||||
public void Set (string key, string value)
|
||||
{
|
||||
if (key == null)
|
||||
throw new ArgumentNullException ("key");
|
||||
if (value == null)
|
||||
throw new ArgumentNullException ("value");
|
||||
|
||||
Set (key, Encoding.UTF8.GetBytes (value));
|
||||
}
|
||||
|
||||
|
||||
public void Set (string key, byte [] value)
|
||||
{
|
||||
if (key == null)
|
||||
throw new ArgumentNullException ("key");
|
||||
if (value == null)
|
||||
throw new ArgumentNullException ("value");
|
||||
|
||||
if (value.Length > 1073741824)
|
||||
throw new ArgumentException ("value exceeds 1G", "value");
|
||||
|
||||
if (!SendDataCommand (value, "SET", key))
|
||||
throw new Exception ("Unable to connect");
|
||||
ExpectSuccess ();
|
||||
}
|
||||
|
||||
public bool SetNX (string key, string value)
|
||||
{
|
||||
if (key == null)
|
||||
throw new ArgumentNullException ("key");
|
||||
if (value == null)
|
||||
throw new ArgumentNullException ("value");
|
||||
|
||||
return SetNX (key, Encoding.UTF8.GetBytes (value));
|
||||
}
|
||||
|
||||
public bool SetNX (string key, byte [] value)
|
||||
{
|
||||
if (key == null)
|
||||
throw new ArgumentNullException ("key");
|
||||
if (value == null)
|
||||
throw new ArgumentNullException ("value");
|
||||
|
||||
if (value.Length > 1073741824)
|
||||
throw new ArgumentException ("value exceeds 1G", "value");
|
||||
|
||||
return SendDataExpectInt (value, "SETNX", key) > 0 ? true : false;
|
||||
}
|
||||
|
||||
public void Set (IDictionary<string,string> dict)
|
||||
{
|
||||
if (dict == null)
|
||||
throw new ArgumentNullException ("dict");
|
||||
|
||||
Set (dict.ToDictionary(k => k.Key, v => Encoding.UTF8.GetBytes(v.Value)));
|
||||
}
|
||||
|
||||
public void Set (IDictionary<string,byte []> dict)
|
||||
{
|
||||
if (dict == null)
|
||||
throw new ArgumentNullException ("dict");
|
||||
|
||||
MSet (dict.Keys.ToArray (), dict.Values.ToArray ());
|
||||
}
|
||||
|
||||
public void MSet (string [] keys, byte [][] values)
|
||||
{
|
||||
if (keys.Length != values.Length)
|
||||
throw new ArgumentException ("keys and values must have the same size");
|
||||
|
||||
byte [] nl = Encoding.UTF8.GetBytes ("\r\n");
|
||||
MemoryStream ms = new MemoryStream ();
|
||||
|
||||
for (int i = 0; i < keys.Length; i++) {
|
||||
byte [] key = Encoding.UTF8.GetBytes(keys[i]);
|
||||
byte [] val = values[i];
|
||||
byte [] kLength = Encoding.UTF8.GetBytes ("$" + key.Length + "\r\n");
|
||||
byte [] k = Encoding.UTF8.GetBytes (keys[i] + "\r\n");
|
||||
byte [] vLength = Encoding.UTF8.GetBytes ("$" + val.Length + "\r\n");
|
||||
ms.Write (kLength, 0, kLength.Length);
|
||||
ms.Write (k, 0, k.Length);
|
||||
ms.Write (vLength, 0, vLength.Length);
|
||||
ms.Write (val, 0, val.Length);
|
||||
ms.Write (nl, 0, nl.Length);
|
||||
}
|
||||
|
||||
SendDataRESP (ms.ToArray (), "*" + (keys.Length * 2 + 1) + "\r\n$4\r\nMSET\r\n");
|
||||
ExpectSuccess ();
|
||||
}
|
||||
|
||||
public byte [] Get (string key)
|
||||
{
|
||||
if (key == null)
|
||||
throw new ArgumentNullException ("key");
|
||||
return SendExpectData ("GET", key);
|
||||
}
|
||||
|
||||
public string Ping(String key)
|
||||
{
|
||||
return Encoding.UTF8.GetString (SendExpectData("PING", key));
|
||||
}
|
||||
|
||||
public string GetString (string key)
|
||||
{
|
||||
if (key == null)
|
||||
throw new ArgumentNullException ("key");
|
||||
return Encoding.UTF8.GetString (Get (key));
|
||||
}
|
||||
|
||||
public byte [][] Sort (SortOptions options)
|
||||
{
|
||||
return Sort (options.Key, options.StoreInKey, options.ToArgs());
|
||||
}
|
||||
|
||||
public byte [][] Sort (string key, string destination, params object [] options)
|
||||
{
|
||||
if (key == null)
|
||||
throw new ArgumentNullException ("key");
|
||||
|
||||
int offset = string.IsNullOrEmpty (destination) ? 1 : 3;
|
||||
object [] args = new object [offset + options.Length];
|
||||
|
||||
args [0] = key;
|
||||
Array.Copy (options, 0, args, offset, options.Length);
|
||||
if (offset == 1) {
|
||||
return SendExpectDataArray ("SORT", args);
|
||||
}
|
||||
else {
|
||||
args [1] = "STORE";
|
||||
args [2] = destination;
|
||||
int n = SendExpectInt ("SORT", args);
|
||||
return new byte [n][];
|
||||
}
|
||||
}
|
||||
|
||||
public byte [] GetSet (string key, byte [] value)
|
||||
{
|
||||
if (key == null)
|
||||
throw new ArgumentNullException ("key");
|
||||
if (value == null)
|
||||
throw new ArgumentNullException ("value");
|
||||
|
||||
if (value.Length > 1073741824)
|
||||
throw new ArgumentException ("value exceeds 1G", "value");
|
||||
|
||||
if (!SendDataCommand (value, "GETSET", key))
|
||||
throw new Exception ("Unable to connect");
|
||||
|
||||
return ReadData ();
|
||||
}
|
||||
|
||||
public string GetSet (string key, string value)
|
||||
{
|
||||
if (key == null)
|
||||
throw new ArgumentNullException ("key");
|
||||
if (value == null)
|
||||
throw new ArgumentNullException ("value");
|
||||
return Encoding.UTF8.GetString (GetSet (key, Encoding.UTF8.GetBytes (value)));
|
||||
}
|
||||
|
||||
string ReadLine ()
|
||||
{
|
||||
StringBuilder sb = new StringBuilder ();
|
||||
int c;
|
||||
|
||||
while ((c = bstream.ReadByte ()) != -1){
|
||||
if (c == '\r')
|
||||
continue;
|
||||
if (c == '\n')
|
||||
break;
|
||||
sb.Append ((char) c);
|
||||
}
|
||||
return sb.ToString ();
|
||||
}
|
||||
|
||||
void Connect ()
|
||||
{
|
||||
socket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
|
||||
socket.NoDelay = true;
|
||||
socket.SendTimeout = SendTimeout;
|
||||
socket.Connect (Host, Port);
|
||||
if (!socket.Connected){
|
||||
socket.Close ();
|
||||
socket = null;
|
||||
return;
|
||||
}
|
||||
bstream = new BufferedStream (new NetworkStream (socket), 16*1024);
|
||||
|
||||
if (Password != null)
|
||||
SendExpectSuccess ("AUTH", Password);
|
||||
}
|
||||
|
||||
byte [] end_data = new byte [] { (byte) '\r', (byte) '\n' };
|
||||
|
||||
bool SendDataCommand (byte [] data, string cmd, params object [] args)
|
||||
{
|
||||
string resp = "*" + (1 + args.Length + 1).ToString () + "\r\n";
|
||||
resp += "$" + cmd.Length + "\r\n" + cmd + "\r\n";
|
||||
foreach (object arg in args) {
|
||||
string argStr = arg.ToString ();
|
||||
int argStrLength = Encoding.UTF8.GetByteCount(argStr);
|
||||
resp += "$" + argStrLength + "\r\n" + argStr + "\r\n";
|
||||
}
|
||||
resp += "$" + data.Length + "\r\n";
|
||||
|
||||
return SendDataRESP (data, resp);
|
||||
}
|
||||
|
||||
bool SendDataRESP (byte [] data, string resp)
|
||||
{
|
||||
if (socket == null)
|
||||
Connect ();
|
||||
if (socket == null)
|
||||
return false;
|
||||
|
||||
byte [] r = Encoding.UTF8.GetBytes (resp);
|
||||
try {
|
||||
Log ("C", resp);
|
||||
socket.Send (r);
|
||||
if (data != null){
|
||||
socket.Send (data);
|
||||
socket.Send (end_data);
|
||||
}
|
||||
} catch (SocketException){
|
||||
// timeout;
|
||||
socket.Close ();
|
||||
socket = null;
|
||||
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool SendCommand (string cmd, params object [] args)
|
||||
{
|
||||
if (socket == null)
|
||||
Connect ();
|
||||
if (socket == null)
|
||||
return false;
|
||||
|
||||
string resp = "*" + (1 + args.Length).ToString () + "\r\n";
|
||||
resp += "$" + cmd.Length + "\r\n" + cmd + "\r\n";
|
||||
foreach (object arg in args) {
|
||||
string argStr = arg.ToString ();
|
||||
int argStrLength = Encoding.UTF8.GetByteCount(argStr);
|
||||
resp += "$" + argStrLength + "\r\n" + argStr + "\r\n";
|
||||
}
|
||||
|
||||
byte [] r = Encoding.UTF8.GetBytes (resp);
|
||||
try {
|
||||
Log ("C", resp);
|
||||
socket.Send (r);
|
||||
} catch (SocketException){
|
||||
// timeout;
|
||||
socket.Close ();
|
||||
socket = null;
|
||||
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
[Conditional ("DEBUG")]
|
||||
void Log (string id, string message)
|
||||
{
|
||||
Console.WriteLine(id + ": " + message.Trim().Replace("\r\n", " "));
|
||||
}
|
||||
|
||||
void ExpectSuccess ()
|
||||
{
|
||||
int c = bstream.ReadByte ();
|
||||
if (c == -1)
|
||||
throw new ResponseException ("No more data");
|
||||
|
||||
string s = ReadLine ();
|
||||
Log ("S", (char)c + s);
|
||||
if (c == '-')
|
||||
throw new ResponseException (s.StartsWith ("ERR ") ? s.Substring (4) : s);
|
||||
}
|
||||
|
||||
void SendExpectSuccess (string cmd, params object [] args)
|
||||
{
|
||||
if (!SendCommand (cmd, args))
|
||||
throw new Exception ("Unable to connect");
|
||||
|
||||
ExpectSuccess ();
|
||||
}
|
||||
|
||||
int SendDataExpectInt (byte[] data, string cmd, params object [] args)
|
||||
{
|
||||
if (!SendDataCommand (data, cmd, args))
|
||||
throw new Exception ("Unable to connect");
|
||||
|
||||
int c = bstream.ReadByte ();
|
||||
if (c == -1)
|
||||
throw new ResponseException ("No more data");
|
||||
|
||||
string s = ReadLine ();
|
||||
Log ("S", (char)c + s);
|
||||
if (c == '-')
|
||||
throw new ResponseException (s.StartsWith ("ERR ") ? s.Substring (4) : s);
|
||||
if (c == ':'){
|
||||
int i;
|
||||
if (int.TryParse (s, out i))
|
||||
return i;
|
||||
}
|
||||
throw new ResponseException ("Unknown reply on integer request: " + c + s);
|
||||
}
|
||||
|
||||
int SendExpectInt (string cmd, params object [] args)
|
||||
{
|
||||
if (!SendCommand (cmd, args))
|
||||
throw new Exception ("Unable to connect");
|
||||
|
||||
int c = bstream.ReadByte ();
|
||||
if (c == -1)
|
||||
throw new ResponseException ("No more data");
|
||||
|
||||
string s = ReadLine ();
|
||||
Log ("S", (char)c + s);
|
||||
if (c == '-')
|
||||
throw new ResponseException (s.StartsWith ("ERR ") ? s.Substring (4) : s);
|
||||
if (c == ':'){
|
||||
int i;
|
||||
if (int.TryParse (s, out i))
|
||||
return i;
|
||||
}
|
||||
throw new ResponseException ("Unknown reply on integer request: " + c + s);
|
||||
}
|
||||
|
||||
string SendExpectString (string cmd, params object [] args)
|
||||
{
|
||||
if (!SendCommand (cmd, args))
|
||||
throw new Exception ("Unable to connect");
|
||||
|
||||
int c = bstream.ReadByte ();
|
||||
if (c == -1)
|
||||
throw new ResponseException ("No more data");
|
||||
|
||||
string s = ReadLine ();
|
||||
Log ("S", (char)c + s);
|
||||
if (c == '-')
|
||||
throw new ResponseException (s.StartsWith ("ERR ") ? s.Substring (4) : s);
|
||||
if (c == '+')
|
||||
return s;
|
||||
|
||||
throw new ResponseException ("Unknown reply on integer request: " + c + s);
|
||||
}
|
||||
|
||||
//
|
||||
// This one does not throw errors
|
||||
//
|
||||
string SendGetString (string cmd, params object [] args)
|
||||
{
|
||||
if (!SendCommand (cmd, args))
|
||||
throw new Exception ("Unable to connect");
|
||||
|
||||
return ReadLine ();
|
||||
}
|
||||
|
||||
byte [] SendExpectData (string cmd, params object [] args)
|
||||
{
|
||||
if (!SendCommand (cmd, args))
|
||||
throw new Exception ("Unable to connect");
|
||||
|
||||
return ReadData ();
|
||||
}
|
||||
|
||||
byte [] ReadData ()
|
||||
{
|
||||
string s = ReadLine ();
|
||||
Log ("S", s);
|
||||
if (s.Length == 0)
|
||||
throw new ResponseException ("Zero length respose");
|
||||
|
||||
char c = s [0];
|
||||
if (c == '-')
|
||||
throw new ResponseException (s.StartsWith ("-ERR ") ? s.Substring (5) : s.Substring (1));
|
||||
|
||||
if (c == '$'){
|
||||
if (s == "$-1")
|
||||
return null;
|
||||
int n;
|
||||
|
||||
if (Int32.TryParse (s.Substring (1), out n)){
|
||||
byte [] retbuf = new byte [n];
|
||||
|
||||
int bytesRead = 0;
|
||||
do {
|
||||
int read = bstream.Read (retbuf, bytesRead, n - bytesRead);
|
||||
if (read < 1)
|
||||
throw new ResponseException("Invalid termination mid stream");
|
||||
bytesRead += read;
|
||||
}
|
||||
while (bytesRead < n);
|
||||
if (bstream.ReadByte () != '\r' || bstream.ReadByte () != '\n')
|
||||
throw new ResponseException ("Invalid termination");
|
||||
return retbuf;
|
||||
}
|
||||
throw new ResponseException ("Invalid length");
|
||||
}
|
||||
|
||||
/* don't treat arrays here because only one element works -- use DataArray!
|
||||
//returns the number of matches
|
||||
if (c == '*') {
|
||||
int n;
|
||||
if (Int32.TryParse(s.Substring(1), out n))
|
||||
return n <= 0 ? new byte [0] : ReadData();
|
||||
|
||||
throw new ResponseException ("Unexpected length parameter" + r);
|
||||
}
|
||||
*/
|
||||
|
||||
throw new ResponseException ("Unexpected reply: " + s);
|
||||
}
|
||||
|
||||
public bool ContainsKey (string key)
|
||||
{
|
||||
if (key == null)
|
||||
throw new ArgumentNullException ("key");
|
||||
return SendExpectInt ("EXISTS", key) == 1;
|
||||
}
|
||||
|
||||
public bool Remove (string key)
|
||||
{
|
||||
if (key == null)
|
||||
throw new ArgumentNullException ("key");
|
||||
return SendExpectInt ("DEL", key) == 1;
|
||||
}
|
||||
|
||||
public int Remove (params string [] args)
|
||||
{
|
||||
if (args == null)
|
||||
throw new ArgumentNullException ("args");
|
||||
return SendExpectInt ("DEL", args);
|
||||
}
|
||||
|
||||
public int Increment (string key)
|
||||
{
|
||||
if (key == null)
|
||||
throw new ArgumentNullException ("key");
|
||||
return SendExpectInt ("INCR", key);
|
||||
}
|
||||
|
||||
public int Increment (string key, int count)
|
||||
{
|
||||
if (key == null)
|
||||
throw new ArgumentNullException ("key");
|
||||
return SendExpectInt ("INCRBY", key, count);
|
||||
}
|
||||
|
||||
public int Decrement (string key)
|
||||
{
|
||||
if (key == null)
|
||||
throw new ArgumentNullException ("key");
|
||||
return SendExpectInt ("DECR", key);
|
||||
}
|
||||
|
||||
public int Decrement (string key, int count)
|
||||
{
|
||||
if (key == null)
|
||||
throw new ArgumentNullException ("key");
|
||||
return SendExpectInt ("DECRBY", key, count);
|
||||
}
|
||||
|
||||
public KeyType TypeOf (string key)
|
||||
{
|
||||
if (key == null)
|
||||
throw new ArgumentNullException ("key");
|
||||
switch (SendExpectString ("TYPE", key)) {
|
||||
case "none":
|
||||
return KeyType.None;
|
||||
case "string":
|
||||
return KeyType.String;
|
||||
case "set":
|
||||
return KeyType.Set;
|
||||
case "list":
|
||||
return KeyType.List;
|
||||
}
|
||||
throw new ResponseException ("Invalid value");
|
||||
}
|
||||
|
||||
public string RandomKey ()
|
||||
{
|
||||
return SendExpectString ("RANDOMKEY");
|
||||
}
|
||||
|
||||
public bool Rename (string oldKeyname, string newKeyname)
|
||||
{
|
||||
if (oldKeyname == null)
|
||||
throw new ArgumentNullException ("oldKeyname");
|
||||
if (newKeyname == null)
|
||||
throw new ArgumentNullException ("newKeyname");
|
||||
return SendGetString ("RENAME", oldKeyname, newKeyname) [0] == '+';
|
||||
}
|
||||
|
||||
public bool Expire (string key, int seconds)
|
||||
{
|
||||
if (key == null)
|
||||
throw new ArgumentNullException ("key");
|
||||
return SendExpectInt ("EXPIRE", key, seconds) == 1;
|
||||
}
|
||||
|
||||
public bool ExpireAt (string key, int time)
|
||||
{
|
||||
if (key == null)
|
||||
throw new ArgumentNullException ("key");
|
||||
return SendExpectInt ("EXPIREAT", key, time) == 1;
|
||||
}
|
||||
|
||||
public int TimeToLive (string key)
|
||||
{
|
||||
if (key == null)
|
||||
throw new ArgumentNullException ("key");
|
||||
return SendExpectInt ("TTL", key);
|
||||
}
|
||||
|
||||
public int DbSize {
|
||||
get {
|
||||
return SendExpectInt ("DBSIZE");
|
||||
}
|
||||
}
|
||||
|
||||
public void Save ()
|
||||
{
|
||||
SendExpectSuccess ("SAVE");
|
||||
}
|
||||
|
||||
public void BackgroundSave ()
|
||||
{
|
||||
SendExpectSuccess ("BGSAVE");
|
||||
}
|
||||
|
||||
public void Shutdown ()
|
||||
{
|
||||
SendCommand ("SHUTDOWN");
|
||||
try {
|
||||
// the server may return an error
|
||||
string s = ReadLine ();
|
||||
Log ("S", s);
|
||||
if (s.Length == 0)
|
||||
throw new ResponseException ("Zero length respose");
|
||||
throw new ResponseException (s.StartsWith ("-ERR ") ? s.Substring (5) : s.Substring (1));
|
||||
} catch (IOException) {
|
||||
// this is the expected good result
|
||||
socket.Close ();
|
||||
socket = null;
|
||||
}
|
||||
}
|
||||
|
||||
public void FlushAll ()
|
||||
{
|
||||
SendExpectSuccess ("FLUSHALL");
|
||||
}
|
||||
|
||||
public void FlushDb ()
|
||||
{
|
||||
SendExpectSuccess ("FLUSHDB");
|
||||
}
|
||||
|
||||
const long UnixEpoch = 621355968000000000L;
|
||||
|
||||
public DateTime LastSave {
|
||||
get {
|
||||
int t = SendExpectInt ("LASTSAVE");
|
||||
|
||||
return new DateTime (UnixEpoch) + TimeSpan.FromSeconds (t);
|
||||
}
|
||||
}
|
||||
|
||||
public Dictionary<string,string> GetInfo ()
|
||||
{
|
||||
byte [] r = SendExpectData ("INFO");
|
||||
var dict = new Dictionary<string,string>();
|
||||
|
||||
foreach (var line in Encoding.UTF8.GetString (r).Split ('\n')){
|
||||
int p = line.IndexOf (':');
|
||||
if (p == -1)
|
||||
continue;
|
||||
dict.Add (line.Substring (0, p), line.Substring (p+1));
|
||||
}
|
||||
return dict;
|
||||
}
|
||||
|
||||
public string [] Keys {
|
||||
get {
|
||||
return GetKeys("*");
|
||||
}
|
||||
}
|
||||
|
||||
public string [] GetKeys (string pattern)
|
||||
{
|
||||
if (pattern == null)
|
||||
throw new ArgumentNullException ("pattern");
|
||||
|
||||
return SendExpectStringArray ("KEYS", pattern);
|
||||
}
|
||||
|
||||
public byte [][] MGet (params string [] keys)
|
||||
{
|
||||
if (keys == null)
|
||||
throw new ArgumentNullException ("keys");
|
||||
if (keys.Length == 0)
|
||||
throw new ArgumentException ("keys");
|
||||
|
||||
return SendExpectDataArray ("MGET", keys);
|
||||
}
|
||||
|
||||
|
||||
public string [] SendExpectStringArray (string cmd, params object [] args)
|
||||
{
|
||||
byte [][] reply = SendExpectDataArray (cmd, args);
|
||||
string [] keys = new string [reply.Length];
|
||||
for (int i = 0; i < reply.Length; i++)
|
||||
keys[i] = Encoding.UTF8.GetString (reply[i]);
|
||||
return keys;
|
||||
}
|
||||
|
||||
public byte[][] SendExpectDataArray (string cmd, params object [] args)
|
||||
{
|
||||
if (!SendCommand (cmd, args))
|
||||
throw new Exception("Unable to connect");
|
||||
int c = bstream.ReadByte();
|
||||
if (c == -1)
|
||||
throw new ResponseException("No more data");
|
||||
|
||||
string s = ReadLine();
|
||||
Log("S", (char)c + s);
|
||||
if (c == '-')
|
||||
throw new ResponseException(s.StartsWith("ERR ") ? s.Substring(4) : s);
|
||||
if (c == '*') {
|
||||
int count;
|
||||
if (int.TryParse (s, out count)) {
|
||||
byte [][] result = new byte [count][];
|
||||
|
||||
for (int i = 0; i < count; i++)
|
||||
result[i] = ReadData();
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
throw new ResponseException("Unknown reply on multi-request: " + c + s);
|
||||
}
|
||||
|
||||
#region List commands
|
||||
public byte[][] ListRange(string key, int start, int end)
|
||||
{
|
||||
return SendExpectDataArray ("LRANGE", key, start, end);
|
||||
}
|
||||
|
||||
public void LeftPush(string key, string value)
|
||||
{
|
||||
LeftPush(key, Encoding.UTF8.GetBytes (value));
|
||||
}
|
||||
|
||||
public void LeftPush(string key, byte [] value)
|
||||
{
|
||||
SendDataCommand (value, "LPUSH", key);
|
||||
ExpectSuccess();
|
||||
}
|
||||
|
||||
public void RightPush(string key, string value)
|
||||
{
|
||||
RightPush(key, Encoding.UTF8.GetBytes (value));
|
||||
}
|
||||
|
||||
public void RightPush(string key, byte [] value)
|
||||
{
|
||||
SendDataCommand (value, "RPUSH", key);
|
||||
ExpectSuccess();
|
||||
}
|
||||
|
||||
public int ListLength (string key)
|
||||
{
|
||||
return SendExpectInt ("LLEN", key);
|
||||
}
|
||||
|
||||
public byte[] ListIndex (string key, int index)
|
||||
{
|
||||
SendCommand ("LINDEX", key, index);
|
||||
return ReadData ();
|
||||
}
|
||||
|
||||
public byte[] LeftPop(string key)
|
||||
{
|
||||
SendCommand ("LPOP", key);
|
||||
return ReadData ();
|
||||
}
|
||||
|
||||
public byte[] RightPop(string key)
|
||||
{
|
||||
SendCommand ("RPOP", key);
|
||||
return ReadData ();
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Set commands
|
||||
public bool AddToSet (string key, byte[] member)
|
||||
{
|
||||
return SendDataExpectInt(member, "SADD", key) > 0;
|
||||
}
|
||||
|
||||
public bool AddToSet (string key, string member)
|
||||
{
|
||||
return AddToSet (key, Encoding.UTF8.GetBytes(member));
|
||||
}
|
||||
|
||||
public int CardinalityOfSet (string key)
|
||||
{
|
||||
return SendExpectInt ("SCARD", key);
|
||||
}
|
||||
|
||||
public bool IsMemberOfSet (string key, byte[] member)
|
||||
{
|
||||
return SendDataExpectInt (member, "SISMEMBER", key) > 0;
|
||||
}
|
||||
|
||||
public bool IsMemberOfSet(string key, string member)
|
||||
{
|
||||
return IsMemberOfSet(key, Encoding.UTF8.GetBytes(member));
|
||||
}
|
||||
|
||||
public byte[][] GetMembersOfSet (string key)
|
||||
{
|
||||
return SendExpectDataArray ("SMEMBERS", key);
|
||||
}
|
||||
|
||||
public byte[] GetRandomMemberOfSet (string key)
|
||||
{
|
||||
return SendExpectData ("SRANDMEMBER", key);
|
||||
}
|
||||
|
||||
public byte[] PopRandomMemberOfSet (string key)
|
||||
{
|
||||
return SendExpectData ("SPOP", key);
|
||||
}
|
||||
|
||||
public bool RemoveFromSet (string key, byte[] member)
|
||||
{
|
||||
return SendDataExpectInt (member, "SREM", key) > 0;
|
||||
}
|
||||
|
||||
public bool RemoveFromSet (string key, string member)
|
||||
{
|
||||
return RemoveFromSet (key, Encoding.UTF8.GetBytes(member));
|
||||
}
|
||||
|
||||
public byte[][] GetUnionOfSets (params string[] keys)
|
||||
{
|
||||
if (keys == null)
|
||||
throw new ArgumentNullException();
|
||||
|
||||
return SendExpectDataArray ("SUNION", keys);
|
||||
|
||||
}
|
||||
|
||||
void StoreSetCommands (string cmd, params string[] keys)
|
||||
{
|
||||
if (String.IsNullOrEmpty(cmd))
|
||||
throw new ArgumentNullException ("cmd");
|
||||
|
||||
if (keys == null)
|
||||
throw new ArgumentNullException ("keys");
|
||||
|
||||
SendExpectSuccess (cmd, keys);
|
||||
}
|
||||
|
||||
public void StoreUnionOfSets (params string[] keys)
|
||||
{
|
||||
StoreSetCommands ("SUNIONSTORE", keys);
|
||||
}
|
||||
|
||||
public byte[][] GetIntersectionOfSets (params string[] keys)
|
||||
{
|
||||
if (keys == null)
|
||||
throw new ArgumentNullException();
|
||||
|
||||
return SendExpectDataArray ("SINTER", keys);
|
||||
}
|
||||
|
||||
public void StoreIntersectionOfSets (params string[] keys)
|
||||
{
|
||||
StoreSetCommands ("SINTERSTORE", keys);
|
||||
}
|
||||
|
||||
public byte[][] GetDifferenceOfSets (params string[] keys)
|
||||
{
|
||||
if (keys == null)
|
||||
throw new ArgumentNullException();
|
||||
|
||||
return SendExpectDataArray ("SDIFF", keys);
|
||||
}
|
||||
|
||||
public void StoreDifferenceOfSets (params string[] keys)
|
||||
{
|
||||
StoreSetCommands ("SDIFFSTORE", keys);
|
||||
}
|
||||
|
||||
public bool MoveMemberToSet (string srcKey, string destKey, byte[] member)
|
||||
{
|
||||
return SendDataExpectInt (member, "SMOVE", srcKey, destKey) > 0;
|
||||
}
|
||||
#endregion
|
||||
|
||||
public void Dispose ()
|
||||
{
|
||||
Dispose (true);
|
||||
GC.SuppressFinalize (this);
|
||||
}
|
||||
|
||||
~Redis ()
|
||||
{
|
||||
Dispose (false);
|
||||
}
|
||||
|
||||
protected virtual void Dispose (bool disposing)
|
||||
{
|
||||
if (disposing){
|
||||
SendCommand ("QUIT");
|
||||
ExpectSuccess ();
|
||||
socket.Close ();
|
||||
socket = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class SortOptions {
|
||||
public string Key { get; set; }
|
||||
public bool Descending { get; set; }
|
||||
public bool Lexographically { get; set; }
|
||||
public Int32 LowerLimit { get; set; }
|
||||
public Int32 UpperLimit { get; set; }
|
||||
public string By { get; set; }
|
||||
public string StoreInKey { get; set; }
|
||||
public string Get { get; set; }
|
||||
|
||||
public object [] ToArgs ()
|
||||
{
|
||||
System.Collections.ArrayList args = new System.Collections.ArrayList();
|
||||
|
||||
if (LowerLimit != 0 || UpperLimit != 0) {
|
||||
args.Add ("LIMIT");
|
||||
args.Add (LowerLimit);
|
||||
args.Add (UpperLimit);
|
||||
}
|
||||
if (Lexographically)
|
||||
args.Add("ALPHA");
|
||||
if (!string.IsNullOrEmpty (By)) {
|
||||
args.Add("BY");
|
||||
args.Add(By);
|
||||
}
|
||||
if (!string.IsNullOrEmpty (Get)) {
|
||||
args.Add("GET");
|
||||
args.Add(Get);
|
||||
}
|
||||
return args.ToArray ();
|
||||
}
|
||||
}
|
@ -28,7 +28,9 @@
|
||||
<ROW Property="ELASTICSEARCH_PORT" Value="9200" ValueLocId="-"/>
|
||||
<ROW Property="ELASTICSEARCH_SCHEME" Value="http" ValueLocId="-"/>
|
||||
<ROW Property="ENVIRONMENT" Value="test"/>
|
||||
<ROW Property="Editor_Port" Value="5013"/>
|
||||
<ROW Property="INSTALL_ROOT_FOLDER_NAME" Value="[|Manufacturer]"/>
|
||||
<ROW Property="Login_Port" Value="5011"/>
|
||||
<ROW Property="MSIFASTINSTALL" MultiBuildValue="DefaultBuild:3"/>
|
||||
<ROW Property="MYSQLODBCDRIVER" Value="MySQL ODBC 8.0 Unicode Driver"/>
|
||||
<ROW Property="Manufacturer" Value="Ascensio System SIA"/>
|
||||
@ -56,8 +58,10 @@
|
||||
<ROW Property="ServiceName_BackgroundTasks" Value="ASC.Data.Backup.BackgroundTasks"/>
|
||||
<ROW Property="ServiceName_BackupService" Value="ASC.BackupService"/>
|
||||
<ROW Property="ServiceName_ClearEvents" Value="ASC.ClearEvents"/>
|
||||
<ROW Property="ServiceName_DocEditor" Value="ASC.DocEditor"/>
|
||||
<ROW Property="ServiceName_FileServer" Value="ASC.FileServer"/>
|
||||
<ROW Property="ServiceName_FileService" Value="ASC.FileService"/>
|
||||
<ROW Property="ServiceName_Login" Value="ASC.Login"/>
|
||||
<ROW Property="ServiceName_Migration" Value="ASC.Migration"/>
|
||||
<ROW Property="ServiceName_MigrationRunner" Value="ASC.MigrationRunner"/>
|
||||
<ROW Property="ServiceName_NotifyService" Value="ASC.NotifyService"/>
|
||||
@ -71,8 +75,11 @@
|
||||
<ROW Property="ServiceName_WebApi" Value="ASC.WebApi"/>
|
||||
<ROW Property="ServiceName_WebStudio" Value="ASC.WebStudio"/>
|
||||
<ROW Property="ServiceName_WebhooksService" Value="ASC.WebhooksService"/>
|
||||
<ROW Property="Socket.IO_Port" Value="9899"/>
|
||||
<ROW Property="SsoAuth_port" Value="9834"/>
|
||||
<ROW Property="USERNAME_PROP" Value="root"/>
|
||||
<ROW Property="UpgradeCode" Value="{FFA9CD16-E087-45F3-8D34-3BBA1EF8A897}"/>
|
||||
<ROW Property="UrlShortener_Port" Value="9999"/>
|
||||
<ROW Property="WindowsType9X" MultiBuildValue="DefaultBuild:Windows 9x/ME" ValueLocId="-"/>
|
||||
<ROW Property="WindowsType9XDisplay" MultiBuildValue="DefaultBuild:Windows 9x/ME" ValueLocId="-"/>
|
||||
<ROW Property="WindowsTypeNT40" MultiBuildValue="DefaultBuild:Windows NT 4.0" ValueLocId="-"/>
|
||||
@ -83,82 +90,163 @@
|
||||
<ROW Property="WindowsTypeNT5XDisplay" MultiBuildValue="DefaultBuild:Windows XP/2003" ValueLocId="-"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiDirsComponent">
|
||||
<ROW Directory="APPDIR" Directory_Parent="TARGETDIR" DefaultDir="APPDIR:." IsPseudoRoot="1"/>
|
||||
<ROW Directory="ASC.ClearEvents_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.CLE|ASC.ClearEvents"/>
|
||||
<ROW Directory="ASC.Data.Backup.BackgroundTasks_Dir" Directory_Parent="services_Dir" DefaultDir="ASCDAT~2.BAC|ASC.Data.Backup.BackgroundTasks"/>
|
||||
<ROW Directory="ASC.Data.Backup_Dir" Directory_Parent="services_Dir" DefaultDir="ASCDAT~1.BAC|ASC.Data.Backup"/>
|
||||
<ROW Directory="ASC.Files.Service_Dir" Directory_Parent="services_Dir" DefaultDir="ASCFIL~1.SER|ASC.Files.Service"/>
|
||||
<ROW Directory="ASC.Files_Dir" Directory_Parent="products_Dir" DefaultDir="ASC~1.FIL|ASC.Files"/>
|
||||
<ROW Directory="ASC.Migration.Runner_Dir" Directory_Parent="services_Dir" DefaultDir="ASCMIG~1.RUN|ASC.Migration.Runner"/>
|
||||
<ROW Directory="ASC.Migration_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.MIG|ASC.Migration"/>
|
||||
<ROW Directory="ASC.Notify_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.NOT|ASC.Notify"/>
|
||||
<ROW Directory="ASC.People_Dir" Directory_Parent="products_Dir" DefaultDir="ASC~1.PEO|ASC.People"/>
|
||||
<ROW Directory="ASC.Socket.IO_Dir" Directory_Parent="services_Dir" DefaultDir="ASCSOC~1.IO|ASC.Socket.IO"/>
|
||||
<ROW Directory="ASC.SsoAuth_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.SSO|ASC.SsoAuth"/>
|
||||
<ROW Directory="ASC.Studio.Notify_Dir" Directory_Parent="services_Dir" DefaultDir="ASCSTU~1.NOT|ASC.Studio.Notify"/>
|
||||
<ROW Directory="ASC.TelegramService_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.TEL|ASC.TelegramService"/>
|
||||
<ROW Directory="ASC.UrlShortener_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.URL|ASC.UrlShortener"/>
|
||||
<ROW Directory="ASC.Web.Api_Dir" Directory_Parent="services_Dir" DefaultDir="ASCWEB~1.API|ASC.Web.Api"/>
|
||||
<ROW Directory="ASC.Web.Studio_Dir" Directory_Parent="services_Dir" DefaultDir="ASCWEB~1.STU|ASC.Web.Studio"/>
|
||||
<ROW Directory="ASC.Webhooks.Service_Dir" Directory_Parent="services_Dir" DefaultDir="ASCWEB~1.SER|ASC.Webhooks.Service"/>
|
||||
<ROW Directory="NewFolder_1_Dir" Directory_Parent="service_1_Dir" DefaultDir="config"/>
|
||||
<ROW Directory="NewFolder_3_Dir" Directory_Parent="ASC.Webhooks.Service_Dir" DefaultDir="service"/>
|
||||
<ROW Directory="NewFolder_Dir" Directory_Parent="ASC.UrlShortener_Dir" DefaultDir="service"/>
|
||||
<ROW Directory="APPDIR" Directory_Parent="TARGETDIR" DefaultDir="APPDIR:." IsPseudoRoot="1" DirectoryOptions="12"/>
|
||||
<ROW Directory="ASC.ClearEvents_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.CLE|ASC.ClearEvents" DirectoryOptions="12"/>
|
||||
<ROW Directory="ASC.Data.Backup.BackgroundTasks_Dir" Directory_Parent="services_Dir" DefaultDir="ASCDAT~2.BAC|ASC.Data.Backup.BackgroundTasks" DirectoryOptions="12"/>
|
||||
<ROW Directory="ASC.Data.Backup_Dir" Directory_Parent="services_Dir" DefaultDir="ASCDAT~1.BAC|ASC.Data.Backup" DirectoryOptions="12"/>
|
||||
<ROW Directory="ASC.Files.Service_Dir" Directory_Parent="services_Dir" DefaultDir="ASCFIL~1.SER|ASC.Files.Service" DirectoryOptions="12"/>
|
||||
<ROW Directory="ASC.Files_Dir" Directory_Parent="products_Dir" DefaultDir="ASC~1.FIL|ASC.Files" DirectoryOptions="12"/>
|
||||
<ROW Directory="ASC.Login_Dir" Directory_Parent="products_Dir" DefaultDir="ASC~1.LOG|ASC.Login" DirectoryOptions="12"/>
|
||||
<ROW Directory="ASC.Migration.Runner_Dir" Directory_Parent="services_Dir" DefaultDir="ASCMIG~1.RUN|ASC.Migration.Runner" DirectoryOptions="12"/>
|
||||
<ROW Directory="ASC.Migration_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.MIG|ASC.Migration" DirectoryOptions="12"/>
|
||||
<ROW Directory="ASC.Notify_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.NOT|ASC.Notify" DirectoryOptions="12"/>
|
||||
<ROW Directory="ASC.People_Dir" Directory_Parent="products_Dir" DefaultDir="ASC~1.PEO|ASC.People" DirectoryOptions="12"/>
|
||||
<ROW Directory="ASC.Socket.IO_Dir" Directory_Parent="services_Dir" DefaultDir="ASCSOC~1.IO|ASC.Socket.IO" DirectoryOptions="12"/>
|
||||
<ROW Directory="ASC.SsoAuth_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.SSO|ASC.SsoAuth" DirectoryOptions="12"/>
|
||||
<ROW Directory="ASC.Studio.Notify_Dir" Directory_Parent="services_Dir" DefaultDir="ASCSTU~1.NOT|ASC.Studio.Notify" DirectoryOptions="12"/>
|
||||
<ROW Directory="ASC.TelegramService_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.TEL|ASC.TelegramService" DirectoryOptions="12"/>
|
||||
<ROW Directory="ASC.UrlShortener_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.URL|ASC.UrlShortener" DirectoryOptions="12"/>
|
||||
<ROW Directory="ASC.Web.Api_Dir" Directory_Parent="services_Dir" DefaultDir="ASCWEB~1.API|ASC.Web.Api" DirectoryOptions="12"/>
|
||||
<ROW Directory="ASC.Web.Studio_Dir" Directory_Parent="services_Dir" DefaultDir="ASCWEB~1.STU|ASC.Web.Studio" DirectoryOptions="12"/>
|
||||
<ROW Directory="ASC.Webhooks.Service_Dir" Directory_Parent="services_Dir" DefaultDir="ASCWEB~1.SER|ASC.Webhooks.Service" DirectoryOptions="12"/>
|
||||
<ROW Directory="Logs_Dir" Directory_Parent="APPDIR" DefaultDir="Logs" DirectoryOptions="12"/>
|
||||
<ROW Directory="NewFolder_1_Dir" Directory_Parent="service_1_Dir" DefaultDir="config" DirectoryOptions="12"/>
|
||||
<ROW Directory="NewFolder_3_Dir" Directory_Parent="ASC.Webhooks.Service_Dir" DefaultDir="service" DirectoryOptions="12"/>
|
||||
<ROW Directory="NewFolder_Dir" Directory_Parent="ASC.UrlShortener_Dir" DefaultDir="service" DirectoryOptions="12"/>
|
||||
<ROW Directory="TARGETDIR" DefaultDir="SourceDir"/>
|
||||
<ROW Directory="config_1_Dir" Directory_Parent="NewFolder_Dir" DefaultDir="config"/>
|
||||
<ROW Directory="config_2_Dir" Directory_Parent="service_5_Dir" DefaultDir="config"/>
|
||||
<ROW Directory="config_Dir" Directory_Parent="APPDIR" DefaultDir="config"/>
|
||||
<ROW Directory="products_Dir" Directory_Parent="APPDIR" DefaultDir="products"/>
|
||||
<ROW Directory="public_Dir" Directory_Parent="APPDIR" DefaultDir="public"/>
|
||||
<ROW Directory="server_2_Dir" Directory_Parent="ASC.Files_Dir" DefaultDir="server"/>
|
||||
<ROW Directory="server_5_Dir" Directory_Parent="ASC.People_Dir" DefaultDir="server"/>
|
||||
<ROW Directory="service_11_Dir" Directory_Parent="ASC.Studio.Notify_Dir" DefaultDir="service"/>
|
||||
<ROW Directory="service_12_Dir" Directory_Parent="ASC.TelegramService_Dir" DefaultDir="service"/>
|
||||
<ROW Directory="service_15_Dir" Directory_Parent="ASC.Web.Api_Dir" DefaultDir="service"/>
|
||||
<ROW Directory="service_16_Dir" Directory_Parent="ASC.Web.Studio_Dir" DefaultDir="service"/>
|
||||
<ROW Directory="service_1_Dir" Directory_Parent="ASC.Socket.IO_Dir" DefaultDir="service"/>
|
||||
<ROW Directory="service_2_Dir" Directory_Parent="ASC.Data.Backup_Dir" DefaultDir="service"/>
|
||||
<ROW Directory="service_3_Dir" Directory_Parent="ASC.Data.Backup.BackgroundTasks_Dir" DefaultDir="service"/>
|
||||
<ROW Directory="service_4_Dir" Directory_Parent="ASC.Migration_Dir" DefaultDir="service"/>
|
||||
<ROW Directory="service_5_Dir" Directory_Parent="ASC.SsoAuth_Dir" DefaultDir="service"/>
|
||||
<ROW Directory="service_6_Dir" Directory_Parent="ASC.Migration.Runner_Dir" DefaultDir="service"/>
|
||||
<ROW Directory="service_7_Dir" Directory_Parent="ASC.Files.Service_Dir" DefaultDir="service"/>
|
||||
<ROW Directory="service_9_Dir" Directory_Parent="ASC.Notify_Dir" DefaultDir="service"/>
|
||||
<ROW Directory="service_Dir" Directory_Parent="ASC.ClearEvents_Dir" DefaultDir="service"/>
|
||||
<ROW Directory="services_Dir" Directory_Parent="APPDIR" DefaultDir="services"/>
|
||||
<ROW Directory="tools_Dir" Directory_Parent="APPDIR" DefaultDir="tools"/>
|
||||
<ROW Directory="conf_Dir" Directory_Parent="nginx_Dir" DefaultDir="conf" DirectoryOptions="12"/>
|
||||
<ROW Directory="config_1_Dir" Directory_Parent="NewFolder_Dir" DefaultDir="config" DirectoryOptions="12"/>
|
||||
<ROW Directory="config_2_Dir" Directory_Parent="service_5_Dir" DefaultDir="config" DirectoryOptions="12"/>
|
||||
<ROW Directory="config_Dir" Directory_Parent="APPDIR" DefaultDir="config" DirectoryOptions="12"/>
|
||||
<ROW Directory="editor_Dir" Directory_Parent="ASC.Files_Dir" DefaultDir="editor" DirectoryOptions="12"/>
|
||||
<ROW Directory="includes_Dir" Directory_Parent="conf_Dir" DefaultDir="includes" DirectoryOptions="12"/>
|
||||
<ROW Directory="login_Dir" Directory_Parent="ASC.Login_Dir" DefaultDir="login" DirectoryOptions="12"/>
|
||||
<ROW Directory="logs_Dir" Directory_Parent="nginx_Dir" DefaultDir="logs" DirectoryOptions="12"/>
|
||||
<ROW Directory="nginx_Dir" Directory_Parent="APPDIR" DefaultDir="nginx" DirectoryOptions="12"/>
|
||||
<ROW Directory="products_Dir" Directory_Parent="APPDIR" DefaultDir="products" DirectoryOptions="12"/>
|
||||
<ROW Directory="server_2_Dir" Directory_Parent="ASC.Files_Dir" DefaultDir="server" DirectoryOptions="12"/>
|
||||
<ROW Directory="server_5_Dir" Directory_Parent="ASC.People_Dir" DefaultDir="server" DirectoryOptions="12"/>
|
||||
<ROW Directory="service_11_Dir" Directory_Parent="ASC.Studio.Notify_Dir" DefaultDir="service" DirectoryOptions="12"/>
|
||||
<ROW Directory="service_12_Dir" Directory_Parent="ASC.TelegramService_Dir" DefaultDir="service" DirectoryOptions="12"/>
|
||||
<ROW Directory="service_15_Dir" Directory_Parent="ASC.Web.Api_Dir" DefaultDir="service" DirectoryOptions="12"/>
|
||||
<ROW Directory="service_16_Dir" Directory_Parent="ASC.Web.Studio_Dir" DefaultDir="service" DirectoryOptions="12"/>
|
||||
<ROW Directory="service_1_Dir" Directory_Parent="ASC.Socket.IO_Dir" DefaultDir="service" DirectoryOptions="12"/>
|
||||
<ROW Directory="service_2_Dir" Directory_Parent="ASC.Data.Backup_Dir" DefaultDir="service" DirectoryOptions="12"/>
|
||||
<ROW Directory="service_3_Dir" Directory_Parent="ASC.Data.Backup.BackgroundTasks_Dir" DefaultDir="service" DirectoryOptions="12"/>
|
||||
<ROW Directory="service_4_Dir" Directory_Parent="ASC.Migration_Dir" DefaultDir="service" DirectoryOptions="12"/>
|
||||
<ROW Directory="service_5_Dir" Directory_Parent="ASC.SsoAuth_Dir" DefaultDir="service" DirectoryOptions="12"/>
|
||||
<ROW Directory="service_6_Dir" Directory_Parent="ASC.Migration.Runner_Dir" DefaultDir="service" DirectoryOptions="12"/>
|
||||
<ROW Directory="service_7_Dir" Directory_Parent="ASC.Files.Service_Dir" DefaultDir="service" DirectoryOptions="12"/>
|
||||
<ROW Directory="service_9_Dir" Directory_Parent="ASC.Notify_Dir" DefaultDir="service" DirectoryOptions="12"/>
|
||||
<ROW Directory="service_Dir" Directory_Parent="ASC.ClearEvents_Dir" DefaultDir="service" DirectoryOptions="12"/>
|
||||
<ROW Directory="services_Dir" Directory_Parent="APPDIR" DefaultDir="services" DirectoryOptions="12"/>
|
||||
<ROW Directory="temp_10_Dir" Directory_Parent="service_16_Dir" DefaultDir="temp" DirectoryOptions="12"/>
|
||||
<ROW Directory="temp_11_Dir" Directory_Parent="NewFolder_3_Dir" DefaultDir="temp" DirectoryOptions="12"/>
|
||||
<ROW Directory="temp_12_Dir" Directory_Parent="service_12_Dir" DefaultDir="temp" DirectoryOptions="12"/>
|
||||
<ROW Directory="temp_13_Dir" Directory_Parent="server_2_Dir" DefaultDir="temp" DirectoryOptions="12"/>
|
||||
<ROW Directory="temp_14_Dir" Directory_Parent="server_5_Dir" DefaultDir="temp" DirectoryOptions="12"/>
|
||||
<ROW Directory="temp_1_Dir" Directory_Parent="service_Dir" DefaultDir="temp" DirectoryOptions="12"/>
|
||||
<ROW Directory="temp_2_Dir" Directory_Parent="service_3_Dir" DefaultDir="temp" DirectoryOptions="12"/>
|
||||
<ROW Directory="temp_3_Dir" Directory_Parent="service_7_Dir" DefaultDir="temp" DirectoryOptions="12"/>
|
||||
<ROW Directory="temp_4_Dir" Directory_Parent="service_2_Dir" DefaultDir="temp" DirectoryOptions="12"/>
|
||||
<ROW Directory="temp_5_Dir" Directory_Parent="service_4_Dir" DefaultDir="temp" DirectoryOptions="12"/>
|
||||
<ROW Directory="temp_6_Dir" Directory_Parent="service_6_Dir" DefaultDir="temp" DirectoryOptions="12"/>
|
||||
<ROW Directory="temp_7_Dir" Directory_Parent="service_9_Dir" DefaultDir="temp" DirectoryOptions="12"/>
|
||||
<ROW Directory="temp_8_Dir" Directory_Parent="service_11_Dir" DefaultDir="temp" DirectoryOptions="12"/>
|
||||
<ROW Directory="temp_9_Dir" Directory_Parent="service_15_Dir" DefaultDir="temp" DirectoryOptions="12"/>
|
||||
<ROW Directory="temp_Dir" Directory_Parent="nginx_Dir" DefaultDir="temp" DirectoryOptions="12"/>
|
||||
<ROW Directory="tools_Dir" Directory_Parent="APPDIR" DefaultDir="tools" DirectoryOptions="12"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiCompsComponent">
|
||||
<ROW Component="AI_CustomARPName" ComponentId="{5283455D-3786-42EC-9887-FCF453E2FBF9}" Directory_="APPDIR" Attributes="4" KeyPath="DisplayName" Options="1"/>
|
||||
<ROW Component="AI_DisableModify" ComponentId="{E036B14F-E2E4-4247-B9AB-55C1F6142BF9}" Directory_="APPDIR" Attributes="4" KeyPath="NoModify" Options="1"/>
|
||||
<ROW Component="AI_ExePath" ComponentId="{EDF666FF-8C56-4EB7-8255-67DA879A090C}" Directory_="APPDIR" Attributes="4" KeyPath="AI_ExePath"/>
|
||||
<ROW Component="APPDIR" ComponentId="{E32A4F89-E985-4E8E-AB26-DFCD685A316B}" Directory_="APPDIR" Attributes="0"/>
|
||||
<ROW Component="ASC.ClearEvents" ComponentId="{73FB7C9B-9AA8-4BB6-A2C3-E85F6B5BE1D5}" Directory_="ASC.ClearEvents_Dir" Attributes="0"/>
|
||||
<ROW Component="ASC.ClearEvents.exe" ComponentId="{208F2E9D-F72D-47D8-8B6E-0B85E3EAD12E}" Directory_="service_Dir" Attributes="0" KeyPath="ASC.ClearEvents.exe"/>
|
||||
<ROW Component="ASC.Data.Backup" ComponentId="{DDE1435C-947F-4507-B55B-B0594193F8E4}" Directory_="ASC.Data.Backup_Dir" Attributes="0"/>
|
||||
<ROW Component="ASC.Data.Backup.BackgroundTasks" ComponentId="{E6D04525-2108-45E9-8DC2-AD692A66026A}" Directory_="ASC.Data.Backup.BackgroundTasks_Dir" Attributes="0"/>
|
||||
<ROW Component="ASC.Data.Backup.BackgroundTasks.exe" ComponentId="{CB715B3B-BFC0-4A4D-8B47-B1DB7A99A49E}" Directory_="service_3_Dir" Attributes="0" KeyPath="ASC.Data.Backup.BackgroundTasks.exe"/>
|
||||
<ROW Component="ASC.Data.Backup.exe" ComponentId="{240665F1-DDCF-4FFB-ABEE-2F784ACD87E6}" Directory_="service_2_Dir" Attributes="256" KeyPath="ASC.Data.Backup.exe"/>
|
||||
<ROW Component="ASC.Files" ComponentId="{7D4356CB-8A55-4528-8CF6-E3C6181DC119}" Directory_="ASC.Files_Dir" Attributes="0"/>
|
||||
<ROW Component="ASC.Files.Service" ComponentId="{10E5C648-6B24-40DB-926A-4E26E7ABBE7E}" Directory_="ASC.Files.Service_Dir" Attributes="0"/>
|
||||
<ROW Component="ASC.Files.Service.exe" ComponentId="{14D153CC-E7A6-4818-A310-9CE1F332DCDA}" Directory_="service_7_Dir" Attributes="256" KeyPath="ASC.Files.Service.exe"/>
|
||||
<ROW Component="ASC.Files.exe" ComponentId="{4D48DD81-BABF-4E1C-A216-C72C1EA8428B}" Directory_="server_2_Dir" Attributes="256" KeyPath="ASC.Files.exe"/>
|
||||
<ROW Component="ASC.Login" ComponentId="{323B1636-C7E9-4DA2-8575-92D939FA381F}" Directory_="ASC.Login_Dir" Attributes="0"/>
|
||||
<ROW Component="ASC.Migration" ComponentId="{26C33C84-C6FC-4DDB-8DFA-F7012F29C4EC}" Directory_="ASC.Migration_Dir" Attributes="0"/>
|
||||
<ROW Component="ASC.Migration.Runner" ComponentId="{C03F968B-6259-4CE7-89C7-3236EDD2170C}" Directory_="ASC.Migration.Runner_Dir" Attributes="0"/>
|
||||
<ROW Component="ASC.Migration.Runner.exe" ComponentId="{124E8A20-2ECA-4DC0-ACD9-DBEA64CCF2CF}" Directory_="service_6_Dir" Attributes="256" KeyPath="ASC.Migration.Runner.exe"/>
|
||||
<ROW Component="ASC.Migration.exe" ComponentId="{C65B4FF9-AAE7-41EF-B05F-737FF78DEB4F}" Directory_="service_4_Dir" Attributes="0" KeyPath="ASC.Migration.exe"/>
|
||||
<ROW Component="ASC.Notify" ComponentId="{A94C4D5B-1426-4B3D-ACF5-0C316E4E792D}" Directory_="ASC.Notify_Dir" Attributes="0"/>
|
||||
<ROW Component="ASC.Notify.exe" ComponentId="{7457E31A-B6FC-4A71-A5C0-174C9E965051}" Directory_="service_9_Dir" Attributes="256" KeyPath="ASC.Notify.exe"/>
|
||||
<ROW Component="ASC.People" ComponentId="{8FDAD389-26DF-47BE-8DC5-A9DE5DF3BD22}" Directory_="ASC.People_Dir" Attributes="0"/>
|
||||
<ROW Component="ASC.People.exe" ComponentId="{044D57BC-8BAC-4D64-AB36-141BAA1F2E15}" Directory_="server_5_Dir" Attributes="256" KeyPath="ASC.People.exe"/>
|
||||
<ROW Component="ASC.Socket.IO" ComponentId="{A22A1FDB-2706-4133-812D-0AA1E5B5BF02}" Directory_="ASC.Socket.IO_Dir" Attributes="0"/>
|
||||
<ROW Component="ASC.SsoAuth" ComponentId="{0A4502F2-6D3B-491B-86B1-BDC54C78FE18}" Directory_="ASC.SsoAuth_Dir" Attributes="0"/>
|
||||
<ROW Component="ASC.Studio.Notify" ComponentId="{49CD6FD5-5B49-4CB9-8EDD-654922F11F88}" Directory_="ASC.Studio.Notify_Dir" Attributes="0"/>
|
||||
<ROW Component="ASC.Studio.Notify.exe" ComponentId="{AFB3D13A-4F5B-46E1-8819-3517A228C22B}" Directory_="service_11_Dir" Attributes="256" KeyPath="ASC.Studio.Notify.exe"/>
|
||||
<ROW Component="ASC.TelegramService" ComponentId="{57B76E6A-DEF4-4242-96D4-E43AEBC68A97}" Directory_="ASC.TelegramService_Dir" Attributes="0"/>
|
||||
<ROW Component="ASC.TelegramService.exe" ComponentId="{475A1DBC-3864-434E-86E2-497D70D39BDE}" Directory_="service_12_Dir" Attributes="256" KeyPath="ASC.TelegramService.exe"/>
|
||||
<ROW Component="ASC.UrlShortener" ComponentId="{B5FB450A-789E-4096-BE2D-7E9E92FA665C}" Directory_="ASC.UrlShortener_Dir" Attributes="0"/>
|
||||
<ROW Component="ASC.Web.Api" ComponentId="{CFFB4D5A-23D0-4BD6-BB8D-A62FCE92B883}" Directory_="ASC.Web.Api_Dir" Attributes="0"/>
|
||||
<ROW Component="ASC.Web.Api.exe" ComponentId="{E726DF21-2E7E-4C62-8F6E-C63C65B041EC}" Directory_="service_15_Dir" Attributes="256" KeyPath="ASC.Web.Api.exe"/>
|
||||
<ROW Component="ASC.Web.Studio" ComponentId="{8C58AEA7-5FC3-4506-ACF6-611A801D0426}" Directory_="ASC.Web.Studio_Dir" Attributes="0"/>
|
||||
<ROW Component="ASC.Web.Studio.exe" ComponentId="{00F95035-98D9-44AD-9DB4-B34306EE2170}" Directory_="service_16_Dir" Attributes="256" KeyPath="ASC.Web.Studio.exe"/>
|
||||
<ROW Component="ASC.Webhooks.Service" ComponentId="{9B39D301-7EAD-48C8-A88C-A3570C132D08}" Directory_="ASC.Webhooks.Service_Dir" Attributes="0"/>
|
||||
<ROW Component="ASC.Webhooks.Service.exe" ComponentId="{9D6002C5-A610-4B28-982C-2DB794571878}" Directory_="NewFolder_3_Dir" Attributes="0" KeyPath="ASC.Webhooks.Service.exe"/>
|
||||
<ROW Component="DocEditor.exe" ComponentId="{FBE9155F-9ACD-4A1A-9198-891ED73BA90C}" Directory_="tools_Dir" Attributes="0" KeyPath="DocEditor.exe"/>
|
||||
<ROW Component="Login.exe" ComponentId="{FBE9155F-9ACD-4A1A-9198-891ED73BA202}" Directory_="tools_Dir" Attributes="0" KeyPath="Login.exe"/>
|
||||
<ROW Component="Logs" ComponentId="{6C28AF1C-0190-4DE3-A753-430496711F3C}" Directory_="Logs_Dir" Attributes="0"/>
|
||||
<ROW Component="ProductInformation" ComponentId="{5FB28D19-6A7D-4078-901F-58C2DF0DE176}" Directory_="APPDIR" Attributes="4" KeyPath="Version"/>
|
||||
<ROW Component="Proxy.exe" ComponentId="{913596AD-5C75-4418-8C3A-FAB2A70530DB}" Directory_="tools_Dir" Attributes="0" KeyPath="Proxy.exe"/>
|
||||
<ROW Component="Socket.IO.exe" ComponentId="{D08CDE1C-FB16-49AB-98A2-92FD887774F1}" Directory_="tools_Dir" Attributes="0" KeyPath="Socket.IO.exe"/>
|
||||
<ROW Component="SsoAuth.exe" ComponentId="{B4A48C44-5FC0-43D8-9CFB-EB4A4AAB4169}" Directory_="tools_Dir" Attributes="0" KeyPath="SsoAuth.exe"/>
|
||||
<ROW Component="UrlShortener.exe" ComponentId="{1F1D4189-385A-4AE1-8011-A82ED137DA22}" Directory_="tools_Dir" Attributes="0" KeyPath="UrlShortener.exe"/>
|
||||
<ROW Component="conf" ComponentId="{88EC3AED-DF73-4B66-A228-9A87CFB5519D}" Directory_="conf_Dir" Attributes="0"/>
|
||||
<ROW Component="config" ComponentId="{B58E086D-0CB4-4F53-8411-3AE5A46D1DE4}" Directory_="config_Dir" Attributes="0"/>
|
||||
<ROW Component="config_socketio" ComponentId="{4F28A197-AD56-48D0-9E97-9F88A73BE24E}" Directory_="NewFolder_1_Dir" Attributes="0"/>
|
||||
<ROW Component="config_ssoauth" ComponentId="{D51A4591-143D-4C91-8665-BED153555AC0}" Directory_="config_2_Dir" Attributes="0"/>
|
||||
<ROW Component="config_urlshortener" ComponentId="{3A8A13E2-9BAA-485B-9E09-A6AD3EF70127}" Directory_="config_1_Dir" Attributes="0"/>
|
||||
<ROW Component="favicon.ico" ComponentId="{31B18A50-6FF2-4C5E-8A1F-018247C8C55C}" Directory_="public_Dir" Attributes="0" KeyPath="favicon.ico" Type="0"/>
|
||||
<ROW Component="proxy.exe" ComponentId="{913596AD-5C75-4418-8C3A-FAB2A70530DB}" Directory_="tools_Dir" Attributes="0" KeyPath="proxy.exe"/>
|
||||
<ROW Component="proxy.xml" ComponentId="{92B2BA6A-009B-4731-A0E2-A6C729DC8A68}" Directory_="tools_Dir" Attributes="0" KeyPath="proxy.xml" Type="0"/>
|
||||
<ROW Component="public" ComponentId="{025757D9-89DC-4136-A278-2B273D3A741A}" Directory_="public_Dir" Attributes="0"/>
|
||||
<ROW Component="editor" ComponentId="{7BB6D12C-B38B-435D-8A86-2D5D2AB0543F}" Directory_="editor_Dir" Attributes="0"/>
|
||||
<ROW Component="includes" ComponentId="{6F7827D0-7F14-4F09-BB3C-98E0633F5D1B}" Directory_="includes_Dir" Attributes="0"/>
|
||||
<ROW Component="login" ComponentId="{17166A18-3A7B-44FF-A6A3-0938FD45B107}" Directory_="login_Dir" Attributes="0"/>
|
||||
<ROW Component="logs" ComponentId="{183C2BF5-A348-407D-BEB4-8A5A6C3D7DB8}" Directory_="logs_Dir" Attributes="0"/>
|
||||
<ROW Component="nginx" ComponentId="{F6782189-7D44-4DDE-B1A5-5DF8D2B839F5}" Directory_="nginx_Dir" Attributes="0"/>
|
||||
<ROW Component="products" ComponentId="{5A3B0279-AFE0-456F-9685-5422D5E731B6}" Directory_="products_Dir" Attributes="0"/>
|
||||
<ROW Component="server_ASC.Files" ComponentId="{8B02814C-6260-4A36-8C09-26AF31CDE52A}" Directory_="server_2_Dir" Attributes="0"/>
|
||||
<ROW Component="server_ASC.People" ComponentId="{BDBA6378-A15F-44CC-BD6E-232FB7CFBA59}" Directory_="server_5_Dir" Attributes="0"/>
|
||||
<ROW Component="service_ASC.ClearEvents" ComponentId="{1BDE62CE-18DF-4372-9B95-41287FA84740}" Directory_="service_Dir" Attributes="0"/>
|
||||
<ROW Component="service_ASC.Data.Backup" ComponentId="{F5899AA1-8093-4BB3-862C-34A782831A72}" Directory_="service_2_Dir" Attributes="0"/>
|
||||
<ROW Component="service_ASC.Data.Backup.BachgroundTasks" ComponentId="{CCF47514-0441-44B9-A77D-C4E5619638BB}" Directory_="service_3_Dir" Attributes="0"/>
|
||||
<ROW Component="service_ASC.File.Service" ComponentId="{C94C9F5B-91E0-4AE3-8A7B-752198128A1E}" Directory_="service_7_Dir" Attributes="0"/>
|
||||
<ROW Component="service_ASC.Migration" ComponentId="{F209787D-632E-4E20-8415-7D71DBAE5B5A}" Directory_="service_4_Dir" Attributes="0"/>
|
||||
<ROW Component="service_ASC.Migration.Runner" ComponentId="{A21DD084-2228-4E0E-9F32-7A04F6766F8D}" Directory_="service_6_Dir" Attributes="0"/>
|
||||
<ROW Component="service_ASC.Notify" ComponentId="{1A0897FF-9EBE-4D01-AFC5-3CBF264CA6C2}" Directory_="service_9_Dir" Attributes="0"/>
|
||||
<ROW Component="service_ASC.Socket.IO" ComponentId="{F050F8C3-24CF-45F6-AFA4-05F2C121BA1E}" Directory_="service_1_Dir" Attributes="0"/>
|
||||
<ROW Component="service_ASC.SsoAuth" ComponentId="{1DD71548-898E-4C6D-9D54-7DB4ABF7E976}" Directory_="service_5_Dir" Attributes="0"/>
|
||||
<ROW Component="service_ASC.Studio.Notify" ComponentId="{C30289A6-F81B-4C4B-9C77-969DBD83EF66}" Directory_="service_11_Dir" Attributes="0"/>
|
||||
<ROW Component="service_ASC.TelegramService" ComponentId="{1CB6D2E9-EE2F-4FEC-82E6-77B775303032}" Directory_="service_12_Dir" Attributes="0"/>
|
||||
<ROW Component="service_ASC.Urlshortner" ComponentId="{B8D83118-B7EA-4C8D-85AD-01A0098561D9}" Directory_="NewFolder_Dir" Attributes="0"/>
|
||||
<ROW Component="service_ASC.Web.Studio" ComponentId="{24E30A59-BC9C-4497-9B31-9FDD1130851B}" Directory_="service_16_Dir" Attributes="0"/>
|
||||
<ROW Component="service_ASC.WebApi" ComponentId="{C9664C57-4333-4E95-B94E-E78C6CB28058}" Directory_="service_15_Dir" Attributes="0"/>
|
||||
<ROW Component="service_ASC.Webhooks.Service" ComponentId="{EB2FD18F-FEAD-4C36-9B8B-556E7D84AE28}" Directory_="NewFolder_3_Dir" Attributes="0"/>
|
||||
<ROW Component="services" ComponentId="{8F9FE4E0-772E-487A-A61D-7019807D88D4}" Directory_="services_Dir" Attributes="0"/>
|
||||
<ROW Component="temp_ASC.ClearEvents" ComponentId="{0D0BC98A-425B-4217-B420-4DA6B25F23DD}" Directory_="temp_1_Dir" Attributes="0"/>
|
||||
<ROW Component="temp_ASC.Data.Backup.BackgroundTasks" ComponentId="{29E2557D-6012-44B2-A9D4-D773157411E2}" Directory_="temp_2_Dir" Attributes="0"/>
|
||||
<ROW Component="temp_ASC.Data.Buckup" ComponentId="{53DD808E-59C8-471C-8F2B-05F7ED92D2A7}" Directory_="temp_4_Dir" Attributes="0"/>
|
||||
<ROW Component="temp_ASC.File.Service" ComponentId="{D36D733E-3659-46FB-9127-876F179702BD}" Directory_="temp_3_Dir" Attributes="0"/>
|
||||
<ROW Component="temp_ASC.Files" ComponentId="{B25665D3-EB6F-4010-A93A-2423983A426A}" Directory_="temp_13_Dir" Attributes="0"/>
|
||||
<ROW Component="temp_ASC.Migration" ComponentId="{BEA71B3C-222C-4565-B0D1-A5671BE029F5}" Directory_="temp_5_Dir" Attributes="0"/>
|
||||
<ROW Component="temp_ASC.Migration.Runner" ComponentId="{3B95B108-8CEE-487D-AE0B-2E93C1749611}" Directory_="temp_6_Dir" Attributes="0"/>
|
||||
<ROW Component="temp_ASC.Notify" ComponentId="{471221C5-3F91-476D-B87F-F504AC55D9A6}" Directory_="temp_7_Dir" Attributes="0"/>
|
||||
<ROW Component="temp_ASC.People" ComponentId="{F4E45171-654B-455B-A261-A7C52830AEC0}" Directory_="temp_14_Dir" Attributes="0"/>
|
||||
<ROW Component="temp_ASC.Studio.Notify" ComponentId="{F61A9699-F7DF-47F7-BE8B-B57ED43CCAC6}" Directory_="temp_8_Dir" Attributes="0"/>
|
||||
<ROW Component="temp_ASC.TelegramService" ComponentId="{0BF04783-7F52-4926-B269-E1C6B9C90CF8}" Directory_="temp_12_Dir" Attributes="0"/>
|
||||
<ROW Component="temp_ASC.Web.Api" ComponentId="{BBE4771E-AF81-4B40-84C8-AACD26A8AAEE}" Directory_="temp_9_Dir" Attributes="0"/>
|
||||
<ROW Component="temp_ASC.Web.Studio" ComponentId="{50C05886-70FB-42A5-B4F9-333B317B1E25}" Directory_="temp_10_Dir" Attributes="0"/>
|
||||
<ROW Component="temp_ASC.Webhooks.Service" ComponentId="{21F5F636-660F-4116-9DB2-9BFDC0365708}" Directory_="temp_11_Dir" Attributes="0"/>
|
||||
<ROW Component="temp_nginx" ComponentId="{44C32C3C-30B2-4FB2-B6C0-F88B4C3F3F26}" Directory_="temp_Dir" Attributes="0"/>
|
||||
<ROW Component="tools" ComponentId="{3BE057FE-EC94-4514-8961-A8660D9E6EB4}" Directory_="tools_Dir" Attributes="0"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiFeatsComponent">
|
||||
<ROW Feature="MainFeature" Title="MainFeature" Description="Description" Display="1" Level="1" Directory_="APPDIR" Attributes="0"/>
|
||||
@ -174,20 +262,17 @@
|
||||
<ROW File="ASC.TelegramService.exe" Component_="ASC.TelegramService.exe" FileName="ASCTEL~1.EXE|ASC.TelegramService.exe" Attributes="0" SourcePath="Files\services\ASC.TelegramService\service\ASC.TelegramService.exe" SelfReg="false" DigSign="true"/>
|
||||
<ROW File="ASC.Web.Studio.exe" Component_="ASC.Web.Studio.exe" FileName="ASCWEB~1.EXE|ASC.Web.Studio.exe" Attributes="0" SourcePath="Files\services\ASC.Web.Studio\service\ASC.Web.Studio.exe" SelfReg="false" DigSign="true"/>
|
||||
<ROW File="ASC.Web.Api.exe" Component_="ASC.Web.Api.exe" FileName="ASCWEB~1.EXE|ASC.Web.Api.exe" Attributes="0" SourcePath="Files\services\ASC.Web.Api\service\ASC.Web.Api.exe" SelfReg="false" DigSign="true"/>
|
||||
<ROW File="proxy.exe" Component_="proxy.exe" FileName="ONLYO~13.EXE|proxy.exe" Attributes="0" SourcePath="Files\tools\proxy.exe" SelfReg="false" DigSign="true"/>
|
||||
<ROW File="proxy.xml" Component_="proxy.xml" FileName="ONLYO~13.XML|proxy.xml" Attributes="0" SourcePath="Files\tools\proxy.xml" SelfReg="false"/>
|
||||
<ROW File="Proxy.exe" Component_="Proxy.exe" FileName="Proxy.exe" Attributes="0" SourcePath="Files\tools\Proxy.exe" SelfReg="false" DigSign="true"/>
|
||||
<ROW File="Socket.IO.exe" Component_="Socket.IO.exe" FileName="SOCKET~1.EXE|Socket.IO.exe" Attributes="0" SourcePath="Files\tools\Socket.IO.exe" SelfReg="false" DigSign="true"/>
|
||||
<ROW File="Socket.IO.xml" Component_="proxy.xml" FileName="SOCKET~1.XML|Socket.IO.xml" Attributes="0" SourcePath="Files\tools\Socket.IO.xml" SelfReg="false"/>
|
||||
<ROW File="SsoAuth.exe" Component_="SsoAuth.exe" FileName="SsoAuth.exe" Attributes="0" SourcePath="Files\tools\SsoAuth.exe" SelfReg="false" DigSign="true"/>
|
||||
<ROW File="SsoAuth.xml" Component_="proxy.xml" FileName="SsoAuth.xml" Attributes="0" SourcePath="Files\tools\SsoAuth.xml" SelfReg="false"/>
|
||||
<ROW File="UrlShortener.exe" Component_="UrlShortener.exe" FileName="URLSHO~1.EXE|UrlShortener.exe" Attributes="0" SourcePath="Files\tools\UrlShortener.exe" SelfReg="false" DigSign="true"/>
|
||||
<ROW File="UrlShortener.xml" Component_="proxy.xml" FileName="URLSHO~1.XML|UrlShortener.xml" Attributes="0" SourcePath="Files\tools\UrlShortener.xml" SelfReg="false"/>
|
||||
<ROW File="ASC.ClearEvents.exe" Component_="ASC.ClearEvents.exe" FileName="ASCCLE~1.EXE|ASC.ClearEvents.exe" Attributes="0" SourcePath="Files\services\ASC.ClearEvents\service\ASC.ClearEvents.exe" SelfReg="false" DigSign="true"/>
|
||||
<ROW File="ASC.Data.Backup.BackgroundTasks.exe" Component_="ASC.Data.Backup.BackgroundTasks.exe" FileName="ASCDAT~1.EXE|ASC.Data.Backup.BackgroundTasks.exe" Attributes="0" SourcePath="Files\services\ASC.Data.Backup.BackgroundTasks\service\ASC.Data.Backup.BackgroundTasks.exe" SelfReg="false" DigSign="true"/>
|
||||
<ROW File="ASC.Migration.exe" Component_="ASC.Migration.exe" FileName="ASCMIG~1.EXE|ASC.Migration.exe" Attributes="0" SourcePath="Files\services\ASC.Migration\service\ASC.Migration.exe" SelfReg="false" DigSign="true"/>
|
||||
<ROW File="ASC.Webhooks.Service.exe" Component_="ASC.Webhooks.Service.exe" FileName="ASCWEB~1.EXE|ASC.Webhooks.Service.exe" Attributes="0" SourcePath="Files\services\ASC.Webhooks.Service\service\ASC.Webhooks.Service.exe" SelfReg="false" DigSign="true"/>
|
||||
<ROW File="ASC.Migration.Runner.exe" Component_="ASC.Migration.Runner.exe" FileName="ASCMIG~2.EXE|ASC.Migration.Runner.exe" Attributes="0" SourcePath="Files\services\ASC.Migration.Runner\service\ASC.Migration.Runner.exe" SelfReg="false" DigSign="true"/>
|
||||
<ROW File="favicon.ico" Component_="favicon.ico" FileName="favicon.ico" Attributes="0" SourcePath="Files\public\favicon.ico" SelfReg="false" DigSign="true"/>
|
||||
<ROW File="DocEditor.exe" Component_="DocEditor.exe" FileName="DOCEDI~1.EXE|DocEditor.exe" Attributes="0" SourcePath="Files\tools\DocEditor.exe" SelfReg="false" DigSign="true"/>
|
||||
<ROW File="Login.exe" Component_="Login.exe" FileName="LOGIN~1.EXE|Login.exe" Attributes="0" SourcePath="Files\tools\Login.exe" SelfReg="false" DigSign="true"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.BootstrOptComponent">
|
||||
<ROW BootstrOptKey="GlobalOptions" DownloadFolder="[AppDataFolder][|Manufacturer]\[|ProductName]\prerequisites" Options="2"/>
|
||||
@ -222,15 +307,79 @@
|
||||
<ROW Fragment="WelcomePrereqDlg.aip" Path="<AI_THEMES>classic\fragments\WelcomePrereqDlg.aip"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.JsonFileComponent">
|
||||
<ROW JsonFile="Newfile.json_1" FileName="APPSET~1.JSO|appsettings.test.json" DirProperty="config_Dir" Component="AI_ExePath" RootProperty="Root_1" Flags="6" IndentUnits="2"/>
|
||||
<ROW JsonFile="Newfile.json" FileName="ELASTI~1.JSO|elastic.test.json" DirProperty="config_Dir" Component="config" RootProperty="Root" Flags="6" IndentUnits="2"/>
|
||||
<ROW JsonFile="Newfile.json_1" FileName="APPSET~1.JSO|appsettings.test.json" DirProperty="config_Dir" Component="config" RootProperty="Root_1" Flags="6" IndentUnits="2"/>
|
||||
<ROW JsonFile="Newfile.json_2" FileName="RABBIT~1.JSO|rabbitmq.test.json" DirProperty="config_Dir" Component="config" RootProperty="Root_2" Flags="6" IndentUnits="2"/>
|
||||
<ROW JsonFile="Newfile.json_3" FileName="REDIST~1.JSO|redis.test.json" DirProperty="config_Dir" Component="config" RootProperty="Root_3" Flags="6" IndentUnits="2"/>
|
||||
<ROW JsonFile="Newfile.json_4" FileName="APPSET~2.JSO|appsettings.services.json" DirProperty="config_Dir" Component="config" RootProperty="Root_4" Flags="6" IndentUnits="2"/>
|
||||
<ROW JsonFile="Newfile.json_5" FileName="APPSET~3.JSO|appsettings.json" DirProperty="config_Dir" Component="config" RootProperty="Root_5" Flags="6" IndentUnits="2"/>
|
||||
<ROW JsonFile="Newfile.json_6" FileName="CONFIG~1.JSO|config.json" DirProperty="NewFolder_1_Dir" Component="config_socketio" RootProperty="Root_6" Flags="6" IndentUnits="2"/>
|
||||
<ROW JsonFile="config.json" FileName="CONFIG~1.JSO|config.json" DirProperty="config_2_Dir" Component="config_ssoauth" RootProperty="Root_7" Flags="6" IndentUnits="2"/>
|
||||
<ROW JsonFile="config.json_1" FileName="CONFIG~1.JSO|config.json" DirProperty="config_1_Dir" Component="config_urlshortener" RootProperty="Root_8" Flags="6" IndentUnits="2"/>
|
||||
<ROW JsonFile="config.json_2" FileName="CONFIG~1.JSO|config.json" DirProperty="login_Dir" Component="login" RootProperty="Root_9" Flags="6" IndentUnits="2"/>
|
||||
<ROW JsonFile="config.json_3" FileName="CONFIG~1.JSO|config.json" DirProperty="editor_Dir" Component="editor" RootProperty="Root_10" Flags="6" IndentUnits="2"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.JsonPropertyComponent">
|
||||
<ROW JsonProperty="ConnectionStrings_1" Parent="Root_1" Name="ConnectionStrings" Condition="1" Order="0" Flags="60"/>
|
||||
<ROW JsonProperty="Host" Parent="elastic" Name="Host" Condition="1" Order="0" Flags="57" Value="[ELASTICSEARCH_HOST]"/>
|
||||
<ROW JsonProperty="Host_1" Parent="_" Name="Host" Condition="1" Order="0" Flags="57" Value="[REDIS_HOST_PROP]"/>
|
||||
<ROW JsonProperty="Hostname" Parent="RabbitMQ" Name="Hostname" Condition="1" Order="0" Flags="57" Value="[RABBITMQ_HOSTNAME_PROP]"/>
|
||||
<ROW JsonProperty="Hosts" Parent="Redis" Name="Hosts" Condition="1" Order="0" Flags="61"/>
|
||||
<ROW JsonProperty="PORT" Parent="Root_9" Name="PORT" Condition="1" Order="1" Flags="57" Value="[Login_Port]"/>
|
||||
<ROW JsonProperty="PORT_1" Parent="Root_10" Name="PORT" Condition="1" Order="1" Flags="57" Value="[Editor_Port]"/>
|
||||
<ROW JsonProperty="Password" Parent="RabbitMQ" Name="Password" Condition="1" Order="2" Flags="57" Value="[RABBITMQ_PASSWORD_PROP]"/>
|
||||
<ROW JsonProperty="Port" Parent="elastic" Name="Port" Condition="1" Order="2" Flags="57" Value="[ELASTICSEARCH_PORT]"/>
|
||||
<ROW JsonProperty="Port_1" Parent="RabbitMQ" Name="Port" Condition="1" Order="3" Flags="59" Value="[RABBITMQ_PORT_PROP]"/>
|
||||
<ROW JsonProperty="Port_2" Parent="_" Name="Port" Condition="1" Order="1" Flags="57" Value="[REDIS_PORT_PROP]"/>
|
||||
<ROW JsonProperty="RabbitMQ" Parent="Root_2" Name="RabbitMQ" Condition="1" Order="0" Flags="60"/>
|
||||
<ROW JsonProperty="Redis" Parent="Root_3" Name="Redis" Condition="1" Order="0" Flags="60"/>
|
||||
<ROW JsonProperty="Root" Name="Root" Condition="1" Order="0" Flags="60"/>
|
||||
<ROW JsonProperty="Root_1" Name="Root" Condition="1" Order="0" Flags="60"/>
|
||||
<ROW JsonProperty="Root_10" Name="Root" Condition="1" Order="0" Flags="60"/>
|
||||
<ROW JsonProperty="Root_2" Name="Root" Condition="1" Order="0" Flags="60"/>
|
||||
<ROW JsonProperty="Root_3" Name="Root" Condition="1" Order="0" Flags="60"/>
|
||||
<ROW JsonProperty="Root_4" Name="Root" Condition="1" Order="0" Flags="60"/>
|
||||
<ROW JsonProperty="Root_5" Name="Root" Condition="1" Order="0" Flags="60"/>
|
||||
<ROW JsonProperty="Root_6" Name="Root" Condition="1" Order="0" Flags="60"/>
|
||||
<ROW JsonProperty="Root_7" Name="Root" Condition="1" Order="0" Flags="60"/>
|
||||
<ROW JsonProperty="Root_8" Name="Root" Condition="1" Order="0" Flags="60"/>
|
||||
<ROW JsonProperty="Root_9" Name="Root" Condition="1" Order="0" Flags="60"/>
|
||||
<ROW JsonProperty="Scheme" Parent="elastic" Name="Scheme" Condition="1" Order="1" Flags="57" Value="[ELASTICSEARCH_SCHEME]"/>
|
||||
<ROW JsonProperty="UserName" Parent="RabbitMQ" Name="UserName" Condition="1" Order="1" Flags="57" Value="[RABBITMQ_USERNAME_PROP]"/>
|
||||
<ROW JsonProperty="VirtualHost" Parent="RabbitMQ" Name="VirtualHost" Condition="1" Order="4" Flags="57" Value="[RABBITMQ_VIRTUALHOST_PROP]"/>
|
||||
<ROW JsonProperty="_" Parent="Hosts" Name="0" Condition="1" Order="0" Flags="60"/>
|
||||
<ROW JsonProperty="app" Parent="Root_6" Name="app" Condition="1" Order="0" Flags="60"/>
|
||||
<ROW JsonProperty="app_1" Parent="Root_7" Name="app" Condition="1" Order="0" Flags="60"/>
|
||||
<ROW JsonProperty="app_2" Parent="Root_8" Name="app" Condition="1" Order="0" Flags="60"/>
|
||||
<ROW JsonProperty="app_3" Parent="Root_9" Name="app" Condition="1" Order="0" Flags="60"/>
|
||||
<ROW JsonProperty="app_4" Parent="Root_10" Name="app" Condition="1" Order="0" Flags="60"/>
|
||||
<ROW JsonProperty="appsettings" Parent="app" Name="appsettings" Condition="1" Order="1" Flags="57" Value="[APPDIR_FORWARD_SLASH]config"/>
|
||||
<ROW JsonProperty="appsettings_1" Parent="app_1" Name="appsettings" Condition="1" Order="1" Flags="57" Value="[APPDIR_FORWARD_SLASH]config"/>
|
||||
<ROW JsonProperty="appsettings_2" Parent="app_2" Name="appsettings" Condition="1" Order="1" Flags="57" Value="[APPDIR_FORWARD_SLASH]config"/>
|
||||
<ROW JsonProperty="appsettings_3" Parent="app_3" Name="appsettings" Condition="1" Order="0" Flags="57" Value="[APPDIR_FORWARD_SLASH]config"/>
|
||||
<ROW JsonProperty="appsettings_4" Parent="app_4" Name="appsettings" Condition="1" Order="0" Flags="57" Value="[APPDIR_FORWARD_SLASH]config"/>
|
||||
<ROW JsonProperty="connectionString_1" Parent="default_1" Name="connectionString" Condition="1" Order="0" Flags="57" Value="Server=[SERVER_PROP];Port=3306;Database=[DATABASE_PROP];User ID=[USERNAME_PROP];Password=[PASSWORD_PROP];Pooling=true;Character Set=utf8;AutoEnlist=false;SSL Mode=none"/>
|
||||
<ROW JsonProperty="core" Parent="Root_4" Name="core" Condition="1" Order="0" Flags="60"/>
|
||||
<ROW JsonProperty="core_1" Parent="Root_5" Name="core" Condition="1" Order="0" Flags="60"/>
|
||||
<ROW JsonProperty="core_2" Parent="Root_1" Name="core" Condition="1" Order="2" Flags="60"/>
|
||||
<ROW JsonProperty="default_1" Parent="ConnectionStrings_1" Name="default" Condition="1" Order="0" Flags="60"/>
|
||||
<ROW JsonProperty="elastic" Parent="Root" Name="elastic" Condition="1" Order="0" Flags="60"/>
|
||||
<ROW JsonProperty="enabled" Parent="migration" Name="enabled" Condition="1" Order="0" Flags="57" Value="[DATABASE_MIGRATION]"/>
|
||||
<ROW JsonProperty="environment" Parent="app" Name="environment" Condition="1" Order="2" Flags="57" Value="[ENVIRONMENT]"/>
|
||||
<ROW JsonProperty="environment_1" Parent="app_1" Name="environment" Condition="1" Order="2" Flags="57" Value="[ENVIRONMENT]"/>
|
||||
<ROW JsonProperty="environment_2" Parent="app_2" Name="environment" Condition="1" Order="2" Flags="57" Value="[ENVIRONMENT]"/>
|
||||
<ROW JsonProperty="folder" Parent="products" Name="folder" Condition="1" Order="0" Flags="57" Value="[APPDIR_FORWARD_SLASH]products"/>
|
||||
<ROW JsonProperty="folder_1" Parent="products_1" Name="folder" Condition="1" Order="0" Flags="57" Value="[APPDIR_FORWARD_SLASH]products"/>
|
||||
<ROW JsonProperty="logPath" Parent="Root_4" Name="logPath" Condition="1" Order="1" Flags="57" Value="[APPDIR_FORWARD_SLASH]Logs"/>
|
||||
<ROW JsonProperty="machinekey" Parent="core_2" Name="machinekey" Condition="1" Order="0" Flags="57" Value="[MACHINE_KEY]"/>
|
||||
<ROW JsonProperty="machinekey_1" Parent="app_1" Name="machinekey" Condition="1" Order="3" Flags="57" Value="[MACHINE_KEY]"/>
|
||||
<ROW JsonProperty="machinekey_2" Parent="core_1" Name="machinekey" Condition="1" Order="0" Flags="57" Value="[MACHINE_KEY]"/>
|
||||
<ROW JsonProperty="migration" Parent="Root_1" Name="migration" Condition="1" Order="1" Flags="60"/>
|
||||
<ROW JsonProperty="port" Parent="app" Name="port" Condition="1" Order="0" Flags="57" Value="[Socket.IO_Port]"/>
|
||||
<ROW JsonProperty="port_1" Parent="app_1" Name="port" Condition="1" Order="0" Flags="57" Value="[SsoAuth_port]"/>
|
||||
<ROW JsonProperty="port_2" Parent="app_2" Name="port" Condition="1" Order="0" Flags="57" Value="[UrlShortener_Port]"/>
|
||||
<ROW JsonProperty="products" Parent="core" Name="products" Condition="1" Order="0" Flags="60"/>
|
||||
<ROW JsonProperty="products_1" Parent="core_2" Name="products" Condition="1" Order="1" Flags="60"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiActionTextComponent">
|
||||
<ROW Action="AI_ConfigFailActions" Description="Configure service failure actions" DescriptionLocId="ActionText.Description.AI_ConfigFailActions" Template="Service: [1]" TemplateLocId="ActionText.Template.AI_ConfigFailActions"/>
|
||||
@ -255,7 +404,6 @@
|
||||
<ROW Property="AI_SETUPEXEPATH" Signature_="AI_EXE_PATH_CU" Builds="DefaultBuild"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiBinaryComponent">
|
||||
<ROW Name="PowerShellScriptLauncher.dll" SourcePath="<AI_CUSTACTS>PowerShellScriptLauncher.dll"/>
|
||||
<ROW Name="Prereq.dll" SourcePath="<AI_CUSTACTS>Prereq.dll"/>
|
||||
<ROW Name="SoftwareDetector.dll" SourcePath="<AI_CUSTACTS>SoftwareDetector.dll"/>
|
||||
<ROW Name="TxtUpdater.dll" SourcePath="<AI_CUSTACTS>TxtUpdater.dll"/>
|
||||
@ -265,6 +413,7 @@
|
||||
<ROW Name="dialog.bmp" SourcePath="Resources\dialog.bmp"/>
|
||||
<ROW Name="jsonCfg.dll" SourcePath="<AI_CUSTACTS>jsonCfg.dll"/>
|
||||
<ROW Name="lzmaextractor.dll" SourcePath="<AI_CUSTACTS>lzmaextractor.dll"/>
|
||||
<ROW Name="userAccounts.dll" SourcePath="<AI_CUSTACTS>userAccounts.dll"/>
|
||||
<ROW Name="utils.vbs" SourcePath="utils.vbs"/>
|
||||
<ROW Name="viewer.exe" SourcePath="<AI_CUSTACTS>viewer.exe"/>
|
||||
</COMPONENT>
|
||||
@ -578,12 +727,72 @@
|
||||
<ROW Directory_="config_1_Dir" Component_="config_urlshortener" ManualDelete="false"/>
|
||||
<ROW Directory_="config_2_Dir" Component_="config_ssoauth" ManualDelete="false"/>
|
||||
<ROW Directory_="NewFolder_1_Dir" Component_="config_socketio" ManualDelete="false"/>
|
||||
<ROW Directory_="public_Dir" Component_="public" ManualDelete="true"/>
|
||||
<ROW Directory_="login_Dir" Component_="login" ManualDelete="false"/>
|
||||
<ROW Directory_="editor_Dir" Component_="editor" ManualDelete="false"/>
|
||||
<ROW Directory_="conf_Dir" Component_="conf" ManualDelete="false"/>
|
||||
<ROW Directory_="includes_Dir" Component_="includes" ManualDelete="false"/>
|
||||
<ROW Directory_="nginx_Dir" Component_="nginx" ManualDelete="false"/>
|
||||
<ROW Directory_="tools_Dir" Component_="tools" ManualDelete="false"/>
|
||||
<ROW Directory_="products_Dir" Component_="products" ManualDelete="false"/>
|
||||
<ROW Directory_="ASC.Files_Dir" Component_="ASC.Files" ManualDelete="false"/>
|
||||
<ROW Directory_="server_2_Dir" Component_="server_ASC.Files" ManualDelete="false"/>
|
||||
<ROW Directory_="ASC.Login_Dir" Component_="ASC.Login" ManualDelete="false"/>
|
||||
<ROW Directory_="ASC.People_Dir" Component_="ASC.People" ManualDelete="false"/>
|
||||
<ROW Directory_="server_5_Dir" Component_="server_ASC.People" ManualDelete="false"/>
|
||||
<ROW Directory_="services_Dir" Component_="services" ManualDelete="false"/>
|
||||
<ROW Directory_="ASC.Migration.Runner_Dir" Component_="ASC.Migration.Runner" ManualDelete="false"/>
|
||||
<ROW Directory_="service_6_Dir" Component_="service_ASC.Migration.Runner" ManualDelete="false"/>
|
||||
<ROW Directory_="ASC.ClearEvents_Dir" Component_="ASC.ClearEvents" ManualDelete="false"/>
|
||||
<ROW Directory_="service_Dir" Component_="service_ASC.ClearEvents" ManualDelete="false"/>
|
||||
<ROW Directory_="ASC.UrlShortener_Dir" Component_="ASC.UrlShortener" ManualDelete="false"/>
|
||||
<ROW Directory_="NewFolder_Dir" Component_="service_ASC.Urlshortner" ManualDelete="false"/>
|
||||
<ROW Directory_="ASC.Data.Backup.BackgroundTasks_Dir" Component_="ASC.Data.Backup.BackgroundTasks" ManualDelete="false"/>
|
||||
<ROW Directory_="service_3_Dir" Component_="service_ASC.Data.Backup.BachgroundTasks" ManualDelete="false"/>
|
||||
<ROW Directory_="ASC.Socket.IO_Dir" Component_="ASC.Socket.IO" ManualDelete="false"/>
|
||||
<ROW Directory_="service_1_Dir" Component_="service_ASC.Socket.IO" ManualDelete="false"/>
|
||||
<ROW Directory_="ASC.Data.Backup_Dir" Component_="ASC.Data.Backup" ManualDelete="false"/>
|
||||
<ROW Directory_="service_2_Dir" Component_="service_ASC.Data.Backup" ManualDelete="false"/>
|
||||
<ROW Directory_="ASC.Migration_Dir" Component_="ASC.Migration" ManualDelete="false"/>
|
||||
<ROW Directory_="service_4_Dir" Component_="service_ASC.Migration" ManualDelete="false"/>
|
||||
<ROW Directory_="ASC.Files.Service_Dir" Component_="ASC.Files.Service" ManualDelete="false"/>
|
||||
<ROW Directory_="service_7_Dir" Component_="service_ASC.File.Service" ManualDelete="false"/>
|
||||
<ROW Directory_="ASC.TelegramService_Dir" Component_="ASC.TelegramService" ManualDelete="false"/>
|
||||
<ROW Directory_="service_12_Dir" Component_="service_ASC.TelegramService" ManualDelete="false"/>
|
||||
<ROW Directory_="ASC.Notify_Dir" Component_="ASC.Notify" ManualDelete="false"/>
|
||||
<ROW Directory_="service_9_Dir" Component_="service_ASC.Notify" ManualDelete="false"/>
|
||||
<ROW Directory_="ASC.SsoAuth_Dir" Component_="ASC.SsoAuth" ManualDelete="false"/>
|
||||
<ROW Directory_="service_5_Dir" Component_="service_ASC.SsoAuth" ManualDelete="false"/>
|
||||
<ROW Directory_="ASC.Studio.Notify_Dir" Component_="ASC.Studio.Notify" ManualDelete="false"/>
|
||||
<ROW Directory_="service_11_Dir" Component_="service_ASC.Studio.Notify" ManualDelete="false"/>
|
||||
<ROW Directory_="ASC.Web.Api_Dir" Component_="ASC.Web.Api" ManualDelete="false"/>
|
||||
<ROW Directory_="service_15_Dir" Component_="service_ASC.WebApi" ManualDelete="false"/>
|
||||
<ROW Directory_="ASC.Web.Studio_Dir" Component_="ASC.Web.Studio" ManualDelete="false"/>
|
||||
<ROW Directory_="service_16_Dir" Component_="service_ASC.Web.Studio" ManualDelete="false"/>
|
||||
<ROW Directory_="ASC.Webhooks.Service_Dir" Component_="ASC.Webhooks.Service" ManualDelete="false"/>
|
||||
<ROW Directory_="NewFolder_3_Dir" Component_="service_ASC.Webhooks.Service" ManualDelete="false"/>
|
||||
<ROW Directory_="Logs_Dir" Component_="Logs" ManualDelete="false"/>
|
||||
<ROW Directory_="temp_Dir" Component_="temp_nginx" ManualDelete="false"/>
|
||||
<ROW Directory_="logs_Dir" Component_="logs" ManualDelete="false"/>
|
||||
<ROW Directory_="temp_1_Dir" Component_="temp_ASC.ClearEvents" ManualDelete="false"/>
|
||||
<ROW Directory_="temp_2_Dir" Component_="temp_ASC.Data.Backup.BackgroundTasks" ManualDelete="false"/>
|
||||
<ROW Directory_="temp_3_Dir" Component_="temp_ASC.File.Service" ManualDelete="false"/>
|
||||
<ROW Directory_="temp_4_Dir" Component_="temp_ASC.Data.Buckup" ManualDelete="false"/>
|
||||
<ROW Directory_="temp_5_Dir" Component_="temp_ASC.Migration" ManualDelete="false"/>
|
||||
<ROW Directory_="temp_6_Dir" Component_="temp_ASC.Migration.Runner" ManualDelete="false"/>
|
||||
<ROW Directory_="temp_7_Dir" Component_="temp_ASC.Notify" ManualDelete="false"/>
|
||||
<ROW Directory_="temp_8_Dir" Component_="temp_ASC.Studio.Notify" ManualDelete="false"/>
|
||||
<ROW Directory_="temp_9_Dir" Component_="temp_ASC.Web.Api" ManualDelete="false"/>
|
||||
<ROW Directory_="temp_10_Dir" Component_="temp_ASC.Web.Studio" ManualDelete="false"/>
|
||||
<ROW Directory_="temp_11_Dir" Component_="temp_ASC.Webhooks.Service" ManualDelete="false"/>
|
||||
<ROW Directory_="temp_12_Dir" Component_="temp_ASC.TelegramService" ManualDelete="false"/>
|
||||
<ROW Directory_="temp_13_Dir" Component_="temp_ASC.Files" ManualDelete="false"/>
|
||||
<ROW Directory_="temp_14_Dir" Component_="temp_ASC.People" ManualDelete="false"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiCustActComponent">
|
||||
<ROW Action="AI_AppSearchEx" Type="1" Source="Prereq.dll" Target="DoAppSearchEx"/>
|
||||
<ROW Action="AI_BACKUP_AI_SETUPEXEPATH" Type="51" Source="AI_SETUPEXEPATH_ORIGINAL" Target="[AI_SETUPEXEPATH]"/>
|
||||
<ROW Action="AI_ConfigFailActions" Type="11265" Source="aicustact.dll" Target="ConfigureServFailActions" WithoutSeq="true"/>
|
||||
<ROW Action="AI_ConfigPermissions" Type="1" Source="userAccounts.dll" Target="OnConfigPermissions" AdditionalSeq="AI_DATA_SETTER_4"/>
|
||||
<ROW Action="AI_DATA_SETTER" Type="51" Source="CustomActionData" Target="[ELASTICSEARCH_MSG] \n[ELASTICSEARCH_SCHEME]://[ELASTICSEARCH_HOST]:[ELASTICSEARCH_PORT] |[ProductName] Setup |MB_OK,MB_ICONWARNING,MB_DEFBUTTON1||[CLIENTPROCESSID]"/>
|
||||
<ROW Action="AI_DATA_SETTER_1" Type="51" Source="CustomActionData" Target="HOST=[ELASTICSEARCH_HOST];PORT=[ELASTICSEARCH_PORT];OUTPUT=ELK_CONNECTION"/>
|
||||
<ROW Action="AI_DATA_SETTER_10" Type="51" Source="CustomActionData" Target="MySQL80"/>
|
||||
@ -594,6 +803,7 @@
|
||||
<ROW Action="AI_DATA_SETTER_18" Type="51" Source="CustomActionData" Target="[RabbitMQServerConnectionError] |[ProductName] Setup |MB_OK,MB_ICONWARNING,MB_DEFBUTTON1||[CLIENTPROCESSID]"/>
|
||||
<ROW Action="AI_DATA_SETTER_2" Type="51" Source="CustomActionData" Target="[AI_SETUPEXEPATH]"/>
|
||||
<ROW Action="AI_DATA_SETTER_3" Type="51" Source="CustomActionData" Target="[~]"/>
|
||||
<ROW Action="AI_DATA_SETTER_4" Type="51" Source="CustomActionData" Target="[~]"/>
|
||||
<ROW Action="AI_DATA_SETTER_5" Type="51" Source="CustomActionData" Target="[RedisServerConnectionError] |[ProductName] Setup |MB_OK,MB_ICONWARNING,MB_DEFBUTTON1||[CLIENTPROCESSID]"/>
|
||||
<ROW Action="AI_DATA_SETTER_6" Type="51" Source="CustomActionData" Target="[APPDIR_FORWARD_SLASH]"/>
|
||||
<ROW Action="AI_DATA_SETTER_7" Type="51" Source="CustomActionData" Target="[~]"/>
|
||||
@ -620,13 +830,17 @@
|
||||
<ROW Action="AI_JsonRollback" Type="11521" Source="jsonCfg.dll" Target="OnJsonRollback" WithoutSeq="true"/>
|
||||
<ROW Action="AI_JsonUninstall" Type="1" Source="jsonCfg.dll" Target="OnJsonUninstall" AdditionalSeq="AI_DATA_SETTER_8"/>
|
||||
<ROW Action="AI_PREPARE_UPGRADE" Type="65" Source="aicustact.dll" Target="PrepareUpgrade"/>
|
||||
<ROW Action="AI_PrepareRevokePermissions" Type="1" Source="userAccounts.dll" Target="OnPrepareRevokePermissions"/>
|
||||
<ROW Action="AI_ProcessFailActions" Type="1" Source="aicustact.dll" Target="ProcessFailActions" AdditionalSeq="AI_DATA_SETTER_3"/>
|
||||
<ROW Action="AI_RESTORE_AI_SETUPEXEPATH" Type="51" Source="AI_SETUPEXEPATH" Target="[AI_SETUPEXEPATH_ORIGINAL]"/>
|
||||
<ROW Action="AI_RESTORE_LOCATION" Type="65" Source="aicustact.dll" Target="RestoreLocation"/>
|
||||
<ROW Action="AI_ResolveKnownFolders" Type="1" Source="aicustact.dll" Target="AI_ResolveKnownFolders"/>
|
||||
<ROW Action="AI_ResolveLocalizedCredentials" Type="1" Source="aicustact.dll" Target="GetLocalizedCredentials"/>
|
||||
<ROW Action="AI_RestartElevated" Type="1" Source="aicustact.dll" Target="RestartElevated"/>
|
||||
<ROW Action="AI_RevokePermissions" Type="11265" Source="userAccounts.dll" Target="OnRevokePermissions" WithoutSeq="true"/>
|
||||
<ROW Action="AI_SHOW_LOG" Type="65" Source="aicustact.dll" Target="LaunchLogFile" WithoutSeq="true"/>
|
||||
<ROW Action="AI_STORE_LOCATION" Type="51" Source="ARPINSTALLLOCATION" Target="[APPDIR]"/>
|
||||
<ROW Action="AI_SetPermissions" Type="11265" Source="userAccounts.dll" Target="OnSetPermissions" WithoutSeq="true"/>
|
||||
<ROW Action="AI_TxtUpdaterCommit" Type="11777" Source="TxtUpdater.dll" Target="OnTxtUpdaterCommit" WithoutSeq="true"/>
|
||||
<ROW Action="AI_TxtUpdaterConfig" Type="11265" Source="TxtUpdater.dll" Target="OnTxtUpdaterConfig" WithoutSeq="true"/>
|
||||
<ROW Action="AI_TxtUpdaterInstall" Type="1" Source="TxtUpdater.dll" Target="OnTxtUpdaterInstall"/>
|
||||
@ -639,9 +853,10 @@
|
||||
<ROW Action="SET_APPDIR" Type="307" Source="APPDIR" Target="[ProgramFilesFolder][Manufacturer]\[ProductName]" MultiBuildTarget="DefaultBuild:[ProgramFilesFolder][INSTALL_ROOT_FOLDER_NAME]\DocSpace"/>
|
||||
<ROW Action="SET_SHORTCUTDIR" Type="307" Source="SHORTCUTDIR" Target="[ProgramMenuFolder][ProductName]" MultiBuildTarget="DefaultBuild:[ProgramMenuFolder][INSTALL_ROOT_FOLDER_NAME]\DocSpace"/>
|
||||
<ROW Action="SET_TARGETDIR_TO_APPDIR" Type="51" Source="TARGETDIR" Target="[APPDIR]"/>
|
||||
<ROW Action="SetMACHINEKEY" Type="51" Source="MACHINE_KEY" Target="[ComputerName]"/>
|
||||
<ROW Action="Set_APPDIR_FORWARD_SLASH" Type="38" Target="Script Text" TargetUnformatted="Session.Property("APPDIR_FORWARD_SLASH") = Replace(Session.Property("APPDIR"), "\", "/") " AdditionalSeq="AI_DATA_SETTER_6"/>
|
||||
<ROW Action="StartElasticSearchService" Type="3073" Source="aicustact.dll" Target="StartWinService" Options="1" AdditionalSeq="AI_DATA_SETTER_13"/>
|
||||
<ROW Action="StartMigrationRunner" Type="3106" Source="service_6_Dir" Target=""[APPDIR]services\ASC.Migration.Runner\service\ASC.Migration.Runner.exe""/>
|
||||
<ROW Action="StartMigrationRunner" Type="3074" Source="viewer.exe" Target="/EnforcedRunAsAdmin /RunAsAdmin /HideWindow /dir "[APPDIR]\services\ASC.Migration.Runner\service" "[APPDIR]services\ASC.Migration.Runner\service\ASC.Migration.Runner.exe"" Options="1"/>
|
||||
<ROW Action="StartMySQLService" Type="1" Source="aicustact.dll" Target="StartWinService" Options="1" AdditionalSeq="AI_DATA_SETTER_11"/>
|
||||
<ROW Action="StopElasticSearchService" Type="1" Source="aicustact.dll" Target="StopWinService" Options="1" AdditionalSeq="AI_DATA_SETTER_12"/>
|
||||
<ROW Action="StopMySQLService" Type="1" Source="aicustact.dll" Target="StopWinService" Options="1" AdditionalSeq="AI_DATA_SETTER_10"/>
|
||||
@ -675,8 +890,7 @@
|
||||
<ROW Feature_="MainFeature" Component_="ASC.Web.Studio.exe"/>
|
||||
<ROW Feature_="MainFeature" Component_="ASC.Files.exe"/>
|
||||
<ROW Feature_="MainFeature" Component_="ASC.Web.Api.exe"/>
|
||||
<ROW Feature_="MainFeature" Component_="proxy.xml"/>
|
||||
<ROW Feature_="MainFeature" Component_="proxy.exe"/>
|
||||
<ROW Feature_="MainFeature" Component_="Proxy.exe"/>
|
||||
<ROW Feature_="MainFeature" Component_="config"/>
|
||||
<ROW Feature_="MainFeature" Component_="AI_CustomARPName"/>
|
||||
<ROW Feature_="MainFeature" Component_="AI_DisableModify"/>
|
||||
@ -691,8 +905,68 @@
|
||||
<ROW Feature_="MainFeature" Component_="ASC.Migration.exe"/>
|
||||
<ROW Feature_="MainFeature" Component_="ASC.Webhooks.Service.exe"/>
|
||||
<ROW Feature_="MainFeature" Component_="ASC.Migration.Runner.exe"/>
|
||||
<ROW Feature_="MainFeature" Component_="favicon.ico"/>
|
||||
<ROW Feature_="MainFeature" Component_="public"/>
|
||||
<ROW Feature_="MainFeature" Component_="DocEditor.exe"/>
|
||||
<ROW Feature_="MainFeature" Component_="Login.exe"/>
|
||||
<ROW Feature_="MainFeature" Component_="login"/>
|
||||
<ROW Feature_="MainFeature" Component_="editor"/>
|
||||
<ROW Feature_="MainFeature" Component_="conf"/>
|
||||
<ROW Feature_="MainFeature" Component_="includes"/>
|
||||
<ROW Feature_="MainFeature" Component_="nginx"/>
|
||||
<ROW Feature_="MainFeature" Component_="tools"/>
|
||||
<ROW Feature_="MainFeature" Component_="products"/>
|
||||
<ROW Feature_="MainFeature" Component_="ASC.Files"/>
|
||||
<ROW Feature_="MainFeature" Component_="server_ASC.Files"/>
|
||||
<ROW Feature_="MainFeature" Component_="ASC.Login"/>
|
||||
<ROW Feature_="MainFeature" Component_="ASC.People"/>
|
||||
<ROW Feature_="MainFeature" Component_="server_ASC.People"/>
|
||||
<ROW Feature_="MainFeature" Component_="services"/>
|
||||
<ROW Feature_="MainFeature" Component_="ASC.Migration.Runner"/>
|
||||
<ROW Feature_="MainFeature" Component_="service_ASC.Migration.Runner"/>
|
||||
<ROW Feature_="MainFeature" Component_="ASC.ClearEvents"/>
|
||||
<ROW Feature_="MainFeature" Component_="service_ASC.ClearEvents"/>
|
||||
<ROW Feature_="MainFeature" Component_="ASC.UrlShortener"/>
|
||||
<ROW Feature_="MainFeature" Component_="service_ASC.Urlshortner"/>
|
||||
<ROW Feature_="MainFeature" Component_="ASC.Data.Backup.BackgroundTasks"/>
|
||||
<ROW Feature_="MainFeature" Component_="service_ASC.Data.Backup.BachgroundTasks"/>
|
||||
<ROW Feature_="MainFeature" Component_="ASC.Socket.IO"/>
|
||||
<ROW Feature_="MainFeature" Component_="service_ASC.Socket.IO"/>
|
||||
<ROW Feature_="MainFeature" Component_="ASC.Data.Backup"/>
|
||||
<ROW Feature_="MainFeature" Component_="service_ASC.Data.Backup"/>
|
||||
<ROW Feature_="MainFeature" Component_="ASC.Migration"/>
|
||||
<ROW Feature_="MainFeature" Component_="service_ASC.Migration"/>
|
||||
<ROW Feature_="MainFeature" Component_="ASC.Files.Service"/>
|
||||
<ROW Feature_="MainFeature" Component_="service_ASC.File.Service"/>
|
||||
<ROW Feature_="MainFeature" Component_="ASC.TelegramService"/>
|
||||
<ROW Feature_="MainFeature" Component_="service_ASC.TelegramService"/>
|
||||
<ROW Feature_="MainFeature" Component_="ASC.Notify"/>
|
||||
<ROW Feature_="MainFeature" Component_="service_ASC.Notify"/>
|
||||
<ROW Feature_="MainFeature" Component_="ASC.SsoAuth"/>
|
||||
<ROW Feature_="MainFeature" Component_="service_ASC.SsoAuth"/>
|
||||
<ROW Feature_="MainFeature" Component_="ASC.Studio.Notify"/>
|
||||
<ROW Feature_="MainFeature" Component_="service_ASC.Studio.Notify"/>
|
||||
<ROW Feature_="MainFeature" Component_="ASC.Web.Api"/>
|
||||
<ROW Feature_="MainFeature" Component_="service_ASC.WebApi"/>
|
||||
<ROW Feature_="MainFeature" Component_="ASC.Web.Studio"/>
|
||||
<ROW Feature_="MainFeature" Component_="service_ASC.Web.Studio"/>
|
||||
<ROW Feature_="MainFeature" Component_="ASC.Webhooks.Service"/>
|
||||
<ROW Feature_="MainFeature" Component_="service_ASC.Webhooks.Service"/>
|
||||
<ROW Feature_="MainFeature" Component_="Logs"/>
|
||||
<ROW Feature_="MainFeature" Component_="temp_nginx"/>
|
||||
<ROW Feature_="MainFeature" Component_="logs"/>
|
||||
<ROW Feature_="MainFeature" Component_="temp_ASC.ClearEvents"/>
|
||||
<ROW Feature_="MainFeature" Component_="temp_ASC.Data.Backup.BackgroundTasks"/>
|
||||
<ROW Feature_="MainFeature" Component_="temp_ASC.File.Service"/>
|
||||
<ROW Feature_="MainFeature" Component_="temp_ASC.Data.Buckup"/>
|
||||
<ROW Feature_="MainFeature" Component_="temp_ASC.Migration"/>
|
||||
<ROW Feature_="MainFeature" Component_="temp_ASC.Migration.Runner"/>
|
||||
<ROW Feature_="MainFeature" Component_="temp_ASC.Notify"/>
|
||||
<ROW Feature_="MainFeature" Component_="temp_ASC.Studio.Notify"/>
|
||||
<ROW Feature_="MainFeature" Component_="temp_ASC.Web.Api"/>
|
||||
<ROW Feature_="MainFeature" Component_="temp_ASC.Web.Studio"/>
|
||||
<ROW Feature_="MainFeature" Component_="temp_ASC.Webhooks.Service"/>
|
||||
<ROW Feature_="MainFeature" Component_="temp_ASC.TelegramService"/>
|
||||
<ROW Feature_="MainFeature" Component_="temp_ASC.Files"/>
|
||||
<ROW Feature_="MainFeature" Component_="temp_ASC.People"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiIconsComponent">
|
||||
<ROW Name="icon.exe" SourcePath="Resources\icon.ico" Index="0"/>
|
||||
@ -702,8 +976,8 @@
|
||||
<ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=""" Sequence="749"/>
|
||||
<ROW Action="AI_STORE_LOCATION" Condition="(Not Installed) OR REINSTALL" Sequence="1501"/>
|
||||
<ROW Action="AI_PREPARE_UPGRADE" Condition="AI_UPGRADE="No" AND (Not Installed)" Sequence="1397"/>
|
||||
<ROW Action="AI_ResolveKnownFolders" Sequence="52"/>
|
||||
<ROW Action="AI_EnableDebugLog" Sequence="51"/>
|
||||
<ROW Action="AI_ResolveKnownFolders" Sequence="53"/>
|
||||
<ROW Action="AI_EnableDebugLog" Sequence="52"/>
|
||||
<ROW Action="AI_AppSearchEx" Sequence="103"/>
|
||||
<ROW Action="AI_DetectSoftware" Sequence="102"/>
|
||||
<ROW Action="AI_BACKUP_AI_SETUPEXEPATH" Sequence="99" Builds="DefaultBuild"/>
|
||||
@ -724,35 +998,42 @@
|
||||
<ROW Action="AI_DATA_SETTER_7" Condition="(REMOVE <> "ALL")" Sequence="5101"/>
|
||||
<ROW Action="AI_JsonUninstall" Condition="(REMOVE)" Sequence="3102"/>
|
||||
<ROW Action="AI_DATA_SETTER_8" Condition="(REMOVE)" Sequence="3101"/>
|
||||
<ROW Action="StopMySQLService" Condition="( NOT Installed AND NOT OLDPRODUCTS ) AND ( AI_PROCESS_STATE <> "Not Found" )" Sequence="1605"/>
|
||||
<ROW Action="AI_DATA_SETTER_10" Condition="( NOT Installed AND NOT OLDPRODUCTS ) AND ( AI_PROCESS_STATE <> "Not Found" )" Sequence="1604"/>
|
||||
<ROW Action="StartMySQLService" Condition="( NOT Installed AND NOT OLDPRODUCTS ) AND ( AI_PROCESS_STATE <> "Not Found" )" Sequence="1607"/>
|
||||
<ROW Action="AI_DATA_SETTER_11" Condition="( NOT Installed AND NOT OLDPRODUCTS ) AND ( AI_PROCESS_STATE <> "Not Found" )" Sequence="1606"/>
|
||||
<ROW Action="Set_APPDIR_FORWARD_SLASH" Condition="( NOT Installed )" Sequence="1615"/>
|
||||
<ROW Action="AI_DATA_SETTER_6" Condition="( NOT Installed )" Sequence="1614"/>
|
||||
<ROW Action="MySQLConfigure" Condition="( NOT Installed )" Sequence="1601"/>
|
||||
<ROW Action="DetectMySQLService" Condition="( ( NOT Installed AND NOT OLDPRODUCTS ) OR ( Installed AND REMOVE <> "ALL" AND AI_INSTALL_MODE <> "Remove" ) )" Sequence="1603"/>
|
||||
<ROW Action="AI_DATA_SETTER_9" Condition="( ( NOT Installed AND NOT OLDPRODUCTS ) OR ( Installed AND REMOVE <> "ALL" AND AI_INSTALL_MODE <> "Remove" ) )" Sequence="1602"/>
|
||||
<ROW Action="ElasticSearchSetup" Condition="( NOT Installed )" Sequence="1611"/>
|
||||
<ROW Action="StopElasticSearchService" Condition="( NOT Installed )" Sequence="1609"/>
|
||||
<ROW Action="AI_DATA_SETTER_12" Condition="( NOT Installed )" Sequence="1608"/>
|
||||
<ROW Action="ElasticSearchInstallPlugin" Condition="( NOT Installed )" Sequence="1610"/>
|
||||
<ROW Action="StartElasticSearchService" Condition="( NOT Installed )" Sequence="1613"/>
|
||||
<ROW Action="AI_DATA_SETTER_13" Condition="( NOT Installed )" Sequence="1612"/>
|
||||
<ROW Action="StopMySQLService" Condition="( NOT Installed AND NOT OLDPRODUCTS ) AND ( AI_PROCESS_STATE <> "Not Found" )" Sequence="1606"/>
|
||||
<ROW Action="AI_DATA_SETTER_10" Condition="( NOT Installed AND NOT OLDPRODUCTS ) AND ( AI_PROCESS_STATE <> "Not Found" )" Sequence="1605"/>
|
||||
<ROW Action="Set_APPDIR_FORWARD_SLASH" Condition="( NOT Installed )" Sequence="1616"/>
|
||||
<ROW Action="AI_DATA_SETTER_6" Condition="( NOT Installed )" Sequence="1615"/>
|
||||
<ROW Action="MySQLConfigure" Condition="( NOT Installed )" Sequence="1602"/>
|
||||
<ROW Action="DetectMySQLService" Condition="( ( NOT Installed AND NOT OLDPRODUCTS ) OR ( Installed AND REMOVE <> "ALL" AND AI_INSTALL_MODE <> "Remove" ) )" Sequence="1604"/>
|
||||
<ROW Action="AI_DATA_SETTER_9" Condition="( ( NOT Installed AND NOT OLDPRODUCTS ) OR ( Installed AND REMOVE <> "ALL" AND AI_INSTALL_MODE <> "Remove" ) )" Sequence="1603"/>
|
||||
<ROW Action="ElasticSearchSetup" Condition="( NOT Installed )" Sequence="1612"/>
|
||||
<ROW Action="StopElasticSearchService" Condition="( NOT Installed )" Sequence="1610"/>
|
||||
<ROW Action="AI_DATA_SETTER_12" Condition="( NOT Installed )" Sequence="1609"/>
|
||||
<ROW Action="ElasticSearchInstallPlugin" Condition="( NOT Installed )" Sequence="1611"/>
|
||||
<ROW Action="StartElasticSearchService" Condition="( NOT Installed )" Sequence="1614"/>
|
||||
<ROW Action="AI_DATA_SETTER_13" Condition="( NOT Installed )" Sequence="1613"/>
|
||||
<ROW Action="AI_GetArpIconPath" Sequence="1401"/>
|
||||
<ROW Action="StartMySQLService" Condition="( NOT Installed AND NOT OLDPRODUCTS ) AND ( AI_PROCESS_STATE <> "Not Found" )" Sequence="1608"/>
|
||||
<ROW Action="AI_DATA_SETTER_11" Condition="( NOT Installed AND NOT OLDPRODUCTS ) AND ( AI_PROCESS_STATE <> "Not Found" )" Sequence="1607"/>
|
||||
<ROW Action="StartMigrationRunner" Condition="( NOT Installed )" Sequence="5826"/>
|
||||
<ROW Action="SetMACHINEKEY" Condition="( NOT Installed )" Sequence="1601"/>
|
||||
<ROW Action="AI_DETECT_MODERNWIN" Condition="(VersionNT >= 603)" Sequence="54" MsiKey="AI_DETECT_MODERNWIN"/>
|
||||
<ROW Action="AI_ResolveLocalizedCredentials" Sequence="51"/>
|
||||
<ROW Action="AI_ConfigPermissions" Condition="REMOVE <> "ALL"" Sequence="5852"/>
|
||||
<ROW Action="AI_DATA_SETTER_4" Condition="REMOVE <> "ALL"" Sequence="5851"/>
|
||||
<ROW Action="AI_PrepareRevokePermissions" Condition="REMOVE = "ALL"" Sequence="1699"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiInstallUISequenceComponent">
|
||||
<ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=""" Sequence="749"/>
|
||||
<ROW Action="AI_ResolveKnownFolders" Sequence="54"/>
|
||||
<ROW Action="AI_DpiContentScale" Sequence="53"/>
|
||||
<ROW Action="AI_EnableDebugLog" Sequence="52"/>
|
||||
<ROW Action="AI_ResolveKnownFolders" Sequence="55"/>
|
||||
<ROW Action="AI_DpiContentScale" Sequence="54"/>
|
||||
<ROW Action="AI_EnableDebugLog" Sequence="53"/>
|
||||
<ROW Action="AI_BACKUP_AI_SETUPEXEPATH" Sequence="99"/>
|
||||
<ROW Action="AI_RESTORE_AI_SETUPEXEPATH" Condition="AI_SETUPEXEPATH_ORIGINAL" Sequence="103"/>
|
||||
<ROW Action="AI_AppSearchEx" Sequence="102"/>
|
||||
<ROW Action="AI_DetectSoftware" Sequence="101"/>
|
||||
<ROW Action="MySQLConfigureGUI" Condition="( NOT Installed )" Sequence="1101"/>
|
||||
<ROW Action="AI_RestartElevated" Sequence="51"/>
|
||||
<ROW Action="AI_RestartElevated" Sequence="52"/>
|
||||
<ROW Action="AI_ResolveLocalizedCredentials" Sequence="51"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiLaunchConditionsComponent">
|
||||
<ROW Condition="((VersionNT <> 501) AND (VersionNT <> 502))" Description="[ProductName] cannot be installed on [WindowsTypeNT5XDisplay]." DescriptionLocId="AI.LaunchCondition.NoNT5X" IsPredefined="true" Builds="DefaultBuild"/>
|
||||
@ -762,6 +1043,73 @@
|
||||
<ROW Condition="SETUPEXEDIR OR (REMOVE="ALL")" Description="This package can only be run from a bootstrapper." DescriptionLocId="AI.LaunchCondition.RequireBootstrapper" IsPredefined="true" Builds="DefaultBuild"/>
|
||||
<ROW Condition="VersionNT" Description="[ProductName] cannot be installed on [WindowsType9XDisplay]." DescriptionLocId="AI.LaunchCondition.No9X" IsPredefined="true" Builds="DefaultBuild"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiLockPermComponent">
|
||||
<ROW LockObject="APPDIR" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="config_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="nginx_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="conf_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="includes_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="tools_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
|
||||
<ROW LockObject="products_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="editor_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="ASC.Files_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="login_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="server_2_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="ASC.Login_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="ASC.People_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="server_5_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="services_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="ASC.Migration.Runner_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="service_6_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="ASC.ClearEvents_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="service_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="ASC.UrlShortener_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="NewFolder_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="config_1_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="NewFolder_1_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="ASC.Data.Backup.BackgroundTasks_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="service_3_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="ASC.Socket.IO_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="service_1_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="ASC.Data.Backup_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="service_2_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="ASC.Migration_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="service_4_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="ASC.Files.Service_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="service_7_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="ASC.TelegramService_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="service_12_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="ASC.Notify_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="service_9_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="ASC.SsoAuth_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="config_2_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="service_5_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="ASC.Studio.Notify_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="service_11_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="ASC.Web.Api_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="service_15_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="ASC.Web.Studio_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="service_16_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="ASC.Webhooks.Service_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="NewFolder_3_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
|
||||
<ROW LockObject="Logs_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
|
||||
<ROW LockObject="temp_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
|
||||
<ROW LockObject="logs_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
|
||||
<ROW LockObject="temp_1_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
|
||||
<ROW LockObject="temp_2_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
|
||||
<ROW LockObject="temp_3_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
|
||||
<ROW LockObject="temp_4_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
|
||||
<ROW LockObject="temp_5_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
|
||||
<ROW LockObject="temp_6_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
|
||||
<ROW LockObject="temp_7_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
|
||||
<ROW LockObject="temp_8_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
|
||||
<ROW LockObject="temp_9_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
|
||||
<ROW LockObject="temp_10_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
|
||||
<ROW LockObject="temp_11_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
|
||||
<ROW LockObject="temp_12_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
|
||||
<ROW LockObject="temp_13_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
|
||||
<ROW LockObject="temp_14_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiRegLocatorComponent">
|
||||
<ROW Signature_="AI_EXE_PATH_CU" Root="1" Key="Software\Caphyon\Advanced Installer\LZMA\[ProductCode]\[ProductVersion]" Name="AI_ExePath" Type="2"/>
|
||||
<ROW Signature_="AI_EXE_PATH_LM" Root="2" Key="Software\Caphyon\Advanced Installer\LZMA\[ProductCode]\[ProductVersion]" Name="AI_ExePath" Type="2"/>
|
||||
@ -795,12 +1143,14 @@
|
||||
<ROW MsiServiceConfig="ServiceName_BackgroundTasks" Name="[ServiceName_BackgroundTasks]" Event="1" ConfigType="3" Argument="1" Component_="ASC.Data.Backup.BackgroundTasks.exe"/>
|
||||
<ROW MsiServiceConfig="ServiceName_BackupService" Name="[ServiceName_BackupService]" Event="1" ConfigType="3" Argument="1" Component_="ASC.Data.Backup.exe"/>
|
||||
<ROW MsiServiceConfig="ServiceName_ClearEvents" Name="[ServiceName_ClearEvents]" Event="1" ConfigType="3" Argument="1" Component_="ASC.ClearEvents.exe"/>
|
||||
<ROW MsiServiceConfig="ServiceName_DocEditor" Name="[ServiceName_DocEditor]" Event="1" ConfigType="3" Argument="1" Component_="DocEditor.exe"/>
|
||||
<ROW MsiServiceConfig="ServiceName_FileServer" Name="[ServiceName_FileServer]" Event="1" ConfigType="3" Argument="1" Component_="ASC.Files.exe"/>
|
||||
<ROW MsiServiceConfig="ServiceName_FileService" Name="[ServiceName_FileService]" Event="1" ConfigType="3" Argument="1" Component_="ASC.Files.Service.exe"/>
|
||||
<ROW MsiServiceConfig="ServiceName_Login" Name="[ServiceName_Login]" Event="1" ConfigType="3" Argument="1" Component_="Login.exe"/>
|
||||
<ROW MsiServiceConfig="ServiceName_Migration" Name="[ServiceName_Migration]" Event="1" ConfigType="3" Argument="1" Component_="ASC.Migration.exe"/>
|
||||
<ROW MsiServiceConfig="ServiceName_NotifyService" Name="[ServiceName_NotifyService]" Event="1" ConfigType="3" Argument="1" Component_="ASC.Notify.exe"/>
|
||||
<ROW MsiServiceConfig="ServiceName_PeopleServer" Name="[ServiceName_PeopleServer]" Event="1" ConfigType="3" Argument="1" Component_="ASC.People.exe"/>
|
||||
<ROW MsiServiceConfig="ServiceName_Proxy" Name="[ServiceName_Proxy]" Event="1" ConfigType="3" Argument="1" Component_="proxy.exe"/>
|
||||
<ROW MsiServiceConfig="ServiceName_Proxy" Name="[ServiceName_Proxy]" Event="1" ConfigType="3" Argument="1" Component_="Proxy.exe"/>
|
||||
<ROW MsiServiceConfig="ServiceName_Socket.IO" Name="[ServiceName_Socket.IO]" Event="1" ConfigType="3" Argument="1" Component_="Socket.IO.exe"/>
|
||||
<ROW MsiServiceConfig="ServiceName_SsoAuth" Name="[ServiceName_SsoAuth]" Event="1" ConfigType="3" Argument="1" Component_="SsoAuth.exe"/>
|
||||
<ROW MsiServiceConfig="ServiceName_StudioNotifyService" Name="[ServiceName_StudioNotifyService]" Event="1" ConfigType="3" Argument="1" Component_="ASC.Studio.Notify.exe"/>
|
||||
@ -811,35 +1161,38 @@
|
||||
<ROW MsiServiceConfig="ServiceName_WebhooksService" Name="[ServiceName_WebhooksService]" Event="1" ConfigType="3" Argument="1" Component_="ASC.Webhooks.Service.exe"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiServConfigFailureActionsComponent">
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_BackgroundTasks" Name="[ServiceName_BackgroundTasks]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.Data.Backup.BackgroundTasks.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_BackupService" Name="[ServiceName_BackupService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.Data.Backup.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_ClearEvents" Name="[ServiceName_ClearEvents]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.ClearEvents.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_FileServer" Name="[ServiceName_FileServer]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.Files.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_FileService" Name="[ServiceName_FileService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.Files.Service.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_Migration" Name="[ServiceName_Migration]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.Migration.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_NotifyService" Name="[ServiceName_NotifyService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.Notify.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_PeopleServer" Name="[ServiceName_PeopleServer]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.People.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_Proxy" Name="[ServiceName_Proxy]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="proxy.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_Socket.IO" Name="[ServiceName_Socket.IO]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="Socket.IO.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_SsoAuth" Name="[ServiceName_SsoAuth]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="SsoAuth.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_StudioNotifyService" Name="[ServiceName_StudioNotifyService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.Studio.Notify.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_TelegramService" Name="[ServiceName_TelegramService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.TelegramService.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_UrlShortenerService" Name="[ServiceName_UrlShortenerService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="UrlShortener.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_WebApi" Name="[ServiceName_WebApi]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.Web.Api.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_WebStudio" Name="[ServiceName_WebStudio]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.Web.Studio.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_WebhooksService" Name="[ServiceName_WebhooksService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.Webhooks.Service.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_BackgroundTasks" Name="[ServiceName_BackgroundTasks]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.Data.Backup.BackgroundTasks.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_BackupService" Name="[ServiceName_BackupService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.Data.Backup.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_ClearEvents" Name="[ServiceName_ClearEvents]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.ClearEvents.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_DocEditor" Name="[ServiceName_DocEditor]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="DocEditor.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_FileServer" Name="[ServiceName_FileServer]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.Files.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_FileService" Name="[ServiceName_FileService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.Files.Service.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_Login" Name="[ServiceName_Login]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="Login.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_Migration" Name="[ServiceName_Migration]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.Migration.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_NotifyService" Name="[ServiceName_NotifyService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.Notify.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_PeopleServer" Name="[ServiceName_PeopleServer]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.People.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_Proxy" Name="[ServiceName_Proxy]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="Proxy.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_Socket.IO" Name="[ServiceName_Socket.IO]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="Socket.IO.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_SsoAuth" Name="[ServiceName_SsoAuth]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="SsoAuth.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_StudioNotifyService" Name="[ServiceName_StudioNotifyService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.Studio.Notify.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_TelegramService" Name="[ServiceName_TelegramService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.TelegramService.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_UrlShortenerService" Name="[ServiceName_UrlShortenerService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="UrlShortener.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_WebApi" Name="[ServiceName_WebApi]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.Web.Api.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_WebStudio" Name="[ServiceName_WebStudio]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.Web.Studio.exe"/>
|
||||
<ROW MsiServiceConfigFailureActions="ServiceName_WebhooksService" Name="[ServiceName_WebhooksService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.Webhooks.Service.exe"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiServCtrlComponent">
|
||||
<ROW ServiceControl="ASC.ClearEvents.exe" Name="[ServiceName_ClearEvents]" Event="161" Wait="0" Component_="ASC.ClearEvents.exe"/>
|
||||
<ROW ServiceControl="ASC.Data.Backup.BackgroundTasks.exe" Name="[ServiceName_BackgroundTasks]" Event="161" Wait="0" Component_="ASC.Data.Backup.BackgroundTasks.exe"/>
|
||||
<ROW ServiceControl="ASC.Migration.exe" Name="[ServiceName_Migration]" Event="161" Wait="0" Component_="ASC.Migration.exe"/>
|
||||
<ROW ServiceControl="ASC.Webhooks.Service.exe" Name="[ServiceName_WebhooksService]" Event="161" Wait="0" Component_="ASC.Webhooks.Service.exe"/>
|
||||
<ROW ServiceControl="ServiceName_BackgroundTasks" Name="[ServiceName_BackgroundTasks]" Event="161" Wait="0" Component_="ASC.Data.Backup.BackgroundTasks.exe"/>
|
||||
<ROW ServiceControl="ServiceName_BackupService" Name="[ServiceName_BackupService]" Event="161" Wait="0" Component_="ASC.Data.Backup.exe"/>
|
||||
<ROW ServiceControl="ServiceName_ClearEvents" Name="[ServiceName_ClearEvents]" Event="161" Wait="0" Component_="ASC.ClearEvents.exe"/>
|
||||
<ROW ServiceControl="ServiceName_DocEditor" Name="[ServiceName_DocEditor]" Event="161" Wait="0" Component_="DocEditor.exe"/>
|
||||
<ROW ServiceControl="ServiceName_FileServer" Name="[ServiceName_FileServer]" Event="161" Wait="0" Component_="ASC.Files.exe"/>
|
||||
<ROW ServiceControl="ServiceName_FileService" Name="[ServiceName_FileService]" Event="161" Wait="0" Component_="ASC.Files.Service.exe"/>
|
||||
<ROW ServiceControl="ServiceName_Login" Name="[ServiceName_Login]" Event="161" Wait="0" Component_="Login.exe"/>
|
||||
<ROW ServiceControl="ServiceName_Migration" Name="[ServiceName_Migration]" Event="161" Wait="0" Component_="ASC.Migration.exe"/>
|
||||
<ROW ServiceControl="ServiceName_NotifyService" Name="[ServiceName_NotifyService]" Event="161" Wait="0" Component_="ASC.Notify.exe"/>
|
||||
<ROW ServiceControl="ServiceName_PeopleServer" Name="[ServiceName_PeopleServer]" Event="161" Wait="0" Component_="ASC.People.exe"/>
|
||||
<ROW ServiceControl="ServiceName_Proxy" Name="[ServiceName_Proxy]" Event="161" Wait="0" Component_="proxy.exe"/>
|
||||
<ROW ServiceControl="ServiceName_Proxy" Name="[ServiceName_Proxy]" Event="161" Wait="0" Component_="Proxy.exe"/>
|
||||
<ROW ServiceControl="ServiceName_Socket.IO" Name="[ServiceName_Socket.IO]" Event="161" Wait="0" Component_="Socket.IO.exe"/>
|
||||
<ROW ServiceControl="ServiceName_SsoAuth" Name="[ServiceName_SsoAuth]" Event="161" Wait="0" Component_="SsoAuth.exe"/>
|
||||
<ROW ServiceControl="ServiceName_StudioNotifyService" Name="[ServiceName_StudioNotifyService]" Event="161" Wait="0" Component_="ASC.Studio.Notify.exe"/>
|
||||
@ -847,25 +1200,28 @@
|
||||
<ROW ServiceControl="ServiceName_UrlShortenerService" Name="[ServiceName_UrlShortenerService]" Event="161" Wait="0" Component_="UrlShortener.exe"/>
|
||||
<ROW ServiceControl="ServiceName_WebApi" Name="[ServiceName_WebApi]" Event="161" Wait="0" Component_="ASC.Web.Api.exe"/>
|
||||
<ROW ServiceControl="ServiceName_WebStudio" Name="[ServiceName_WebStudio]" Event="161" Wait="0" Component_="ASC.Web.Studio.exe"/>
|
||||
<ROW ServiceControl="ServiceName_WebhooksService" Name="[ServiceName_WebhooksService]" Event="161" Wait="0" Component_="ASC.Webhooks.Service.exe"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiServInstComponent">
|
||||
<ROW ServiceInstall="ASC.ClearEvents.exe" Name="[ServiceName_ClearEvents]" DisplayName="[ServiceName_ClearEvents]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5027 --ENVIRONMENT=[ENVIRONMENT] --pathToConf="[APPDIR]config" --$STORAGE_ROOT="[APPDIR]Data" --log:dir="[APPDIR]Logs" --log:name=[ServiceName_BackupService] --core:products:folder="[APPDIR]products" [SUBFOLDER_SERVER]" Component_="ASC.ClearEvents.exe"/>
|
||||
<ROW ServiceInstall="ASC.Data.Backup.BackgroundTasks.exe" Name="[ServiceName_BackgroundTasks]" DisplayName="[ServiceName_BackgroundTasks]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5032 --ENVIRONMENT=[ENVIRONMENT] --pathToConf="[APPDIR]config" --$STORAGE_ROOT="[APPDIR]Data" --log:dir="[APPDIR]Logs" --log:name=[ServiceName_BackupService] --core:products:folder="[APPDIR]products" [SUBFOLDER_SERVER]" Component_="ASC.Data.Backup.BackgroundTasks.exe"/>
|
||||
<ROW ServiceInstall="ASC.Migration.exe" Name="[ServiceName_Migration]" DisplayName="[ServiceName_Migration]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5018 --ENVIRONMENT=[ENVIRONMENT] --pathToConf="[APPDIR]config" --$STORAGE_ROOT="[APPDIR]Data" --log:dir="[APPDIR]Logs" --log:name=[ServiceName_BackupService] --core:products:folder="[APPDIR]products" [SUBFOLDER_SERVER]" Component_="ASC.Migration.exe"/>
|
||||
<ROW ServiceInstall="ASC.Webhooks.Service.exe" Name="[ServiceName_WebhooksService]" DisplayName="[ServiceName_WebhooksService]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5031 --ENVIRONMENT=[ENVIRONMENT] --pathToConf="[APPDIR]config" --$STORAGE_ROOT="[APPDIR]Data" --log:dir="[APPDIR]Logs" --log:name=[ServiceName_BackupService] --core:products:folder="[APPDIR]products" [SUBFOLDER_SERVER]" Component_="ASC.Webhooks.Service.exe"/>
|
||||
<ROW ServiceInstall="ServiceName_BackupService" Name="[ServiceName_BackupService]" DisplayName="[ServiceName_BackupService]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5012 --ENVIRONMENT=[ENVIRONMENT] --pathToConf="[APPDIR]config" --$STORAGE_ROOT="[APPDIR]Data" --log:dir="[APPDIR]Logs" --log:name=[ServiceName_BackupService] --core:products:folder="[APPDIR]products" [SUBFOLDER_SERVER]" Component_="ASC.Data.Backup.exe"/>
|
||||
<ROW ServiceInstall="ServiceName_FileServer" Name="[ServiceName_FileServer]" DisplayName="[ServiceName_FileServer]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5007 --ENVIRONMENT=[ENVIRONMENT] --pathToConf="[APPDIR]config" --$STORAGE_ROOT="[APPDIR]Data" --log:dir="[APPDIR]Logs" --log:name=[ServiceName_FileServer] [SUBFOLDER_SERVER]" Component_="ASC.Files.exe"/>
|
||||
<ROW ServiceInstall="ServiceName_FileService" Name="[ServiceName_FileService]" DisplayName="[ServiceName_FileService]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5009 --ENVIRONMENT=[ENVIRONMENT] --pathToConf="[APPDIR]config" --$STORAGE_ROOT="[APPDIR]Data" --log:dir="[APPDIR]Logs" --log:name=[ServiceName_FileService] --core:products:folder="[APPDIR]products" [SUBFOLDER_SERVER]" Component_="ASC.Files.Service.exe"/>
|
||||
<ROW ServiceInstall="ServiceName_NotifyService" Name="[ServiceName_NotifyService]" DisplayName="[ServiceName_NotifyService]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5005 --ENVIRONMENT=[ENVIRONMENT] --pathToConf="[APPDIR]config" --$STORAGE_ROOT="[APPDIR]Data" --log:dir="[APPDIR]Logs" --log:name=[ServiceName_NotifyService] --core:products:folder="[APPDIR]products" [SUBFOLDER_SERVER]" Component_="ASC.Notify.exe"/>
|
||||
<ROW ServiceInstall="ServiceName_PeopleServer" Name="[ServiceName_PeopleServer]" DisplayName="[ServiceName_PeopleServer]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5004 --ENVIRONMENT=[ENVIRONMENT] --pathToConf="[APPDIR]config" --$STORAGE_ROOT="[APPDIR]Data" --log:dir="[APPDIR]Logs" --log:name=[ServiceName_PeopleServer] [SUBFOLDER_SERVER]" Component_="ASC.People.exe"/>
|
||||
<ROW ServiceInstall="ServiceName_Proxy" Name="[ServiceName_Proxy]" DisplayName="[ServiceName_Proxy]" ServiceType="16" StartType="2" ErrorControl="1" Component_="proxy.exe"/>
|
||||
<ROW ServiceInstall="ServiceName_Socket.IO" Name="[ServiceName_Socket.IO]" DisplayName="[ServiceName_Socket.IO]" ServiceType="16" StartType="2" ErrorControl="1" Component_="Socket.IO.exe"/>
|
||||
<ROW ServiceInstall="ServiceName_SsoAuth" Name="[ServiceName_SsoAuth]" DisplayName="[ServiceName_SsoAuth]" ServiceType="16" StartType="2" ErrorControl="1" Component_="SsoAuth.exe"/>
|
||||
<ROW ServiceInstall="ServiceName_StudioNotifyService" Name="[ServiceName_StudioNotifyService]" DisplayName="[ServiceName_StudioNotifyService]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5006 --ENVIRONMENT=[ENVIRONMENT] --pathToConf="[APPDIR]config" --$STORAGE_ROOT="[APPDIR]Data" --log:dir="[APPDIR]Logs" --log:name=[ServiceName_StudioNotifyService] --core:products:folder="[APPDIR]products" [SUBFOLDER_SERVER]" Component_="ASC.Studio.Notify.exe"/>
|
||||
<ROW ServiceInstall="ServiceName_TelegramService" Name="[ServiceName_TelegramService]" DisplayName="[ServiceName_TelegramService]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:51702 --ENVIRONMENT=[ENVIRONMENT] --pathToConf="[APPDIR]config" --$STORAGE_ROOT="[APPDIR]Data" --log:dir="[APPDIR]Logs" --log:name=[ServiceName_TelegramService] [SUBFOLDER_SERVER]" Component_="ASC.TelegramService.exe"/>
|
||||
<ROW ServiceInstall="ServiceName_UrlShortenerService" Name="[ServiceName_UrlShortenerService]" DisplayName="[ServiceName_UrlShortenerService]" ServiceType="16" StartType="2" ErrorControl="1" Component_="UrlShortener.exe"/>
|
||||
<ROW ServiceInstall="ServiceName_WebApi" Name="[ServiceName_WebApi]" DisplayName="[ServiceName_WebApi]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5000 --ENVIRONMENT=[ENVIRONMENT] --pathToConf="[APPDIR]config" --$STORAGE_ROOT="[APPDIR]Data" --log:dir="[APPDIR]Logs" --log:name=[ServiceName_WebApi] [SUBFOLDER_SERVER]" Component_="ASC.Web.Api.exe"/>
|
||||
<ROW ServiceInstall="ServiceName_WebStudio" Name="[ServiceName_WebStudio]" DisplayName="[ServiceName_WebStudio]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5003 --ENVIRONMENT=[ENVIRONMENT] --pathToConf="[APPDIR]config" --$STORAGE_ROOT="[APPDIR]Data" --log:dir="[APPDIR]Logs" --log:name=[ServiceName_WebStudio] [SUBFOLDER_SERVER]" Component_="ASC.Web.Studio.exe"/>
|
||||
<ROW ServiceInstall="ServiceName_BackgroundTasks" Name="[ServiceName_BackgroundTasks]" DisplayName="[ServiceName_BackgroundTasks]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5032 --ENVIRONMENT=[ENVIRONMENT] --pathToConf="[APPDIR]config" --$STORAGE_ROOT="[APPDIR]Data" --log:dir="[APPDIR]Logs" --log:name=[ServiceName_BackupService] --core:products:folder="[APPDIR]products" [SUBFOLDER_SERVER]" Component_="ASC.Data.Backup.BackgroundTasks.exe"/>
|
||||
<ROW ServiceInstall="ServiceName_BackupService" Name="[ServiceName_BackupService]" DisplayName="[ServiceName_BackupService]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5012 --ENVIRONMENT=[ENVIRONMENT] --pathToConf="[APPDIR]config" --$STORAGE_ROOT="[APPDIR]Data" --log:dir="[APPDIR]Logs" --log:name=[ServiceName_BackupService] --core:products:folder="[APPDIR]products" [SUBFOLDER_SERVER]" Component_="ASC.Data.Backup.exe"/>
|
||||
<ROW ServiceInstall="ServiceName_ClearEvents" Name="[ServiceName_ClearEvents]" DisplayName="[ServiceName_ClearEvents]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5027 --ENVIRONMENT=[ENVIRONMENT] --pathToConf="[APPDIR]config" --$STORAGE_ROOT="[APPDIR]Data" --log:dir="[APPDIR]Logs" --log:name=[ServiceName_BackupService] --core:products:folder="[APPDIR]products" [SUBFOLDER_SERVER]" Component_="ASC.ClearEvents.exe"/>
|
||||
<ROW ServiceInstall="ServiceName_DocEditor" Name="[ServiceName_DocEditor]" DisplayName="[ServiceName_DocEditor]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Component_="DocEditor.exe"/>
|
||||
<ROW ServiceInstall="ServiceName_FileServer" Name="[ServiceName_FileServer]" DisplayName="[ServiceName_FileServer]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5007 --ENVIRONMENT=[ENVIRONMENT] --pathToConf="[APPDIR]config" --$STORAGE_ROOT="[APPDIR]Data" --log:dir="[APPDIR]Logs" --log:name=[ServiceName_FileServer] [SUBFOLDER_SERVER]" Component_="ASC.Files.exe"/>
|
||||
<ROW ServiceInstall="ServiceName_FileService" Name="[ServiceName_FileService]" DisplayName="[ServiceName_FileService]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5009 --ENVIRONMENT=[ENVIRONMENT] --pathToConf="[APPDIR]config" --$STORAGE_ROOT="[APPDIR]Data" --log:dir="[APPDIR]Logs" --log:name=[ServiceName_FileService] --core:products:folder="[APPDIR]products" [SUBFOLDER_SERVER]" Component_="ASC.Files.Service.exe"/>
|
||||
<ROW ServiceInstall="ServiceName_Login" Name="[ServiceName_Login]" DisplayName="[ServiceName_Login]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Component_="Login.exe"/>
|
||||
<ROW ServiceInstall="ServiceName_Migration" Name="[ServiceName_Migration]" DisplayName="[ServiceName_Migration]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5018 --ENVIRONMENT=[ENVIRONMENT] --pathToConf="[APPDIR]config" --$STORAGE_ROOT="[APPDIR]Data" --log:dir="[APPDIR]Logs" --log:name=[ServiceName_BackupService] --core:products:folder="[APPDIR]products" [SUBFOLDER_SERVER]" Component_="ASC.Migration.exe"/>
|
||||
<ROW ServiceInstall="ServiceName_NotifyService" Name="[ServiceName_NotifyService]" DisplayName="[ServiceName_NotifyService]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5005 --ENVIRONMENT=[ENVIRONMENT] --pathToConf="[APPDIR]config" --$STORAGE_ROOT="[APPDIR]Data" --log:dir="[APPDIR]Logs" --log:name=[ServiceName_NotifyService] --core:products:folder="[APPDIR]products" [SUBFOLDER_SERVER]" Component_="ASC.Notify.exe"/>
|
||||
<ROW ServiceInstall="ServiceName_PeopleServer" Name="[ServiceName_PeopleServer]" DisplayName="[ServiceName_PeopleServer]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5004 --ENVIRONMENT=[ENVIRONMENT] --pathToConf="[APPDIR]config" --$STORAGE_ROOT="[APPDIR]Data" --log:dir="[APPDIR]Logs" --log:name=[ServiceName_PeopleServer] [SUBFOLDER_SERVER]" Component_="ASC.People.exe"/>
|
||||
<ROW ServiceInstall="ServiceName_Proxy" Name="[ServiceName_Proxy]" DisplayName="[ServiceName_Proxy]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Component_="Proxy.exe"/>
|
||||
<ROW ServiceInstall="ServiceName_Socket.IO" Name="[ServiceName_Socket.IO]" DisplayName="[ServiceName_Socket.IO]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Component_="Socket.IO.exe"/>
|
||||
<ROW ServiceInstall="ServiceName_SsoAuth" Name="[ServiceName_SsoAuth]" DisplayName="[ServiceName_SsoAuth]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Component_="SsoAuth.exe"/>
|
||||
<ROW ServiceInstall="ServiceName_StudioNotifyService" Name="[ServiceName_StudioNotifyService]" DisplayName="[ServiceName_StudioNotifyService]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5006 --ENVIRONMENT=[ENVIRONMENT] --pathToConf="[APPDIR]config" --$STORAGE_ROOT="[APPDIR]Data" --log:dir="[APPDIR]Logs" --log:name=[ServiceName_StudioNotifyService] --core:products:folder="[APPDIR]products" [SUBFOLDER_SERVER]" Component_="ASC.Studio.Notify.exe"/>
|
||||
<ROW ServiceInstall="ServiceName_TelegramService" Name="[ServiceName_TelegramService]" DisplayName="[ServiceName_TelegramService]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:51702 --ENVIRONMENT=[ENVIRONMENT] --pathToConf="[APPDIR]config" --$STORAGE_ROOT="[APPDIR]Data" --log:dir="[APPDIR]Logs" --log:name=[ServiceName_TelegramService] [SUBFOLDER_SERVER]" Component_="ASC.TelegramService.exe"/>
|
||||
<ROW ServiceInstall="ServiceName_UrlShortenerService" Name="[ServiceName_UrlShortenerService]" DisplayName="[ServiceName_UrlShortenerService]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Component_="UrlShortener.exe"/>
|
||||
<ROW ServiceInstall="ServiceName_WebApi" Name="[ServiceName_WebApi]" DisplayName="[ServiceName_WebApi]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5000 --ENVIRONMENT=[ENVIRONMENT] --pathToConf="[APPDIR]config" --$STORAGE_ROOT="[APPDIR]Data" --log:dir="[APPDIR]Logs" --log:name=[ServiceName_WebApi] [SUBFOLDER_SERVER]" Component_="ASC.Web.Api.exe"/>
|
||||
<ROW ServiceInstall="ServiceName_WebStudio" Name="[ServiceName_WebStudio]" DisplayName="[ServiceName_WebStudio]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5003 --ENVIRONMENT=[ENVIRONMENT] --pathToConf="[APPDIR]config" --$STORAGE_ROOT="[APPDIR]Data" --log:dir="[APPDIR]Logs" --log:name=[ServiceName_WebStudio] [SUBFOLDER_SERVER]" Component_="ASC.Web.Studio.exe"/>
|
||||
<ROW ServiceInstall="ServiceName_WebhooksService" Name="[ServiceName_WebhooksService]" DisplayName="[ServiceName_WebhooksService]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5031 --ENVIRONMENT=[ENVIRONMENT] --pathToConf="[APPDIR]config" --$STORAGE_ROOT="[APPDIR]Data" --log:dir="[APPDIR]Logs" --log:name=[ServiceName_BackupService] --core:products:folder="[APPDIR]products" [SUBFOLDER_SERVER]" Component_="ASC.Webhooks.Service.exe"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.MsiThemeComponent">
|
||||
<ATTRIBUTE name="UsedTheme" value="classic"/>
|
||||
@ -930,19 +1286,15 @@
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.TxtUpdateComponent">
|
||||
<ROW Name="ReplaceAppDir" TxtUpdateSet="xml" FindPattern="{APPDIR}" ReplacePattern="[APPDIR]" Options="2" Order="0" FileEncoding="-1"/>
|
||||
<ROW Name="ReplaceAppDir" TxtUpdateSet="appsettings.test.json" FindPattern="{APPDIRCONF}" ReplacePattern="[APPDIR_FORWARD_SLASH]" Options="2" Order="0" FileEncoding="-1"/>
|
||||
<ROW Name="ReplaceElasticHost" TxtUpdateSet="YourFile.txt" FindPattern=".Host.:.*" ReplacePattern=""Host": "localhost"," Options="3" Order="0" FileEncoding="-1"/>
|
||||
<ROW Name="ReplaceWinVol" TxtUpdateSet="xml" FindPattern="{WindowsVolume}" ReplacePattern="[WindowsVolume]" Options="2" Order="1" FileEncoding="-1"/>
|
||||
<ROW Name="ReplaceAppDir" TxtUpdateSet="json" FindPattern="{APPDIRCONF}" ReplacePattern="[APPDIR_FORWARD_SLASH]" Options="2" Order="0" FileEncoding="-1"/>
|
||||
<ROW Name="ReplaceAppDir" TxtUpdateSet="config.json" FindPattern="{APPDIRCONF}" ReplacePattern="[APPDIR_FORWARD_SLASH]" Options="2" Order="0" FileEncoding="-1"/>
|
||||
<ROW Name="ReplaceAppDir" TxtUpdateSet="config.json_1" FindPattern="{APPDIRCONF}" ReplacePattern="[APPDIR_FORWARD_SLASH]" Options="2" Order="0" FileEncoding="-1"/>
|
||||
<ROW Name="ReplaceInclude" TxtUpdateSet="YourFile.txt" FindPattern="/etc/nginx/includes" ReplacePattern="includes" Options="2" Order="0" FileEncoding="-1"/>
|
||||
<ROW Name="ReplaceRoot" TxtUpdateSet="YourFile.txt_1" FindPattern="/var/www" ReplacePattern=".." Options="2" Order="0" FileEncoding="-1"/>
|
||||
<ROW Name="ReplaceRoot" TxtUpdateSet="YourFile.txt_2" FindPattern="/var/www" ReplacePattern=".." Options="2" Order="0" FileEncoding="-1"/>
|
||||
</COMPONENT>
|
||||
<COMPONENT cid="caphyon.advinst.msicomp.TxtUpdateSetComponent">
|
||||
<ROW Key="YourFile.txt" Component="AI_ExePath" FileName="elastic.json" Directory="config_Dir" Options="17"/>
|
||||
<ROW Key="appsettings.test.json" Component="Socket.IO.exe" FileName="*.json" Directory="config_Dir" Options="17"/>
|
||||
<ROW Key="config.json" Component="proxy.xml" FileName="config.json" Directory="config_2_Dir" Options="17"/>
|
||||
<ROW Key="config.json_1" Component="proxy.xml" FileName="config.json" Directory="NewFolder_1_Dir" Options="17"/>
|
||||
<ROW Key="json" Component="proxy.xml" FileName="config.json" Directory="config_1_Dir" Options="17"/>
|
||||
<ROW Key="YourFile.txt" Component="conf" FileName="onlyoffice.conf" Directory="conf_Dir" Options="17"/>
|
||||
<ROW Key="YourFile.txt_1" Component="conf" FileName="onlyoffice-client.conf" Directory="conf_Dir" Options="17"/>
|
||||
<ROW Key="YourFile.txt_2" Component="includes" FileName="onlyoffice-public.conf" Directory="includes_Dir" Options="17"/>
|
||||
<ROW Key="xml" Component="AI_ExePath" FileName="*.xml" Directory="tools_Dir" Options="17"/>
|
||||
</COMPONENT>
|
||||
</DOCUMENT>
|
||||
|
@ -4,14 +4,12 @@ echo #####################
|
||||
echo # build backend #
|
||||
echo #####################
|
||||
|
||||
set SRC_PATH=%~s2
|
||||
|
||||
pushd %~1
|
||||
|
||||
call dotnet build ASC.Web.sln
|
||||
|
||||
echo "== Build ASC.Thumbnails =="
|
||||
pushd common\ASC.Thumbnails
|
||||
call yarn install --frozen-lockfile
|
||||
popd
|
||||
call dotnet build ASC.Web.slnf
|
||||
call dotnet build ASC.Migrations.sln -o %SRC_PATH%\services\ASC.Migration.Runner\service
|
||||
|
||||
echo "== Build ASC.UrlShortener =="
|
||||
pushd common\ASC.UrlShortener
|
||||
|
@ -1,88 +1,61 @@
|
||||
REM echo ######## Set variables ########
|
||||
set "publisher="Ascensio System SIA""
|
||||
set "zookeeper_version=3.7.1"
|
||||
set "kafka_version=2.8.0"
|
||||
set "nginx_version=1.21.1"
|
||||
set "scala_version=2.12"
|
||||
set "nuget="%cd%\thirdparty\SimpleRestServices\src\.nuget\NuGet.exe""
|
||||
|
||||
REM echo ######## Extracting and preparing files to build ########
|
||||
%sevenzip% x build\install\win\nginx-%nginx_version%.zip -o"build\install\win\Files" -y
|
||||
xcopy "build\install\win\Files\nginx-%nginx_version%" "build\install\win\Files\nginx" /s /y /b /i
|
||||
rmdir build\install\win\Files\nginx-%nginx_version% /s /q
|
||||
rmdir build\install\win\kafka-zookeeper /s /q
|
||||
md build\install\win\kafka-zookeeper
|
||||
md build\install\win\Files\nginx\temp
|
||||
md build\install\win\Files\nginx\logs
|
||||
%tar% -xvf build\install\win\apache-zookeeper-%zookeeper_version%-bin.tar.gz -C build\install\win\kafka-zookeeper
|
||||
%tar% -xvf build\install\win\kafka_%scala_version%-%kafka_version%.tgz -C build\install\win\kafka-zookeeper
|
||||
ren build\install\win\kafka-zookeeper\apache-zookeeper-%zookeeper_version%-bin zookeeper
|
||||
ren build\install\win\kafka-zookeeper\kafka_%scala_version%-%kafka_version% kafka
|
||||
md build\install\win\kafka-zookeeper\kafka\tools
|
||||
md build\install\win\Files\tools
|
||||
copy build\install\win\WinSW.NET4new.exe "build\install\win\kafka-zookeeper\kafka\tools\kafka.exe" /y
|
||||
copy build\install\win\WinSW.NET4new.exe "build\install\win\kafka-zookeeper\kafka\tools\zookeeper.exe" /y
|
||||
copy build\install\win\tools\zookeeper.xml "build\install\win\kafka-zookeeper\kafka\tools\zookeeper.xml" /y
|
||||
copy build\install\win\tools\kafka.xml "build\install\win\kafka-zookeeper\kafka\tools\kafka.xml" /y
|
||||
del /f /q build\install\win\apache-zookeeper-%zookeeper_version%-bin.*
|
||||
del /f /q build\install\win\kafka_%scala_version%-%kafka_version%.*
|
||||
copy build\install\win\WinSW.NET4.exe "build\install\win\Files\tools\proxy.exe" /y
|
||||
copy build\install\win\tools\proxy.xml "build\install\win\Files\tools\proxy.xml" /y
|
||||
md build\install\win\Files\Logs
|
||||
md build\install\win\Files\service\
|
||||
md build\install\win\Files\products\ASC.Files\server\temp
|
||||
md build\install\win\Files\products\ASC.People\server\temp
|
||||
md build\install\win\Files\services\ASC.Data.Backup\service\temp
|
||||
md build\install\win\Files\services\ASC.Files.Service\service\temp
|
||||
md build\install\win\Files\services\ASC.Notify\service\temp
|
||||
md build\install\win\Files\services\ASC.Studio.Notify\service\temp
|
||||
md build\install\win\Files\services\ASC.TelegramService\service\temp
|
||||
md build\install\win\Files\services\ASC.Data.Backup.BackgroundTasks\service\temp
|
||||
md build\install\win\Files\services\ASC.ClearEvents\service\temp
|
||||
md build\install\win\Files\services\ASC.Migration\service\temp
|
||||
md build\install\win\Files\services\ASC.Webhooks.Service\service\temp
|
||||
md build\install\win\Files\services\ASC.Web.Api\service\temp
|
||||
md build\install\win\Files\services\ASC.Web.Studio\service\temp
|
||||
copy build\install\win\WinSW.NET4.exe "build\install\win\Files\tools\Proxy.exe" /y
|
||||
copy build\install\win\tools\Proxy.xml "build\install\win\Files\tools\Proxy.xml" /y
|
||||
copy build\install\win\WinSW3.0.0.exe "build\install\win\Files\tools\Socket.IO.exe" /y
|
||||
copy build\install\win\tools\Socket.IO.xml "build\install\win\Files\tools\Socket.IO.xml" /y
|
||||
copy build\install\win\WinSW3.0.0.exe "build\install\win\Files\tools\UrlShortener.exe" /y
|
||||
copy build\install\win\tools\UrlShortener.xml "build\install\win\Files\tools\UrlShortener.xml" /y
|
||||
copy build\install\win\WinSW3.0.0.exe "build\install\win\Files\tools\SsoAuth.exe" /y
|
||||
copy build\install\win\tools\SsoAuth.xml "build\install\win\Files\tools\SsoAuth.xml" /y
|
||||
copy build\install\win\WinSW3.0.0.exe "build\install\win\Files\tools\DocEditor.exe" /y
|
||||
copy build\install\win\tools\DocEditor.xml "build\install\win\Files\tools\DocEditor.xml" /y
|
||||
copy build\install\win\WinSW3.0.0.exe "build\install\win\Files\tools\Login.exe" /y
|
||||
copy build\install\win\tools\Login.xml "build\install\win\Files\tools\Login.xml" /y
|
||||
copy "build\install\win\nginx.conf" "build\install\win\Files\nginx\conf\nginx.conf" /y
|
||||
copy "build\install\win\kafka-zookeeper\zookeeper\conf\zoo_sample.cfg" "build\install\win\kafka-zookeeper\zookeeper\conf\zoo.cfg" /y
|
||||
del /f /q "build\install\win\kafka-zookeeper\zookeeper\conf\zoo_sample.cfg"
|
||||
rmdir build\install\win\publish /s /q
|
||||
del /f /q build\install\win\Files\nginx\conf\onlyoffice-login.conf
|
||||
|
||||
|
||||
REM echo ######## Build Utils ########
|
||||
%nuget% install %cd%\build\install\win\CustomActions\C#\Utils\packages.config -OutputDirectory %cd%\build\install\win\CustomActions\C#\Utils\packages
|
||||
%msbuild% build\install\win\CustomActions\C#\Utils\Utils.csproj
|
||||
copy build\install\win\CustomActions\C#\Utils\bin\Debug\Utils.CA.dll build\install\win\Utils.CA.dll /y
|
||||
rmdir build\install\win\CustomActions\C#\Utils\bin /s /q
|
||||
rmdir build\install\win\CustomActions\C#\Utils\obj /s /q
|
||||
|
||||
REM echo ######## Edit zookeeper/kafka cfg and proprties files ########
|
||||
%sed% -i "s/\(dataDir\).*/\1=.\/..\/zookeeper\/Data/g" build/install/win/kafka-zookeeper/zookeeper/conf/zoo.cfg
|
||||
%sed% -i "s/\(log.dirs\)=.*/\1=kafka-logs/g" build/install/win/kafka-zookeeper/kafka/config/server.properties
|
||||
%sed% -i "s/\(zookeeper.connect\)=.*/\1=localhost:2181/g" build/install/win/kafka-zookeeper/kafka/config/server.properties
|
||||
%sed% -i "s/\(clientPort\)=.*/\1=2181/g" build/install/win/kafka-zookeeper/kafka/config/zookeeper.properties
|
||||
%sed% -i "s/\(dataDir\).*/\1=.\/..\/zookeeper\/Data/g" build/install/win/kafka-zookeeper/kafka/config/zookeeper.properties
|
||||
%sed% -i "s/\(bootstrap.servers\)=.*/\1=localhost:9092/g" build/install/win/kafka-zookeeper/kafka/config/consumer.properties
|
||||
%sed% -i "s/\(bootstrap.servers\)=.*/\1=localhost:9092/g" build/install/win/kafka-zookeeper/kafka/config/connect-standalone.properties
|
||||
%sed% -i "s/\(offset.storage.file.filename\)=.*/\1=kafka-offsets/g" build/install/win/kafka-zookeeper/kafka/config/connect-standalone.properties
|
||||
%sed% -i "s/\(logger.kafka.controller\)=.*,/\1=INFO,/g" build/install/win/kafka-zookeeper/kafka/config/log4j.properties
|
||||
%sed% -i "s/\(logger.state.change.logger\)=.*,/\1=INFO,/g" build/install/win/kafka-zookeeper/kafka/config/log4j.properties
|
||||
echo log4j.logger.kafka.producer.async.DefaultEventHandler=INFO, kafkaAppender >> build/install/win/kafka-zookeeper/kafka/config/log4j.properties
|
||||
echo exit /b 1 >> build/install/win/kafka-zookeeper/kafka/bin/windows/zookeeper-server-start.bat
|
||||
echo exit /b 1 >> build/install/win/kafka-zookeeper/kafka/bin/windows/kafka-server-start.bat
|
||||
|
||||
REM echo ######## Edit nginx conf files ########
|
||||
%sed% -i "s!#rewrite!rewrite!g" build/install/win/Files/nginx/conf/onlyoffice.conf
|
||||
%sed% -i "s!/etc/nginx/includes!includes!g" build/install/win/Files/nginx/conf/onlyoffice.conf
|
||||
%sed% -i "s!/var/www!..!g" build/install/win/Files/nginx/conf/onlyoffice-*.conf
|
||||
%sed% -i "s!/var/www!..!g" build/install/win/Files/nginx/conf/includes/onlyoffice-*.conf
|
||||
|
||||
REM echo ######## Edit json files ########
|
||||
%sed% -i "s!\(\"machinekey\":\).\".*\"!\1 \"1123askdasjklasbnd\"!g" build/install/win/Files/config/appsettings*.json
|
||||
%sed% -i "s!\(\"folder\":\).\".*\"!\1 \"{APPDIRCONF}products\"!g" build/install/win/Files/config/appsettings*.json
|
||||
%sed% -i "s!\(\"path\":\).\".*\"!\1 \"{APPDIRCONF}services\/ASC.Socket.IO\/service\"!g" build/install/win/Files/config/socket*.json
|
||||
%sed% -i "s!\(\"path\":\).\".*\"!\1 \"{APPDIRCONF}services\/ASC.Thumbnails\/service\"!g" build/install/win/Files/config/thumb*.json
|
||||
%sed% -i "s!\(\"path\":\).\".*\"!\1 \"{APPDIRCONF}services\/ASC.UrlShortener\/service\/index.js\"!g" build/install/win/Files/config/urlshortener*.json
|
||||
%sed% -i "s!\(\"path\":\).\".*\"!\1 \"{APPDIRCONF}services\/ASC.SsoAuth\/service\"!g" build/install/win/Files/config/ssoauth*.json
|
||||
%sed% -i "s!\(\"path\":\).\".*\"!\1 \"{APPDIRCONF}services\/ASC.UrlShortener\/service\/index.js\"!g" build/install/win/Files/config/appsettings.services.json
|
||||
%sed% -i "s!\(\"log\":\).\".*\"!\1 \"{APPDIRCONF}Logs\/urlshortener.log\"!g" build/install/win/Files/config/appsettings.services.json
|
||||
|
||||
REM echo ######## Delete temp files ########
|
||||
del /f /q build\install\win\Files\config\sed*
|
||||
del /f /q build\install\win\Files\nginx\conf\sed*
|
||||
del /f /q build\install\win\Files\nginx\conf\includes\sed*
|
||||
del /f /q build\install\win\kafka-zookeeper\zookeeper\conf\sed*
|
||||
del /f /q build\install\win\kafka-zookeeper\kafka\config\sed*
|
||||
del /f /q build\install\win\Files\services\*\service\config\sed*
|
||||
del /f /q build\install\win\*.back.*
|
||||
|
||||
REM echo ######## Build kafka/zookeeper ########
|
||||
%AdvancedInstaller% /rebuild "build\install\win\Apache ZooKeeper.aip"
|
||||
copy "build\install\win\publish\Apache ZooKeeper.msi" "build\install\win\Apache ZooKeeper.msi" /y
|
||||
%AdvancedInstaller% /rebuild "build\install\win\Apache Kafka.aip"
|
||||
copy "build\install\win\publish\Apache Kafka.msi" "build\install\win\Apache Kafka.msi" /y
|
||||
|
||||
REM echo ######## Build MySQL Server Installer ########
|
||||
iscc /Qp /S"byparam="signtool" sign /a /n "%publisher%" /t http://timestamp.digicert.com $f" "build\install\win\MySQL Server Installer Runner.iss"
|
||||
|
||||
|
@ -29,9 +29,6 @@ function DownloadComponents {
|
||||
}
|
||||
}
|
||||
|
||||
$zookeeper_version = '3.7.1'
|
||||
$kafka_version = '2.8.0'
|
||||
$scala_version = '2.12'
|
||||
$nginx_version = '1.21.1'
|
||||
|
||||
$path_prereq = "${pwd}\build\install\win\"
|
||||
@ -43,17 +40,6 @@ $prerequisites = @(
|
||||
link = "https://nginx.org/download/nginx-${nginx_version}.zip";
|
||||
}
|
||||
|
||||
@{
|
||||
download_allways = $false;
|
||||
name = "apache-zookeeper-${zookeeper_version}-bin.tar.gz";
|
||||
link = "https://dlcdn.apache.org/zookeeper/zookeeper-${zookeeper_version}/apache-zookeeper-${zookeeper_version}-bin.tar.gz";
|
||||
}
|
||||
@{
|
||||
download_allways = $false;
|
||||
name = "kafka_${scala_version}-${kafka_version}.tgz";
|
||||
link = "https://archive.apache.org/dist/kafka/${kafka_version}/kafka_${scala_version}-${kafka_version}.tgz";
|
||||
}
|
||||
|
||||
@{
|
||||
download_allways = $false;
|
||||
name = "WinSW.NET4new.exe";
|
||||
@ -61,4 +47,16 @@ $prerequisites = @(
|
||||
}
|
||||
)
|
||||
|
||||
$path_nuget_packages = "${pwd}\.nuget\packages\"
|
||||
|
||||
$nuget_packages = @(
|
||||
@{
|
||||
download_allways = $false;
|
||||
name = "rabbitmq.client.3.6.5.nupkg";
|
||||
link = "https://www.nuget.org/api/v2/package/RabbitMQ.Client/3.6.5";
|
||||
}
|
||||
)
|
||||
|
||||
DownloadComponents $prerequisites $path_prereq
|
||||
|
||||
DownloadComponents $nuget_packages $path_nuget_packages
|
||||
|
@ -4,9 +4,12 @@ echo ######################
|
||||
echo # build frontend #
|
||||
echo ######################
|
||||
|
||||
pushd %~1
|
||||
set DEBUG_INFO=%~2
|
||||
|
||||
pushd %~s1
|
||||
|
||||
call yarn install
|
||||
if "%DEBUG_INFO%"=="true" yarn debug-info
|
||||
call yarn build
|
||||
call yarn deploy
|
||||
|
||||
|
@ -17,10 +17,6 @@ if defined SecondArg (
|
||||
)
|
||||
|
||||
xcopy "%PathToRepository%\build\deploy\public" "%PathToAppFolder%\public" /s /y /b /i
|
||||
xcopy "%PathToRepository%\build\deploy\studio\client" "%PathToAppFolder%\studio\client" /s /y /b /i
|
||||
xcopy "%PathToRepository%\build\deploy\studio\login" "%PathToAppFolder%\studio\login" /s /y /b /i
|
||||
xcopy "%PathToRepository%\build\deploy\products\ASC.Files\client" "%PathToAppFolder%\products\ASC.Files\client" /s /y /b /i
|
||||
xcopy "%PathToRepository%\build\deploy\products\ASC.Files\editor" "%PathToAppFolder%\products\ASC.Files\editor" /s /y /b /i
|
||||
xcopy "%PathToRepository%\build\deploy\products\ASC.People\client" "%PathToAppFolder%\products\ASC.People\client" /s /y /b /i
|
||||
xcopy "%PathToRepository%\build\deploy\client" "%PathToAppFolder%\client" /s /y /b /i
|
||||
xcopy "%PathToRepository%\config\nginx" "%PathToAppFolder%\nginx\conf" /s /y /b /i
|
||||
xcopy "%PathToRepository%\config\*" "%PathToAppFolder%\config" /y /b /i
|
||||
|
@ -32,54 +32,7 @@ http {
|
||||
keepalive_timeout 65;
|
||||
|
||||
#gzip on;
|
||||
|
||||
server {
|
||||
|
||||
set $public_root ../public;
|
||||
listen 80;
|
||||
server_name localhost;
|
||||
|
||||
#charset koi8-r;
|
||||
|
||||
#access_log logs/host.access.log main;
|
||||
|
||||
location / {
|
||||
root html;
|
||||
index index.html index.htm;
|
||||
}
|
||||
|
||||
#error_page 404 /404.html;
|
||||
|
||||
# redirect server error pages to the static page /50x.html
|
||||
#
|
||||
error_page 500 502 503 504 /50x.html;
|
||||
location = /50x.html {
|
||||
root html;
|
||||
}
|
||||
}
|
||||
|
||||
include onlyoffice.conf;
|
||||
include onlyoffice-*.conf;
|
||||
|
||||
# HTTPS server
|
||||
#
|
||||
#server {
|
||||
# listen 443 ssl;
|
||||
# server_name localhost;
|
||||
|
||||
# ssl_certificate cert.pem;
|
||||
# ssl_certificate_key cert.key;
|
||||
|
||||
# ssl_session_cache shared:SSL:1m;
|
||||
# ssl_session_timeout 5m;
|
||||
|
||||
# ssl_ciphers HIGH:!aNULL:!MD5;
|
||||
# ssl_prefer_server_ciphers on;
|
||||
|
||||
# location / {
|
||||
# root html;
|
||||
# index index.html index.htm;
|
||||
# }
|
||||
#}
|
||||
|
||||
}
|
||||
|
@ -16,34 +16,24 @@ if defined SecondArg (
|
||||
set PathToAppFolder=%FirstArg%\publish
|
||||
)
|
||||
|
||||
rem publish in directory 'products'
|
||||
REM dotnet publish "%PathToRepository%\products\ASC.Calendar\server\ASC.Calendar.csproj" -c Release --self-contained false -o "%PathToAppFolder%\products\ASC.Calendar\server"
|
||||
REM dotnet publish "%PathToRepository%\products\ASC.CRM\server\ASC.CRM.csproj" -c Release --self-contained false -o "%PathToAppFolder%\products\ASC.CRM\server"
|
||||
rem backend services (dotnet) in directory 'products'
|
||||
dotnet publish "%PathToRepository%\products\ASC.Files\server\ASC.Files.csproj" -c Release --self-contained false -o "%PathToAppFolder%\products\ASC.Files\server"
|
||||
REM dotnet publish "%PathToRepository%\products\ASC.Mail\server\ASC.Mail.csproj" -c Release --self-contained false -o "%PathToAppFolder%\products\ASC.Mail\server"
|
||||
dotnet publish "%PathToRepository%\products\ASC.People\server\ASC.People.csproj" -c Release --self-contained false -o "%PathToAppFolder%\products\ASC.People\server"
|
||||
REM dotnet publish "%PathToRepository%\products\ASC.Projects\server\ASC.Projects.csproj" -c Release --self-contained false -o "%PathToAppFolder%\products\ASC.Projects\server"
|
||||
|
||||
rem publish in directory 'services'
|
||||
dotnet publish "%PathToRepository%\common\services\ASC.ApiSystem\ASC.ApiSystem.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.ApiSystem\service"
|
||||
rem backend services (dotnet) in directory 'services'
|
||||
dotnet publish "%PathToRepository%\common\services\ASC.Data.Backup\ASC.Data.Backup.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Data.Backup\service"
|
||||
dotnet publish "%PathToRepository%\common\services\ASC.Data.Storage.Encryption\ASC.Data.Storage.Encryption.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Data.Storage.Encryption\service"
|
||||
dotnet publish "%PathToRepository%\products\ASC.Files\service\ASC.Files.Service.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Files.Service\service"
|
||||
dotnet publish "%PathToRepository%\common\services\ASC.Data.Storage.Migration\ASC.Data.Storage.Migration.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Data.Storage.Migration\service"
|
||||
dotnet publish "%PathToRepository%\common\services\ASC.Notify\ASC.Notify.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Notify\service"
|
||||
dotnet publish "%PathToRepository%\common\services\ASC.Socket.IO.Svc\ASC.Socket.IO.Svc.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Socket.IO.Svc\service"
|
||||
dotnet publish "%PathToRepository%\common\services\ASC.Studio.Notify\ASC.Studio.Notify.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Studio.Notify\service"
|
||||
dotnet publish "%PathToRepository%\common\services\ASC.TelegramService\ASC.TelegramService.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.TelegramService\service"
|
||||
dotnet publish "%PathToRepository%\common\services\ASC.Thumbnails.Svc\ASC.Thumbnails.Svc.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Thumbnails.Svc\service"
|
||||
dotnet publish "%PathToRepository%\common\services\ASC.UrlShortener.Svc\ASC.UrlShortener.Svc.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.UrlShortener.Svc\service"
|
||||
dotnet publish "%PathToRepository%\common\services\ASC.Data.Backup.BackgroundTasks\ASC.Data.Backup.BackgroundTasks.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Data.Backup.BackgroundTasks\service"
|
||||
dotnet publish "%PathToRepository%\common\services\ASC.ClearEvents\ASC.ClearEvents.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.ClearEvents\service"
|
||||
dotnet publish "%PathToRepository%\common\ASC.Migration\ASC.Migration.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Migration\service"
|
||||
dotnet publish "%PathToRepository%\common\services\ASC.Webhooks.Service\ASC.Webhooks.Service.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Webhooks.Service\service"
|
||||
dotnet publish "%PathToRepository%\web\ASC.Web.Api\ASC.Web.Api.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Web.Api\service"
|
||||
dotnet publish "%PathToRepository%\web\ASC.Web.Studio\ASC.Web.Studio.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Web.Studio\service"
|
||||
dotnet publish "%PathToRepository%\common\services\ASC.SsoAuth.Svc\ASC.SsoAuth.Svc.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.SsoAuth.Svc\service"
|
||||
|
||||
rem Publish backend services (Nodejs)
|
||||
mkdir "%PathToAppFolder%\services\ASC.Thumbnails\service"
|
||||
xcopy "%PathToRepository%\common\ASC.Thumbnails" "%PathToAppFolder%\services\ASC.Thumbnails\service" /s /y /b /i
|
||||
|
||||
rem backend services (Nodejs) in directory 'services'
|
||||
mkdir "%PathToAppFolder%\services\ASC.UrlShortener\service"
|
||||
xcopy "%PathToRepository%\common\ASC.UrlShortener" "%PathToAppFolder%\services\ASC.UrlShortener\service" /s /y /b /i
|
||||
|
||||
@ -52,3 +42,10 @@ xcopy "%PathToRepository%\common\ASC.Socket.IO" "%PathToAppFolder%\services\ASC.
|
||||
|
||||
mkdir "%PathToAppFolder%\services\ASC.SsoAuth\service"
|
||||
xcopy "%PathToRepository%\common\ASC.SsoAuth" "%PathToAppFolder%\services\ASC.SsoAuth\service" /s /y /b /i
|
||||
|
||||
rem backend services (Nodejs) in directory 'products'
|
||||
mkdir "%PathToAppFolder%\products\ASC.Login\login"
|
||||
xcopy "%PathToRepository%\build\deploy\login" "%PathToAppFolder%\products\ASC.Login\login" /s /y /b /i
|
||||
|
||||
mkdir "%PathToAppFolder%\products\ASC.Files\editor"
|
||||
xcopy "%PathToRepository%\build\deploy\editor" "%PathToAppFolder%\products\ASC.Files\editor" /s /y /b /i
|
||||
|
14
build/install/win/tools/DocEditor.xml
Normal file
14
build/install/win/tools/DocEditor.xml
Normal file
@ -0,0 +1,14 @@
|
||||
<service>
|
||||
<id>ASC.DocEditor</id>
|
||||
<name>ASC.DocEditor</name>
|
||||
<description>This service runs ASC.DocEditor</description>
|
||||
<priority>RealTime</priority>
|
||||
<startmode>Automatic</startmode>
|
||||
<onfailure action="restart" delay="10 sec"/>
|
||||
<executable>node</executable>
|
||||
<arguments>"{APPDIR}products\ASC.Files\editor\server.js"</arguments>
|
||||
<log mode="roll-by-size">
|
||||
<sizeThreshold>10240</sizeThreshold>
|
||||
<keepFiles>8</keepFiles>
|
||||
</log>
|
||||
</service>
|
14
build/install/win/tools/Login.xml
Normal file
14
build/install/win/tools/Login.xml
Normal file
@ -0,0 +1,14 @@
|
||||
<service>
|
||||
<id>ASC.Login</id>
|
||||
<name>ASC.Login</name>
|
||||
<description>This service runs ASC.Login</description>
|
||||
<priority>RealTime</priority>
|
||||
<startmode>Automatic</startmode>
|
||||
<onfailure action="restart" delay="10 sec"/>
|
||||
<executable>node</executable>
|
||||
<arguments>"{APPDIR}products\ASC.Login\login\server.js"</arguments>
|
||||
<log mode="roll-by-size">
|
||||
<sizeThreshold>10240</sizeThreshold>
|
||||
<keepFiles>8</keepFiles>
|
||||
</log>
|
||||
</service>
|
14
build/install/win/tools/Socket.IO.xml
Normal file
14
build/install/win/tools/Socket.IO.xml
Normal file
@ -0,0 +1,14 @@
|
||||
<service>
|
||||
<id>ASC.Socket.IO</id>
|
||||
<name>ASC.Socket.IO</name>
|
||||
<description>This service runs ASC.Socket.IO</description>
|
||||
<priority>RealTime</priority>
|
||||
<startmode>Automatic</startmode>
|
||||
<onfailure action="restart" delay="10 sec"/>
|
||||
<executable>node</executable>
|
||||
<arguments>"{APPDIR}services\ASC.Socket.IO\service\server.js"</arguments>
|
||||
<log mode="roll-by-size">
|
||||
<sizeThreshold>10240</sizeThreshold>
|
||||
<keepFiles>8</keepFiles>
|
||||
</log>
|
||||
</service>
|
14
build/install/win/tools/SsoAuth.xml
Normal file
14
build/install/win/tools/SsoAuth.xml
Normal file
@ -0,0 +1,14 @@
|
||||
<service>
|
||||
<id>ASC.SsoAuth</id>
|
||||
<name>ASC.SsoAuth</name>
|
||||
<description>This service runs ASC.SsoAuth</description>
|
||||
<priority>RealTime</priority>
|
||||
<startmode>Automatic</startmode>
|
||||
<onfailure action="restart" delay="10 sec"/>
|
||||
<executable>node</executable>
|
||||
<arguments>"{APPDIR}services\ASC.SsoAuth\service\app.js"</arguments>
|
||||
<log mode="roll-by-size">
|
||||
<sizeThreshold>10240</sizeThreshold>
|
||||
<keepFiles>8</keepFiles>
|
||||
</log>
|
||||
</service>
|
14
build/install/win/tools/UrlShortener.xml
Normal file
14
build/install/win/tools/UrlShortener.xml
Normal file
@ -0,0 +1,14 @@
|
||||
<service>
|
||||
<id>ASC.UrlShortener</id>
|
||||
<name>ASC.UrlShortener</name>
|
||||
<description>This service runs ASC.UrlShortener</description>
|
||||
<priority>RealTime</priority>
|
||||
<startmode>Automatic</startmode>
|
||||
<onfailure action="restart" delay="10 sec"/>
|
||||
<executable>node</executable>
|
||||
<arguments>"{APPDIR}services\ASC.UrlShortener\service\index.js"</arguments>
|
||||
<log mode="roll-by-size">
|
||||
<sizeThreshold>10240</sizeThreshold>
|
||||
<keepFiles>8</keepFiles>
|
||||
</log>
|
||||
</service>
|
@ -1,15 +0,0 @@
|
||||
<service>
|
||||
<id>kafka</id>
|
||||
<name>kafka</name>
|
||||
<description>This service runs kafka</description>
|
||||
<priority>RealTime</priority>
|
||||
<startmode>Automatic</startmode>
|
||||
<onfailure action="restart" delay="1 sec"/>
|
||||
<executable>{WindowsVolume}Apache\kafka\bin\windows\kafka-server-start.bat</executable>
|
||||
<arguments>{WindowsVolume}Apache\kafka\config\server.properties</arguments>
|
||||
<workingdirectory>{WindowsVolume}Apache\kafka</workingdirectory>
|
||||
<log mode="roll-by-size">
|
||||
<sizeThreshold>10240</sizeThreshold>
|
||||
<keepFiles>8</keepFiles>
|
||||
</log>
|
||||
</service>
|
@ -1,15 +0,0 @@
|
||||
<service>
|
||||
<id>zookeeper</id>
|
||||
<name>zookeeper</name>
|
||||
<description>This service runs zookeeper</description>
|
||||
<priority>RealTime</priority>
|
||||
<startmode>Automatic</startmode>
|
||||
<onfailure action="restart" delay="1 sec"/>
|
||||
<executable>{WindowsVolume}Apache\kafka\bin\windows\zookeeper-server-start.bat</executable>
|
||||
<arguments>{WindowsVolume}Apache\kafka\config\zookeeper.properties</arguments>
|
||||
<workingdirectory>{WindowsVolume}Apache\kafka</workingdirectory>
|
||||
<log mode="roll-by-size">
|
||||
<sizeThreshold>10240</sizeThreshold>
|
||||
<keepFiles>8</keepFiles>
|
||||
</log>
|
||||
</service>
|
@ -1,4 +1,4 @@
|
||||
@echo off
|
||||
|
||||
PUSHD %~dp0..\..
|
||||
set servicepath=%cd%\web\ASC.Web.Api\bin\Debug\ASC.Web.Api.exe urls=http://0.0.0.0:5000 $STORAGE_ROOT=%cd%\Data log:dir=%cd%\Logs log:name=api pathToConf=%cd%\config core:products:folder=%cd%\products
|
||||
set servicepath=%cd%\web\ASC.Web.Api\bin\Debug\ASC.Web.Api.exe urls=http://0.0.0.0:5000 $STORAGE_ROOT=%cd%\Data log:dir=%cd%\Logs log:name=web.api pathToConf=%cd%\config core:products:folder=%cd%\products
|
@ -1,4 +1,4 @@
|
||||
@echo off
|
||||
|
||||
PUSHD %~dp0..\..
|
||||
set servicepath=%cd%\web\ASC.Web.Studio\bin\Debug\ASC.Web.Studio.exe urls=http://0.0.0.0:5003 $STORAGE_ROOT=%cd%\Data log:dir=%cd%\Logs log:name=studio pathToConf=%cd%\config core:products:folder=%cd%\products
|
||||
set servicepath=%cd%\web\ASC.Web.Studio\bin\Debug\ASC.Web.Studio.exe urls=http://0.0.0.0:5003 $STORAGE_ROOT=%cd%\Data log:dir=%cd%\Logs log:name=web.studio pathToConf=%cd%\config core:products:folder=%cd%\products
|
@ -603,7 +603,7 @@ public class LdapOperationJob : DistributedTaskProgress
|
||||
|
||||
foreach (var user in users)
|
||||
{
|
||||
if (!user.Equals(Constants.LostUser) && !user.IsVisitor(_userManager))
|
||||
if (!user.Equals(Constants.LostUser) && !_userManager.IsVisitor(user))
|
||||
{
|
||||
if (!usersWithRightsFlat.Contains(user.Id.ToString()))
|
||||
{
|
||||
@ -1051,7 +1051,7 @@ public class LdapOperationJob : DistributedTaskProgress
|
||||
case LdapOperationType.Save:
|
||||
case LdapOperationType.Sync:
|
||||
removedUser.Sid = null;
|
||||
if (!removedUser.IsOwner(_tenantManager.GetCurrentTenant()) && !(_currentUser != null && _currentUser.Id == removedUser.Id && removedUser.IsAdmin(_userManager)))
|
||||
if (!removedUser.IsOwner(_tenantManager.GetCurrentTenant()) && !(_currentUser != null && _currentUser.Id == removedUser.Id && _userManager.IsAdmin(removedUser)))
|
||||
{
|
||||
removedUser.Status = EmployeeStatus.Terminated; // Disable user on portal
|
||||
}
|
||||
|
@ -290,7 +290,7 @@ public class LdapUserManager
|
||||
var notifuEngineQueue = scope.ServiceProvider.GetRequiredService<NotifyEngineQueue>();
|
||||
var client = workContext.NotifyContext.RegisterClient(notifuEngineQueue, source);
|
||||
|
||||
var confirmLink = _commonLinkUtility.GetConfirmationUrl(ldapUserInfo.Email, ConfirmType.EmailActivation);
|
||||
var confirmLink = _commonLinkUtility.GetConfirmationEmailUrl(ldapUserInfo.Email, ConfirmType.EmailActivation);
|
||||
|
||||
client.SendNoticeToAsync(
|
||||
NotifyConstants.ActionLdapActivation,
|
||||
|
@ -21,7 +21,7 @@
|
||||
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.7" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting.Systemd" Version="6.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.0" />
|
||||
<PackageReference Include="NLog.Web.AspNetCore" Version="5.1.0" />
|
||||
<PackageReference Include="NLog.Web.AspNetCore" Version="5.1.4" />
|
||||
<PackageReference Include="StackExchange.Redis.Extensions.AspNetCore" Version="8.0.4" />
|
||||
<PackageReference Include="StackExchange.Redis.Extensions.Newtonsoft" Version="8.0.4" />
|
||||
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="7.2.0" />
|
||||
|
@ -273,35 +273,3 @@ public abstract class BaseStartup
|
||||
}
|
||||
}
|
||||
|
||||
public static class LogNLogConfigureExtenstion
|
||||
{
|
||||
private static LoggingConfiguration GetXmlLoggingConfiguration(IHostEnvironment hostEnvironment, IConfiguration configuration)
|
||||
{
|
||||
var loggerConfiguration = new XmlLoggingConfiguration(CrossPlatform.PathCombine(configuration["pathToConf"], "nlog.config"));
|
||||
|
||||
var settings = new ConfigurationExtension(configuration).GetSetting<NLogSettings>("log");
|
||||
|
||||
if (!string.IsNullOrEmpty(settings.Name))
|
||||
{
|
||||
loggerConfiguration.Variables["name"] = settings.Name;
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(settings.Dir))
|
||||
{
|
||||
var dir = Path.IsPathRooted(settings.Dir) ? settings.Dir : CrossPlatform.PathCombine(hostEnvironment.ContentRootPath, settings.Dir);
|
||||
loggerConfiguration.Variables["dir"] = dir.TrimEnd('/').TrimEnd('\\') + Path.DirectorySeparatorChar;
|
||||
}
|
||||
|
||||
return loggerConfiguration;
|
||||
}
|
||||
|
||||
public static IHostBuilder ConfigureNLogLogging(this IHostBuilder hostBuilder)
|
||||
{
|
||||
return hostBuilder.ConfigureLogging((hostBuildexContext, r) =>
|
||||
{
|
||||
LogManager.ThrowConfigExceptions = false;
|
||||
|
||||
r.AddNLog(GetXmlLoggingConfiguration(hostBuildexContext.HostingEnvironment, hostBuildexContext.Configuration));
|
||||
});
|
||||
}
|
||||
}
|
@ -47,16 +47,15 @@ public static class ConfigurationManagerExtension
|
||||
{"pathToConf", path }
|
||||
});
|
||||
|
||||
config.AddJsonFile("appsettings.json")
|
||||
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", true)
|
||||
.AddJsonFile("storage.json")
|
||||
.AddJsonFile("kafka.json")
|
||||
.AddJsonFile($"kafka.{env.EnvironmentName}.json", true)
|
||||
.AddJsonFile("rabbitmq.json")
|
||||
.AddJsonFile($"rabbitmq.{env.EnvironmentName}.json", true)
|
||||
.AddJsonFile("redis.json")
|
||||
.AddJsonFile($"redis.{env.EnvironmentName}.json", true);
|
||||
|
||||
config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
|
||||
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
|
||||
.AddJsonFile("storage.json", optional: false, reloadOnChange: true)
|
||||
.AddJsonFile("kafka.json", optional: true, reloadOnChange: true)
|
||||
.AddJsonFile($"kafka.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
|
||||
.AddJsonFile("rabbitmq.json", optional: true, reloadOnChange: true)
|
||||
.AddJsonFile($"rabbitmq.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
|
||||
.AddJsonFile("redis.json", optional: true, reloadOnChange: true)
|
||||
.AddJsonFile($"redis.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
|
||||
|
||||
return config;
|
||||
}
|
||||
|
@ -24,6 +24,8 @@
|
||||
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
|
||||
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
|
||||
|
||||
using NLog.Web;
|
||||
|
||||
namespace ASC.Api.Core.Extensions;
|
||||
|
||||
public static class HostBuilderExtension
|
||||
@ -33,8 +35,10 @@ public static class HostBuilderExtension
|
||||
hostBuilder.UseSystemd();
|
||||
hostBuilder.UseWindowsService();
|
||||
hostBuilder.UseServiceProviderFactory(new AutofacServiceProviderFactory());
|
||||
hostBuilder.ConfigureNLogLogging();
|
||||
|
||||
hostBuilder.UseNLog();
|
||||
|
||||
return hostBuilder;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
69
common/ASC.Api.Core/Extensions/ISetupBuilderExtension.cs
Normal file
69
common/ASC.Api.Core/Extensions/ISetupBuilderExtension.cs
Normal file
@ -0,0 +1,69 @@
|
||||
// (c) Copyright Ascensio System SIA 2010-2022
|
||||
//
|
||||
// This program is a free software product.
|
||||
// You can redistribute it and/or modify it under the terms
|
||||
// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
|
||||
// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
|
||||
// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
|
||||
// any third-party rights.
|
||||
//
|
||||
// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty
|
||||
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
|
||||
// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
|
||||
//
|
||||
// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
|
||||
//
|
||||
// The interactive user interfaces in modified source and object code versions of the Program must
|
||||
// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
|
||||
//
|
||||
// Pursuant to Section 7(b) of the License you must retain the original Product logo when
|
||||
// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
|
||||
// trademark law for use of our trademarks.
|
||||
//
|
||||
// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
|
||||
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
|
||||
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
|
||||
|
||||
using NLog.AWS.Logger;
|
||||
|
||||
namespace ASC.Api.Core.Extensions;
|
||||
public static class ISetupBuilderExtension
|
||||
{
|
||||
public static ISetupBuilder LoadConfiguration(this ISetupBuilder loggingBuilder, IConfiguration configuration, IHostEnvironment hostEnvironment)
|
||||
{
|
||||
var conf = new XmlLoggingConfiguration(CrossPlatform.PathCombine(configuration["pathToConf"], "nlog.config"));
|
||||
|
||||
var settings = new ConfigurationExtension(configuration).GetSetting<NLogSettings>("log");
|
||||
|
||||
if (!string.IsNullOrEmpty(settings.Name))
|
||||
{
|
||||
conf.Variables["name"] = settings.Name;
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(settings.Dir))
|
||||
{
|
||||
var dir = Path.IsPathRooted(settings.Dir) ? settings.Dir : CrossPlatform.PathCombine(hostEnvironment.ContentRootPath, settings.Dir);
|
||||
conf.Variables["dir"] = dir.TrimEnd('/').TrimEnd('\\') + Path.DirectorySeparatorChar;
|
||||
}
|
||||
|
||||
foreach (var targetName in new[] { "aws", "aws_sql" })
|
||||
{
|
||||
var awsTarget = conf.FindTargetByName<AWSTarget>(targetName);
|
||||
|
||||
if (awsTarget == null) continue;
|
||||
|
||||
//hack
|
||||
if (!string.IsNullOrEmpty(settings.Name))
|
||||
{
|
||||
awsTarget.LogGroup = awsTarget.LogGroup.Replace("${var:name}", settings.Name);
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(settings.AWSSecretAccessKey))
|
||||
{
|
||||
awsTarget.Credentials = new Amazon.Runtime.BasicAWSCredentials(settings.AWSAccessKeyId, settings.AWSSecretAccessKey);
|
||||
}
|
||||
}
|
||||
|
||||
return loggingBuilder.LoadConfiguration(conf);
|
||||
}
|
||||
}
|
@ -81,24 +81,40 @@ public static class ServiceCollectionExtension
|
||||
services.AddSingleton<IRabbitMQPersistentConnection>(sp =>
|
||||
{
|
||||
var cfg = sp.GetRequiredService<IConfiguration>();
|
||||
var settings = cfg.GetSection("RabbitMQ").Get<RabbitMQSettings>();
|
||||
|
||||
var logger = sp.GetRequiredService<ILogger<DefaultRabbitMQPersistentConnection>>();
|
||||
|
||||
var factory = new ConnectionFactory()
|
||||
{
|
||||
HostName = settings.HostName,
|
||||
DispatchConsumersAsync = true
|
||||
};
|
||||
|
||||
if (!string.IsNullOrEmpty(settings.UserName))
|
||||
{
|
||||
factory.UserName = settings.UserName;
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(settings.Password))
|
||||
{
|
||||
factory.Password = settings.Password;
|
||||
};
|
||||
|
||||
if (!string.IsNullOrEmpty(rabbitMQConfiguration.Uri))
|
||||
{
|
||||
factory.Uri = new Uri(rabbitMQConfiguration.Uri);
|
||||
}
|
||||
else
|
||||
{
|
||||
factory.HostName = rabbitMQConfiguration.HostName;
|
||||
factory.UserName = rabbitMQConfiguration.UserName;
|
||||
factory.Password = rabbitMQConfiguration.Password;
|
||||
factory.Port = rabbitMQConfiguration.Port;
|
||||
factory.VirtualHost = rabbitMQConfiguration.VirtualHost;
|
||||
}
|
||||
|
||||
if (rabbitMQConfiguration.EnableSsl)
|
||||
{
|
||||
factory.Ssl = new SslOption
|
||||
{
|
||||
Enabled = rabbitMQConfiguration.EnableSsl,
|
||||
Version = SslProtocols.Tls12
|
||||
};
|
||||
|
||||
if (!string.IsNullOrEmpty(rabbitMQConfiguration.SslCertPath))
|
||||
{
|
||||
factory.Ssl.CertPath = rabbitMQConfiguration.SslCertPath;
|
||||
factory.Ssl.ServerName = rabbitMQConfiguration.SslServerName;
|
||||
}
|
||||
}
|
||||
|
||||
var retryCount = 5;
|
||||
|
@ -182,8 +182,8 @@ public class EmployeeFullDtoHelper : EmployeeDtoHelper
|
||||
Terminated = _apiDateTimeHelper.Get(userInfo.TerminatedDate),
|
||||
WorkFrom = _apiDateTimeHelper.Get(userInfo.WorkFromDate),
|
||||
Email = userInfo.Email,
|
||||
IsVisitor = userInfo.IsVisitor(_userManager),
|
||||
IsAdmin = userInfo.IsAdmin(_userManager),
|
||||
IsVisitor = _userManager.IsVisitor(userInfo),
|
||||
IsAdmin = _userManager.IsAdmin(userInfo),
|
||||
IsOwner = userInfo.IsOwner(_context.Tenant),
|
||||
IsLDAP = userInfo.IsLDAP(),
|
||||
IsSSO = userInfo.IsSSO()
|
||||
|
@ -23,74 +23,96 @@
|
||||
// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
|
||||
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
|
||||
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
|
||||
|
||||
|
||||
using ValidationResult = ASC.Security.Cryptography.EmailValidationKeyProvider.ValidationResult;
|
||||
|
||||
namespace ASC.Api.Core.Security;
|
||||
|
||||
[Scope]
|
||||
public class RoomInvitationLinksService
|
||||
public class DocSpaceLinkHelper
|
||||
{
|
||||
private readonly CommonLinkUtility _commonLinkUtility;
|
||||
private readonly IDbContextFactory<MessagesContext> _dbContextFactory;
|
||||
private readonly IHttpContextAccessor _httpContextAccessor;
|
||||
private readonly MessageService _messageService;
|
||||
private readonly MessageTarget _messageTarget;
|
||||
private readonly UserManager _userManager;
|
||||
private readonly MessageService _messageService;
|
||||
private readonly IDbContextFactory<MessagesContext> _dbContextFactory;
|
||||
|
||||
public RoomInvitationLinksService(
|
||||
CommonLinkUtility commonLinkUtility,
|
||||
private readonly Signature _signature;
|
||||
private readonly EmailValidationKeyProvider _emailValidationKeyProvider;
|
||||
|
||||
public TimeSpan ExpirationInterval => _emailValidationKeyProvider.ValidEmailKeyInterval;
|
||||
public TimeSpan ExpirationVisitInterval => _emailValidationKeyProvider.ValidVisitLinkInterval;
|
||||
|
||||
public DocSpaceLinkHelper(
|
||||
IHttpContextAccessor httpContextAccessor,
|
||||
MessageTarget messageTarget,
|
||||
UserManager userManager,
|
||||
MessageService messageService,
|
||||
IDbContextFactory<MessagesContext> dbContextFactory)
|
||||
MessageService messageService,
|
||||
Signature signature,
|
||||
IDbContextFactory<MessagesContext> dbContextFactory,
|
||||
EmailValidationKeyProvider emailValidationKeyProvider)
|
||||
{
|
||||
_commonLinkUtility = commonLinkUtility;
|
||||
_httpContextAccessor = httpContextAccessor;
|
||||
_messageTarget = messageTarget;
|
||||
_userManager = userManager;
|
||||
_messageService = messageService;
|
||||
_dbContextFactory = dbContextFactory;
|
||||
_messageService = messageService;
|
||||
_dbContextFactory = dbContextFactory;
|
||||
_signature = signature;
|
||||
_emailValidationKeyProvider = emailValidationKeyProvider;
|
||||
}
|
||||
|
||||
public string GenerateLink<T>(T id, int fileShare, EmployeeType employeeType, Guid guid)
|
||||
public string MakeKey(Guid linkId)
|
||||
{
|
||||
return GenerateLink(id, string.Empty, fileShare, employeeType, guid);
|
||||
return _signature.Create(linkId);
|
||||
}
|
||||
|
||||
public string GenerateLink<T>(T id, string email, int fileShare, EmployeeType employeeType, Guid guid)
|
||||
public string MakeKey(string email)
|
||||
{
|
||||
var user = _userManager.GetUserByEmail(email);
|
||||
return email + ConfirmType.LinkInvite.ToStringFast() + EmployeeType.User.ToStringFast();
|
||||
}
|
||||
|
||||
if (user != ASC.Core.Users.Constants.LostUser)
|
||||
public Guid Parse(string key)
|
||||
{
|
||||
return _signature.Read<Guid>(key);
|
||||
}
|
||||
|
||||
public ValidationResult Validate(string key, string email)
|
||||
{
|
||||
return string.IsNullOrEmpty(email) ? ValidateExternalLink(key) : ValidateEmailLink(email, key);
|
||||
}
|
||||
|
||||
private ValidationResult ValidateEmailLink(string email, string key)
|
||||
{
|
||||
var result = _emailValidationKeyProvider.ValidateEmailKey(MakeKey(email), key, ExpirationInterval);
|
||||
|
||||
if (result == ValidationResult.Ok)
|
||||
{
|
||||
throw new Exception("The user with this email already exists");
|
||||
}
|
||||
var canUsed = CanUsed(email, key, ExpirationVisitInterval);
|
||||
|
||||
var postifx = (int)employeeType + fileShare + id.ToString();
|
||||
|
||||
var link = _commonLinkUtility.GetConfirmationUrl(email, ConfirmType.LinkInvite, postifx, guid)
|
||||
+ $"&emplType={employeeType:d}&roomId={id}&access={fileShare}";
|
||||
|
||||
return link;
|
||||
}
|
||||
|
||||
public bool VisitProcess(string id, string email, string key, TimeSpan interval)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(email))
|
||||
{
|
||||
var user = _userManager.GetUserByEmail(email);
|
||||
|
||||
if (user != ASC.Core.Users.Constants.LostUser)
|
||||
if (!canUsed)
|
||||
{
|
||||
return false;
|
||||
return ValidationResult.Expired;
|
||||
}
|
||||
}
|
||||
|
||||
var message = GetLinkInfo(id, email, key);
|
||||
return result;
|
||||
}
|
||||
|
||||
private ValidationResult ValidateExternalLink(string key)
|
||||
{
|
||||
var payload = Parse(key);
|
||||
|
||||
if (payload == default)
|
||||
{
|
||||
return ValidationResult.Invalid;
|
||||
}
|
||||
|
||||
return ValidationResult.Ok;
|
||||
}
|
||||
|
||||
private bool CanUsed(string email, string key, TimeSpan interval)
|
||||
{
|
||||
var message = GetLinkInfo(email, key);
|
||||
|
||||
if (message == null)
|
||||
{
|
||||
SaveVisitLinkInfo(id, email, key);
|
||||
SaveVisitLinkInfo(email, key);
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -98,27 +120,27 @@ public class RoomInvitationLinksService
|
||||
return message.Date + interval > DateTime.UtcNow;
|
||||
}
|
||||
|
||||
private void SaveVisitLinkInfo(string id, string email, string key)
|
||||
{
|
||||
var headers = _httpContextAccessor?.HttpContext?.Request?.Headers;
|
||||
var target = _messageTarget.CreateFromGroupValues(email != null ? new[] { id, email } : new[] { id });
|
||||
|
||||
_messageService.Send(headers, MessageAction.RoomInviteLinkUsed, target, key);
|
||||
}
|
||||
|
||||
private AuditEvent GetLinkInfo(string id, string email, string key)
|
||||
private AuditEvent GetLinkInfo(string email, string key)
|
||||
{
|
||||
using var context = _dbContextFactory.CreateDbContext();
|
||||
var target = _messageTarget.CreateFromGroupValues(email != null ? new[] { id, email } : new[] { id });
|
||||
var target = _messageTarget.Create(email);
|
||||
var description = JsonConvert.SerializeObject(new[] { key },
|
||||
new JsonSerializerSettings
|
||||
{
|
||||
DateTimeZoneHandling = DateTimeZoneHandling.Utc
|
||||
});
|
||||
|
||||
var message = context.AuditEvents.Where(a => a.Target == target.ToString() &&
|
||||
var message = context.AuditEvents.Where(a => a.Target == target.ToString() &&
|
||||
a.DescriptionRaw == description).FirstOrDefault();
|
||||
|
||||
return message;
|
||||
}
|
||||
|
||||
private void SaveVisitLinkInfo(string email, string key)
|
||||
{
|
||||
var headers = _httpContextAccessor?.HttpContext?.Request?.Headers;
|
||||
var target = _messageTarget.Create(email);
|
||||
|
||||
_messageService.Send(headers, MessageAction.RoomInviteLinkUsed, target, key);
|
||||
}
|
||||
}
|
@ -38,7 +38,7 @@ public class EmailValidationKeyModelHelper
|
||||
private readonly AuthContext _authContext;
|
||||
private readonly UserManager _userManager;
|
||||
private readonly AuthManager _authentication;
|
||||
private readonly RoomInvitationLinksService _roomLinksService;
|
||||
private readonly DocSpaceLinkHelper _docSpaceLinkHelper;
|
||||
private readonly AuditEventsRepository _auditEventsRepository;
|
||||
private readonly TenantUtil _tenantUtil;
|
||||
private readonly MessageTarget _messageTarget;
|
||||
@ -49,7 +49,7 @@ public class EmailValidationKeyModelHelper
|
||||
AuthContext authContext,
|
||||
UserManager userManager,
|
||||
AuthManager authentication,
|
||||
RoomInvitationLinksService roomLinksService,
|
||||
DocSpaceLinkHelper docSpaceLinkHelper,
|
||||
AuditEventsRepository auditEventsRepository,
|
||||
TenantUtil tenantUtil,
|
||||
MessageTarget messageTarget)
|
||||
@ -59,7 +59,7 @@ public class EmailValidationKeyModelHelper
|
||||
_authContext = authContext;
|
||||
_userManager = userManager;
|
||||
_authentication = authentication;
|
||||
_roomLinksService = roomLinksService;
|
||||
_docSpaceLinkHelper = docSpaceLinkHelper;
|
||||
_auditEventsRepository = auditEventsRepository;
|
||||
_tenantUtil = tenantUtil;
|
||||
_messageTarget = messageTarget;
|
||||
@ -87,11 +87,6 @@ public class EmailValidationKeyModelHelper
|
||||
request.TryGetValue("uid", out var userIdKey);
|
||||
Guid.TryParse(userIdKey, out var userId);
|
||||
|
||||
request.TryGetValue("access", out var fileShareRaw);
|
||||
int.TryParse(fileShareRaw, out var fileShare);
|
||||
|
||||
request.TryGetValue("roomId", out var roomId);
|
||||
|
||||
return new EmailValidationKeyModel
|
||||
{
|
||||
Email = _email,
|
||||
@ -99,14 +94,12 @@ public class EmailValidationKeyModelHelper
|
||||
Key = key,
|
||||
Type = cType,
|
||||
UiD = userId,
|
||||
RoomAccess = fileShare,
|
||||
RoomId = roomId
|
||||
};
|
||||
}
|
||||
|
||||
public ValidationResult Validate(EmailValidationKeyModel inDto)
|
||||
{
|
||||
var (key, emplType, email, uiD, type, fileShare, roomId) = inDto;
|
||||
var (key, emplType, email, uiD, type) = inDto;
|
||||
|
||||
ValidationResult checkKeyResult;
|
||||
|
||||
@ -117,18 +110,12 @@ public class EmailValidationKeyModelHelper
|
||||
break;
|
||||
|
||||
case ConfirmType.LinkInvite:
|
||||
if (fileShare != default && !string.IsNullOrEmpty(roomId))
|
||||
{
|
||||
checkKeyResult = _provider.ValidateEmailKey(email + type + ((int)emplType + (int)fileShare + roomId), key, _provider.ValidEmailKeyInterval);
|
||||
if (checkKeyResult == ValidationResult.Ok &&
|
||||
!_roomLinksService.VisitProcess(roomId, email, key, _provider.ValidVisitLinkInterval))
|
||||
{
|
||||
checkKeyResult = ValidationResult.Expired;
|
||||
}
|
||||
break;
|
||||
}
|
||||
checkKeyResult = _docSpaceLinkHelper.Validate(key, email);
|
||||
|
||||
checkKeyResult = _provider.ValidateEmailKey(type.ToString() + (int)emplType, key, _provider.ValidEmailKeyInterval);
|
||||
if (checkKeyResult == ValidationResult.Invalid)
|
||||
{
|
||||
checkKeyResult = _provider.ValidateEmailKey(type.ToString() + (int)emplType, key, _provider.ValidEmailKeyInterval);
|
||||
}
|
||||
break;
|
||||
|
||||
case ConfirmType.PortalOwnerChange:
|
||||
|
@ -29,6 +29,7 @@
|
||||
<PackageReference Include="ARSoft.Tools.NetStandard.DXSdata" Version="1.0.0" />
|
||||
<PackageReference Include="Autofac.Configuration" Version="6.0.0" />
|
||||
<PackageReference Include="AutoMapper" Version="11.0.1" />
|
||||
<PackageReference Include="AWS.Logger.NLog" Version="3.1.0" />
|
||||
<PackageReference Include="Confluent.Kafka" Version="1.9.0" />
|
||||
<PackageReference Include="Google.Protobuf" Version="3.21.4" />
|
||||
<PackageReference Include="Grpc.Tools" Version="2.47.0">
|
||||
@ -54,7 +55,7 @@
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference> -->
|
||||
<PackageReference Include="NLog" Version="5.0.1" />
|
||||
<PackageReference Include="NLog" Version="5.0.4" />
|
||||
<PackageReference Include="NVelocity" Version="1.2.0" />
|
||||
<PackageReference Include="protobuf-net" Version="3.1.17" />
|
||||
<PackageReference Include="RabbitMQ.Client" Version="6.4.0" />
|
||||
|
@ -24,13 +24,15 @@
|
||||
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
|
||||
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
|
||||
|
||||
using System.Security.Authentication;
|
||||
|
||||
namespace ASC.Common.Caching;
|
||||
|
||||
[Singletone]
|
||||
public class RabbitMQCache<T> : IDisposable, ICacheNotify<T> where T : IMessage<T>, new()
|
||||
{
|
||||
private IConnection _connection;
|
||||
private readonly IConnectionFactory _connectionFactory;
|
||||
private readonly ConnectionFactory _factory;
|
||||
|
||||
private IModel _consumerChannel;
|
||||
private readonly Guid _instanceId;
|
||||
@ -53,14 +55,37 @@ public class RabbitMQCache<T> : IDisposable, ICacheNotify<T> where T : IMessage<
|
||||
|
||||
var rabbitMQConfiguration = configuration.GetSection("rabbitmq").Get<RabbitMQSettings>();
|
||||
|
||||
_connectionFactory = new ConnectionFactory
|
||||
_factory = new ConnectionFactory();
|
||||
|
||||
if (!string.IsNullOrEmpty(rabbitMQConfiguration.Uri))
|
||||
{
|
||||
HostName = rabbitMQConfiguration.HostName,
|
||||
UserName = rabbitMQConfiguration.UserName,
|
||||
Password = rabbitMQConfiguration.Password
|
||||
};
|
||||
_factory.Uri = new Uri(rabbitMQConfiguration.Uri);
|
||||
}
|
||||
else
|
||||
{
|
||||
_factory.HostName = rabbitMQConfiguration.HostName;
|
||||
_factory.UserName = rabbitMQConfiguration.UserName;
|
||||
_factory.Password = rabbitMQConfiguration.Password;
|
||||
_factory.Port = rabbitMQConfiguration.Port;
|
||||
_factory.VirtualHost = rabbitMQConfiguration.VirtualHost;
|
||||
}
|
||||
|
||||
if (rabbitMQConfiguration.EnableSsl)
|
||||
{
|
||||
_factory.Ssl = new SslOption
|
||||
{
|
||||
Enabled = rabbitMQConfiguration.EnableSsl,
|
||||
Version = SslProtocols.Tls12
|
||||
};
|
||||
|
||||
if (!string.IsNullOrEmpty(rabbitMQConfiguration.SslCertPath))
|
||||
{
|
||||
_factory.Ssl.CertPath = rabbitMQConfiguration.SslCertPath;
|
||||
_factory.Ssl.ServerName = rabbitMQConfiguration.SslServerName;
|
||||
}
|
||||
}
|
||||
|
||||
_connection = _connectionFactory.CreateConnection();
|
||||
_connection = _factory.CreateConnection();
|
||||
_consumerChannel = CreateConsumerChannel();
|
||||
|
||||
StartBasicConsume();
|
||||
@ -125,7 +150,7 @@ public class RabbitMQCache<T> : IDisposable, ICacheNotify<T> where T : IMessage<
|
||||
return;
|
||||
}
|
||||
|
||||
_connection = _connectionFactory.CreateConnection();
|
||||
_connection = _factory.CreateConnection();
|
||||
_connection.ConnectionShutdown += (s, e) => TryConnect();
|
||||
_connection.CallbackException += (s, e) => TryConnect();
|
||||
_connection.ConnectionBlocked += (s, e) => TryConnect();
|
||||
@ -213,6 +238,11 @@ public class RabbitMQSettings
|
||||
{
|
||||
public string HostName { get; set; }
|
||||
public string UserName { get; set; }
|
||||
public string Password { get; set; }
|
||||
|
||||
public string Password { get; set; }
|
||||
public int Port { get; set; }
|
||||
public string VirtualHost { get; set; }
|
||||
public string Uri { get; set; }
|
||||
public bool EnableSsl { get; set; }
|
||||
public string SslServerName { get; set; }
|
||||
public string SslCertPath { get; set; }
|
||||
}
|
||||
|
@ -30,5 +30,8 @@ namespace ASC.Common.Logging;
|
||||
public class NLogSettings
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public string Dir { get; set; }
|
||||
public string Dir { get; set; }
|
||||
public string AWSAccessKeyId { get; set; }
|
||||
public string AWSSecretAccessKey {get; set;}
|
||||
|
||||
}
|
||||
|
@ -54,18 +54,17 @@ public class Signature
|
||||
return Read<T>(signature, Encoding.UTF8.GetString(_machinePseudoKeys.GetMachineConstant()));
|
||||
}
|
||||
|
||||
public static T Read<T>(string signature, string secret)
|
||||
public T Read<T>(string signature, Action<string> signatureResolver = null)
|
||||
{
|
||||
return Read<T>(signature, Encoding.UTF8.GetString(_machinePseudoKeys.GetMachineConstant()), signatureResolver);
|
||||
}
|
||||
|
||||
public static T Read<T>(string signature, string secret, Action<string> signatureResolver = null)
|
||||
{
|
||||
try
|
||||
{
|
||||
var lastSignChar = Int32.Parse(signature.Substring(signature.Length - 1));
|
||||
signature = signature.Remove(signature.Length - 1);
|
||||
signatureResolver?.Invoke(signature);
|
||||
|
||||
while(lastSignChar > 0)
|
||||
{
|
||||
signature = signature + "=";
|
||||
lastSignChar--;
|
||||
}
|
||||
var payloadParts = Encoding.UTF8.GetString(WebEncoders.Base64UrlDecode(signature)).Split('?');
|
||||
|
||||
if (GetHashBase64(payloadParts[1].Trim() + secret) == payloadParts[0])
|
||||
|
@ -144,10 +144,10 @@ public class UserManager
|
||||
switch (type)
|
||||
{
|
||||
case EmployeeType.User:
|
||||
users = users.Where(u => !u.IsVisitor(this));
|
||||
users = users.Where(u => !this.IsVisitor(u));
|
||||
break;
|
||||
case EmployeeType.Visitor:
|
||||
users = users.Where(u => u.IsVisitor(this));
|
||||
users = users.Where(u => this.IsVisitor(u));
|
||||
break;
|
||||
}
|
||||
|
||||
@ -715,7 +715,7 @@ public class UserManager
|
||||
|
||||
if (group == null)
|
||||
{
|
||||
group = ToGroup(Constants.BuildinGroups.FirstOrDefault(r => r.ID == groupID) ?? Constants.LostGroupInfo);
|
||||
group = ToGroup(Constants.BuildinGroups.FirstOrDefault(r => r.ID == groupID) ?? Constants.LostGroupInfo);
|
||||
}
|
||||
|
||||
if (group == null)
|
||||
|
@ -31,6 +31,7 @@ public class TenantIpRestrictions
|
||||
public int Id { get; set; }
|
||||
public int Tenant { get; set; }
|
||||
public string Ip { get; set; }
|
||||
public bool ForAdmin { get; set; }
|
||||
}
|
||||
|
||||
public static class TenantIpRestrictionsExtension
|
||||
@ -63,6 +64,11 @@ public static class TenantIpRestrictionsExtension
|
||||
.HasCharSet("utf8")
|
||||
.UseCollation("utf8_general_ci");
|
||||
|
||||
entity.Property(e => e.ForAdmin)
|
||||
.IsRequired()
|
||||
.HasColumnName("for_admin")
|
||||
.HasColumnType("TINYINT(1)");
|
||||
|
||||
entity.Property(e => e.Tenant).HasColumnName("tenant");
|
||||
});
|
||||
}
|
||||
@ -83,6 +89,11 @@ public static class TenantIpRestrictionsExtension
|
||||
.HasColumnName("ip")
|
||||
.HasMaxLength(50);
|
||||
|
||||
entity.Property(e => e.ForAdmin)
|
||||
.IsRequired()
|
||||
.HasColumnName("for_admin")
|
||||
.HasColumnType("TINYINT(1)");
|
||||
|
||||
entity.Property(e => e.Tenant).HasColumnName("tenant");
|
||||
});
|
||||
|
||||
|
@ -24,6 +24,8 @@
|
||||
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
|
||||
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
|
||||
|
||||
using ASC.Notify;
|
||||
|
||||
namespace ASC.Core.Common.Hosting;
|
||||
|
||||
[Scope]
|
||||
@ -48,6 +50,10 @@ public class RegisterInstanceDao<T> : IRegisterInstanceDao<T> where T : IHostedS
|
||||
if (inst == null)
|
||||
{
|
||||
await _instanceRegistrationContext.AddAsync(obj);
|
||||
}
|
||||
else
|
||||
{
|
||||
_instanceRegistrationContext.Entry(inst).CurrentValues.SetValues(obj);
|
||||
}
|
||||
|
||||
bool saveFailed;
|
||||
|
@ -60,7 +60,7 @@ public class RegisterInstanceManager<T> : IRegisterInstanceManager<T> where T :
|
||||
{
|
||||
var firstAliceInstance = GetFirstAliveInstance(instances);
|
||||
|
||||
if (firstAliceInstance != null && firstAliceInstance.InstanceRegistrationId == instance.InstanceRegistrationId)
|
||||
if (firstAliceInstance == null || firstAliceInstance.InstanceRegistrationId == instance.InstanceRegistrationId)
|
||||
{
|
||||
instance.IsActive = true;
|
||||
}
|
||||
|
@ -468,7 +468,8 @@ public enum MessageAction
|
||||
RoomArchived = 5072,
|
||||
RoomUnarchived = 5073,
|
||||
RoomDeleted = 5074,
|
||||
RoomUpdateAccess = 5075,
|
||||
RoomUpdateAccess = 5075,
|
||||
RoomInvintationUpdateAccess = 5082,
|
||||
|
||||
TagCreated = 5076,
|
||||
TagsDeleted = 5077,
|
||||
|
@ -59,11 +59,12 @@ public class EmailValidationKeyProvider
|
||||
}
|
||||
if (!TimeSpan.TryParse(configuration["visit:validinterval"], out var validVisitLinkInterval))
|
||||
{
|
||||
ValidVisitLinkInterval = TimeSpan.FromMinutes(15);
|
||||
validVisitLinkInterval = TimeSpan.FromMinutes(15);
|
||||
}
|
||||
|
||||
ValidEmailKeyInterval = validInterval;
|
||||
ValidAuthKeyInterval = authValidInterval;
|
||||
ValidVisitLinkInterval = validVisitLinkInterval;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
@ -168,11 +169,9 @@ public class EmailValidationKeyModel
|
||||
public string Email { get; set; }
|
||||
public Guid? UiD { get; set; }
|
||||
public ConfirmType? Type { get; set; }
|
||||
public int RoomAccess { get; set; }
|
||||
public string RoomId { get; set; }
|
||||
|
||||
public void Deconstruct(out string key, out EmployeeType? emplType, out string email, out Guid? uiD, out ConfirmType? type, out int roomAccess, out string roomId)
|
||||
public void Deconstruct(out string key, out EmployeeType? emplType, out string email, out Guid? uiD, out ConfirmType? type)
|
||||
{
|
||||
(key, emplType, email, uiD, type, roomAccess, roomId) = (Key, EmplType, Email, UiD, Type, RoomAccess, RoomId);
|
||||
(key, emplType, email, uiD, type) = (Key, EmplType, Email, UiD, Type);
|
||||
}
|
||||
}
|
@ -43,19 +43,36 @@ public static class UserExtensions
|
||||
return ui != null && ui.Id == authContext.CurrentAccount.ID;
|
||||
}
|
||||
|
||||
public static bool IsAdmin(this UserInfo ui, UserManager UserManager)
|
||||
public static bool IsAdmin(this UserManager userManager, Guid id)
|
||||
{
|
||||
return ui != null && UserManager.IsUserInGroup(ui.Id, Constants.GroupAdmin.ID);
|
||||
var ui = userManager.GetUsers(id);
|
||||
return userManager.IsAdmin(ui);
|
||||
}
|
||||
|
||||
public static bool IsVisitor(this UserInfo ui, UserManager UserManager)
|
||||
public static bool IsAdmin(this UserManager userManager, UserInfo ui)
|
||||
{
|
||||
return ui != null && UserManager.IsUserInGroup(ui.Id, Constants.GroupVisitor.ID);
|
||||
return ui != null && userManager.IsUserInGroup(ui.Id, Constants.GroupAdmin.ID);
|
||||
}
|
||||
|
||||
public static bool IsOutsider(this UserInfo ui, UserManager userManager)
|
||||
public static bool IsVisitor(this UserManager userManager, Guid id)
|
||||
{
|
||||
return IsVisitor(ui, userManager) && ui.Id == Constants.OutsideUser.Id;
|
||||
var ui = userManager.GetUsers(id);
|
||||
return userManager.IsVisitor(ui);
|
||||
}
|
||||
|
||||
public static bool IsVisitor(this UserManager userManager, UserInfo ui)
|
||||
{
|
||||
return ui != null && userManager.IsUserInGroup(ui.Id, Constants.GroupVisitor.ID);
|
||||
}
|
||||
|
||||
public static bool IsOutsider(this UserManager userManager, Guid id)
|
||||
{
|
||||
return userManager.IsVisitor(id) && id == Constants.OutsideUser.Id;
|
||||
}
|
||||
|
||||
public static bool IsOutsider(this UserManager userManager, UserInfo ui)
|
||||
{
|
||||
return userManager.IsVisitor(ui) && ui.Id == Constants.OutsideUser.Id;
|
||||
}
|
||||
|
||||
public static bool IsLDAP(this UserInfo ui)
|
||||
|
@ -72,7 +72,7 @@ public class BackupAjaxHandler
|
||||
_tempPath = tempPath;
|
||||
}
|
||||
|
||||
public void StartBackup(BackupStorageType storageType, Dictionary<string, string> storageParams, bool backupMail)
|
||||
public void StartBackup(BackupStorageType storageType, Dictionary<string, string> storageParams)
|
||||
{
|
||||
DemandPermissionsBackup();
|
||||
|
||||
@ -80,7 +80,6 @@ public class BackupAjaxHandler
|
||||
{
|
||||
TenantId = GetCurrentTenantId(),
|
||||
UserId = _securityContext.CurrentAccount.ID,
|
||||
BackupMail = backupMail,
|
||||
StorageType = storageType,
|
||||
StorageParams = storageParams
|
||||
};
|
||||
@ -141,7 +140,7 @@ public class BackupAjaxHandler
|
||||
return _backupService.GetBackupHistory(GetCurrentTenantId());
|
||||
}
|
||||
|
||||
public void CreateSchedule(BackupStorageType storageType, Dictionary<string, string> storageParams, int backupsStored, CronParams cronParams, bool backupMail)
|
||||
public void CreateSchedule(BackupStorageType storageType, Dictionary<string, string> storageParams, int backupsStored, CronParams cronParams)
|
||||
{
|
||||
DemandPermissionsBackup();
|
||||
|
||||
@ -155,7 +154,6 @@ public class BackupAjaxHandler
|
||||
var scheduleRequest = new CreateScheduleRequest
|
||||
{
|
||||
TenantId = _tenantManager.GetCurrentTenant().Id,
|
||||
BackupMail = backupMail,
|
||||
Cron = cronParams.ToString(),
|
||||
NumberOfBackupsStored = backupsStored,
|
||||
StorageType = storageType,
|
||||
@ -198,7 +196,6 @@ public class BackupAjaxHandler
|
||||
StorageType = response.StorageType,
|
||||
StorageParams = response.StorageParams.ToDictionary(r => r.Key, r => r.Value) ?? new Dictionary<string, string>(),
|
||||
CronParams = new CronParams(response.Cron),
|
||||
BackupMail = response.BackupMail.NullIfDefault(),
|
||||
BackupsStored = response.NumberOfBackupsStored.NullIfDefault(),
|
||||
LastBackupTime = response.LastBackupTime
|
||||
};
|
||||
@ -224,7 +221,6 @@ public class BackupAjaxHandler
|
||||
var Schedule = new CreateScheduleRequest
|
||||
{
|
||||
TenantId = _tenantManager.GetCurrentTenant().Id,
|
||||
BackupMail = schedule.BackupMail != null && (bool)schedule.BackupMail,
|
||||
Cron = schedule.CronParams.ToString(),
|
||||
NumberOfBackupsStored = schedule.BackupsStored == null ? 0 : (int)schedule.BackupsStored,
|
||||
StorageType = schedule.StorageType,
|
||||
@ -337,7 +333,7 @@ public class BackupAjaxHandler
|
||||
|
||||
#region transfer
|
||||
|
||||
public void StartTransfer(string targetRegion, bool notifyUsers, bool transferMail)
|
||||
public void StartTransfer(string targetRegion, bool notifyUsers)
|
||||
{
|
||||
DemandPermissionsTransfer();
|
||||
|
||||
@ -347,7 +343,6 @@ public class BackupAjaxHandler
|
||||
{
|
||||
TenantId = GetCurrentTenantId(),
|
||||
TargetRegion = targetRegion,
|
||||
BackupMail = transferMail,
|
||||
NotifyUsers = notifyUsers
|
||||
});
|
||||
|
||||
@ -405,7 +400,6 @@ public class BackupAjaxHandler
|
||||
public BackupStorageType StorageType { get; set; }
|
||||
public Dictionary<string, string> StorageParams { get; set; }
|
||||
public CronParams CronParams { get; set; }
|
||||
public bool? BackupMail { get; set; }
|
||||
public int? BackupsStored { get; set; }
|
||||
public DateTime LastBackupTime { get; set; }
|
||||
}
|
||||
|
@ -41,7 +41,6 @@ public class StartBackupRequest
|
||||
{
|
||||
public int TenantId { get; set; }
|
||||
public Guid UserId { get; set; }
|
||||
public bool BackupMail { get; set; }
|
||||
public BackupStorageType StorageType { get; set; }
|
||||
public string StorageBasePath { get; set; }
|
||||
public Dictionary<string, string> StorageParams { get; set; }
|
||||
@ -61,7 +60,6 @@ public class StartTransferRequest
|
||||
public int TenantId { get; set; }
|
||||
public string TargetRegion { get; set; }
|
||||
public bool NotifyUsers { get; set; }
|
||||
public bool BackupMail { get; set; }
|
||||
}
|
||||
|
||||
public class TransferRegion
|
||||
@ -91,7 +89,6 @@ public class ScheduleResponse
|
||||
{
|
||||
public BackupStorageType StorageType { get; set; }
|
||||
public string StorageBasePath { get; set; }
|
||||
public bool BackupMail { get; set; }
|
||||
public int NumberOfBackupsStored { get; set; }
|
||||
public string Cron { get; set; }
|
||||
public DateTime LastBackupTime { get; set; }
|
||||
|
@ -124,7 +124,7 @@ public class NotifyHelper
|
||||
foreach (var user in users)
|
||||
{
|
||||
var hash = _authManager.GetUserPasswordStamp(user.Id).ToString("s");
|
||||
var confirmationUrl = _commonLinkUtility.GetConfirmationUrl(user.Email, ConfirmType.PasswordChange, hash);
|
||||
var confirmationUrl = _commonLinkUtility.GetConfirmationEmailUrl(user.Email, ConfirmType.PasswordChange, hash);
|
||||
|
||||
Func<string> greenButtonText = () => BackupResource.ButtonSetPassword;
|
||||
|
||||
|
@ -30,8 +30,6 @@ public class BackupSchedule : BaseEntity
|
||||
{
|
||||
public int TenantId { get; set; }
|
||||
|
||||
public bool BackupMail { get; set; }
|
||||
|
||||
public string Cron { get; set; }
|
||||
|
||||
public int BackupsStored { get; set; }
|
||||
@ -76,11 +74,6 @@ public static class BackupScheduleExtension
|
||||
.HasColumnType("int(10)")
|
||||
.ValueGeneratedNever();
|
||||
|
||||
entity.Property(e => e.BackupMail)
|
||||
.HasColumnName("backup_mail")
|
||||
.HasColumnType("tinyint(1)")
|
||||
.HasDefaultValueSql("'0'");
|
||||
|
||||
entity.Property(e => e.Cron)
|
||||
.IsRequired()
|
||||
.HasColumnName("cron")
|
||||
@ -132,11 +125,6 @@ public static class BackupScheduleExtension
|
||||
.HasColumnName("tenant_id")
|
||||
.HasMaxLength(10);
|
||||
|
||||
entity.Property(e => e.BackupMail)
|
||||
.HasColumnName("backup_mail")
|
||||
.HasMaxLength(10)
|
||||
.HasDefaultValueSql("'0'");
|
||||
|
||||
entity.Property(e => e.Cron)
|
||||
.IsRequired()
|
||||
.HasColumnName("cron")
|
||||
|
@ -38,14 +38,12 @@ public record BackupRequestIntegrationEvent : IntegrationEvent
|
||||
int tenantId,
|
||||
Guid createBy,
|
||||
Dictionary<string, string> storageParams,
|
||||
bool backupMail,
|
||||
bool isScheduled = false,
|
||||
int backupsStored = 0,
|
||||
string storageBasePath = "") : base(createBy, tenantId)
|
||||
{
|
||||
StorageType = storageType;
|
||||
StorageParams = storageParams;
|
||||
BackupMail = backupMail;
|
||||
IsScheduled = isScheduled;
|
||||
BackupsStored = backupsStored;
|
||||
StorageBasePath = storageBasePath;
|
||||
@ -57,9 +55,6 @@ public record BackupRequestIntegrationEvent : IntegrationEvent
|
||||
[ProtoMember(2)]
|
||||
public Dictionary<string, string> StorageParams { get; private init; }
|
||||
|
||||
[ProtoMember(3)]
|
||||
public bool BackupMail { get; private init; }
|
||||
|
||||
[ProtoMember(4)]
|
||||
public bool IsScheduled { get; private init; }
|
||||
|
||||
|
@ -126,7 +126,7 @@ public class BackupService : IBackupService
|
||||
|
||||
public void StartTransfer(StartTransferRequest request)
|
||||
{
|
||||
var progress = _backupWorker.StartTransfer(request.TenantId, request.TargetRegion, request.BackupMail, request.NotifyUsers);
|
||||
var progress = _backupWorker.StartTransfer(request.TenantId, request.TargetRegion, request.NotifyUsers);
|
||||
if (!string.IsNullOrEmpty(progress.Error))
|
||||
{
|
||||
throw new FaultException();
|
||||
@ -209,7 +209,6 @@ public class BackupService : IBackupService
|
||||
{
|
||||
TenantId = request.TenantId,
|
||||
Cron = request.Cron,
|
||||
BackupMail = request.BackupMail,
|
||||
BackupsStored = request.NumberOfBackupsStored,
|
||||
StorageType = request.StorageType,
|
||||
StorageBasePath = request.StorageBasePath,
|
||||
@ -231,7 +230,6 @@ public class BackupService : IBackupService
|
||||
{
|
||||
StorageType = schedule.StorageType,
|
||||
StorageBasePath = schedule.StorageBasePath,
|
||||
BackupMail = schedule.BackupMail,
|
||||
NumberOfBackupsStored = schedule.BackupsStored,
|
||||
Cron = schedule.Cron,
|
||||
LastBackupTime = schedule.LastBackupTime,
|
||||
|
@ -209,7 +209,7 @@ public class BackupWorker
|
||||
}
|
||||
}
|
||||
|
||||
public BackupProgress StartTransfer(int tenantId, string targetRegion, bool transferMail, bool notify)
|
||||
public BackupProgress StartTransfer(int tenantId, string targetRegion, bool notify)
|
||||
{
|
||||
lock (_synchRoot)
|
||||
{
|
||||
@ -223,7 +223,7 @@ public class BackupWorker
|
||||
if (item == null)
|
||||
{
|
||||
item = _serviceProvider.GetService<TransferProgressItem>();
|
||||
item.Init(targetRegion, transferMail, tenantId, TempFolder, _limit, notify, _currentRegion, _configPaths);
|
||||
item.Init(targetRegion, tenantId, TempFolder, _limit, notify, _currentRegion, _configPaths);
|
||||
|
||||
_progressQueue.EnqueueTask(item);
|
||||
}
|
||||
|
@ -54,7 +54,6 @@ namespace ASC.Data.Backup.Services;
|
||||
[Transient]
|
||||
public class BackupProgressItem : BaseBackupProgressItem
|
||||
{
|
||||
public bool BackupMail { get; set; }
|
||||
public Dictionary<string, string> StorageParams { get; set; }
|
||||
public string TempFolder { get; set; }
|
||||
|
||||
@ -94,7 +93,6 @@ public class BackupProgressItem : BaseBackupProgressItem
|
||||
TenantId = schedule.TenantId;
|
||||
_storageType = schedule.StorageType;
|
||||
_storageBasePath = schedule.StorageBasePath;
|
||||
BackupMail = schedule.BackupMail;
|
||||
StorageParams = JsonConvert.DeserializeObject<Dictionary<string, string>>(schedule.StorageParams);
|
||||
_isScheduled = isScheduled;
|
||||
TempFolder = tempFolder;
|
||||
@ -109,7 +107,6 @@ public class BackupProgressItem : BaseBackupProgressItem
|
||||
TenantId = request.TenantId;
|
||||
_storageType = request.StorageType;
|
||||
_storageBasePath = request.StorageBasePath;
|
||||
BackupMail = request.BackupMail;
|
||||
StorageParams = request.StorageParams.ToDictionary(r => r.Key, r => r.Value);
|
||||
_isScheduled = isScheduled;
|
||||
TempFolder = tempFolder;
|
||||
@ -142,11 +139,7 @@ public class BackupProgressItem : BaseBackupProgressItem
|
||||
{
|
||||
var backupTask = _backupPortalTask;
|
||||
|
||||
backupTask.Init(TenantId, _configPaths[_currentRegion], tempFile, _limit);
|
||||
if (!BackupMail)
|
||||
{
|
||||
backupTask.IgnoreModule(ModuleName.Mail);
|
||||
}
|
||||
backupTask.Init(TenantId, _configPaths[_currentRegion], tempFile, _limit);
|
||||
|
||||
backupTask.ProgressChanged += (sender, args) =>
|
||||
{
|
||||
|
@ -74,7 +74,6 @@ public class TransferProgressItem : BaseBackupProgressItem
|
||||
}
|
||||
|
||||
public string TargetRegion { get; set; }
|
||||
public bool TransferMail { get; set; }
|
||||
public bool Notify { get; set; }
|
||||
public string TempFolder { get; set; }
|
||||
public Dictionary<string, string> ConfigPaths { get; set; }
|
||||
@ -83,7 +82,6 @@ public class TransferProgressItem : BaseBackupProgressItem
|
||||
|
||||
public void Init(
|
||||
string targetRegion,
|
||||
bool transferMail,
|
||||
int tenantId,
|
||||
string tempFolder,
|
||||
int limit,
|
||||
@ -93,7 +91,6 @@ public class TransferProgressItem : BaseBackupProgressItem
|
||||
{
|
||||
TenantId = tenantId;
|
||||
TargetRegion = targetRegion;
|
||||
TransferMail = transferMail;
|
||||
Notify = notify;
|
||||
TempFolder = tempFolder;
|
||||
ConfigPaths = configPaths;
|
||||
@ -122,11 +119,8 @@ public class TransferProgressItem : BaseBackupProgressItem
|
||||
{
|
||||
Percentage = args.Progress;
|
||||
PublishChanges();
|
||||
};
|
||||
if (!TransferMail)
|
||||
{
|
||||
transferProgressItem.IgnoreModule(ModuleName.Mail);
|
||||
}
|
||||
};
|
||||
|
||||
transferProgressItem.RunJob();
|
||||
|
||||
Link = GetLink(alias, false);
|
||||
|
@ -1,101 +0,0 @@
|
||||
// (c) Copyright Ascensio System SIA 2010-2022
|
||||
//
|
||||
// This program is a free software product.
|
||||
// You can redistribute it and/or modify it under the terms
|
||||
// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
|
||||
// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
|
||||
// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
|
||||
// any third-party rights.
|
||||
//
|
||||
// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty
|
||||
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
|
||||
// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
|
||||
//
|
||||
// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
|
||||
//
|
||||
// The interactive user interfaces in modified source and object code versions of the Program must
|
||||
// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
|
||||
//
|
||||
// Pursuant to Section 7(b) of the License you must retain the original Product logo when
|
||||
// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
|
||||
// trademark law for use of our trademarks.
|
||||
//
|
||||
// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
|
||||
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
|
||||
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
|
||||
|
||||
namespace ASC.Data.Backup.Tasks.Modules;
|
||||
|
||||
public class CalendarModuleSpecifics : ModuleSpecificsBase
|
||||
{
|
||||
public override ModuleName ModuleName => ModuleName.Calendar;
|
||||
public override IEnumerable<TableInfo> Tables => _tables;
|
||||
public override IEnumerable<RelationInfo> TableRelations => _tableRelations;
|
||||
|
||||
private readonly RelationInfo[] _tableRelations;
|
||||
private readonly TableInfo[] _tables = new[]
|
||||
{
|
||||
new TableInfo("calendar_calendars", "tenant", "id") {UserIDColumns = new[] {"owner_id"}},
|
||||
new TableInfo("calendar_calendar_item"),
|
||||
new TableInfo("calendar_calendar_user") {UserIDColumns = new[] {"user_id"}},
|
||||
new TableInfo("calendar_events", "tenant", "id")
|
||||
{
|
||||
UserIDColumns = new[] {"owner_id"},
|
||||
DateColumns = new Dictionary<string, bool> {{"start_date", true}, {"end_date", true}}
|
||||
},
|
||||
new TableInfo("calendar_event_history", "tenant"),
|
||||
new TableInfo("calendar_event_item"),
|
||||
new TableInfo("calendar_event_user") {UserIDColumns = new[] {"user_id"}},
|
||||
new TableInfo("calendar_notifications", "tenant")
|
||||
{
|
||||
UserIDColumns = new[] {"user_id"},
|
||||
DateColumns = new Dictionary<string, bool> {{"notify_date", true}}
|
||||
}
|
||||
};
|
||||
|
||||
public CalendarModuleSpecifics(Helpers helpers)
|
||||
: base(helpers)
|
||||
{
|
||||
_tableRelations = new[]
|
||||
{
|
||||
new RelationInfo("calendar_calendars", "id", "calendar_calendar_item", "calendar_id"),
|
||||
new RelationInfo("calendar_calendars", "id", "calendar_calendar_user", "calendar_id"),
|
||||
new RelationInfo("calendar_calendars", "id", "calendar_events", "calendar_id"),
|
||||
new RelationInfo("calendar_calendars", "id", "calendar_event_history", "calendar_id"),
|
||||
new RelationInfo("calendar_events", "id", "calendar_event_history", "event_id"),
|
||||
new RelationInfo("calendar_events", "id", "calendar_event_item", "event_id"),
|
||||
new RelationInfo("calendar_events", "id", "calendar_event_user", "event_id"),
|
||||
new RelationInfo("calendar_events", "id", "calendar_notifications", "event_id"),
|
||||
new RelationInfo("core_user", "id", "calendar_calendar_item", "item_id", typeof(TenantsModuleSpecifics),
|
||||
x => Convert.ToInt32(x["is_group"]) == 0),
|
||||
new RelationInfo("core_group", "id", "calendar_calendar_item", "item_id", typeof(TenantsModuleSpecifics),
|
||||
x => Convert.ToInt32(x["is_group"]) == 1 && !helpers.IsEmptyOrSystemGroup(Convert.ToString(x["item_id"]))),
|
||||
new RelationInfo("core_user", "id", "calendar_event_item", "item_id", typeof(TenantsModuleSpecifics),
|
||||
x => Convert.ToInt32(x["is_group"]) == 0),
|
||||
new RelationInfo("core_group", "id", "calendar_event_item", "item_id", typeof(TenantsModuleSpecifics),
|
||||
x => Convert.ToInt32(x["is_group"]) == 1 && !helpers.IsEmptyOrSystemGroup(Convert.ToString(x["item_id"])))
|
||||
};
|
||||
}
|
||||
|
||||
protected override string GetSelectCommandConditionText(int tenantId, TableInfo table)
|
||||
{
|
||||
if (table.Name == "calendar_calendar_item" || table.Name == "calendar_calendar_user")
|
||||
{
|
||||
return "inner join calendar_calendars as t1 on t1.id = t.calendar_id where t1.tenant = " + tenantId;
|
||||
}
|
||||
|
||||
if (table.Name == "calendar_event_item" || table.Name == "calendar_event_user")
|
||||
{
|
||||
return "inner join calendar_events as t1 on t1.id = t.event_id where t1.tenant = " + tenantId;
|
||||
}
|
||||
|
||||
if (table.Name == "calendar_event_history")
|
||||
{
|
||||
return string.Format(
|
||||
"inner join calendar_calendars as t1 on t1.id = t.calendar_id and t1.tenant = t.tenant inner join calendar_events as t2 on t2.id = t.event_id where t1.tenant = {0} and t2.tenant = {0}",
|
||||
tenantId);
|
||||
}
|
||||
|
||||
return base.GetSelectCommandConditionText(tenantId, table);
|
||||
}
|
||||
}
|
@ -1,289 +0,0 @@
|
||||
// (c) Copyright Ascensio System SIA 2010-2022
|
||||
//
|
||||
// This program is a free software product.
|
||||
// You can redistribute it and/or modify it under the terms
|
||||
// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
|
||||
// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
|
||||
// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
|
||||
// any third-party rights.
|
||||
//
|
||||
// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty
|
||||
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
|
||||
// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
|
||||
//
|
||||
// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
|
||||
//
|
||||
// The interactive user interfaces in modified source and object code versions of the Program must
|
||||
// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
|
||||
//
|
||||
// Pursuant to Section 7(b) of the License you must retain the original Product logo when
|
||||
// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
|
||||
// trademark law for use of our trademarks.
|
||||
//
|
||||
// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
|
||||
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
|
||||
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
|
||||
|
||||
namespace ASC.Data.Backup.Tasks.Modules;
|
||||
|
||||
public class CommunityModuleSpecifics : ModuleSpecificsBase
|
||||
{
|
||||
public override ModuleName ModuleName => ModuleName.Community;
|
||||
public override IEnumerable<TableInfo> Tables => _tables;
|
||||
public override IEnumerable<RelationInfo> TableRelations => _tableRelations;
|
||||
|
||||
private readonly TableInfo[] _tables = new[]
|
||||
{
|
||||
new TableInfo("bookmarking_bookmark", "Tenant", "ID")
|
||||
{
|
||||
UserIDColumns = new[] {"UserCreatorID"},
|
||||
DateColumns = new Dictionary<string, bool> {{"Date", false}}
|
||||
},
|
||||
new TableInfo("bookmarking_bookmarktag", "tenant"),
|
||||
new TableInfo("bookmarking_comment", "tenant", "ID", IdType.Guid)
|
||||
{
|
||||
UserIDColumns = new[] {"UserID"},
|
||||
DateColumns = new Dictionary<string, bool> {{"Datetime", false}}
|
||||
},
|
||||
new TableInfo("bookmarking_tag", "tenant", "TagID"),
|
||||
new TableInfo("bookmarking_userbookmark", "tenant", "UserBookmarkID")
|
||||
{
|
||||
UserIDColumns = new[] {"UserID"},
|
||||
DateColumns = new Dictionary<string, bool> {{"DateAdded", false}, {"LastModified", false}}
|
||||
},
|
||||
new TableInfo("bookmarking_userbookmarktag", "tenant"),
|
||||
new TableInfo("blogs_comments", "Tenant", "id", IdType.Guid)
|
||||
{
|
||||
UserIDColumns = new[] {"created_by"},
|
||||
DateColumns = new Dictionary<string, bool> {{"created_when", false}}
|
||||
},
|
||||
new TableInfo("blogs_posts", "Tenant", "post_id", IdType.Autoincrement)
|
||||
{
|
||||
UserIDColumns = new[] {"created_by"},
|
||||
DateColumns = new Dictionary<string, bool> {{"created_when", false}, {"LastModified", false}}
|
||||
},
|
||||
new TableInfo("blogs_reviewposts", "Tenant")
|
||||
{
|
||||
UserIDColumns = new[] {"reviewed_by"},
|
||||
DateColumns = new Dictionary<string, bool> {{"timestamp", false}}
|
||||
},
|
||||
new TableInfo("blogs_tags", "Tenant"),
|
||||
new TableInfo("events_comment", "Tenant", "id")
|
||||
{
|
||||
UserIDColumns = new[] {"Creator"},
|
||||
DateColumns = new Dictionary<string, bool> {{"Date", false}}
|
||||
},
|
||||
new TableInfo("events_feed", "Tenant", "id")
|
||||
{
|
||||
UserIDColumns = new[] {"Creator"},
|
||||
DateColumns = new Dictionary<string, bool> {{"Date", false}, {"LastModified", false}}
|
||||
},
|
||||
new TableInfo("events_poll", "Tenant")
|
||||
{
|
||||
DateColumns = new Dictionary<string, bool> {{"StartDate", true}, {"EndDate", true}}
|
||||
},
|
||||
new TableInfo("events_pollanswer", "Tenant") {UserIDColumns = new[] {"User"}}, //todo: check //varchar(64)?
|
||||
new TableInfo("events_pollvariant", "Tenant", "Id"),
|
||||
new TableInfo("events_reader", "Tenant") {UserIDColumns = new[] {"Reader"}}, //todo: check
|
||||
new TableInfo("forum_answer", "TenantID", "id")
|
||||
{
|
||||
UserIDColumns = new[] {"user_id"},
|
||||
DateColumns = new Dictionary<string, bool> {{"create_date", false}}
|
||||
},
|
||||
new TableInfo("forum_answer_variant"),
|
||||
new TableInfo("forum_attachment", "TenantID", "id")
|
||||
{
|
||||
DateColumns = new Dictionary<string, bool> {{"create_date", false}}
|
||||
},
|
||||
new TableInfo("forum_category", "TenantID", "id")
|
||||
{
|
||||
UserIDColumns = new[] {"poster_id"},
|
||||
DateColumns = new Dictionary<string, bool> {{"create_date", false}}
|
||||
},
|
||||
new TableInfo("forum_lastvisit", "tenantid")
|
||||
{
|
||||
UserIDColumns = new[] {"user_id"},
|
||||
DateColumns = new Dictionary<string, bool> {{"last_visit", false}}
|
||||
},
|
||||
new TableInfo("forum_post", "TenantID", "id")
|
||||
{
|
||||
UserIDColumns = new[] {"poster_id", "editor_id"},
|
||||
DateColumns = new Dictionary<string, bool> {{"create_date", false}, {"edit_date", false}, {"LastModified", false}}
|
||||
},
|
||||
new TableInfo("forum_question", "TenantID", "id") {DateColumns = new Dictionary<string, bool> {{"create_date", false}}},
|
||||
new TableInfo("forum_tag", "TenantID", "id"),
|
||||
new TableInfo("forum_thread", "TenantID", "id")
|
||||
{
|
||||
UserIDColumns = new[] {"recent_poster_id"},
|
||||
DateColumns = new Dictionary<string, bool> {{"recent_post_date", false}}
|
||||
},
|
||||
new TableInfo("forum_topic", "TenantID", "id")
|
||||
{
|
||||
UserIDColumns = new[] {"poster_id"},
|
||||
DateColumns = new Dictionary<string, bool> {{"create_date", false}, {"LastModified", false}}
|
||||
},
|
||||
new TableInfo("forum_topicwatch", "TenantID") {UserIDColumns = new[] {"UserID"}},
|
||||
new TableInfo("forum_topic_tag"),
|
||||
new TableInfo("forum_variant", idColumn: "id"),
|
||||
new TableInfo("wiki_categories", "Tenant"),
|
||||
new TableInfo("wiki_comments", "Tenant", "Id", IdType.Guid)
|
||||
{
|
||||
UserIDColumns = new[] {"UserId"},
|
||||
DateColumns = new Dictionary<string, bool> {{"Date", false}}
|
||||
},
|
||||
new TableInfo("wiki_files", "Tenant")
|
||||
{
|
||||
UserIDColumns = new[] {"UserID"},
|
||||
DateColumns = new Dictionary<string, bool> {{"Date", false}}
|
||||
},
|
||||
new TableInfo("wiki_pages", "tenant", "id", IdType.Autoincrement)
|
||||
{
|
||||
UserIDColumns = new[] {"modified_by"},
|
||||
DateColumns = new Dictionary<string, bool> {{"modified_on", false}}
|
||||
},
|
||||
new TableInfo("wiki_pages_history", "Tenant")
|
||||
{
|
||||
UserIDColumns = new[] {"create_by"},
|
||||
DateColumns = new Dictionary<string, bool> {{"create_on", false}}
|
||||
},
|
||||
};
|
||||
|
||||
private readonly RelationInfo[] _tableRelations = new[]
|
||||
{
|
||||
new RelationInfo("bookmarking_bookmark", "ID", "bookmarking_bookmarktag", "BookmarkID"),
|
||||
new RelationInfo("bookmarking_tag", "TagID", "bookmarking_bookmarktag", "TagID"),
|
||||
new RelationInfo("bookmarking_bookmark", "ID", "bookmarking_comment", "BookmarkID"),
|
||||
new RelationInfo("bookmarking_comment", "ID", "bookmarking_comment", "Parent"),
|
||||
new RelationInfo("bookmarking_bookmark", "ID", "bookmarking_userbookmark", "BookmarkID"),
|
||||
new RelationInfo("bookmarking_tag", "TagID", "bookmarking_userbookmarktag", "TagID"),
|
||||
new RelationInfo("bookmarking_userbookmark", "UserBookmarkID", "bookmarking_userbookmarktag", "UserBookmarkID"),
|
||||
new RelationInfo("blogs_comments", "id", "blogs_comments", "parent_id"),
|
||||
new RelationInfo("blogs_posts", "id", "blogs_comments", "post_id"),
|
||||
new RelationInfo("blogs_comments", "id", "blogs_posts", "LastCommentId", null, null, RelationImportance.Low),
|
||||
new RelationInfo("blogs_posts", "id", "blogs_reviewposts", "post_id"),
|
||||
new RelationInfo("blogs_posts", "id", "blogs_tags", "post_id"),
|
||||
new RelationInfo("events_feed", "Id", "events_comment", "Feed"),
|
||||
new RelationInfo("events_comment", "Id", "events_comment", "Parent"),
|
||||
new RelationInfo("events_feed", "Id", "events_poll", "Id"),
|
||||
new RelationInfo("events_pollvariant", "Id", "events_pollanswer", "Variant"),
|
||||
new RelationInfo("events_feed", "Id", "events_pollvariant", "Poll"),
|
||||
new RelationInfo("events_feed", "Id", "events_reader", "Feed"),
|
||||
new RelationInfo("forum_question", "id", "forum_answer", "question_id"),
|
||||
new RelationInfo("forum_answer", "id", "forum_answer_variant", "answer_id"),
|
||||
new RelationInfo("forum_variant", "id", "forum_answer_variant", "variant_id"),
|
||||
new RelationInfo("forum_post", "id", "forum_attachment", "post_id"),
|
||||
new RelationInfo("forum_category", "id", "forum_attachment", "path"),
|
||||
new RelationInfo("forum_thread", "id", "forum_attachment", "path"),
|
||||
new RelationInfo("forum_thread", "id", "forum_lastvisit", "thread_id"),
|
||||
new RelationInfo("forum_topic", "id", "forum_post", "topic_id"),
|
||||
new RelationInfo("forum_post", "id", "forum_post", "parent_post_id"),
|
||||
new RelationInfo("forum_topic", "id", "forum_question", "topic_id"),
|
||||
new RelationInfo("forum_category", "id", "forum_thread", "category_id"),
|
||||
new RelationInfo("forum_post", "id", "forum_thread", "recent_post_id", null, null, RelationImportance.Low),
|
||||
new RelationInfo("forum_topic", "id", "forum_thread", "recent_topic_id", null, null, RelationImportance.Low),
|
||||
new RelationInfo("forum_thread", "id", "forum_topic", "thread_id"),
|
||||
new RelationInfo("forum_question", "id", "forum_topic", "question_id", null, null, RelationImportance.Low),
|
||||
new RelationInfo("forum_post", "id", "forum_topic", "recent_post_id", null, null, RelationImportance.Low),
|
||||
new RelationInfo("forum_topic", "id", "forum_topicwatch", "TopicID"),
|
||||
new RelationInfo("forum_topic", "id", "forum_topic_tag", "topic_id"),
|
||||
new RelationInfo("forum_tag", "id", "forum_topic_tag", "tag_id"),
|
||||
new RelationInfo("forum_question", "id", "forum_variant", "question_id"),
|
||||
new RelationInfo("wiki_comments", "Id", "wiki_comments", "ParentId")
|
||||
};
|
||||
|
||||
public CommunityModuleSpecifics(Helpers helpers)
|
||||
: base(helpers) { }
|
||||
|
||||
public override bool TryAdjustFilePath(bool dump, ColumnMapper columnMapper, ref string filePath)
|
||||
{
|
||||
filePath = PreparePath(dump, columnMapper, "/", filePath);
|
||||
return filePath != null;
|
||||
}
|
||||
|
||||
protected override bool TryPrepareValue(bool dump, DbConnection connection, ColumnMapper columnMapper, TableInfo table, string columnName, IEnumerable<RelationInfo> relations, ref object value)
|
||||
{
|
||||
relations = relations.ToList();
|
||||
|
||||
if (relations.All(x => x.ChildTable == "forum_attachment" && x.ChildColumn == "path"))
|
||||
{
|
||||
value = PreparePath(dump, columnMapper, "\\", Convert.ToString(value));
|
||||
return value != null;
|
||||
}
|
||||
|
||||
return base.TryPrepareValue(dump, connection, columnMapper, table, columnName, relations, ref value);
|
||||
}
|
||||
|
||||
protected override bool TryPrepareValue(DbConnection connection, ColumnMapper columnMapper, TableInfo table, string columnName, ref object value)
|
||||
{
|
||||
var column = columnName.ToLowerInvariant();
|
||||
if (table.Name == "forum_post" && column == "text" ||
|
||||
table.Name == "events_feed" && column == "text" ||
|
||||
table.Name == "events_comment" && column == "comment" ||
|
||||
table.Name == "blogs_posts" && column == "content" ||
|
||||
table.Name == "blogs_comments" && column == "content" ||
|
||||
table.Name == "bookmarking_comment" && column == "content" ||
|
||||
table.Name == "wiki_comments" && column == "body")
|
||||
{
|
||||
value = FCKEditorPathUtility.CorrectStoragePath(value as string, columnMapper.GetTenantMapping());
|
||||
return true;
|
||||
}
|
||||
return base.TryPrepareValue(connection, columnMapper, table, columnName, ref value);
|
||||
}
|
||||
|
||||
protected override string GetSelectCommandConditionText(int tenantId, TableInfo table)
|
||||
{
|
||||
if (table.Name == "forum_answer_variant")
|
||||
{
|
||||
return "inner join forum_answer as t1 on t1.id = t.answer_id where t1.TenantID = " + tenantId;
|
||||
}
|
||||
|
||||
if (table.Name == "forum_variant")
|
||||
{
|
||||
return "inner join forum_question as t1 on t1.id = t.question_id where t1.TenantID = " + tenantId;
|
||||
}
|
||||
|
||||
if (table.Name == "forum_topic_tag")
|
||||
{
|
||||
return "inner join forum_topic as t1 on t1.id = t.topic_id where t1.TenantID = " + tenantId;
|
||||
}
|
||||
|
||||
return base.GetSelectCommandConditionText(tenantId, table);
|
||||
}
|
||||
|
||||
private static string PreparePath(bool dump, ColumnMapper columnMapper, string partsSeparator, string path)
|
||||
{
|
||||
var parts = path.Split(new[] { partsSeparator }, StringSplitOptions.None);
|
||||
|
||||
if (parts.Length != 4)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var categoryId = columnMapper.GetMapping("forum_category", "id", parts[0]);
|
||||
if (categoryId == null)
|
||||
{
|
||||
if (!dump)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
categoryId = parts[0];
|
||||
}
|
||||
|
||||
var threadId = columnMapper.GetMapping("forum_thread", "id", parts[1]);
|
||||
if (threadId == null)
|
||||
{
|
||||
if (!dump)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
threadId = parts[1];
|
||||
}
|
||||
|
||||
parts[0] = categoryId.ToString();
|
||||
parts[1] = threadId.ToString();
|
||||
|
||||
return string.Join(partsSeparator, parts);
|
||||
}
|
||||
}
|
@ -91,51 +91,6 @@ public class CoreModuleSpecifics : ModuleSpecificsBase
|
||||
new RelationInfo("core_group", "id", "core_usergroup", "groupid", typeof(TenantsModuleSpecifics),
|
||||
x => !helpers.IsEmptyOrSystemGroup(Convert.ToString(x["groupid"]))),
|
||||
|
||||
new RelationInfo("crm_contact", "id", "core_acl", "object", typeof(CrmModuleSpecifics),
|
||||
x => Convert.ToString(x["object"]).StartsWith(CrmCompanyAclObjectStart) || Convert.ToString(x["object"]).StartsWith(CrmPersonAclObjectStart)),
|
||||
|
||||
new RelationInfo("crm_deal", "id", "core_acl", "object", typeof(CrmModuleSpecifics),
|
||||
x => Convert.ToString(x["object"]).StartsWith(CrmDealAclObjectStart)),
|
||||
|
||||
new RelationInfo("crm_case", "id", "core_acl", "object", typeof(CrmModuleSpecifics),
|
||||
x => Convert.ToString(x["object"]).StartsWith(CrmCasesAclObjectStart)),
|
||||
|
||||
new RelationInfo("crm_relationship_event", "id", "core_acl", "object", typeof(CrmModuleSpecifics2),
|
||||
x => Convert.ToString(x["object"]).StartsWith(CrmRelationshipEventAclObjectStart)),
|
||||
|
||||
new RelationInfo("calendar_calendars", "id", "core_acl", "object", typeof(CalendarModuleSpecifics),
|
||||
x => Convert.ToString(x["object"]).StartsWith(CalendarCalendarAclObjectStart)),
|
||||
|
||||
new RelationInfo("calendar_events", "id", "core_acl", "object", typeof(CalendarModuleSpecifics),
|
||||
x => Convert.ToString(x["object"]).StartsWith(CalendarEventAclObjectStart)),
|
||||
|
||||
new RelationInfo("projects_projects", "id", "core_subscription", "object", typeof(ProjectsModuleSpecifics),
|
||||
x => ValidateSource(_projectsSourceID, x)),
|
||||
|
||||
new RelationInfo("projects_tasks", "id", "core_subscription", "object", typeof(ProjectsModuleSpecifics),
|
||||
x => ValidateSource(_projectsSourceID, x) && Convert.ToString(x["object"]).StartsWith("Task_")),
|
||||
|
||||
new RelationInfo("projects_messages", "id", "core_subscription", "object", typeof(ProjectsModuleSpecifics),
|
||||
x => ValidateSource(_projectsSourceID, x) && Convert.ToString(x["object"]).StartsWith("Message_")),
|
||||
|
||||
new RelationInfo("projects_milestones", "id", "core_subscription", "object", typeof(ProjectsModuleSpecifics),
|
||||
x => ValidateSource(_projectsSourceID, x) && Convert.ToString(x["object"]).StartsWith("Milestone_")),
|
||||
|
||||
new RelationInfo("bookmarking_bookmark", "ID", "core_subscription", "object", typeof(CommunityModuleSpecifics),
|
||||
x => ValidateSource(_bookmarksSourceID, x) && !string.IsNullOrEmpty(Convert.ToString(x["object"]))),
|
||||
|
||||
new RelationInfo("forum_topic", "id", "core_subscription", "object", typeof(CommunityModuleSpecifics),
|
||||
x => ValidateSource(_forumsSourceID, x) && Convert.ToString(x["action"]) == ForumsNewPostInTopicActionID && !string.IsNullOrEmpty(Convert.ToString(x["object"]))),
|
||||
|
||||
new RelationInfo("forum_thread", "id", "core_subscription", "object", typeof(CommunityModuleSpecifics),
|
||||
x => ValidateSource(_forumsSourceID, x) && Convert.ToString(x["action"]) == ForumsNewPostInThreadActionID && !string.IsNullOrEmpty(Convert.ToString(x["object"]))),
|
||||
|
||||
new RelationInfo("events_feed", "id", "core_subscription", "object", typeof(CommunityModuleSpecifics),
|
||||
x => ValidateSource(_newsSourceID, x) && Convert.ToString(x["action"]) == NewsNewCommentActionID && !string.IsNullOrEmpty(Convert.ToString(x["object"]))),
|
||||
|
||||
new RelationInfo("blogs_posts", "id", "core_subscription", "object", typeof(CommunityModuleSpecifics),
|
||||
x => ValidateSource(_blogsSourceID, x) && Convert.ToString(x["action"]) == BlogsNewCommentActionID),
|
||||
|
||||
new RelationInfo("core_user", "id", "feed_users", "user_id", typeof(CoreModuleSpecifics)),
|
||||
|
||||
new RelationInfo("files_folder", "id", "backup_backup", "storage_base_path", typeof(FilesModuleSpecifics),
|
||||
|
@ -1,356 +0,0 @@
|
||||
// (c) Copyright Ascensio System SIA 2010-2022
|
||||
//
|
||||
// This program is a free software product.
|
||||
// You can redistribute it and/or modify it under the terms
|
||||
// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
|
||||
// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
|
||||
// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
|
||||
// any third-party rights.
|
||||
//
|
||||
// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty
|
||||
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
|
||||
// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
|
||||
//
|
||||
// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
|
||||
//
|
||||
// The interactive user interfaces in modified source and object code versions of the Program must
|
||||
// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
|
||||
//
|
||||
// Pursuant to Section 7(b) of the License you must retain the original Product logo when
|
||||
// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
|
||||
// trademark law for use of our trademarks.
|
||||
//
|
||||
// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
|
||||
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
|
||||
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
|
||||
|
||||
namespace ASC.Data.Backup.Tasks.Modules;
|
||||
|
||||
public class CrmModuleSpecifics : ModuleSpecificsBase
|
||||
{
|
||||
public override ModuleName ModuleName => ModuleName.Crm;
|
||||
public override IEnumerable<TableInfo> Tables => _tables;
|
||||
public override IEnumerable<RelationInfo> TableRelations => _tableRelations;
|
||||
|
||||
private readonly TableInfo[] _tables = new[]
|
||||
{
|
||||
new TableInfo("crm_case", "tenant_id", "id")
|
||||
{
|
||||
UserIDColumns = new[] {"create_by", "last_modifed_by"},
|
||||
DateColumns = new Dictionary<string, bool> {{"create_on", false}, {"last_modifed_on", false}}
|
||||
},
|
||||
new TableInfo("crm_contact", "tenant_id", "id")
|
||||
{
|
||||
UserIDColumns = new[] {"create_by", "last_modifed_by"},
|
||||
DateColumns = new Dictionary<string, bool> {{"create_on", false}, {"last_modifed_on", false}}
|
||||
},
|
||||
new TableInfo("crm_contact_info", "tenant_id", "id")
|
||||
{
|
||||
UserIDColumns = new[] {"last_modifed_by"},
|
||||
DateColumns = new Dictionary<string, bool> {{"last_modifed_on", false}}
|
||||
},
|
||||
new TableInfo("crm_deal", "tenant_id", "id")
|
||||
{
|
||||
UserIDColumns = new[] {"create_by", "last_modifed_by", "responsible_id"},
|
||||
DateColumns = new Dictionary<string, bool> {{"create_on", false}, {"last_modifed_on", false}, {"expected_close_date", true}, {"actual_close_date", true}}
|
||||
},
|
||||
new TableInfo("crm_deal_milestone", "tenant_id", "id"),
|
||||
new TableInfo("crm_field_description", "tenant_id", "id"),
|
||||
new TableInfo("crm_list_item", "tenant_id", "id"),
|
||||
new TableInfo("crm_projects", "tenant_id"),
|
||||
new TableInfo("crm_tag", "tenant_id", "id"),
|
||||
new TableInfo("crm_task", "tenant_id", "id")
|
||||
{
|
||||
UserIDColumns = new[] {"create_by", "last_modifed_by", "responsible_id"},
|
||||
DateColumns = new Dictionary<string, bool> {{"create_on", false}, {"last_modifed_on", false}, {"deadline", true}}
|
||||
},
|
||||
new TableInfo("crm_task_template", "tenant_id", "id")
|
||||
{
|
||||
UserIDColumns = new[] {"create_by", "last_modifed_by", "responsible_id"},
|
||||
DateColumns = new Dictionary<string, bool> {{"create_on", false}, {"last_modifed_on", false}}
|
||||
},
|
||||
new TableInfo("crm_task_template_container", "tenant_id", "id")
|
||||
{
|
||||
UserIDColumns = new[] {"create_by", "last_modifed_by"},
|
||||
DateColumns = new Dictionary<string, bool> {{"create_on", false}, {"last_modifed_on", false}}
|
||||
},
|
||||
new TableInfo("crm_task_template_task", "tenant_id"),
|
||||
new TableInfo("crm_currency_rate", "tenant_id", "id")
|
||||
{
|
||||
UserIDColumns = new[] {"create_by", "last_modified_by"},
|
||||
DateColumns = new Dictionary<string, bool> {{"create_on", false}, {"last_modified_on", false}}
|
||||
}
|
||||
};
|
||||
|
||||
private readonly RelationInfo[] _tableRelations = new[]
|
||||
{
|
||||
new RelationInfo("crm_contact", "id", "crm_contact", "company_id"),
|
||||
new RelationInfo("crm_list_item", "id", "crm_contact", "status_id"),
|
||||
new RelationInfo("crm_list_item", "id", "crm_contact", "contact_type_id"),
|
||||
new RelationInfo("crm_contact", "id", "crm_contact_info", "contact_id"),
|
||||
new RelationInfo("crm_deal_milestone", "id", "crm_deal", "deal_milestone_id"),
|
||||
new RelationInfo("crm_contact", "id", "crm_deal", "contact_id"),
|
||||
new RelationInfo("projects_projects", "id", "crm_projects", "project_id", typeof(ProjectsModuleSpecifics)),
|
||||
new RelationInfo("crm_contact", "id", "crm_projects", "contact_id"),
|
||||
new RelationInfo("crm_contact", "id", "crm_task", "entity_id", x => ResolveRelation(x, 0, 4, 5)),
|
||||
new RelationInfo("crm_deal", "id", "crm_task", "entity_id", x => ResolveRelation(x, 1)),
|
||||
new RelationInfo("crm_task", "id", "crm_task", "entity_id", x => ResolveRelation(x, 3)),
|
||||
new RelationInfo("crm_case", "id", "crm_task", "entity_id", x => ResolveRelation(x, 7)),
|
||||
new RelationInfo("crm_contact", "id", "crm_task", "contact_id"),
|
||||
new RelationInfo("crm_list_item", "id", "crm_task", "category_id"),
|
||||
new RelationInfo("crm_list_item", "id", "crm_task_template", "category_id"),
|
||||
new RelationInfo("crm_task_template_container", "id", "crm_task_template", "container_id"),
|
||||
new RelationInfo("crm_task", "id", "crm_task_template_task", "task_id"),
|
||||
new RelationInfo("crm_task_template", "id", "crm_task_template_task", "task_template_id")
|
||||
};
|
||||
|
||||
public CrmModuleSpecifics(Helpers helpers)
|
||||
: base(helpers) { }
|
||||
|
||||
public override bool TryAdjustFilePath(bool dump, ColumnMapper columnMapper, ref string filePath)
|
||||
{
|
||||
var pathMatch = Regex.Match(filePath, @"^photos/\d+/\d+/\d+/contact_(?'contactId'\d+)(?'sizeExtension'_\d+_\d+\.\w+)$", RegexOptions.Compiled);
|
||||
if (pathMatch.Success)
|
||||
{
|
||||
var contactId = columnMapper.GetMapping("crm_contact", "id", pathMatch.Groups["contactId"].Value);
|
||||
if (contactId == null)
|
||||
{
|
||||
if (!dump)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
contactId = pathMatch.Groups["contactId"].Value;
|
||||
}
|
||||
|
||||
var s = contactId.ToString().PadLeft(6, '0');
|
||||
filePath = string.Format("photos/{0}/{1}/{2}/contact_{3}{4}", s.Substring(0, 2), s.Substring(2, 2), s.Substring(4), contactId, pathMatch.Groups["sizeExtension"].Value);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private static bool ResolveRelation(DataRowInfo row, params int[] matchingTypes)
|
||||
{
|
||||
var entityType = Convert.ToInt32(row["entity_type"]);
|
||||
|
||||
return matchingTypes.Contains(entityType);
|
||||
}
|
||||
}
|
||||
|
||||
//todo: hack: in future there be no modules only tables!!!
|
||||
public class CrmModuleSpecifics2 : ModuleSpecificsBase
|
||||
{
|
||||
public override string ConnectionStringName => "crm";
|
||||
public override ModuleName ModuleName => ModuleName.Crm2;
|
||||
public override IEnumerable<TableInfo> Tables => _tables;
|
||||
public override IEnumerable<RelationInfo> TableRelations => _tableRelations;
|
||||
|
||||
private readonly TableInfo[] _tables = new[]
|
||||
{
|
||||
new TableInfo("crm_field_value", "tenant_id", "id", IdType.Autoincrement) {UserIDColumns = new[] {"last_modifed_by"}},
|
||||
new TableInfo("crm_entity_contact"),
|
||||
new TableInfo("crm_entity_tag"),
|
||||
new TableInfo("crm_relationship_event", "tenant_id", "id") {UserIDColumns = new[] {"create_by", "last_modifed_by"}},
|
||||
};
|
||||
|
||||
private readonly RelationInfo[] _tableRelations = new[]
|
||||
{
|
||||
new RelationInfo("crm_contact", "id", "crm_field_value", "entity_id", x => ResolveRelation(x, 0, 4, 5)),
|
||||
new RelationInfo("crm_deal", "id", "crm_field_value", "entity_id", x => ResolveRelation(x, 1)),
|
||||
new RelationInfo("crm_task", "id", "crm_field_value", "entity_id", x => ResolveRelation(x, 3)),
|
||||
new RelationInfo("crm_case", "id", "crm_field_value", "entity_id", x => ResolveRelation(x, 7)),
|
||||
new RelationInfo("crm_field_description", "id", "crm_field_value", "field_id"),
|
||||
new RelationInfo("crm_contact", "id", "crm_entity_contact", "entity_id", x => ResolveRelation(x, 0, 4, 5)),
|
||||
new RelationInfo("crm_deal", "id", "crm_entity_contact", "entity_id", x => ResolveRelation(x, 1)),
|
||||
new RelationInfo("crm_task", "id", "crm_entity_contact", "entity_id", x => ResolveRelation(x, 3)),
|
||||
new RelationInfo("crm_case", "id", "crm_entity_contact", "entity_id", x => ResolveRelation(x, 7)),
|
||||
new RelationInfo("crm_contact", "id", "crm_entity_contact", "contact_id"),
|
||||
new RelationInfo("crm_contact", "id", "crm_entity_tag", "entity_id", x => ResolveRelation(x, 0, 4, 5)),
|
||||
new RelationInfo("crm_deal", "id", "crm_entity_tag", "entity_id", x => ResolveRelation(x, 1)),
|
||||
new RelationInfo("crm_task", "id", "crm_entity_tag", "entity_id", x => ResolveRelation(x, 3)),
|
||||
new RelationInfo("crm_case", "id", "crm_entity_tag", "entity_id", x => ResolveRelation(x, 7)),
|
||||
new RelationInfo("crm_tag", "id", "crm_entity_tag", "tag_id"),
|
||||
new RelationInfo("crm_contact", "id", "crm_relationship_event", "entity_id", typeof(CrmModuleSpecifics), x => ResolveRelation(x, 0, 4, 5)),
|
||||
new RelationInfo("crm_deal", "id", "crm_relationship_event", "entity_id", typeof(CrmModuleSpecifics), x => ResolveRelation(x, 1)),
|
||||
new RelationInfo("crm_relationship_event", "id", "crm_relationship_event", "entity_id", typeof(CrmModuleSpecifics), x => ResolveRelation(x, 2)),
|
||||
new RelationInfo("crm_task", "id", "crm_relationship_event", "entity_id", typeof(CrmModuleSpecifics), x => ResolveRelation(x, 3)),
|
||||
new RelationInfo("crm_case", "id", "crm_relationship_event", "entity_id", typeof(CrmModuleSpecifics), x => ResolveRelation(x, 7)),
|
||||
new RelationInfo("crm_contact", "id", "crm_relationship_event", "contact_id", typeof(CrmModuleSpecifics)),
|
||||
new RelationInfo("crm_list_item", "id", "crm_relationship_event", "category_id", typeof(CrmModuleSpecifics)),
|
||||
new RelationInfo("crm_relationship_event", "id", "crm_field_value", "entity_id", typeof(CrmModuleSpecifics), x => ResolveRelation(x, 2)),
|
||||
new RelationInfo("crm_relationship_event", "id", "crm_entity_tag", "entity_id", typeof(CrmModuleSpecifics), x => ResolveRelation(x, 2)),
|
||||
new RelationInfo("crm_relationship_event", "id", "crm_entity_contact", "entity_id", typeof(CrmModuleSpecifics), x => ResolveRelation(x, 2)),
|
||||
new RelationInfo("mail_mail", "id", "crm_relationship_event", "content", typeof(MailModuleSpecifics), x => Convert.ToInt32(x["category_id"]) == -3),
|
||||
};
|
||||
|
||||
public CrmModuleSpecifics2(Helpers helpers) : base(helpers) { }
|
||||
|
||||
public override bool TryAdjustFilePath(bool dump, ColumnMapper columnMapper, ref string filePath)
|
||||
{
|
||||
var match = Regex.Match(filePath, @"(?<=folder_\d+/message_)\d+(?=\.html)"); //todo:
|
||||
if (match.Success)
|
||||
{
|
||||
var mappedMessageId = Convert.ToString(columnMapper.GetMapping("mail_mail", "id", match.Value));
|
||||
|
||||
if (dump && string.IsNullOrEmpty(mappedMessageId))
|
||||
{
|
||||
mappedMessageId = match.Value;
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(mappedMessageId))
|
||||
{
|
||||
filePath = string.Format("folder_{0}/message_{1}.html", (Convert.ToInt32(mappedMessageId) / 1000 + 1) * 1000, mappedMessageId);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return base.TryAdjustFilePath(dump, columnMapper, ref filePath);
|
||||
}
|
||||
|
||||
protected override string GetSelectCommandConditionText(int tenantId, TableInfo table)
|
||||
{
|
||||
if (table.Name == "crm_entity_contact")
|
||||
{
|
||||
return "inner join crm_contact as t1 on t1.id = t.contact_id where t1.tenant_id = " + tenantId;
|
||||
}
|
||||
|
||||
if (table.Name == "crm_entity_tag")
|
||||
{
|
||||
return "inner join crm_tag as t1 on t1.id = t.tag_id where t1.tenant_id = " + tenantId;
|
||||
}
|
||||
|
||||
return base.GetSelectCommandConditionText(tenantId, table);
|
||||
}
|
||||
|
||||
protected override bool TryPrepareValue(DbConnection connection, ColumnMapper columnMapper, RelationInfo relation, ref object value)
|
||||
{
|
||||
if (relation.ChildTable == "crm_relationship_event" && relation.ChildColumn == "content")
|
||||
{
|
||||
value = Regex.Replace(
|
||||
Convert.ToString(value),
|
||||
@"(?<=""message_id"":|/Products/CRM/HttpHandlers/filehandler\.ashx\?action=mailmessage&message_id=)\d+",
|
||||
match =>
|
||||
{
|
||||
var mappedMessageId = Convert.ToString(columnMapper.GetMapping(relation.ParentTable, relation.ParentColumn, match.Value));
|
||||
var success = !string.IsNullOrEmpty(mappedMessageId);
|
||||
return success ? mappedMessageId : match.Value;
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
return base.TryPrepareValue(connection, columnMapper, relation, ref value);
|
||||
}
|
||||
|
||||
private static bool ResolveRelation(DataRowInfo row, params int[] matchingTypes)
|
||||
{
|
||||
var entityType = Convert.ToInt32(row["entity_type"]);
|
||||
return matchingTypes.Contains(entityType);
|
||||
}
|
||||
}
|
||||
|
||||
public class CrmInvoiceModuleSpecifics : ModuleSpecificsBase
|
||||
{
|
||||
public override ModuleName ModuleName => ModuleName.CrmInvoice;
|
||||
public override string ConnectionStringName => "crm";
|
||||
public override IEnumerable<TableInfo> Tables
|
||||
{
|
||||
get
|
||||
{
|
||||
return new List<TableInfo>
|
||||
{
|
||||
new TableInfo("crm_organisation_logo", "tenant_id", "id")
|
||||
{
|
||||
UserIDColumns = new[] {"create_by"},
|
||||
DateColumns = new Dictionary<string, bool> {{"create_on", false}}
|
||||
},
|
||||
new TableInfo("crm_invoice", "tenant_id", "id")
|
||||
{
|
||||
UserIDColumns = new[] {"create_by", "last_modified_by"},
|
||||
DateColumns = new Dictionary<string, bool> {{"create_on", false}, {"last_modified_on", false}, {"due_date", false}, {"issue_date", false}}
|
||||
},
|
||||
new TableInfo("crm_invoice_item", "tenant_id", "id")
|
||||
{
|
||||
UserIDColumns = new[] {"create_by", "last_modified_by"},
|
||||
DateColumns = new Dictionary<string, bool> {{"create_on", false}, {"last_modified_on", false}}
|
||||
},
|
||||
new TableInfo("crm_invoice_line", "tenant_id", "id"),
|
||||
new TableInfo("crm_invoice_tax", "tenant_id", "id")
|
||||
{
|
||||
UserIDColumns = new[] {"create_by", "last_modified_by"},
|
||||
DateColumns = new Dictionary<string, bool> {{"create_on", false}, {"last_modified_on", false}}
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
public override IEnumerable<RelationInfo> TableRelations
|
||||
{
|
||||
get
|
||||
{
|
||||
return new List<RelationInfo>
|
||||
{
|
||||
new RelationInfo("crm_contact", "id", "crm_invoice", "contact_id"),
|
||||
new RelationInfo("crm_contact", "id", "crm_invoice", "consignee_id"),
|
||||
new RelationInfo("crm_contact", "id", "crm_invoice", "entity_id", x => ResolveRelation(x, 0, 4, 5)),
|
||||
new RelationInfo("crm_deal", "id", "crm_invoice", "entity_id", x => ResolveRelation(x, 1)),
|
||||
new RelationInfo("crm_task", "id", "crm_invoice", "entity_id", x => ResolveRelation(x, 3)),
|
||||
new RelationInfo("crm_case", "id", "crm_invoice", "entity_id", x => ResolveRelation(x, 7)),
|
||||
new RelationInfo("files_file", "id", "crm_invoice", "file_id", typeof(FilesModuleSpecifics)),
|
||||
new RelationInfo("crm_invoice_tax", "id", "crm_invoice_item", "invoice_tax1_id"),
|
||||
new RelationInfo("crm_invoice_tax", "id", "crm_invoice_item", "invoice_tax2_id"),
|
||||
new RelationInfo("crm_invoice_tax", "id", "crm_invoice_line", "invoice_tax1_id"),
|
||||
new RelationInfo("crm_invoice_tax", "id", "crm_invoice_line", "invoice_tax2_id"),
|
||||
new RelationInfo("crm_invoice", "id", "crm_invoice_line", "invoice_id"),
|
||||
new RelationInfo("crm_invoice_item", "id", "crm_invoice_line", "invoice_item_id"),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
public CrmInvoiceModuleSpecifics(Helpers helpers) : base(helpers) { }
|
||||
|
||||
protected override bool TryPrepareValue(DbConnection connection, ColumnMapper columnMapper, TableInfo table, string columnName, ref object value)
|
||||
{
|
||||
if (value == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (table.Name == "crm_invoice" && columnName == "json_data")
|
||||
{
|
||||
var data = JObject.Parse((string)value);
|
||||
|
||||
var oldValue = Convert.ToInt32(data["LogoBase64Id"]);
|
||||
if (oldValue != 0)
|
||||
{
|
||||
data["LogoBase64Id"] = Convert.ToInt32(columnMapper.GetMapping("crm_organisation_logo", "id", oldValue));
|
||||
}
|
||||
|
||||
oldValue = Convert.ToInt32(data["DeliveryAddressID"]);
|
||||
if (oldValue != 0)
|
||||
{
|
||||
data["DeliveryAddressID"] = Convert.ToInt32(columnMapper.GetMapping("crm_contact_info", "id", oldValue));
|
||||
}
|
||||
|
||||
oldValue = Convert.ToInt32(data["BillingAddressID"]);
|
||||
if (oldValue != 0)
|
||||
{
|
||||
data["BillingAddressID"] = Convert.ToInt32(columnMapper.GetMapping("crm_contact_info", "id", oldValue));
|
||||
}
|
||||
|
||||
value = data.ToString();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return base.TryPrepareValue(connection, columnMapper, table, columnName, ref value);
|
||||
}
|
||||
|
||||
private static bool ResolveRelation(DataRowInfo row, params int[] matchingTypes)
|
||||
{
|
||||
var entityType = Convert.ToInt32(row["entity_type"]);
|
||||
|
||||
return matchingTypes.Contains(entityType);
|
||||
}
|
||||
}
|
@ -74,11 +74,6 @@ public class FilesModuleSpecifics : ModuleSpecificsBase
|
||||
}),
|
||||
new RelationInfo("core_user", "id", "files_security", "subject", typeof(TenantsModuleSpecifics)),
|
||||
new RelationInfo("core_group", "id", "files_security", "subject", typeof(TenantsModuleSpecifics)),
|
||||
new RelationInfo("crm_deal", "id", "files_bunch_objects", "right_node", typeof(CrmModuleSpecifics),
|
||||
x => Convert.ToString(x["right_node"]).StartsWith(_bunchRightNodeStartCrmOpportunity)),
|
||||
|
||||
new RelationInfo("projects_projects", "id", "files_bunch_objects", "right_node", typeof(ProjectsModuleSpecifics),
|
||||
x => Convert.ToString(x["right_node"]).StartsWith(_bunchRightNodeStartProject, StringComparison.InvariantCultureIgnoreCase)),
|
||||
|
||||
new RelationInfo("files_folder", "id", "files_bunch_objects", "left_node"),
|
||||
new RelationInfo("files_folder", "id", "files_file", "folder_id"),
|
||||
@ -318,18 +313,6 @@ public class FilesModuleSpecifics2 : ModuleSpecificsBase
|
||||
|
||||
private readonly RelationInfo[] _rels = new[]
|
||||
{
|
||||
new RelationInfo("projects_messages", "id", "files_tag", "name", typeof(ProjectsModuleSpecifics),
|
||||
x => Convert.ToString(x["name"]).StartsWith(_tagStartMessage, StringComparison.InvariantCultureIgnoreCase)),
|
||||
|
||||
new RelationInfo("projects_tasks", "id", "files_tag", "name", typeof(ProjectsModuleSpecifics),
|
||||
x => Convert.ToString(x["name"]).StartsWith(_tagStartTask, StringComparison.InvariantCultureIgnoreCase)),
|
||||
|
||||
new RelationInfo("projects_projects", "id", "files_tag", "name", typeof(ProjectsModuleSpecifics),
|
||||
x => Convert.ToString(x["name"]).StartsWith(_tagStartProject, StringComparison.InvariantCultureIgnoreCase)),
|
||||
|
||||
new RelationInfo("crm_relationship_event", "id", "files_tag", "name", typeof(CrmModuleSpecifics2),
|
||||
x => Convert.ToString(x["name"]).StartsWith(_tagStartRelationshipEvent, StringComparison.InvariantCultureIgnoreCase)),
|
||||
|
||||
new RelationInfo("files_tag", "id", "files_tag_link", "tag_id", typeof(FilesModuleSpecifics)),
|
||||
|
||||
new RelationInfo("files_file", "id", "files_tag_link", "entry_id", typeof(FilesModuleSpecifics),
|
||||
|
@ -29,16 +29,9 @@ namespace ASC.Data.Backup.Tasks.Modules;
|
||||
public enum ModuleName
|
||||
{
|
||||
Audit,
|
||||
Calendar,
|
||||
Community,
|
||||
Core,
|
||||
Crm,
|
||||
Crm2,
|
||||
CrmInvoice,
|
||||
Files,
|
||||
Files2,
|
||||
Mail,
|
||||
Projects,
|
||||
Tenants,
|
||||
WebStudio
|
||||
}
|
||||
|
@ -1,304 +0,0 @@
|
||||
// (c) Copyright Ascensio System SIA 2010-2022
|
||||
//
|
||||
// This program is a free software product.
|
||||
// You can redistribute it and/or modify it under the terms
|
||||
// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
|
||||
// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
|
||||
// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
|
||||
// any third-party rights.
|
||||
//
|
||||
// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty
|
||||
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
|
||||
// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
|
||||
//
|
||||
// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
|
||||
//
|
||||
// The interactive user interfaces in modified source and object code versions of the Program must
|
||||
// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
|
||||
//
|
||||
// Pursuant to Section 7(b) of the License you must retain the original Product logo when
|
||||
// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
|
||||
// trademark law for use of our trademarks.
|
||||
//
|
||||
// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
|
||||
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
|
||||
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
|
||||
|
||||
namespace ASC.Data.Backup.Tasks.Modules;
|
||||
|
||||
internal class MailModuleSpecifics : ModuleSpecificsBase
|
||||
{
|
||||
public override ModuleName ModuleName => ModuleName.Mail;
|
||||
public override IEnumerable<TableInfo> Tables => _tables;
|
||||
public override IEnumerable<RelationInfo> TableRelations => _tableRelations;
|
||||
|
||||
private readonly ILogger<ModuleProvider> _logger;
|
||||
private readonly Helpers _helpers;
|
||||
|
||||
private readonly TableInfo[] _tables = new[]
|
||||
{
|
||||
new TableInfo("mail_attachment", "tenant", "id"),
|
||||
new TableInfo("mail_chain", "tenant") {UserIDColumns = new[] {"id_user"}},
|
||||
new TableInfo("mail_contacts", "tenant", "id") {UserIDColumns = new[] {"id_user"}},
|
||||
new TableInfo("mail_folder_counters", "tenant") {UserIDColumns = new[] {"id_user"}},
|
||||
new TableInfo("mail_mail", "tenant", "id")
|
||||
{
|
||||
UserIDColumns = new[] {"id_user"},
|
||||
DateColumns = new Dictionary<string, bool> {{"date_received", false}, {"date_sent", false}, {"chain_date", false}}
|
||||
},
|
||||
new TableInfo("mail_mailbox", "tenant", "id")
|
||||
{
|
||||
UserIDColumns = new[] {"id_user"},
|
||||
DateColumns = new Dictionary<string, bool> {{"begin_date", false}}
|
||||
},
|
||||
new TableInfo("mail_tag", "tenant", "id") {UserIDColumns = new[] {"id_user"}},
|
||||
new TableInfo("mail_tag_addresses", "tenant"),
|
||||
new TableInfo("mail_tag_mail", "tenant") {UserIDColumns = new[] {"id_user"}},
|
||||
new TableInfo("mail_chain_x_crm_entity", "id_tenant"),
|
||||
new TableInfo("mail_mailbox_signature", "tenant"),
|
||||
new TableInfo("mail_mailbox_autoreply", "tenant"),
|
||||
new TableInfo("mail_mailbox_autoreply_history", "tenant"),
|
||||
new TableInfo("mail_contact_info", "tenant", "id") {UserIDColumns = new[] {"id_user"}},
|
||||
new TableInfo("mail_mailbox_provider", idColumn: "id"),
|
||||
new TableInfo("mail_mailbox_domain", idColumn: "id"),
|
||||
new TableInfo("mail_mailbox_server", idColumn: "id")
|
||||
};
|
||||
|
||||
private readonly RelationInfo[] _tableRelations = new[]
|
||||
{
|
||||
new RelationInfo("mail_mail", "id", "mail_attachment", "id_mail"),
|
||||
new RelationInfo("mail_mailbox", "id", "mail_chain", "id_mailbox"),
|
||||
new RelationInfo("mail_tag", "id", "mail_chain", "tags"),
|
||||
new RelationInfo("crm_tag", "id", "mail_chain", "tags", typeof(CrmModuleSpecifics)),
|
||||
new RelationInfo("mail_mailbox", "id", "mail_mail", "id_mailbox"),
|
||||
new RelationInfo("crm_tag", "id", "mail_tag", "crm_id", typeof(CrmModuleSpecifics)),
|
||||
new RelationInfo("mail_tag", "id", "mail_tag_addresses", "id_tag", x => Convert.ToInt32(x["id_tag"]) > 0),
|
||||
new RelationInfo("crm_tag", "id", "mail_tag_addresses", "id_tag", typeof(CrmModuleSpecifics), x => Convert.ToInt32(x["id_tag"]) < 0),
|
||||
new RelationInfo("mail_mail", "id", "mail_tag_mail", "id_mail"),
|
||||
new RelationInfo("mail_tag", "id", "mail_tag_mail", "id_tag", x => Convert.ToInt32(x["id_tag"]) > 0),
|
||||
new RelationInfo("crm_tag", "id", "mail_tag_mail", "id_tag", typeof(CrmModuleSpecifics), x => Convert.ToInt32(x["id_tag"]) < 0),
|
||||
new RelationInfo("mail_mailbox", "id", "mail_chain_x_crm_entity", "id_mailbox"),
|
||||
new RelationInfo("crm_contact", "id", "mail_chain_x_crm_entity", "entity_id", typeof(CrmModuleSpecifics), x => Convert.ToInt32(x["entity_type"]) == 1),
|
||||
new RelationInfo("crm_case", "id", "mail_chain_x_crm_entity", "entity_id", typeof(CrmModuleSpecifics), x => Convert.ToInt32(x["entity_type"]) == 2),
|
||||
new RelationInfo("crm_deal", "id", "mail_chain_x_crm_entity", "entity_id", typeof(CrmModuleSpecifics), x => Convert.ToInt32(x["entity_type"]) == 3),
|
||||
new RelationInfo("mail_mailbox", "id", "mail_mailbox_signature", "id_mailbox"),
|
||||
new RelationInfo("files_folder", "id", "mail_mailbox", "email_in_folder", typeof(FilesModuleSpecifics)),
|
||||
new RelationInfo("mail_mailbox", "id", "mail_mailbox_autoreply", "id_mailbox"),
|
||||
new RelationInfo("mail_mailbox", "id", "mail_mailbox_autoreply_history", "id_mailbox"),
|
||||
new RelationInfo("mail_contacts", "id", "mail_contact_info", "id_contact"),
|
||||
new RelationInfo("mail_mailbox_provider", "id", "mail_mailbox_domain", "id_provider"),
|
||||
new RelationInfo("mail_mailbox_server", "id", "mail_mailbox", "id_smtp_server"),
|
||||
new RelationInfo("mail_mailbox_server", "id", "mail_mailbox", "id_in_server")
|
||||
};
|
||||
|
||||
public MailModuleSpecifics(ILogger<ModuleProvider> logger, Helpers helpers) : base(helpers)
|
||||
{
|
||||
_logger = logger;
|
||||
_helpers = helpers;
|
||||
}
|
||||
|
||||
public override bool TryAdjustFilePath(bool dump, ColumnMapper columnMapper, ref string filePath)
|
||||
{
|
||||
//todo: hack: will be changed later
|
||||
filePath = Regex.Replace(filePath, @"^[-\w]+(?=/)", match => dump ? match.Value : columnMapper.GetUserMapping(match.Value));
|
||||
return !filePath.StartsWith("/");
|
||||
}
|
||||
|
||||
public override void PrepareData(DataTable data)
|
||||
{
|
||||
if (data.TableName == "mail_mailbox")
|
||||
{
|
||||
var address = data.Columns.Cast<DataColumn>().Single(c => c.ColumnName == "address");
|
||||
var smtp = data.Columns.Cast<DataColumn>().Single(c => c.ColumnName == "smtp_password");
|
||||
var pop3 = data.Columns.Cast<DataColumn>().Single(c => c.ColumnName == "pop3_password");
|
||||
var token = data.Columns.Cast<DataColumn>().Single(c => c.ColumnName == "token");
|
||||
for (var i = 0; i < data.Rows.Count; i++)
|
||||
{
|
||||
var row = data.Rows[i];
|
||||
try
|
||||
{
|
||||
row[smtp] = _helpers.CreateHash2(row[smtp] as string);
|
||||
row[pop3] = _helpers.CreateHash2(row[pop3] as string);
|
||||
row[token] = _helpers.CreateHash2(row[token] as string);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.ErrorCanNotPrepareData(row[address] as string, ex);
|
||||
data.Rows.Remove(row);
|
||||
i--;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override Stream PrepareData(string key, Stream stream, ColumnMapper columnMapper)
|
||||
{
|
||||
if (!key.EndsWith("body.html"))
|
||||
{
|
||||
return stream;
|
||||
}
|
||||
|
||||
using (var streamReader = new StreamReader(stream, Encoding.UTF8, true, 1024, true))
|
||||
{
|
||||
var data = streamReader.ReadToEnd();
|
||||
data = Regex.Replace(data, @"(htmleditorfiles|aggregator)(\/0\/|\/[\d]+\/\d\d\/\d\d\/)([-\w]+(?=/))",
|
||||
match => "/" + TenantPath.CreatePath(columnMapper.GetTenantMapping().ToString()) + "/" + columnMapper.GetUserMapping(match.Groups[3].Value));
|
||||
|
||||
var content = Encoding.UTF8.GetBytes(data);
|
||||
|
||||
stream.Position = 0;
|
||||
stream.Write(content, 0, content.Length);
|
||||
}
|
||||
|
||||
return stream;
|
||||
}
|
||||
|
||||
protected override string GetSelectCommandConditionText(int tenantId, TableInfo table)
|
||||
{
|
||||
//optimization: 1) do not include "deleted" rows, 2) backup mail only for the last 30 days
|
||||
switch (table.Name)
|
||||
{
|
||||
case "mail_mailbox_provider":
|
||||
return string.Format("where t.id in " +
|
||||
"(select distinct t2.id_provider from mail_mailbox t1 " +
|
||||
"inner join mail_mailbox_server t2 on t2.id in (t1.id_in_server, t1.id_smtp_server) and t2.is_user_data = 1 " +
|
||||
"where t1.tenant = {0} and t1.is_removed = 0)", tenantId);
|
||||
|
||||
// mail_mailbox_domain.id_provider not in index
|
||||
case "mail_mailbox_domain":
|
||||
return string.Format("where t.id_provider in " +
|
||||
"(select distinct t2.id_provider from mail_mailbox t1 " +
|
||||
"inner join mail_mailbox_server t2 on t2.id in (t1.id_in_server, t1.id_smtp_server) and t2.is_user_data = 1 " +
|
||||
"where t1.tenant = {0} and t1.is_removed = 0)", tenantId);
|
||||
|
||||
case "mail_mailbox_server":
|
||||
return string.Format("where t.id in " +
|
||||
"(select distinct t2.id from mail_mailbox t1 " +
|
||||
"inner join mail_mailbox_server t2 on t2.id in (t1.id_in_server, t1.id_smtp_server) and t2.is_user_data = 1 " +
|
||||
"where t1.tenant = {0} and t1.is_removed = 0)", tenantId);
|
||||
|
||||
case "mail_mailbox":
|
||||
return string.Format("where t.is_removed = 0 and t.tenant = {0}", tenantId);
|
||||
|
||||
//condition on chain_date because of Bug 18855 - transfer mail only for the last 30 days
|
||||
case "mail_mail":
|
||||
return string.Format("inner join mail_mailbox t1 on t1.id = t.id_mailbox " +
|
||||
"where t.tenant = {0} and t1.tenant = {0} and t.is_removed = 0 and t1.is_removed = 0 and t.chain_date > '{1}'",
|
||||
tenantId,
|
||||
DateTime.UtcNow.Subtract(TimeSpan.FromDays(30)).ToString("yyyy-MM-dd HH:mm:ss"));
|
||||
|
||||
case "mail_attachment":
|
||||
case "mail_tag_mail":
|
||||
return string.Format("inner join mail_mail as t1 on t1.id = t.id_mail " +
|
||||
"inner join mail_mailbox as t2 on t2.id = t1.id_mailbox " +
|
||||
"where t1.tenant = {0} and t2.tenant = {0} and t1.is_removed = 0 and t2.is_removed = 0 and t1.chain_date > '{1}'",
|
||||
tenantId,
|
||||
DateTime.UtcNow.Subtract(TimeSpan.FromDays(30)).ToString("yyyy-MM-dd HH:mm:ss"));
|
||||
|
||||
case "mail_chain":
|
||||
return string.Format("inner join mail_mailbox t1 on t1.id = t.id_mailbox " +
|
||||
"where t.tenant = {0} and t1.is_removed = 0",
|
||||
tenantId);
|
||||
|
||||
default:
|
||||
return base.GetSelectCommandConditionText(tenantId, table);
|
||||
}
|
||||
}
|
||||
|
||||
protected override string GetDeleteCommandConditionText(int tenantId, TableInfo table)
|
||||
{
|
||||
//delete all rows regardless of whether there is is_removed = 1 or not
|
||||
return base.GetSelectCommandConditionText(tenantId, table);
|
||||
}
|
||||
|
||||
protected override bool TryPrepareRow(bool dump, DbConnection connection, ColumnMapper columnMapper, TableInfo table, DataRowInfo row, out Dictionary<string, object> preparedRow)
|
||||
{
|
||||
if (table.Name == "mail_mailbox")
|
||||
{
|
||||
var boxType = row["is_server_mailbox"];
|
||||
if (boxType != null && Convert.ToBoolean(int.Parse(boxType.ToString())))
|
||||
{
|
||||
preparedRow = null;
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return base.TryPrepareRow(dump, connection, columnMapper, table, row, out preparedRow);
|
||||
}
|
||||
|
||||
protected override bool TryPrepareValue(bool dump, DbConnection connection, ColumnMapper columnMapper, TableInfo table, string columnName, IEnumerable<RelationInfo> relations, ref object value)
|
||||
{
|
||||
relations = relations.ToList();
|
||||
if (relations.All(x => x.ChildTable == "mail_chain" && x.ChildColumn == "tags"))
|
||||
{
|
||||
var mappedTags = new List<string>();
|
||||
|
||||
foreach (var tag in value.ToString().Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(x => Convert.ToInt32(x)))
|
||||
{
|
||||
object tagId;
|
||||
if (tag > 0)
|
||||
{
|
||||
tagId = columnMapper.GetMapping("mail_tag", "id", tag);
|
||||
}
|
||||
else
|
||||
{
|
||||
tagId = columnMapper.GetMapping("crm_tag", "id", -tag);
|
||||
if (tagId != null)
|
||||
{
|
||||
tagId = -Convert.ToInt32(tagId);
|
||||
}
|
||||
}
|
||||
if (tagId != null)
|
||||
{
|
||||
mappedTags.Add(tagId.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
value = string.Join(",", mappedTags.ToArray());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return base.TryPrepareValue(dump, connection, columnMapper, table, columnName, relations, ref value);
|
||||
}
|
||||
|
||||
protected override bool TryPrepareValue(DbConnection connection, ColumnMapper columnMapper, RelationInfo relation, ref object value)
|
||||
{
|
||||
if (relation.ParentTable == "crm_tag" && relation.ChildColumn == "id_tag"
|
||||
&& (relation.ChildTable == "mail_tag_mail" || relation.ChildTable == "mail_tag_addresses"))
|
||||
{
|
||||
var crmTagId = columnMapper.GetMapping(relation.ParentTable, relation.ParentColumn, -Convert.ToInt32(value));
|
||||
if (crmTagId == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
value = -Convert.ToInt32(crmTagId);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return base.TryPrepareValue(connection, columnMapper, relation, ref value);
|
||||
}
|
||||
|
||||
protected override bool TryPrepareValue(DbConnection connection, ColumnMapper columnMapper, TableInfo table, string columnName, ref object value)
|
||||
{
|
||||
if (table.Name == "mail_mailbox" && (columnName == "smtp_password" || columnName == "pop3_password") && value != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
value = _helpers.CreateHash(value as string); // save original hash
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
_logger.ErrorCanNotPrepareValue(value, err);
|
||||
value = null;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return base.TryPrepareValue(connection, columnMapper, table, columnName, ref value);
|
||||
}
|
||||
}
|
@ -37,15 +37,8 @@ public class ModuleProvider
|
||||
{
|
||||
new TenantsModuleSpecifics(coreSettings,helpers),
|
||||
new AuditModuleSpecifics(helpers),
|
||||
new CommunityModuleSpecifics(helpers),
|
||||
new CalendarModuleSpecifics(helpers),
|
||||
new ProjectsModuleSpecifics(helpers),
|
||||
new CrmModuleSpecifics(helpers),
|
||||
new FilesModuleSpecifics(logger,helpers),
|
||||
new MailModuleSpecifics(logger,helpers),
|
||||
new CrmModuleSpecifics2(helpers),
|
||||
new FilesModuleSpecifics2(helpers),
|
||||
new CrmInvoiceModuleSpecifics(helpers),
|
||||
new WebStudioModuleSpecifics(helpers),
|
||||
new CoreModuleSpecifics(helpers)
|
||||
}
|
||||
@ -56,10 +49,6 @@ public class ModuleProvider
|
||||
return storageModuleName switch
|
||||
{
|
||||
"files" => AllModules.FirstOrDefault(m => m.ModuleName == ModuleName.Files),
|
||||
"projects" => AllModules.FirstOrDefault(m => m.ModuleName == ModuleName.Projects),
|
||||
"crm" => AllModules.FirstOrDefault(m => m.ModuleName == (storageDomainName == "mail_messages" ? ModuleName.Crm2 : ModuleName.Crm)),
|
||||
"forum" => AllModules.FirstOrDefault(m => m.ModuleName == ModuleName.Community),
|
||||
"mailaggregator" => AllModules.FirstOrDefault(m => m.ModuleName == ModuleName.Mail),
|
||||
_ => null,
|
||||
};
|
||||
}
|
||||
|
@ -1,204 +0,0 @@
|
||||
// (c) Copyright Ascensio System SIA 2010-2022
|
||||
//
|
||||
// This program is a free software product.
|
||||
// You can redistribute it and/or modify it under the terms
|
||||
// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
|
||||
// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
|
||||
// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
|
||||
// any third-party rights.
|
||||
//
|
||||
// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty
|
||||
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
|
||||
// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
|
||||
//
|
||||
// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
|
||||
//
|
||||
// The interactive user interfaces in modified source and object code versions of the Program must
|
||||
// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
|
||||
//
|
||||
// Pursuant to Section 7(b) of the License you must retain the original Product logo when
|
||||
// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
|
||||
// trademark law for use of our trademarks.
|
||||
//
|
||||
// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
|
||||
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
|
||||
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
|
||||
|
||||
namespace ASC.Data.Backup.Tasks.Modules;
|
||||
|
||||
public class ProjectsModuleSpecifics : ModuleSpecificsBase
|
||||
{
|
||||
public override ModuleName ModuleName => ModuleName.Projects;
|
||||
public override IEnumerable<TableInfo> Tables => _tables;
|
||||
public override IEnumerable<RelationInfo> TableRelations => _tableRelations;
|
||||
|
||||
private readonly TableInfo[] _tables = new[]
|
||||
{
|
||||
new TableInfo("projects_comments", "tenant_id", "comment_id", IdType.Autoincrement) {UserIDColumns = new[] {"create_by"}},
|
||||
new TableInfo("projects_following_project_participant") {UserIDColumns = new[] {"participant_id"}},
|
||||
new TableInfo("projects_messages", "tenant_id", "id")
|
||||
{
|
||||
UserIDColumns = new[] {"create_by", "last_modified_by"},
|
||||
DateColumns = new Dictionary<string, bool> {{"create_on", false}, {"last_modified_on", false}}
|
||||
},
|
||||
new TableInfo("projects_milestones", "tenant_id", "id")
|
||||
{
|
||||
UserIDColumns = new[] {"create_by", "last_modified_by", "responsible_id"},
|
||||
DateColumns = new Dictionary<string, bool> {{"deadline", true}, {"status_changed", false}, {"create_on", false}, {"last_modified_on", false}}
|
||||
},
|
||||
new TableInfo("projects_projects", "tenant_id", "id")
|
||||
{
|
||||
UserIDColumns = new[] {"create_by", "last_modified_by", "responsible_id"},
|
||||
DateColumns = new Dictionary<string, bool> {{"status_changed", false}, {"create_on", false}, {"last_modified_on", false}}
|
||||
},
|
||||
new TableInfo("projects_project_participant", "tenant") {UserIDColumns = new[] {"participant_id"}},
|
||||
new TableInfo("projects_project_tag"),
|
||||
new TableInfo("projects_report_template", "tenant_id", "id") {UserIDColumns = new[] {"create_by"}},
|
||||
new TableInfo("projects_subtasks", "tenant_id", "id")
|
||||
{
|
||||
UserIDColumns = new[] {"create_by", "last_modified_by", "responsible_id"},
|
||||
DateColumns = new Dictionary<string, bool> {{"status_changed", false}, {"create_on", false}, {"last_modified_on", false}}
|
||||
},
|
||||
new TableInfo("projects_tags", "tenant_id", "id"),
|
||||
new TableInfo("projects_tasks", "tenant_id", "id")
|
||||
{
|
||||
UserIDColumns = new[] {"create_by", "last_modified_by", "responsible_id"},
|
||||
DateColumns = new Dictionary<string, bool> {{"status_changed", true}, {"deadline", true}, {"create_on", false}, {"last_modified_on", true}, {"start_date", true}}
|
||||
},
|
||||
new TableInfo("projects_tasks_responsible", "tenant_id") {UserIDColumns = new[] {"responsible_id"}},
|
||||
new TableInfo("projects_templates", "tenant_id", "id") {UserIDColumns = new[] {"create_by", "last_modified_by"}},
|
||||
new TableInfo("projects_time_tracking", "tenant_id", "id")
|
||||
{
|
||||
UserIDColumns = new[] {"create_by", "person_id"},
|
||||
DateColumns = new Dictionary<string, bool> {{"date", true}, {"create_on", false}, {"status_changed", true}}
|
||||
},
|
||||
new TableInfo("projects_tasks_links", "tenant_id"),
|
||||
new TableInfo("projects_tasks_order", "tenant_id")
|
||||
};
|
||||
|
||||
private readonly RelationInfo[] _tableRelations = new[]
|
||||
{
|
||||
new RelationInfo("projects_comments", "id", "projects_comments", "parent_id"),
|
||||
new RelationInfo("projects_messages", "id", "projects_comments", "target_uniq_id", x => Convert.ToString(x["target_uniq_id"]).StartsWith("Message_", StringComparison.InvariantCultureIgnoreCase)),
|
||||
new RelationInfo("projects_tasks", "id", "projects_comments", "target_uniq_id", x => Convert.ToString(x["target_uniq_id"]).StartsWith("Task_", StringComparison.InvariantCultureIgnoreCase)),
|
||||
new RelationInfo("projects_milestones", "id", "projects_comments", "target_uniq_id", x => Convert.ToString(x["target_uniq_id"]).StartsWith("Milestone_", StringComparison.InvariantCultureIgnoreCase)),
|
||||
new RelationInfo("projects_projects", "id", "projects_following_project_participant", "project_id"),
|
||||
new RelationInfo("projects_projects", "id", "projects_messages", "project_id"),
|
||||
new RelationInfo("projects_projects", "id", "projects_milestones", "project_id"),
|
||||
new RelationInfo("projects_projects", "id", "projects_project_participant", "project_id"),
|
||||
new RelationInfo("projects_projects", "id", "projects_project_tag", "project_id"),
|
||||
new RelationInfo("projects_tags", "id", "projects_project_tag", "tag_id"),
|
||||
new RelationInfo("projects_tasks", "id", "projects_subtasks", "task_id"),
|
||||
new RelationInfo("projects_projects", "id", "projects_tasks", "project_id"),
|
||||
new RelationInfo("projects_milestones", "id", "projects_tasks", "milestone_id"),
|
||||
new RelationInfo("projects_tasks", "id", "projects_tasks_responsible", "task_id"),
|
||||
new RelationInfo("projects_projects", "id", "projects_time_tracking", "project_id"),
|
||||
new RelationInfo("projects_tasks", "id", "projects_time_tracking", "relative_task_id"),
|
||||
new RelationInfo("projects_tasks", "id", "projects_tasks_links", "task_id"),
|
||||
new RelationInfo("projects_tasks", "id", "projects_tasks_links", "parent_id"),
|
||||
new RelationInfo("projects_projects", "id", "projects_tasks_order", "project_id"),
|
||||
new RelationInfo("projects_tasks", "id", "projects_tasks_order", "task_order"),
|
||||
new RelationInfo("projects_milestones", "id", "projects_tasks_order", "task_order")
|
||||
};
|
||||
|
||||
public ProjectsModuleSpecifics(Helpers helpers) : base(helpers) { }
|
||||
|
||||
public override bool TryAdjustFilePath(bool dump, ColumnMapper columnMapper, ref string filePath)
|
||||
{
|
||||
var match = Regex.Match(filePath, @"^thumbs/\d+/\d+/\d+/(?'fileId'\d+)\.jpg$");
|
||||
if (match.Success)
|
||||
{
|
||||
var fileId = columnMapper.GetMapping("files_file", "id", match.Groups["fileId"].Value);
|
||||
if (fileId == null)
|
||||
{
|
||||
if (!dump)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
fileId = match.Groups["fileId"].Value;
|
||||
}
|
||||
|
||||
var s = fileId.ToString().PadRight(6, '0');
|
||||
filePath = string.Format("thumbs/{0}/{1}/{2}/{3}.jpg", s.Substring(0, 2), s.Substring(2, 2), s.Substring(4), fileId);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
protected override string GetSelectCommandConditionText(int tenantId, TableInfo table)
|
||||
{
|
||||
if (table.Name == "projects_project_tag" || table.Name == "projects_following_project_participant")
|
||||
{
|
||||
return "inner join projects_projects as t1 on t1.id = t.project_id where t1.tenant_id = " + tenantId;
|
||||
}
|
||||
|
||||
return base.GetSelectCommandConditionText(tenantId, table);
|
||||
}
|
||||
|
||||
protected override bool TryPrepareValue(DbConnection connection, ColumnMapper columnMapper, TableInfo table, string columnName, ref object value)
|
||||
{
|
||||
|
||||
if (table.Name == "projects_comments" && columnName == "content" ||
|
||||
table.Name == "projects_messages" && columnName == "content")
|
||||
{
|
||||
value = FCKEditorPathUtility.CorrectStoragePath(value as string, columnMapper.GetTenantMapping());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return base.TryPrepareValue(connection, columnMapper, table, columnName, ref value);
|
||||
}
|
||||
|
||||
protected override bool TryPrepareValue(DbConnection connection, ColumnMapper columnMapper, RelationInfo relation, ref object value)
|
||||
{
|
||||
if (relation.ChildTable == "projects_comments" && relation.ChildColumn == "target_uniq_id")
|
||||
{
|
||||
var valParts = value.ToString().Split('_');
|
||||
|
||||
var entityId = columnMapper.GetMapping(relation.ParentTable, relation.ParentColumn, valParts[1]);
|
||||
if (entityId == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
value = string.Format("{0}_{1}", valParts[0], entityId);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return base.TryPrepareValue(connection, columnMapper, relation, ref value);
|
||||
}
|
||||
|
||||
protected override bool TryPrepareValue(bool dump, DbConnection connection, ColumnMapper columnMapper, TableInfo table, string columnName, IEnumerable<RelationInfo> relations, ref object value)
|
||||
{
|
||||
if (table.Name == "projects_tasks_order" && columnName == "task_order")
|
||||
{
|
||||
value = Regex.Replace(
|
||||
Convert.ToString(value),
|
||||
@"(?<=""tasks"":\[(\d+,)*)\d+,?",
|
||||
match =>
|
||||
{
|
||||
var mappedId = Convert.ToString(columnMapper.GetMapping("projects_tasks", "id", match.Value.TrimEnd(',')));
|
||||
return !string.IsNullOrEmpty(mappedId) && match.Value.EndsWith(',') ? mappedId + "," : mappedId;
|
||||
},
|
||||
RegexOptions.Compiled);
|
||||
|
||||
value = Regex.Replace(
|
||||
Convert.ToString(value),
|
||||
@"(?<=""milestones"":\[(\d+,)*)\d+,?",
|
||||
match =>
|
||||
{
|
||||
var mappedId = Convert.ToString(columnMapper.GetMapping("projects_milestones", "id", match.Value.TrimEnd(',')));
|
||||
return !string.IsNullOrEmpty(mappedId) && match.Value.EndsWith(',') ? mappedId + "," : mappedId;
|
||||
},
|
||||
RegexOptions.Compiled);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return base.TryPrepareValue(dump, connection, columnMapper, table, columnName, relations, ref value);
|
||||
}
|
||||
}
|
@ -41,11 +41,7 @@ public class WebStudioModuleSpecifics : ModuleSpecificsBase
|
||||
new TableInfo("webstudio_uservisit", "tenantid") {InsertMethod = InsertMethod.None}
|
||||
};
|
||||
|
||||
private readonly RelationInfo[] _relations = new[]
|
||||
{
|
||||
new RelationInfo("crm_organisation_logo", "id", "webstudio_settings", "Data", typeof(CrmInvoiceModuleSpecifics),
|
||||
x => _crmSettingsId == new Guid(Convert.ToString(x["ID"])))
|
||||
};
|
||||
private readonly RelationInfo[] _relations = new RelationInfo[0];
|
||||
|
||||
public WebStudioModuleSpecifics(Helpers helpers) : base(helpers) { }
|
||||
|
||||
|
@ -24,25 +24,32 @@
|
||||
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
|
||||
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
|
||||
|
||||
using ASC.EventBus.Log;
|
||||
|
||||
namespace ASC.Notify.IntegrationEvents.EventHandling;
|
||||
|
||||
[Scope]
|
||||
public class EncryptionDataStorageRequestedIntegrationEventHandler : IIntegrationEventHandler<EncryptionDataStorageRequestedIntegration>
|
||||
{
|
||||
private readonly ILogger _logger;
|
||||
private readonly EncryptionWorker _encryptionWorker;
|
||||
|
||||
public EncryptionDataStorageRequestedIntegrationEventHandler(EncryptionWorker encryptionWorker)
|
||||
|
||||
public EncryptionDataStorageRequestedIntegrationEventHandler(EncryptionWorker encryptionWorker,
|
||||
ILogger<EncryptionDataStorageRequestedIntegrationEventHandler> logger)
|
||||
{
|
||||
_encryptionWorker = encryptionWorker;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public async Task Handle(EncryptionDataStorageRequestedIntegration @event)
|
||||
{
|
||||
// using (_logger.BeginScope(new[] { new KeyValuePair<string, object>("integrationEventContext", $"{@event.Id}-{Program.AppName}") }))
|
||||
// {
|
||||
// _logger.InformationHandlingIntegrationEvent(@event.Id, Program.AppName, @event);
|
||||
|
||||
// _logger.InformationHandlingIntegrationEvent(@event.Id, Program.AppName, @event);
|
||||
_encryptionWorker.Start(@event.EncryptionSettings, @event.ServerRootPath);
|
||||
|
||||
_encryptionWorker.Start(@event.EncryptionSettings, @event.ServerRootPath);
|
||||
|
||||
await Task.CompletedTask;
|
||||
await Task.CompletedTask;
|
||||
// }
|
||||
}
|
||||
}
|
@ -47,7 +47,7 @@ public class IPRestrictionsRepository
|
||||
.ToList();
|
||||
}
|
||||
|
||||
public List<string> Save(IEnumerable<string> ips, int tenant)
|
||||
public List<IpRestrictionBase> Save(IEnumerable<IpRestrictionBase> ips, int tenant)
|
||||
{
|
||||
using var tenantDbContext = _dbContextManager.CreateDbContext();
|
||||
var strategy = tenantDbContext.Database.CreateExecutionStrategy();
|
||||
@ -64,7 +64,9 @@ public class IPRestrictionsRepository
|
||||
var ipsList = ips.Select(r => new TenantIpRestrictions
|
||||
{
|
||||
Tenant = tenant,
|
||||
Ip = r
|
||||
Ip = r.Ip,
|
||||
ForAdmin = r.ForAdmin
|
||||
|
||||
});
|
||||
|
||||
tenantDbContext.TenantIpRestrictions.AddRange(ipsList);
|
||||
|
@ -27,9 +27,16 @@
|
||||
namespace ASC.IPSecurity;
|
||||
|
||||
[Serializable]
|
||||
public class IPRestriction : IMapFrom<TenantIpRestrictions>
|
||||
public class IPRestriction : IpRestrictionBase, IMapFrom<TenantIpRestrictions>
|
||||
{
|
||||
public int Id { get; set; }
|
||||
|
||||
public int Tenant { get; set; }
|
||||
public string Ip { get; set; }
|
||||
}
|
||||
|
||||
public class IpRestrictionBase
|
||||
{
|
||||
public string Ip { get; set; }
|
||||
|
||||
public bool ForAdmin { get; set; }
|
||||
}
|
||||
|
@ -78,7 +78,7 @@ public class IPRestrictionsService
|
||||
return restrictions;
|
||||
}
|
||||
|
||||
public IEnumerable<string> Save(IEnumerable<string> ips, int tenant)
|
||||
public IEnumerable<IpRestrictionBase> Save(IEnumerable<IpRestrictionBase> ips, int tenant)
|
||||
{
|
||||
var restrictions = _ipRestrictionsRepository.Save(ips, tenant);
|
||||
_notify.Publish(new IPRestrictionItem { TenantId = tenant }, CacheNotifyAction.InsertOrUpdate);
|
||||
|
@ -68,4 +68,15 @@ internal class IPAddressRange
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static bool IsInRange(string ipAddress, string CIDRmask)
|
||||
{
|
||||
var parts = CIDRmask.Split('/');
|
||||
|
||||
var IP_addr = BitConverter.ToInt32(IPAddress.Parse(ipAddress).GetAddressBytes(), 0);
|
||||
var CIDR_addr = BitConverter.ToInt32(IPAddress.Parse(parts[0]).GetAddressBytes(), 0);
|
||||
var CIDR_mask = IPAddress.HostToNetworkOrder(-1 << (32 - int.Parse(parts[1])));
|
||||
|
||||
return (IP_addr & CIDR_mask) == (CIDR_addr & CIDR_mask);
|
||||
}
|
||||
}
|
||||
|
@ -38,20 +38,26 @@ public class IPSecurity
|
||||
private readonly IPRestrictionsService _ipRestrictionsService;
|
||||
private readonly string _currentIpForTest;
|
||||
private readonly string _myNetworks;
|
||||
private readonly SecurityContext _securityContext;
|
||||
private readonly UserManager _userManager;
|
||||
|
||||
public IPSecurity(
|
||||
IConfiguration configuration,
|
||||
IHttpContextAccessor httpContextAccessor,
|
||||
AuthContext authContext,
|
||||
TenantManager tenantManager,
|
||||
IPRestrictionsService iPRestrictionsService,
|
||||
IPRestrictionsService iPRestrictionsService,
|
||||
SecurityContext securityContext,
|
||||
UserManager userManager,
|
||||
ILogger<IPSecurity> logger)
|
||||
{
|
||||
_logger = logger;
|
||||
_httpContextAccessor = httpContextAccessor;
|
||||
_authContext = authContext;
|
||||
_tenantManager = tenantManager;
|
||||
_ipRestrictionsService = iPRestrictionsService;
|
||||
_ipRestrictionsService = iPRestrictionsService;
|
||||
_securityContext = securityContext;
|
||||
_userManager = userManager;
|
||||
_currentIpForTest = configuration["ipsecurity:test"];
|
||||
_myNetworks = configuration["ipsecurity:mynetworks"];
|
||||
var hideSettings = (configuration["web:hide-settings"] ?? "").Split(new[] { ',', ';', ' ' });
|
||||
@ -97,9 +103,11 @@ public class IPSecurity
|
||||
|
||||
var ips = string.IsNullOrWhiteSpace(requestIps)
|
||||
? Array.Empty<string>()
|
||||
: requestIps.Split(new[] { ",", " " }, StringSplitOptions.RemoveEmptyEntries);
|
||||
: requestIps.Split(new[] { ",", " " }, StringSplitOptions.RemoveEmptyEntries);
|
||||
|
||||
var isAdmin = _userManager.IsUserInGroup(_securityContext.CurrentAccount.ID, Core.Users.Constants.GroupAdmin.ID);
|
||||
|
||||
if (ips.Any(requestIp => restrictions.Any(restriction => MatchIPs(GetIpWithoutPort(requestIp), restriction.Ip))))
|
||||
if (ips.Any(requestIp => restrictions.Any(restriction => (restriction.ForAdmin ? isAdmin : true) && MatchIPs(GetIpWithoutPort(requestIp), restriction.Ip))))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
@ -131,6 +139,11 @@ public class IPSecurity
|
||||
var range = new IPAddressRange(lower, upper);
|
||||
|
||||
return range.IsInRange(IPAddress.Parse(requestIp));
|
||||
}
|
||||
|
||||
if (restrictionIp.IndexOf('/') > -1)
|
||||
{
|
||||
return IPAddressRange.IsInRange(requestIp, restrictionIp);
|
||||
}
|
||||
|
||||
return requestIp == restrictionIp;
|
||||
|
@ -65,7 +65,7 @@ public class MigrationController : ControllerBase
|
||||
[HttpGet("backuptmp")]
|
||||
public string GetTmpFolder()
|
||||
{
|
||||
if (!_coreBaseSettings.Standalone || !_userManager.GetUsers(_authContext.CurrentAccount.ID).IsAdmin(_userManager))
|
||||
if (!_coreBaseSettings.Standalone || !_userManager.IsAdmin(_authContext.CurrentAccount.ID))
|
||||
{
|
||||
throw new System.Security.SecurityException();
|
||||
}
|
||||
@ -86,7 +86,7 @@ public class MigrationController : ControllerBase
|
||||
[HttpGet("list")]
|
||||
public string[] List()
|
||||
{
|
||||
if (!_coreBaseSettings.Standalone || !_userManager.GetUsers(_authContext.CurrentAccount.ID).IsAdmin(_userManager))
|
||||
if (!_coreBaseSettings.Standalone || !_userManager.IsAdmin(_authContext.CurrentAccount.ID))
|
||||
{
|
||||
throw new System.Security.SecurityException();
|
||||
}
|
||||
@ -102,7 +102,7 @@ public class MigrationController : ControllerBase
|
||||
[HttpPost("init/{migratorName}")]
|
||||
public void UploadAndInit(string migratorName, string path)
|
||||
{
|
||||
if (!_coreBaseSettings.Standalone || !_userManager.GetUsers(_authContext.CurrentAccount.ID).IsAdmin(_userManager))
|
||||
if (!_coreBaseSettings.Standalone || !_userManager.IsAdmin(_authContext.CurrentAccount.ID))
|
||||
{
|
||||
throw new System.Security.SecurityException();
|
||||
}
|
||||
@ -141,7 +141,7 @@ public class MigrationController : ControllerBase
|
||||
[HttpGet("status")]
|
||||
public object Status()
|
||||
{
|
||||
if (!_coreBaseSettings.Standalone || !_userManager.GetUsers(_authContext.CurrentAccount.ID).IsAdmin(_userManager))
|
||||
if (!_coreBaseSettings.Standalone || !_userManager.IsAdmin(_authContext.CurrentAccount.ID))
|
||||
{
|
||||
throw new System.Security.SecurityException();
|
||||
}
|
||||
@ -175,7 +175,7 @@ public class MigrationController : ControllerBase
|
||||
[HttpPost("cancel")]
|
||||
public void Cancel()
|
||||
{
|
||||
if (!_coreBaseSettings.Standalone || !_userManager.GetUsers(_authContext.CurrentAccount.ID).IsAdmin(_userManager))
|
||||
if (!_coreBaseSettings.Standalone || !_userManager.IsAdmin(_authContext.CurrentAccount.ID))
|
||||
{
|
||||
throw new System.Security.SecurityException();
|
||||
}
|
||||
@ -195,7 +195,7 @@ public class MigrationController : ControllerBase
|
||||
[HttpPost("migrate")]
|
||||
public void Migrate(MigrationApiInfo info)
|
||||
{
|
||||
if (!_coreBaseSettings.Standalone || !_userManager.GetUsers(_authContext.CurrentAccount.ID).IsAdmin(_userManager))
|
||||
if (!_coreBaseSettings.Standalone || !_userManager.IsAdmin(_authContext.CurrentAccount.ID))
|
||||
{
|
||||
throw new System.Security.SecurityException();
|
||||
}
|
||||
@ -220,7 +220,7 @@ public class MigrationController : ControllerBase
|
||||
[HttpGet("logs")]
|
||||
public async Task Logs()
|
||||
{
|
||||
if (!_coreBaseSettings.Standalone || !_userManager.GetUsers(_authContext.CurrentAccount.ID).IsAdmin(_userManager))
|
||||
if (!_coreBaseSettings.Standalone || !_userManager.IsAdmin(_authContext.CurrentAccount.ID))
|
||||
{
|
||||
throw new System.Security.SecurityException();
|
||||
}
|
||||
@ -243,7 +243,7 @@ public class MigrationController : ControllerBase
|
||||
[HttpPost("finish")]
|
||||
public void Finish(bool isSendWelcomeEmail)
|
||||
{
|
||||
if (!_coreBaseSettings.Standalone || !_userManager.GetUsers(_authContext.CurrentAccount.ID).IsAdmin(_userManager))
|
||||
if (!_coreBaseSettings.Standalone || !_userManager.IsAdmin(_authContext.CurrentAccount.ID))
|
||||
{
|
||||
throw new System.Security.SecurityException();
|
||||
}
|
||||
|
@ -270,8 +270,8 @@ public class GwsMigratingFiles : MigratingFiles
|
||||
|
||||
list.Add(new AceWrapper
|
||||
{
|
||||
Share = shareType.Value,
|
||||
SubjectId = entryGuid,
|
||||
Access = shareType.Value,
|
||||
Id = entryGuid,
|
||||
SubjectGroup = false
|
||||
});
|
||||
}
|
||||
|
@ -225,8 +225,8 @@ public class NCMigratingFiles : MigratingFiles
|
||||
var entryGuid = userToShare == null ? groupToShare.Guid : userToShare.Guid;
|
||||
list.Add(new AceWrapper
|
||||
{
|
||||
Share = shareType.Value,
|
||||
SubjectId = entryGuid,
|
||||
Access = shareType.Value,
|
||||
Id = entryGuid,
|
||||
SubjectGroup = false
|
||||
});
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user