- AbitaregliIblei.it

- Server aggiornamenti agli script.
- Editor HTML corretto un po'.
- Record Mysql per server (appena iniziato)
This commit is contained in:
Surya Paolo
2024-09-06 19:57:09 +02:00
parent 45f601bd26
commit fe4a67c9f1
28 changed files with 638 additions and 567 deletions

View File

@@ -40,3 +40,4 @@ FTPSERVER_USER=ftpusrsrv_
FTPSERVER_PWD=ftpmypwd@1A_
AUTH_NEW_SITES=123123123
SCRIPTS_DIR=admin_scripts
CLOUDFLARE_TOKENS=[{"label":"Paolo.arena77@gmail.com","value":"M9EM309v8WFquJKpYgZCw-TViM2wX6vB3wlK6GD0"},{"label":"gruppomacro.com","value":"bqmzGShoX7WqOBzkXocoECyBkPq3GfqcM5t6VFd8"}]

View File

@@ -39,3 +39,4 @@ FTPSERVER_PORT=21
FTPSERVER_USER=ftpusrsrv_
FTPSERVER_PWD=ftpmypwd@1A_
AUTH_NEW_SITES=123123123
CLOUDFLARE_TOKENS=[{"label":"Paolo.arena77@gmail.com","value":"M9EM309v8WFquJKpYgZCw-TViM2wX6vB3wlK6GD0"},{"label":"gruppomacro.com","value":"bqmzGShoX7WqOBzkXocoECyBkPq3GfqcM5t6VFd8"}]

View File

@@ -7,8 +7,8 @@ PORT=3000
appTelegram_TEST=["17","18"]
appTelegram=["17","18"]
ENABLE_PUSHNOTIFICATION=1
DIRECTORY_SERVER=freeplanet_serverside
SERVERDIR_WEBSITE=www.freeplanet_server
DIRECTORY_SERVER=/var/www/www.freeplanet_server
SERVERDIR_WEBSITE=
PORT_APP1="0"
DOMAIN=mongodb://localhost:32001/
AUTH_MONGODB=1
@@ -33,5 +33,6 @@ SECRTK=jAxKm02emx5SeJvz2IGmtRf6YqCgope
TOKEN_LIFE=2h
REFRESH_TOKEN_LIFE=14d
AUTH_NEW_SITES=B234HDSAOJ734ndcsdKWNVZZ
DOMAINS=[{"hostname": "piuchebuono.app","port": 3000 },{"hostname":"gruppomacro.app","port": 3010}]
DOMAINS=[{"hostname":"piuchebuono.app","port":"3000"},{"hostname":"gruppomacro.app","port":"3010"}]
SCRIPTS_DIR=admin_scripts
CLOUDFLARE_TOKENS=[{"label":"Paolo.arena77@gmail.com","value":"M9EM309v8WFquJKpYgZCw-TViM2wX6vB3wlK6GD0"},{"label":"gruppomacro.com","value":"bqmzGShoX7WqOBzkXocoECyBkPq3GfqcM5t6VFd8"}]

View File

@@ -7,8 +7,8 @@ PORT=3001
appTelegram_TEST=["17","18"]
appTelegram=["17","18"]
ENABLE_PUSHNOTIFICATION=1
DIRECTORY_SERVER=freeplanet_serverside
SERVERDIR_WEBSITE=test.freeplanet_server
DIRECTORY_SERVER=/var/www/test.freeplanet_serverside
SERVERDIR_WEBSITE=test.piuchebuono.app
PORT_APP1="0"
DOMAIN=mongodb://localhost:32002/
AUTH_MONGODB=1
@@ -32,3 +32,6 @@ SECRK=iUUb38v23jjDFaosWj92axkBOXCQ
TOKEN_LIFE=2h
REFRESH_TOKEN_LIFE=14d
AUTH_NEW_SITES=B234HDSAOJ734ndcsdKWNV
DOMAINS=[{"hostname":"test.piuchebuono.app","port":"3002"},{"hostname":"test.gruppomacro.app","port":"3012"},{"hostname":"test.abitaregliiblei.it","port":"3022"}]
SCRIPTS_DIR=admin_scripts
CLOUDFLARE_TOKENS=[{"label":"Paolo.arena77@gmail.com","value":"M9EM309v8WFquJKpYgZCw-TViM2wX6vB3wlK6GD0"},{"label":"gruppomacro.com","value":"bqmzGShoX7WqOBzkXocoECyBkPq3GfqcM5t6VFd8"}]

View File

@@ -5,7 +5,7 @@ SEND_EMAIL=1
PORT=3001
ENABLE_PUSHNOTIFICATION=1
DIRECTORY_SERVER=/var/www/testriso.freeplanet_serverside
SERVERDIR_WEBSITE=testriso.piuchebuono.app
SERVERDIR_WEBSITE=test.riso.app
PORT_APP1="0"
DOMAIN=mongodb://localhost:32002/
AUTH_MONGODB=1
@@ -29,3 +29,6 @@ SECRK=iUUb38v23jjDFaosWj92axkBOXCQ
TOKEN_LIFE=2h
REFRESH_TOKEN_LIFE=14d
AUTH_NEW_SITES=B234HDSAOJ734ndcsdKWNV
DOMAINS=[{"hostname":"test.abitaregliiblei.it","port":"3021"}]
SCRIPTS_DIR=admin_scripts
CLOUDFLARE_TOKENS=[{"label":"Paolo.arena77@gmail.com","value":"M9EM309v8WFquJKpYgZCw-TViM2wX6vB3wlK6GD0"},{"label":"gruppomacro.com","value":"bqmzGShoX7WqOBzkXocoECyBkPq3GfqcM5t6VFd8"}]

View File

@@ -1,6 +1,7 @@
#!/bin/bash
#DATA|TITLE|Input Test
#DATA|DESCRIZ|Input Test
#DATA|SOCK|true
echo "Inizio dello Script... "
echo ".............................................."

View File

