Salve,
sono completamente nuovo a WAPT e quando provo a creare un programma di installazione personalizzato, ricevo un messaggio di errore relativo al socket. Quando confermo l'errore, ricevo il seguente messaggio:
Errore durante il caricamento dell'agente WAPT nel repository.
Grazie per l'aiuto.
Patrice
Errore socket #10061 Connessione rifiutata.
Regole del forum
Regole del forum della community
* Supporto in inglese su www.reddit.com/r/wapt
* Supporto della community in francese disponibile su questo forum
* Si prega di anteporre [RISOLTO] al titolo dell'argomento se è stato risolto.
* Si prega di non modificare un argomento contrassegnato con [RISOLTO]. Aprire un nuovo argomento facendo riferimento a quello precedente.
* Specificare la versione di WAPT installata, la versione completa e il numero di build (2.2.1.11957 / 2.2.2.12337 / ecc.) nonché l'edizione Enterprise/Discovery.
* Le versioni 1.8.2 e precedenti non sono più supportate. Le uniche domande accettate relative alla versione 1.8.2 riguardano l'aggiornamento a una versione supportata (2.1, 2.2, ecc.).
* Specificare il sistema operativo del server (Linux/Windows) e la versione (Debian Buster/Bullseye - CentOS 7 - Windows Server 2012/2016/2019).
* Specificare il sistema operativo della macchina di amministrazione/creazione dei pacchetti e della macchina con l'agente problematico, se applicabile (Windows 7/10/11/Debian 11/ecc.).
* Evitare di porre più domande quando si apre una discussione, altrimenti potrebbe essere ignorata. Se ci sono più discussioni, aprirle separatamente, preferibilmente una dopo l'altra e non tutte contemporaneamente (ovvero, non intasare il forum).
* Includere frammenti di codice, screenshot e altre immagini direttamente nel post. I link a Pastebin, Bitly e altri siti di terze parti verranno sistematicamente rimossi.
* Come in qualsiasi forum della community, il supporto è fornito volontariamente dai membri. Se si necessita di supporto commerciale, è possibile contattare il reparto vendite di Tranquil IT al numero 02.40.97.57.55
Regole del forum della community
* Supporto in inglese su www.reddit.com/r/wapt
* Supporto della community in francese disponibile su questo forum
* Si prega di anteporre [RISOLTO] al titolo dell'argomento se è stato risolto.
* Si prega di non modificare un argomento contrassegnato con [RISOLTO]. Aprire un nuovo argomento facendo riferimento a quello precedente.
* Specificare la versione di WAPT installata, la versione completa e il numero di build (2.2.1.11957 / 2.2.2.12337 / ecc.) nonché l'edizione Enterprise/Discovery.
* Le versioni 1.8.2 e precedenti non sono più supportate. Le uniche domande accettate relative alla versione 1.8.2 riguardano l'aggiornamento a una versione supportata (2.1, 2.2, ecc.).
* Specificare il sistema operativo del server (Linux/Windows) e la versione (Debian Buster/Bullseye - CentOS 7 - Windows Server 2012/2016/2019).
* Specificare il sistema operativo della macchina di amministrazione/creazione dei pacchetti e della macchina con l'agente problematico, se applicabile (Windows 7/10/11/Debian 11/ecc.).
* Evitare di porre più domande quando si apre una discussione, altrimenti potrebbe essere ignorata. Se ci sono più discussioni, aprirle separatamente, preferibilmente una dopo l'altra e non tutte contemporaneamente (ovvero, non intasare il forum).
* Includere frammenti di codice, screenshot e altre immagini direttamente nel post. I link a Pastebin, Bitly e altri siti di terze parti verranno sistematicamente rimossi.
* Come in qualsiasi forum della community, il supporto è fornito volontariamente dai membri. Se si necessita di supporto commerciale, è possibile contattare il reparto vendite di Tranquil IT al numero 02.40.97.57.55
Buongiorno,
Grazie per il tuo aiuto. Riesco a trovare il file setup.py solo nella cartella WAPT\WAPTUPGRADE.
Non ho alcun file con quel nome direttamente nella directory WAPT
Allego un'immagine dei file py che si trovano nella mia cartella wapt
Includo il contenuto del file setup.py perché non posso incollarlo come allegato
grazie per l'aiuto
Knpc FILE SETUP.PY
# -*- codifica: utf-8 -*-
importa da setuphelpers *
importare il sistema operativo
importa _winreg
importa file temporaneo
importa shutil
# chiave/e di registro in cui WAPT troverà come rimuovere l'applicazione/le applicazioni
chiave di disinstallazione = []
def update_sources():
file = [
'comune.py',
'setuphelpers.py',
'wapt-get.exe',
'wapt-get.exe.manifest',
'wapt-get.py',
'waptdevutils.py',
'waptpackage.py',
'windnsquery.py',
'wapttray.exe',
'waptexit.exe',
'keyfinder.py',
'COPIA.txt',
'modelli',
'waptconsole.exe',
'waptconsole.exe.manifest',
'waptservice',
'lingue',
r'lib\site-packages\babel\__init__.py',
r'lib\site-packages\babel\_compat.py',
r'lib\site-packages\babel\core.py',
r'lib\site-packages\babel\global.dat',
r'lib\site-packages\babel\localtime',
r'lib\site-packages\babel\plural.py',
r'lib\site-packages\babel\localedata\en.dat',
r'lib\site-packages\babel\localedata\fr.dat',
r'lib\site-packages\babel\messages',
r'lib\site-packages\babel\support.py',
r'lib\site-packages\babel\compat.py',
r'lib\site-packages\babel\dates.py',
r'lib\site-packages\babel\localedata.py',
r'lib\site-packages\babel\numbers.py',
r'lib\site-packages\babel\util.py',
r'lib\site-packages\flask_babel',
r'lib\site-packages\pytz',
r'lib\site-packages\speaklater',
r'lib\site-packages\requests_kerberos_sspi',
r'lib\site-packages\lib\site-packages\flask_kerberos_sspi.py',
r'lib\site-packages\kerberos_sspi.py',
r'lib\site-packages\wapt.pth',
]
def ignore(src,names):
risultato = []
per nome nei nomi:
per il modello in ['*.pyc','*.exe']:
se glob.fnmatch.fnmatch(nome,modello):
risultato.aggiungi(nome)
restituisci il risultato
checkout_dir = os.path.abspath(os.path.join(os.getcwd(),'..'))
# directory delle patch di pulizia
se os.path.exists(os.path.join(checkout_dir,'waptupgrade','patches')):
shutil.rmtree(os.path.join(checkout_dir,'waptupgrade','patches'))
os.makedirs(os.path.join(checkout_dir,'waptupgrade','patch'))
per f nei file:
fn = os.path.join(checkout_dir,f)
target_fn = os.path.join(checkout_dir,'waptupgrade','patch',f)
se os.path.isfile(fn):
se non os.path.exists(os.path.dirname(target_fn)):
os.makedirs(os.path.dirname(target_fn))
filecopyto(fn,target_fn)
elif os.path.isdir(fn):
copytree2(
src=fn,
dst=target_fn,
onreplace = default_overwrite,
ignorare=ignorare)
restituisci Vero
def update_control(voce):
"""Aggiorna il file di controllo del pacchetto prima del caricamento della build"""
se update_sources():
waptget = get_file_properties(r'patches\wapt-get.exe')
rev = open('../versione').read().strip()
entry.package = '%s-waptupgrade' % WAPT.config.get('globale','prefisso_pacchetto_predefinito')
entry.version = '%s-%s' % (waptget['FileVersion'],rev)
altro:
print(u'Mantenimento dei dati di controllo correnti %s (%s)'%(control.package,control.version))
def update_registry_version(versione):
# aggiorna il registro
con _winreg.CreateKeyEx(HKEY_LOCAL_MACHINE,r'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\WAPT_is1',\
0, _winreg.KEY_READ| _winreg.KEY_WRITE ) come waptis:
reg_setvalue(waptis,"DisplayName","WAPT %s" % versione)
reg_setvalue(waptis,"DisplayVersion","WAPT %s" % versione)
reg_setvalue(waptis,"Data di installazione",datacorrente())
def copytree2(src, dst, ignore=None, onreplace=default_skip, oncopy=default_oncopy, enable_replace_at_reboot=True, onerror=None):
"""Copia la directory src nella directory dst. Se non esiste, viene creata la directory dst
src può essere relativo alla directory temporanea di installazione
oncopy viene chiamato per ogni copia del file. Se viene restituito False, la copia viene saltata
onreplace viene chiamato quando un file verrà sovrascritto.
"""
logger.debug('Copia l'albero da "%s" a "%s"' % (ensure_unicode(src),ensure_unicode(dst)))
# percorso relativo alla directory temporanea...
tempdir = os.getcwd()
se non os.path.isdir(src) e os.path.isdir(os.path.join(tempdir,src)):
src = os.path.join(tempdir,src)
nomi = os.listdir(src)
se callable(ignore) e ignore non è None:
ignored_names = ignore(src, names)
altro:
nomi_ignorati = set()
se non os.path.isdir(dst):
if oncopy('crea directory',src,dst):
os.makedirs(dst)
errori = []
per nome nei nomi:
se il nome è in ignored_names:
continua
srcname = os.path.join(src, nome)
dstname = os.path.join(dst, nome)
Tentativo:
se os.path.isdir(nomesrc):
se oncopy('directory',nomesorgente,nomedst):
copytree2(nomeorigine, nomeorigine, ignora = ignora, sostituisci=sostituisci, copia=copia)
altro:
se os.path.isfile(nome_destinazione):
se onreplace(srcname,dstname) e oncopy('sovrascrive',srcname,dstname):
os.unlink(nome_dst)
shutil.copy2(srcname, dstname)
altro:
se oncopy('copia',nomesorgente,nomedestinazione):
shutil.copy2(srcname, dstname)
eccetto (IOError, os.error) come motivo:
#print(u'IO Errore durante la copia da "%s" a "%s": %s' % (ensure_unicode(src),ensure_unicode(dst),ensure_unicode(why)))
se onerror non è None e callable(onerror):
Tentativo:
onerror(nome sorgente,nome destinazione,perché)
eccetto Eccezione come e:
errori.append((nomesrc,nomedst,garantisci_unicode(e)))
altro:
errori.append((nomesrc,nomedst,assicura_unicode(perché)))
# cattura l'errore dal copytree ricorsivo in modo che possiamo
# continua con altri file
eccetto shutil.Error come err:
logger.critical(u'shutil Errore durante la copia da "%s" a "%s": %s' % (ensure_unicode(srcname),ensure_unicode(dstname),ensure_unicode(err)))
errori.estendere(err.args[0])
Tentativo:
shutil.copystat(src, dst)
A parte OSError, perché?
se WindowsError non è None e isinstance(perché, WindowsError):
# La copia dei tempi di accesso ai file potrebbe non riuscire su Windows
passaggio
altro:
print(u'Errore durante la copia delle statistiche da "%s" a "%s": %s' % (ensure_unicode(src),ensure_unicode(dst),ensure_unicode(why)))
errori.append((src, dst, str(perché)))
se errori:
raise shutil.Errore, errori
def add_at_cmd(cmd,delay=1):
importa data e ora
at_time = (datetime.datetime.now() + datetime.timedelta(minuti=ritardo)).strftime('%H:%M:%S')
stampa(esegui('a %s "%s"'%(at_time,cmd)))
def install():
# se vuoi modificare le chiavi in base all'ambiente (parametri win32/win64...)
print(u'Aggiornamento parziale del client WAPT')
killalltasks('wapttray.exe')
killalltasks('waptconsole.exe')
def onerror(nomesorgente,nomesorgente,e):
stampa u"Errore %s %s %s" %(srcname,dstname,ensure_unicode(e))
se e[0] == 5: # bloccato
filecopyto(nomeorigine,nomedestinazione+'.pending')
replace_at_next_reboot(Nessuno, nome_destinazione)
altro:
alzare e
def check_exe_version(src,dst):
se os.path.splitext(dst)[1] in ('.exe','.dll'):
Tentativo:
ov = get_file_properties(dst)['VersioneFile']
nv = get_file_properties(src)['VersioneFile']
ritorna Versione(ov)
tranne:
restituisci Vero
altro:
restituisci Vero
copytree2('patch',WAPT.wapt_base_dir,
onreplace = check_exe_version,
unerrore = unerrore)
aggiorna_versione_registro(controllo.versione)
# il riavvio del servizio non può essere eseguito dal servizio...
se service_installed('waptservice') e service_is_running('waptservice'):
richieste di importazione, json
Tentativo:
res = json.loads(requests.get('http://127.0.0.1:8088/waptservicerestart.json').testo)
tranne:
tmp_bat = tempfile.NamedTemporaryFile(prefisso='waptrestart',suffisso='.cmd',modalità='wt',eliminazione=False)
tmp_bat.write('net stop waptservice\n')
tmp_bat.write('net start waptservice\n')
tmp_bat.write('del "%s"\n'%tmp_bat.name)
tmp_bat.close()
add_at_cmd(tmp_bat.name)
print(u'Aggiornamento completato')
Grazie per il tuo aiuto. Riesco a trovare il file setup.py solo nella cartella WAPT\WAPTUPGRADE.
Non ho alcun file con quel nome direttamente nella directory WAPT
Allego un'immagine dei file py che si trovano nella mia cartella wapt
Includo il contenuto del file setup.py perché non posso incollarlo come allegato
grazie per l'aiuto
Knpc FILE SETUP.PY
# -*- codifica: utf-8 -*-
importa da setuphelpers *
importare il sistema operativo
importa _winreg
importa file temporaneo
importa shutil
# chiave/e di registro in cui WAPT troverà come rimuovere l'applicazione/le applicazioni
chiave di disinstallazione = []
def update_sources():
file = [
'comune.py',
'setuphelpers.py',
'wapt-get.exe',
'wapt-get.exe.manifest',
'wapt-get.py',
'waptdevutils.py',
'waptpackage.py',
'windnsquery.py',
'wapttray.exe',
'waptexit.exe',
'keyfinder.py',
'COPIA.txt',
'modelli',
'waptconsole.exe',
'waptconsole.exe.manifest',
'waptservice',
'lingue',
r'lib\site-packages\babel\__init__.py',
r'lib\site-packages\babel\_compat.py',
r'lib\site-packages\babel\core.py',
r'lib\site-packages\babel\global.dat',
r'lib\site-packages\babel\localtime',
r'lib\site-packages\babel\plural.py',
r'lib\site-packages\babel\localedata\en.dat',
r'lib\site-packages\babel\localedata\fr.dat',
r'lib\site-packages\babel\messages',
r'lib\site-packages\babel\support.py',
r'lib\site-packages\babel\compat.py',
r'lib\site-packages\babel\dates.py',
r'lib\site-packages\babel\localedata.py',
r'lib\site-packages\babel\numbers.py',
r'lib\site-packages\babel\util.py',
r'lib\site-packages\flask_babel',
r'lib\site-packages\pytz',
r'lib\site-packages\speaklater',
r'lib\site-packages\requests_kerberos_sspi',
r'lib\site-packages\lib\site-packages\flask_kerberos_sspi.py',
r'lib\site-packages\kerberos_sspi.py',
r'lib\site-packages\wapt.pth',
]
def ignore(src,names):
risultato = []
per nome nei nomi:
per il modello in ['*.pyc','*.exe']:
se glob.fnmatch.fnmatch(nome,modello):
risultato.aggiungi(nome)
restituisci il risultato
checkout_dir = os.path.abspath(os.path.join(os.getcwd(),'..'))
# directory delle patch di pulizia
se os.path.exists(os.path.join(checkout_dir,'waptupgrade','patches')):
shutil.rmtree(os.path.join(checkout_dir,'waptupgrade','patches'))
os.makedirs(os.path.join(checkout_dir,'waptupgrade','patch'))
per f nei file:
fn = os.path.join(checkout_dir,f)
target_fn = os.path.join(checkout_dir,'waptupgrade','patch',f)
se os.path.isfile(fn):
se non os.path.exists(os.path.dirname(target_fn)):
os.makedirs(os.path.dirname(target_fn))
filecopyto(fn,target_fn)
elif os.path.isdir(fn):
copytree2(
src=fn,
dst=target_fn,
onreplace = default_overwrite,
ignorare=ignorare)
restituisci Vero
def update_control(voce):
"""Aggiorna il file di controllo del pacchetto prima del caricamento della build"""
se update_sources():
waptget = get_file_properties(r'patches\wapt-get.exe')
rev = open('../versione').read().strip()
entry.package = '%s-waptupgrade' % WAPT.config.get('globale','prefisso_pacchetto_predefinito')
entry.version = '%s-%s' % (waptget['FileVersion'],rev)
altro:
print(u'Mantenimento dei dati di controllo correnti %s (%s)'%(control.package,control.version))
def update_registry_version(versione):
# aggiorna il registro
con _winreg.CreateKeyEx(HKEY_LOCAL_MACHINE,r'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\WAPT_is1',\
0, _winreg.KEY_READ| _winreg.KEY_WRITE ) come waptis:
reg_setvalue(waptis,"DisplayName","WAPT %s" % versione)
reg_setvalue(waptis,"DisplayVersion","WAPT %s" % versione)
reg_setvalue(waptis,"Data di installazione",datacorrente())
def copytree2(src, dst, ignore=None, onreplace=default_skip, oncopy=default_oncopy, enable_replace_at_reboot=True, onerror=None):
"""Copia la directory src nella directory dst. Se non esiste, viene creata la directory dst
src può essere relativo alla directory temporanea di installazione
oncopy viene chiamato per ogni copia del file. Se viene restituito False, la copia viene saltata
onreplace viene chiamato quando un file verrà sovrascritto.
"""
logger.debug('Copia l'albero da "%s" a "%s"' % (ensure_unicode(src),ensure_unicode(dst)))
# percorso relativo alla directory temporanea...
tempdir = os.getcwd()
se non os.path.isdir(src) e os.path.isdir(os.path.join(tempdir,src)):
src = os.path.join(tempdir,src)
nomi = os.listdir(src)
se callable(ignore) e ignore non è None:
ignored_names = ignore(src, names)
altro:
nomi_ignorati = set()
se non os.path.isdir(dst):
if oncopy('crea directory',src,dst):
os.makedirs(dst)
errori = []
per nome nei nomi:
se il nome è in ignored_names:
continua
srcname = os.path.join(src, nome)
dstname = os.path.join(dst, nome)
Tentativo:
se os.path.isdir(nomesrc):
se oncopy('directory',nomesorgente,nomedst):
copytree2(nomeorigine, nomeorigine, ignora = ignora, sostituisci=sostituisci, copia=copia)
altro:
se os.path.isfile(nome_destinazione):
se onreplace(srcname,dstname) e oncopy('sovrascrive',srcname,dstname):
os.unlink(nome_dst)
shutil.copy2(srcname, dstname)
altro:
se oncopy('copia',nomesorgente,nomedestinazione):
shutil.copy2(srcname, dstname)
eccetto (IOError, os.error) come motivo:
#print(u'IO Errore durante la copia da "%s" a "%s": %s' % (ensure_unicode(src),ensure_unicode(dst),ensure_unicode(why)))
se onerror non è None e callable(onerror):
Tentativo:
onerror(nome sorgente,nome destinazione,perché)
eccetto Eccezione come e:
errori.append((nomesrc,nomedst,garantisci_unicode(e)))
altro:
errori.append((nomesrc,nomedst,assicura_unicode(perché)))
# cattura l'errore dal copytree ricorsivo in modo che possiamo
# continua con altri file
eccetto shutil.Error come err:
logger.critical(u'shutil Errore durante la copia da "%s" a "%s": %s' % (ensure_unicode(srcname),ensure_unicode(dstname),ensure_unicode(err)))
errori.estendere(err.args[0])
Tentativo:
shutil.copystat(src, dst)
A parte OSError, perché?
se WindowsError non è None e isinstance(perché, WindowsError):
# La copia dei tempi di accesso ai file potrebbe non riuscire su Windows
passaggio
altro:
print(u'Errore durante la copia delle statistiche da "%s" a "%s": %s' % (ensure_unicode(src),ensure_unicode(dst),ensure_unicode(why)))
errori.append((src, dst, str(perché)))
se errori:
raise shutil.Errore, errori
def add_at_cmd(cmd,delay=1):
importa data e ora
at_time = (datetime.datetime.now() + datetime.timedelta(minuti=ritardo)).strftime('%H:%M:%S')
stampa(esegui('a %s "%s"'%(at_time,cmd)))
def install():
# se vuoi modificare le chiavi in base all'ambiente (parametri win32/win64...)
print(u'Aggiornamento parziale del client WAPT')
killalltasks('wapttray.exe')
killalltasks('waptconsole.exe')
def onerror(nomesorgente,nomesorgente,e):
stampa u"Errore %s %s %s" %(srcname,dstname,ensure_unicode(e))
se e[0] == 5: # bloccato
filecopyto(nomeorigine,nomedestinazione+'.pending')
replace_at_next_reboot(Nessuno, nome_destinazione)
altro:
alzare e
def check_exe_version(src,dst):
se os.path.splitext(dst)[1] in ('.exe','.dll'):
Tentativo:
ov = get_file_properties(dst)['VersioneFile']
nv = get_file_properties(src)['VersioneFile']
ritorna Versione(ov)
tranne:
restituisci Vero
altro:
restituisci Vero
copytree2('patch',WAPT.wapt_base_dir,
onreplace = check_exe_version,
unerrore = unerrore)
aggiorna_versione_registro(controllo.versione)
# il riavvio del servizio non può essere eseguito dal servizio...
se service_installed('waptservice') e service_is_running('waptservice'):
richieste di importazione, json
Tentativo:
res = json.loads(requests.get('http://127.0.0.1:8088/waptservicerestart.json').testo)
tranne:
tmp_bat = tempfile.NamedTemporaryFile(prefisso='waptrestart',suffisso='.cmd',modalità='wt',eliminazione=False)
tmp_bat.write('net stop waptservice\n')
tmp_bat.write('net start waptservice\n')
tmp_bat.write('del "%s"\n'%tmp_bat.name)
tmp_bat.close()
add_at_cmd(tmp_bat.name)
print(u'Aggiornamento completato')
Ecco qui 
: FILE WAPT-GET.INI:
[global]
waptupdate_task_period=120
use_hostpackages=1
repo_url=https://srvwapt.mont-tremblant.local/wapt
wapt_server=https://srvwapt.mont-tremblant.local
private_key=C:\private\monttremblant.pem
templates_repo_url=http://wapt.tranquil.it/wapt
default_sources_root=E:\wapt\WaptDev
default_package_prefix=mtt
loglevel=warning
[options]
server_uuid=f444b1ab-6e89-47f9-8d3a-8f8d3ffe1a49
- Giusto per chiarire, sono su un server IIS
- Ricevo lo stesso messaggio "connessione rifiutata" quando provo a connettermi alla console. Le due cose sono correlate?
In questo file .ini non è presente alcuna voce relativa al database. È normale?
Grazie.
: FILE WAPT-GET.INI:
[global]
waptupdate_task_period=120
use_hostpackages=1
repo_url=https://srvwapt.mont-tremblant.local/wapt
wapt_server=https://srvwapt.mont-tremblant.local
private_key=C:\private\monttremblant.pem
templates_repo_url=http://wapt.tranquil.it/wapt
default_sources_root=E:\wapt\WaptDev
default_package_prefix=mtt
loglevel=warning
[options]
server_uuid=f444b1ab-6e89-47f9-8d3a-8f8d3ffe1a49
- Giusto per chiarire, sono su un server IIS
- Ricevo lo stesso messaggio "connessione rifiutata" quando provo a connettermi alla console. Le due cose sono correlate?
In questo file .ini non è presente alcuna voce relativa al database. È normale?
Grazie.
Puoi provare a fare un ping a questo indirizzo: https://srvwapt.mont-tremblant.local/wapt
e vedere cosa restituisce l'URL.
e vedere cosa restituisce l'URL.
Ciao,
riesco a fare il ping a srvwapt.mont-tremblant.local
ma non a https://srvwapt.mont-tremblant.local/wapt. Credo sia normale.
La console che sto usando è direttamente sul server Wapt.
Per vostra informazione, funziona con localhost:8088; ho accesso alla console.
Grazie.
riesco a fare il ping a srvwapt.mont-tremblant.local
ma non a https://srvwapt.mont-tremblant.local/wapt. Credo sia normale.
La console che sto usando è direttamente sul server Wapt.
Per vostra informazione, funziona con localhost:8088; ho accesso alla console.
Grazie.
Ciao,
puoi darci maggiori informazioni?
Si tratta di un server Windows o Linux?
Su questi server sono ospitati altri servizi oltre a WAPT?
Simon
puoi darci maggiori informazioni?
Si tratta di un server Windows o Linux?
Su questi server sono ospitati altri servizi oltre a WAPT?
Simon