@@ -0,0 +1,16 @@
#!/bin/bash
#DATA|TITLE|Esporta FreePlanet sul Server PCB
#DATA|DESCRIZ|Esporta FreePlanet in "exp_db_test.tar.gz" e lo invia sul Server PCB
#DATA|SOCK|false
DATABASE="FreePlanet"
FILEMONGODB="export_database_$DATABASE"
FILEZIP="exp_db_test.tar.gz"
source .my_cfg.ini
mongodump --db $DATABASE --authenticationDatabase admin -u admin -p $PWDDB --out $FILEMONGODB
tar cvfz $FILEZIP $FILEMONGODB
scp -P 8822 $FILEZIP pcbuser@pcb:~

View File

@@ -0,0 +1,28 @@
#!/bin/bash
#DATA|TITLE|Importa FreePlanet su test_FreePlanet
#DATA|DESCRIZ|Importa FreePlanet (su test_FreePlanet) dal file inviato dal server mail.freeplanet.app
#DATA|SOCK|false
FILEZIP="exp_db_test.tar.gz"
DATABASEIN="FreePlanet"
DATABASEOUT="test_FreePlanet"
FILEMONGODBIN="export_database_$DATABASEIN"
FILEMONGODBOUT="export_database_$DATABASEOUT"
source .my_cfg.ini
# Copia il file .tar.gz nel container
docker cp /home/pcbuser/$FILEZIP mongodbtest:/home/test/
# Notifica l'intenzione di estrarre il contenuto del file tar.gz
echo "Estrazione di $FILEZIP in /home/test/ all'interno del container..."
echo ""
# Estrai il contenuto del file tar.gz nel container
docker exec -it mongodbtest tar -xvzf /home/test/$FILEZIP -C /home/test/
# Rinomina la directory contenente il database esportato
docker exec -i mongodbtest mv /home/test/$FILEMONGODBIN /home/test/$FILEMONGODBOUT
# Ripristina il database MongoDB dal dump
docker exec -i mongodbtest mongorestore --username admin --password $PWDDB_TEST --authenticationDatabase admin --nsFrom='FreePlanet.*' --nsTo='test_FreePlanet.*' /home/test/>

View File

@@ -0,0 +1,30 @@
#!/bin/bash
#DATA|TITLE|Copia sito Web
#DATA|DESCRIZ|Fai una copia di Backup del sito web
#DATA|SOCK|false
if [ "$1" = "" ]; then
read -p "Inserisci il Sito Web (pippo.it)" WEBSITE
else
WEBSITE=$1
fi
FILEBACKUP_SITE="BACKUP_$WEBSITE_$(date +"%Y-%m-%d").tar.gz"
echo "********************************"
msg="*** COPIA SITO WEB di $WEBSITE (Y/N) ? "
if [ "$1" = "" ]; then
read -p "$msg" risposta
else
echo $msg
risposta=$1
fi
if [[ $risposta == "Y" || $risposta == "y" ]]; then
tar cvfz $FILEBACKUP_SITE /var/www/$WEBSITE/
echo "*** COPIA TERMINATA ***
echo "***********************"
fi

View File

@@ -0,0 +1,20 @@
#!/bin/bash
#DATA|TITLE|Creazione Certificato
#DATA|DESCRIZ|Crea un Certificato utilizzando cloudflare per dominio e *.dominio
#DATA|SOCK|true
if [ "$1" = "" ]; then
read -p "Inserisci il nome del Dominio " DOMINIO
else
DOMINIO=$1
fi
echo sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials /root/.secrets/certbot/cloudflare.ini -d $DOMINIO,*.$DOMINIO --preferred-challenges dns-01
read -p "CONTINUARE ed Eseguirlo ? (Y/N) ? " risposta
if [[ $risposta == "Y" || $risposta == "y" ]]; then
sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials /root/.secrets/certbot/cloudflare.ini -d $DOMINIO,*.$DOMINIO --preferred-challenges dns-01
fi

View File

@@ -2,7 +2,7 @@
source ./.env.prod.pcb
echo "Sincronizzazione in corso PCB PRODUZIONE ... /var/www/$SERVERDIR_WEBSITE/"
echo "Sincronizzazione in corso PCB PRODUZIONE ... $DIRECTORY_SERVER/"
echo ""
#!/bin/bash
@@ -11,7 +11,7 @@ echo ""
REMOTE_USER="pcbuser"
REMOTE_HOST="pcb"
REMOTE_PORT="8822"
REMOTE_DIR="/var/www/$SERVERDIR_WEBSITE"
REMOTE_DIR="$DIRECTORY_SERVER"
SSH_OPTIONS="-p $REMOTE_PORT"
# Array di cartelle e file da sincronizzare

View File

@@ -2,18 +2,18 @@
source ./.env.test.pcb
echo "Sincronizzazione in corso PCB TEST ... /var/www/$SERVERDIR_WEBSITE/"
echo "Sincronizzazione in corso PCB TEST ... /var/www/$DIRECTORY_SERVER/"
echo ""
rsync -avz -e 'ssh -p 8822' css pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8822' docs pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8822' emails pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8822' images pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8822' plugins pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8822' sass pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8822' src pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8822' .env.test.pcb pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/.env.test
rsync -avz -e 'ssh -p 8822' .env.test.pcb pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/
rsync -avz -e 'ssh -p 8822' package.json pcbuser@pcb:/var/www/$SERVERDIR_WEBSITE/package.json
rsync -avz -e 'ssh -p 8822' css pcbuser@pcb:/var/www/$DIRECTORY_SERVER/
rsync -avz -e 'ssh -p 8822' docs pcbuser@pcb:/var/www/$DIRECTORY_SERVER/
rsync -avz -e 'ssh -p 8822' emails pcbuser@pcb:/var/www/$DIRECTORY_SERVER/
rsync -avz -e 'ssh -p 8822' images pcbuser@pcb:/var/www/$DIRECTORY_SERVER/
rsync -avz -e 'ssh -p 8822' plugins pcbuser@pcb:/var/www/$DIRECTORY_SERVER/
rsync -avz -e 'ssh -p 8822' sass pcbuser@pcb:/var/www/$DIRECTORY_SERVER/
rsync -avz -e 'ssh -p 8822' src pcbuser@pcb:/var/www/$DIRECTORY_SERVER/
rsync -avz -e 'ssh -p 8822' .env.test.pcb pcbuser@pcb:/var/www/$DIRECTORY_SERVER/.env.test
rsync -avz -e 'ssh -p 8822' .env.test.pcb pcbuser@pcb:/var/www/$DIRECTORY_SERVER/
rsync -avz -e 'ssh -p 8822' package.json pcbuser@pcb:/var/www/$DIRECTORY_SERVER/package.json
echo "Sincronizzazione TERMINATA! - SERVER PCB!"

View File

@@ -2,20 +2,68 @@
source ./.env.test.risosrv
echo "Sincronizzazione in corso... $DIRECTORY_SERVER"
rsync -avz -e 'scp -p 8822' .env.test.risosrv pcbuser@pcb:$DIRECTORY_SERVER/.env.test
rsync -avz -e 'ssh -p 8822' ecosystem.config.testriso.js pcbuser@pcb:$DIRECTORY_SERVER/ecosystem.config.js
rsync -avz -e 'ssh -p 8822' css pcbuser@pcb:$DIRECTORY_SERVER/
rsync -avz -e 'ssh -p 8822' docs pcbuser@pcb:$DIRECTORY_SERVER/
rsync -avz -e 'ssh -p 8822' emails pcbuser@pcb:$DIRECTORY_SERVER/
rsync -avz -e 'ssh -p 8822' images pcbuser@pcb:$DIRECTORY_SERVER/
rsync -avz -e 'ssh -p 8822' plugins pcbuser@pcb:$DIRECTORY_SERVER/
rsync -avz -e 'ssh -p 8822' sass pcbuser@pcb:$DIRECTORY_SERVER/
rsync -avz -e 'ssh -p 8822' src --exclude 'server/router/upload' pcbuser@pcb:$DIRECTORY_SERVER/
rsync -avz -e 'ssh -p 8822' ecosystem.config.testriso.js pcbuser@pcb:$DIRECTORY_SERVER/ecosystem.config.js
rsync -avz -e 'ssh -p 8822' package.json pcbuser@pcb:$DIRECTORY_SERVER/package.json
echo "Sincronizzazione in corso ... $DIRECTORY_SERVER/"
echo ""
#!/bin/bash
# Configurazione
REMOTE_USER="pcbuser"
REMOTE_HOST="pcb"
REMOTE_PORT="8822"
REMOTE_DIR="$DIRECTORY_SERVER"
SSH_OPTIONS="-p $REMOTE_PORT"
CONFIG_JS="ecosystem.config.testriso.js"
ENV_FILE=".env.test.risosrv"
ENV_OUT=".env.test"
#ENV_FILE=".env.prod.pcb"
#ENV_OUT=".env.production"
# Array di cartelle e file da sincronizzare
SYNC_ITEMS=(
"css"
"docs"
"emails"
"plugins"
"sass"
"src"
)
echo $REMOTE_DIR
echo ""
echo "*** Copia Cartelle ... "
# Esegui rsync per le cartelle
rsync -avz --delete \
--exclude='src/server/router/upload/' \
-e "ssh $SSH_OPTIONS" \
"${SYNC_ITEMS[@]}" \
"$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/"
echo ""
echo "*** Copia del file $ENV_FILE su $ENV_OUT ... "
# Sincronizza i file specifici
rsync -avz -e "ssh $SSH_OPTIONS" \
$ENV_FILE "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/$ENV_OUT"
echo ""
echo "*** Copia del file package.json ... "
rsync -avz -e "ssh $SSH_OPTIONS" \
package.json "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/package.json"
echo ""
echo "*** Copia del file ecosystem.config.js ... "
rsync -avz -e "ssh $SSH_OPTIONS" \
"$CONFIG_JS" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/ecosystem.config.js"
# Verifica il risultato
if [ $? -eq 0 ]; then
echo "Sincronizzazione completata con successo. SERVER $REMOTE_DIR! "
else
echo "Errore durante la sincronizzazione. Controlla l'output per i dettagli."
fi
echo "**************************"
echo "Sincronizzazione TERMINATA! - TESTSRISO.FREEPLANET_SERVER!"
echo "https://testriso.piuchebuono.app"
echo "**************************"

View File

@@ -0,0 +1,39 @@
Include /etc/apache2/sites-available/dominioinclude_test.abitaregliiblei.it.conf
# Configurazione per HTTP
<VirtualHost 65.108.222.97:80>
ServerName ${MIODOMINIO_COMPLETO}
DocumentRoot /var/www/${MIODOMINIO_COMPLETO}
RewriteEngine on
# Redirigi tutto il traffico HTTP verso HTTPS
RewriteCond %{SERVER_NAME} =${MIODOMINIO_COMPLETO} [OR]
RewriteCond %{SERVER_NAME} =www.${MIODOMINIO_COMPLETO}
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
ErrorLog /var/www/${MIODOMINIO_COMPLETO}/logs/error.log
CustomLog /var/www/${MIODOMINIO_COMPLETO}/logs/access.log combined
</VirtualHost>
# Configurazione per HTTPS
<IfModule mod_ssl.c>
<VirtualHost 65.108.222.97:443>
ServerName ${MIODOMINIO_COMPLETO}
DocumentRoot /var/www/${MIODOMINIO_COMPLETO}
ErrorLog /var/www/${MIODOMINIO_COMPLETO}/logs/error.log
CustomLog /var/www/${MIODOMINIO_COMPLETO}/logs/access.log combined
<Directory /var/www/${MIODOMINIO_COMPLETO}/>
Options -Indexes +IncludesNOEXEC +SymLinksIfOwnerMatch +ExecCGI
AllowOverride All
Require all granted
</Directory>
RewriteEngine on
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/${MIODOMINIO}/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/${MIODOMINIO}/privkey.pem
</VirtualHost>
</IfModule>

View File

@@ -0,0 +1,4 @@
Define MIODOMINIO abitaregliiblei.it
Define MIODOMINIO_COMPLETO test.abitaregliiblei.it
Define MIOURL_TESTAPI testapi.abitaregliiblei.it
Define PORTA 3022

View File

@@ -0,0 +1,51 @@
Include /etc/apache2/sites-available/dominioinclude_test.abitaregliiblei.it.conf
# Configurazione per HTTP
<VirtualHost 65.108.222.97:80>
ServerName ${MIODOMINIO_COMPLETO}
DocumentRoot /var/www/${MIODOMINIO_COMPLETO}
RewriteEngine on
# Redirigi tutto il traffico HTTP verso HTTPS
RewriteCond %{SERVER_NAME} =${MIODOMINIO_COMPLETO} [OR]
RewriteCond %{SERVER_NAME} =www.${MIODOMINIO_COMPLETO}
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
ErrorLog /var/www/${MIODOMINIO_COMPLETO}/logs/error.log
CustomLog /var/www/${MIODOMINIO_COMPLETO}/logs/access.log combined
</VirtualHost>
<VirtualHost 65.108.222.97:443>
ServerName ${MIOURL_TESTAPI}
ServerAdmin surya@riso.app
SSLEngine On
SSLProtocol -ALL +TLSv1.2 +TLSv1.3
SSLCompression Off
SSLHonorCipherOrder off
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:E>
SSLVerifyDepth 10
SSLCertificateFile /etc/letsencrypt/live/${MIODOMINIO}/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/${MIODOMINIO}/privkey.pem
ProxyPreserveHost On
SSLProxyEngine On
SSLProxyVerify None
SSLProxyCheckPeerCN Off
SSLProxyCheckPeerName Off
ProxyPass / https://localhost:${PORTA}/ retry=0 timeout=5 connectiontimeout=2
ProxyPassReverse / https://localhost:${PORTA}/
ProxyTimeout 5
LogLevel debug proxy:trace5
ErrorLog /var/www/${MIODOMINIO_COMPLETO}/logs/error.log
CustomLog /var/www/${MIODOMINIO_COMPLETO}/logs/access.log combined
<Location />
ProxyPassReverse /
SetEnv force-proxy-request-1.0 1
SetEnv proxy-nokeepalive 1
</Location>
</VirtualHost>

View File

@@ -1,22 +1,11 @@
<VirtualHost 65.108.222.97:443>
ServerName api.gruppomacro.app
ServerAlias www.api.gruppomacro.app
ServerAdmin surya@riso.app
SSLEngine On
SSLProtocol -ALL +TLSv1.2 +TLSv1.3
SSLCompression Off
SSLHonorCipherOrder off
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:E>
SSLVerifyDepth 10
SSLCertificateFile /etc/letsencrypt/live/gruppomacro.app/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/gruppomacro.app/privkey.pem
ProxyPreserveHost On
SSLProxyEngine On
SSLProxyVerify None
SSLProxyCheckPeerCN Off
SSLProxyCheckPeerName Off
ProxyPass / https://localhost:3010/ retry=0 timeout=5 connectiontimeout=2
ProxyPassReverse / https://localhost:3010/

View File

@@ -1,22 +0,0 @@
<VirtualHost 65.108.222.97:443>
ServerName abitaregliiblei.it
ServerAlias *.abitaregliiblei.it
ServerAdmin surya@riso.app
SSLEngine On
SSLProtocol -ALL +TLSv1.2
SSLCompression Off
SSLHonorCipherOrder off
SSLCipherSuite ECDH+AESGCM:ECDH+AES256:!aNULL:!MD5:!DSS:!DH:!AES128
SSLVerifyDepth 10
SSLCertificateFile /etc/letsencrypt/live/abitaregliiblei.it/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/abitaregliiblei.it/privkey.pem
DocumentRoot "/var/customers/webs/paolouser/abitaregliiblei.it"
<Directory "/var/customers/webs/paolouser/abitaregliiblei.it/">
CGIPassAuth On
Require all granted
AllowOverride All
</Directory>
LogLevel warn
ErrorLog "/var/customers/logs/paolouser-error.log"
CustomLog "/var/customers/logs/paolouser-access.log" combined
</VirtualHost>

View File

@@ -1,354 +0,0 @@
// MongoDB Playground
// To disable this template go to Settings | MongoDB | Use Default Template For Playground.
// Make sure you are connected to enable completions and to be able to run a playground.
// Use Ctrl+Space inside a snippet or a string literal to trigger completions.
// Select the database to use.
use('test_FreePlanet');
let aggregation = [
{
$match: {
idapp: "13",
},
},
{
$sort: {
date_updated: -1,
},
},
{
$addFields: {
myId1: {
$toObjectId: "$userId",
},
},
},
{
$lookup: {
from: "users",
localField: "myId1",
foreignField: "_id",
as: "user",
},
},
{
$replaceRoot: {
newRoot: {
$mergeObjects: [
{
$arrayElemAt: [
"$user",
0,
],
},
"$$ROOT",
],
},
},
},
{
$project: {
recGood: 1,
sectorGood: 1,
idSectorGood: 1,
idGood: 1,
mygood: 1,
idStatusSkill: 1,
idContribType: 1,
"profile.username_telegram": 1,
"profile.favorite": 1,
"profile.bookmark": 1,
idCity: 1,
pub_to_share: 1,
numLevel: 1,
adType: 1,
photos: 1,
note: 1,
website: 1,
descr: 1,
date_created: 1,
date_updated: 1,
userId: 1,
username: 1,
name: 1,
surname: 1,
lasttimeonline: 1,
comune: 1,
mycities: 1,
"profile.img": 1,
"profile.mygroups": 1,
"profile.qualifica": 1,
"profile.resid_province": 1,
"profile.resid_card": 1,
reported: 1,
date_report: 1,
username_who_report: 1,
},
},
{
$lookup: {
from: "goods",
localField: "idGood",
foreignField: "_id",
as: "recGood",
},
},
{
$replaceRoot: {
newRoot: {
$mergeObjects: [
{
$arrayElemAt: [
"$recGood",
0,
],
},
"$$ROOT",
],
},
},
},
{
$project: {
recGood: 1,
sectorGood: 1,
idSectorGood: 1,
idGood: 1,
mygood: 1,
idStatusSkill: 1,
idContribType: 1,
"profile.username_telegram": 1,
"profile.favorite": 1,
"profile.bookmark": 1,
idCity: 1,
pub_to_share: 1,
numLevel: 1,
adType: 1,
photos: 1,
note: 1,
website: 1,
descr: 1,
date_created: 1,
date_updated: 1,
userId: 1,
username: 1,
name: 1,
surname: 1,
lasttimeonline: 1,
comune: 1,
mycities: 1,
"profile.img": 1,
"profile.mygroups": 1,
"profile.qualifica": 1,
"profile.resid_province": 1,
"profile.resid_card": 1,
reported: 1,
date_report: 1,
username_who_report: 1,
},
},
{
$lookup: {
from: "sectorgoods",
localField: "idSectorGood",
foreignField: "_id",
as: "sectorGood",
},
},
{
$replaceRoot: {
newRoot: {
$mergeObjects: [
{
$arrayElemAt: [
"$sectorGood",
0,
],
},
"$$ROOT",
],
},
},
},
{
$project: {
recGood: 1,
sectorGood: 1,
idSectorGood: 1,
idGood: 1,
mygood: 1,
idStatusSkill: 1,
idContribType: 1,
"profile.username_telegram": 1,
"profile.favorite": 1,
"profile.bookmark": 1,
idCity: 1,
pub_to_share: 1,
numLevel: 1,
adType: 1,
photos: 1,
note: 1,
website: 1,
descr: 1,
date_created: 1,
date_updated: 1,
userId: 1,
username: 1,
name: 1,
surname: 1,
lasttimeonline: 1,
comune: 1,
mycities: 1,
"profile.img": 1,
"profile.mygroups": 1,
"profile.qualifica": 1,
"profile.resid_province": 1,
reported: 1,
date_report: 1,
username_who_report: 1,
},
},
{
$lookup: {
from: "cities",
localField: "idCity",
foreignField: "_id",
as: "mycities",
},
},
{
$replaceRoot: {
newRoot: {
$mergeObjects: [
{
$arrayElemAt: [
"$mycities",
0,
],
},
"$$ROOT",
],
},
},
},
{
$project: {
recGood: 1,
sectorGood: 1,
idSectorGood: 1,
idGood: 1,
mygood: 1,
idStatusSkill: 1,
idContribType: 1,
"profile.username_telegram": 1,
"profile.favorite": 1,
"profile.bookmark": 1,
idCity: 1,
pub_to_share: 1,
numLevel: 1,
adType: 1,
photos: 1,
note: 1,
website: 1,
descr: 1,
date_created: 1,
date_updated: 1,
userId: 1,
username: 1,
name: 1,
surname: 1,
lasttimeonline: 1,
comune: 1,
mycities: 1,
"profile.img": 1,
"profile.mygroups": 1,
"profile.qualifica": 1,
"profile.resid_province": 1,
reported: 1,
date_report: 1,
username_who_report: 1,
},
},
{
$match: {
$or: [
{
$and: [
{
"profile.mygroups": {
$elemMatch: {
groupname: {
$in: [
"000017",
"risoprova",
"VillaggiamoItalia",
"Terraw",
"RisoBenevento",
"111",
"gruppodefaultriso",
"pontiUmani",
],
},
},
},
},
{
pub_to_share: 1,
},
],
},
{
$or: [
{
pub_to_share: {
$exists: false,
},
},
{
pub_to_share: {
$exists: true,
$eq: 0,
},
},
],
},
],
},
},
{
$match: {
$and: [
{
"mycities.reg": "EMR",
},
],
},
},
{
$group: {
_id: null,
count: {
$sum: 1,
},
results: {
$push: "$$ROOT",
},
},
},
{
$project: {
count: 1,
rows: {
$slice: [
"$results",
0,
10,
],
},
},
},
];
db.myskills.aggregate(aggregation);

View File

@@ -0,0 +1,87 @@
const mongoose = require('mongoose').set('debug', false)
const Schema = mongoose.Schema;
mongoose.Promise = global.Promise;
mongoose.level = "F";
const tools = require('../tools/general');
const { ObjectID } = require('mongodb');
// Resolving error Unknown modifier: $pushAll
mongoose.plugin(schema => {
schema.options.usePushEach = true
});
const SectorActivitiesSchema = new Schema({
_id: {
type: Number,
},
descr: {
type: String,
},
idSectorActivities: {
type: Number
},
icon: {
type: String,
},
img: {
type: String,
},
color: {
type: String,
},
theme: {
type: String,
},
});
SectorActivitiesSchema.pre('save', async function (next) {
if (this.isNew) {
const myrec = await SectorActivities.findOne().limit(1).sort({ _id: -1 });
if (!!myrec) {
if (myrec._doc._id === 0)
this._id = 1;
else
this._id = myrec._doc._id + 1;
} else {
this._id = 1;
}
}
next();
});
SectorActivitiesSchema.statics.findAllIdApp = async function (idapp) {
const SectorActivities = this;
const query = [
{ $sort: { descr: 1 } }
];
return await SectorActivities
.aggregate(query)
.then((arrrec) => {
return arrrec
})
};
SectorActivitiesSchema.statics.getFieldsForSearch = function () {
return [{ field: 'descr', type: tools.FieldType.string }]
};
SectorActivitiesSchema.statics.executeQueryTable = function (idapp, params) {
params.fieldsearch = this.getFieldsForSearch();
return tools.executeQueryTable(this, 0, params);
};
const SectorActivities = mongoose.model('SectorActivities', SectorActivitiesSchema);
SectorActivities.createIndexes((err) => {
if (err) throw err;
});
module.exports = { SectorActivities };

View File

@@ -672,6 +672,16 @@ UserSchema.statics.isManagerById = async function (id) {
}
};
UserSchema.statics.isAdminById = async function (id) {
try {
const ris = await User.findOne({ _id: id }, { perm: 1 }).lean();
return ((ris.perm & shared_consts.Permissions.Admin) ===
shared_consts.Permissions.Admin);
} catch (e) {
return false;
}
};
UserSchema.statics.isEditor = function (perm) {
try {
return ((perm & shared_consts.Permissions.Editor) ===
@@ -3237,7 +3247,7 @@ UserSchema.statics.setCircuitCmd = async function (idapp, usernameOrig, circuitn
}
ris = true;
// } else if ((cmd === shared_consts.CIRCUITCMD.SENDCOINS_ACCEPT) || (cmd === shared_consts.CIRCUITCMD.SENDCOINS_REFUSE)) {
// } else if ((cmd === shared_consts.CIRCUITCMD.SENDCOINS_ACCEPT) || (cmd === shared_consts.CIRCUITCMD.SENDCOINS_REFUSE)) {
// Before to accept, I see if it's already set !
/*outres = {
@@ -5742,10 +5752,10 @@ UserSchema.statics.tooManyLoginWrong = async function (idapp, username, set) {
await User.findOneAndUpdate({ _id: user._id }, { $set: { retry_pwd: user.retry_pwd } });
}
return {troppilogin: user.retry_pwd > maxnum, retry_pwd: user.retry_pwd};
return { troppilogin: user.retry_pwd > maxnum, retry_pwd: user.retry_pwd };
}
return {troppilogin: false, retry_pwd: 0};
return { troppilogin: false, retry_pwd: 0 };
};
UserSchema.statics.setLastCircuitOpened = async function (idapp, username, circuitpath) {

View File

@@ -1,66 +1,90 @@
const axios = require('axios');
const apiUrl = 'https://api.cloudflare.com/client/v4'; // Endpoint
async function fetchCloudflareZones(apiToken) {
try {
class CloudFlare {
constructor(config) {
this.config = config ? config : {};
// Effettua una richiesta GET all'API di Cloudflare
const response = await axios.get(apiUrl + '/zones', {
headers: {
'Authorization': `Bearer ${apiToken}`, // Autenticazione con token
'Content-Type': 'application/json' // Tipo di contenuto
}
});
if (!this.config.arrTokens) {
this.config.arrTokens = process.env.CLOUDFLARE_TOKENS;
}
}
// Estrai i dati dalla risposta
const zones = response.data.result;
init() {
if (this.config.arrTokens) {
// this.zones = this.fetchCloudflareZones(this.config.apiToken);
this.zones = [];
this.dnsRecords = null;
}
}
// Stampa le zone
// console.log('Zone di Cloudflare:', zones);
} catch (error) {
console.error('Errore durante il recupero delle zone di Cloudflare:', error.message);
async fetchCloudflareZones(apiToken) {
try {
// Effettua una richiesta GET all'API di Cloudflare
const response = await axios.get(apiUrl + '/zones', {
headers: {
'Authorization': `Bearer ${apiToken}`, // Autenticazione con token
'Content-Type': 'application/json' // Tipo di contenuto
}
});
// Estrai i dati dalla risposta
this.zones = response.data.result;
return this.zones;
// Stampa le zone
// console.log('Zone di Cloudflare:', zones);
} catch (error) {
console.error('Errore durante il recupero delle zone di Cloudflare:', error.message);
}
}
// Funzione per estrarre i record DNS
async fetchDNSRecords(apiToken, zoneId) {
const apiUrlDNS = apiUrl + `/zones/${zoneId}/dns_records`;
try {
const response = await axios.get(apiUrlDNS, {
headers: {
'Authorization': `Bearer ${apiToken}`, // Autenticazione con token
'Content-Type': 'application/json' // Tipo di contenuto
}
});
this.dnsRecords = response.data.result;
return this.dnsRecords;
} catch (error) {
console.error('Errore durante il recupero dei record DNS di Cloudflare:', error.message);
}
}
// Funzione per aggiornare un record DNS
async updateDNSRecord(apiToken, zoneId, dnsRecordId, newDnsRecordData) {
const apiUrlDNS = apiUrl + `/zones/${zoneId}/dns_records/${dnsRecordId}`;
try {
const response = await axios.put(apiUrlDNS, newDnsRecordData, {
headers: {
'Authorization': `Bearer ${apiToken}`, // Autenticazione con token
'Content-Type': 'application/json' // Tipo di contenuto
}
});
const updatedRecord = response.data.result;
// Stampa il record DNS aggiornato
console.log('Record DNS aggiornato:', updatedRecord);
return updatedRecord;
} catch (error) {
console.error('Errore durante l\'aggiornamento del record DNS:', error.message);
}
}
}
// Funzione per estrarre i record DNS
async function fetchDNSRecords(apiToken, zoneId) {
const apiUrlDNS = apiUrl + `/zones/${zoneId}/dns_records`;
try {
const response = await axios.get(apiUrlDNS, {
headers: {
'Authorization': `Bearer ${apiToken}`, // Autenticazione con token
'Content-Type': 'application/json' // Tipo di contenuto
}
});
const dnsRecords = response.data.result;
return dnsRecords;
} catch (error) {
console.error('Errore durante il recupero dei record DNS di Cloudflare:', error.message);
}
}
// Funzione per aggiornare un record DNS
async function updateDNSRecord(apiToken, zoneId, dnsRecordId, newDnsRecordData) {
const apiUrlDNS = apiUrl + `/zones/${zoneId}/dns_records/${dnsRecordId}`;
try {
const response = await axios.put(apiUrlDNS, newDnsRecordData, {
headers: {
'Authorization': `Bearer ${apiToken}`, // Autenticazione con token
'Content-Type': 'application/json' // Tipo di contenuto
}
});
const updatedRecord = response.data.result;
// Stampa il record DNS aggiornato
console.log('Record DNS aggiornato:', updatedRecord);
} catch (error) {
console.error('Errore durante l\'aggiornamento del record DNS:', error.message);
}
}
module.exports = CloudFlare

View File

@@ -1193,4 +1193,47 @@ router.post('/exec', authenticate, async (req, res) => {
});
router.post('/cloudflare', authenticate, async (req, res) => {
try {
idapp = req.body.idapp;
cmd = req.body.cmd;
tok = req.body.tok;
zoneId = req.body.zoneId;
tokcheck = req.body.tokcheck;
dnsRecordId = req.body.dnsRecordId;
record = req.body.record;
console.log('/cloudflare idapp=', idapp, req.body.script);
const CloudFlareClass = require('../modules/Cloudflare.js');
const TOKCHECK = 'php8.1_version_762321HSD121nJDokq@?!aFS.tar.gz'
if (!User.isAdmin(req.user.perm) || (tokcheck !== TOKCHECK)) {
// If without permissions, exit
return res.status(404).send({ code: server_constants.RIS_CODE_ERR_UNAUTHORIZED, msg: '' });
}
let result = '';
let cf = new CloudFlareClass(null);
cf.init();
if (cmd === "getzones") {
result = await cf.fetchCloudflareZones(tok);
} else if (cmd === "getDNS") {
result = await cf.fetchDNSRecords(tok, zoneId);
} else if (cmd === "setRecordDNS") {
result = await cf.updateDNSRecord(tok, zoneId, dnsRecordId, record);
} else if (cmd === "gettok") {
result = JSON.parse(process.env.CLOUDFLARE_TOKENS);
}
return res.send(result);
} catch (e) {
console.error('e', e);
return res.status(400).send({ code: server_constants.RIS_CODE_ERR, msg: '' });
}
});
module.exports = router;

View File

@@ -1890,9 +1890,10 @@ function uploadFile(req, res, version) {
// console.log('fromfile', fromfile)
// console.log('tofile', tofile);
if (!tools.sulServer()) {
console.log('Dovresti copiare fromfile', fromfile, 'tofile', tofile);
console.log('cp ', fromfile, tofile);
await tools.execScriptNoOutput('sudo cp -R ' + fromfile + ' ' + tofile)
res.end();
return;
}

View File

@@ -17,8 +17,6 @@ var http = require('http');
const WebSocket = require('ws');
const { spawn } = require('child_process');
const pty = require('node-pty');
const NUOVO_METODO_TEST = true;
const METODO_MULTI_CORS = false;
@@ -283,6 +281,9 @@ async function mystart() {
// await estraiTutteLeImmagini();
console.log('Versione Server: ' + await tools.getVersServer());
await tools.getApps();
if (process.env.PROD !== 1) {
@@ -716,11 +717,6 @@ async function faitest() {
}
}
/*const domains = [
{ hostname: 'piuchebuono.app', port: 3000 },
{ hostname: 'gruppomacro.app', port: 3010 },
];*/
function getCredentials(hostname) {
if (NUOVO_METODO_TEST) {
@@ -801,6 +797,8 @@ function startServer(app, port) {
let httpsServer = null;
let httpServer = null;
console.log('isProduction', isProduction);
if (isProduction) {
for (let i = 0; i < domains.length; i++) {
const credentials = getCredentials(domains[i].hostname);
@@ -859,82 +857,98 @@ function startServer(app, port) {
// process.exit(1);
}
wss.on('connection', (ws) => {
// console.log('Client connected');
let scriptProcess = null;
if (wss) {
ws.on('message', (message) => {
const parsedMessage = JSON.parse(message);
wss.on('connection', (ws) => {
console.log('Client socket connected...');
if (parsedMessage.type === 'start_script') {
if (scriptProcess) {
scriptProcess.kill();
}
const { User } = require('./models/user');
const scriptPath = path.join(__dirname, '..', '..', '', parsedMessage.scriptName);
let scriptProcess = null;
// Verifica che lo script esista e sia all'interno della directory consentita
if (fs.existsSync(scriptPath)) {
scriptProcess = pty.spawn('bash', [scriptPath], {
name: 'xterm-color',
cols: 80,
rows: 40,
cwd: process.cwd(),
env: process.env
});
try {
let buffer = '';
scriptProcess.on('data', (data) => {
buffer += data;
const pty = require('node-pty');
// Invia l'output al client
ws.send(JSON.stringify({ type: 'output', data: data }));
ws.on('message', (message) => {
const parsedMessage = JSON.parse(message);
// Controlla se c'è una richiesta di input
if (buffer.endsWith(': ') || buffer.includes('? ') ||
buffer.toLowerCase().includes('password')
|| buffer.includes('Inserisci')
|| buffer.includes('Inserted')
|| buffer.includes('(Y')
) {
ws.send(JSON.stringify({ type: 'input_required', prompt: data.trim() }));
buffer = '';
if ((parsedMessage.type === 'start_script') && (User.isAdminById(parsedMessage.user_id))) {
if (scriptProcess) {
scriptProcess.kill();
}
// Pulisci il buffer se diventa troppo grande
if (buffer.length > 5024) {
buffer = buffer.slice(-500);
}
});
const scriptPath = path.join(__dirname, '..', '..', '', parsedMessage.scriptName);
scriptProcess.on('exit', (code) => {
if (code === 0) {
ws.send(JSON.stringify({ type: 'close', data: `*** FINE SCRIPT ***` }));
// Verifica che lo script esista e sia all'interno della directory consentita
if (fs.existsSync(scriptPath)) {
scriptProcess = pty.spawn('bash', [scriptPath], {
name: 'xterm-color',
cols: 80,
rows: 40,
cwd: process.cwd(),
env: process.env
});
let buffer = '';
scriptProcess.on('data', (data) => {
buffer += data;
// Invia l'output al client
ws.send(JSON.stringify({ type: 'output', data: data }));
// Controlla se c'è una richiesta di input
if (buffer.endsWith(': ') || buffer.includes('? ') ||
buffer.toLowerCase().includes('password')
|| buffer.includes('Inserisci')
|| buffer.includes('Inserted')
|| buffer.includes('(Y')
) {
ws.send(JSON.stringify({ type: 'input_required', prompt: data.trim() }));
buffer = '';
}
// Pulisci il buffer se diventa troppo grande
if (buffer.length > 5024) {
buffer = buffer.slice(-500);
}
});
scriptProcess.on('exit', (code) => {
if (code === 0) {
ws.send(JSON.stringify({ type: 'close', data: `*** FINE SCRIPT ***` }));
} else {
ws.send(JSON.stringify({ type: 'close', data: `Script terminato con codice ${code}` }));
}
});
} else {
ws.send(JSON.stringify({ type: 'close', data: `Script terminato con codice ${code}` }));
ws.send(JSON.stringify({ type: 'error', data: 'Script non trovato o non autorizzato' }));
}
});
} else {
ws.send(JSON.stringify({ type: 'error', data: 'Script non trovato o non autorizzato' }));
}
} else if (parsedMessage.type === 'input') {
if (scriptProcess) {
scriptProcess.write(parsedMessage.data + '\n');
}
} else if (parsedMessage.type === 'input') {
if (scriptProcess) {
scriptProcess.write(parsedMessage.data + '\n');
}
}
});
ws.on('close', () => {
console.log('*** Client socket disconnected');
if (scriptProcess) {
scriptProcess.kill();
}
});
} catch (error) {
console.error('connection: Errore durante l\'inizializzazione del WebSocket, error:', error.message);
}
});
ws.on('close', () => {
console.log('Client disconnected');
if (scriptProcess) {
scriptProcess.kill();
}
});
});
} else {
console.error('Nessuna Socket Aperta con WebSocket !!');
}
} catch (e) {
console.log('error ' + e);
console.log('error startServer: ' + e);
}
}

View File

@@ -2486,8 +2486,13 @@ class Telegram {
file = '~/batch/test_restart_server.sh';
}
const ris = await tools.execScriptByTelegram(this.idapp, msg, file,
this.chisono(rec) + ' Restart il Server (Node.Js) : ' + process.version);
let messaggio = this.chisono(rec) + ' Restart il Server (Node.Js) : ' + process.version;
messaggio += '\nVersione Server: ' + await tools.getVersServer();
const ris = await tools.execScriptByTelegram(this.idapp, msg, file, messaggio);
} else {
this.nonAbilitato(msg);
}

View File

@@ -1861,9 +1861,9 @@ module.exports = {
this.MYAPPS.find(item => item.idapp === idapp);
if (myapp) {
if (process.env.NODE_ENV === 'test')
mypath = (myapp) ? myapp.dir_test : '';
mypath = (myapp && myapp.dir_test) ? myapp.dir_test : '';
else
mypath = (myapp) ? myapp.dir : '';
mypath = (myapp && myapp.dir) ? myapp.dir : '';
if (dirmain) {
if (!this.sulServer()) {
@@ -3812,15 +3812,30 @@ module.exports = {
},
readlogfile(idapp, filename) {
async readlogfile(idapp, filename) {
try {
return fs.readFileSync(idapp + '/' + filename, 'utf8');
return await fs.readFileSync(idapp + '/' + filename, 'utf8');
} catch (e) {
return '';
}
},
async readfilecontent(filename) {
try {
const cont = await fs.readFileSync(filename, 'utf8');
return cont;
} catch (e) {
return '';
}
},
async getVersServer() {
return await this.readfilecontent(__dirname + '/../version.txt');
},
writelog(mystr) {
this.writelogfile(mystr, FILELOG);
},
@@ -3852,11 +3867,6 @@ module.exports = {
this.writelogfile(mystr, idapp + '/' + riga + '_' + col + '.txt');
},
readFlottaLog(idapp, riga, col) {
const nomefile = riga + '_' + col + '.txt';
return this.readlogfile(idapp, nomefile);
},
writeNaveLog(mystr) {
this.writelogfile(mystr, FILENAVE);
},
@@ -4507,6 +4517,7 @@ module.exports = {
for (let i = 0; i < arrscripts.length; i++) {
let label = arrscripts[i];
let sock = false;
let description = '';
if (listafiles) {
if (arrscripts[i].endsWith('.sh')) {
@@ -4537,6 +4548,8 @@ module.exports = {
label = value;
} else if (paramstr === 'DESCRIZ') {
description = value;
} else if (paramstr === 'SOCK') {
sock = (value.toLowerCase() === 'true');
}
}
@@ -4551,7 +4564,7 @@ module.exports = {
}
if ((label) && (!extfiles || (extfiles && arrscripts[i].endsWith('.' + extfiles)))) {
arrout.push({ label, value: arrscripts[i], description });
arrout.push({ label, value: arrscripts[i], description, sock });
}
}
@@ -4559,6 +4572,20 @@ module.exports = {
});
});
},
execScriptNoOutput: async function (script) {
return new Promise(async (resolve, reject) => {
console.log('execScriptNoOutput:', script);
exec(script, async (error, stdout, stderr) => { // Aggiunto async qui
if (error) {
console.error(`error: ${error}`);
}
if (stderr) {
console.error(`stderr: ${stderr}`);
}
resolve(!error && !stderr);
});
});
},
execScriptWithInputOnServer: async function (idapp, script) {
return new Promise((resolve, reject) => {

1
src/server/version.txt Normal file
View File

@@ -0,0 +1 @@
1.0.56