Startup.java

  1. /*
  2.  * GovWay - A customizable API Gateway
  3.  * https://govway.org
  4.  *
  5.  * Copyright (c) 2005-2025 Link.it srl (https://link.it).
  6.  *
  7.  * This program is free software: you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License version 3, as published by
  9.  * the Free Software Foundation.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  18.  *
  19.  */


  20. package org.openspcoop2.core.monitor.rs.server.config;

  21. import java.io.File;
  22. import java.io.InputStream;
  23. import java.sql.Connection;
  24. import java.util.HashMap;
  25. import java.util.List;
  26. import java.util.Map;
  27. import java.util.Properties;

  28. import javax.servlet.ServletContextEvent;
  29. import javax.servlet.ServletContextListener;

  30. import org.apache.commons.lang.StringUtils;
  31. import org.openspcoop2.core.config.driver.ExtendedInfoManager;
  32. import org.openspcoop2.core.id.IDSoggetto;
  33. import org.openspcoop2.core.registry.constants.PddTipologia;
  34. import org.openspcoop2.core.registry.driver.DriverRegistroServiziException;
  35. import org.openspcoop2.core.registry.driver.DriverRegistroServiziNotFound;
  36. import org.openspcoop2.core.registry.driver.FiltroRicerca;
  37. import org.openspcoop2.core.registry.driver.FiltroRicercaSoggetti;
  38. import org.openspcoop2.core.registry.driver.db.DriverRegistroServiziDB;
  39. import org.openspcoop2.core.transazioni.utils.DumpUtils;
  40. import org.openspcoop2.generic_project.utils.ServiceManagerProperties;
  41. import org.openspcoop2.pdd.config.ConfigurazioneNodiRuntime;
  42. import org.openspcoop2.pdd.core.byok.BYOKMapProperties;
  43. import org.openspcoop2.pdd.core.dynamic.DynamicInfo;
  44. import org.openspcoop2.pdd.core.dynamic.DynamicUtils;
  45. import org.openspcoop2.pdd.services.ServicesUtils;
  46. import org.openspcoop2.protocol.engine.ProtocolFactoryManager;
  47. import org.openspcoop2.protocol.sdk.ConfigurazionePdD;
  48. import org.openspcoop2.utils.LoggerWrapperFactory;
  49. import org.openspcoop2.utils.UtilsException;
  50. import org.openspcoop2.utils.UtilsRuntimeException;
  51. import org.openspcoop2.utils.certificate.byok.BYOKManager;
  52. import org.openspcoop2.utils.certificate.hsm.HSMManager;
  53. import org.openspcoop2.utils.certificate.hsm.HSMUtils;
  54. import org.openspcoop2.utils.properties.MapProperties;
  55. import org.openspcoop2.utils.resources.Loader;
  56. import org.openspcoop2.utils.security.ProviderUtils;
  57. import org.openspcoop2.web.monitor.core.bean.LoginBean;
  58. import org.openspcoop2.web.monitor.core.core.Utility;
  59. import org.slf4j.Logger;
  60. /**
  61.  * Questa classe si occupa di inizializzare tutte le risorse necessarie al webService.
  62.  *
  63.  *
  64.  * @author Andrea Poli (apoli@link.it)
  65.  * @author $Author$
  66.  * @version $Rev$, $Date$
  67.  *
  68.  */

  69. public class Startup implements ServletContextListener {

  70.     private static Logger log = null;
  71.     public static Logger getLog() {
  72.         return log;
  73.     }
  74.    
  75.     private static InitRuntimeConfigReader initRuntimeConfigReader;
  76.    
  77.    
  78.     @Override
  79.     public void contextDestroyed(ServletContextEvent sce) {
  80.         if(Startup.log!=null)
  81.             Startup.log.info("Undeploy webService in corso...");

  82.          if(initRuntimeConfigReader!=null) {
  83.              initRuntimeConfigReader.setStop(true);
  84.          }
  85.        
  86.         if(Startup.log!=null)
  87.             Startup.log.info("Undeploy webService effettuato.");

  88.     }

  89.     @Override
  90.     public void contextInitialized(ServletContextEvent sce) {
  91.        
  92.         Startup.initLog();
  93.        
  94.         Startup.initResources();

  95.     }
  96.    
  97.    
  98.     // LOG
  99.    
  100.     private static boolean initializedLog = false;
  101.     public static boolean isInitializedLog() {
  102.         return initializedLog;
  103.     }

  104.     public static synchronized String initLog(){
  105.        
  106.         String confDir = null;
  107.         try{
  108.             InputStream is = Startup.class.getResourceAsStream("/rs-api-monitor.properties");
  109.             try{
  110.                 if(is!=null){
  111.                     Properties p = new Properties();
  112.                     p.load(is);
  113.                     confDir = p.getProperty("confDirectory");
  114.                     if(confDir!=null){
  115.                         confDir = confDir.trim();
  116.                     }
  117.                 }
  118.             }finally{
  119.                 try{
  120.                     if(is!=null){
  121.                         is.close();
  122.                     }
  123.                 }catch(Exception eClose){
  124.                     // close
  125.                 }
  126.             }

  127.         }catch(Exception e){
  128.             // ignore
  129.         }
  130.        
  131.         if(!Startup.initializedLog){
  132.            
  133.             try{
  134.                 Startup.log = LoggerWrapperFactory.getLogger(Startup.class);
  135.                 LoggerProperties.initialize(Startup.log, confDir, null);
  136.                 Startup.initializedLog = true;
  137.                 Startup.log = LoggerProperties.getLoggerCore();
  138.                
  139.             }catch(Exception e){
  140.                 throw new UtilsRuntimeException(e.getMessage(),e);
  141.             }
  142.         }
  143.        
  144.         return confDir;
  145.     }
  146.    
  147.    
  148.     // RESOURCES
  149.    
  150.     private static boolean initializedResources = false;
  151.    
  152.     public static synchronized void initResources(){
  153.         if(!Startup.initializedResources){
  154.            
  155.             String confDir = Startup.initLog();
  156.            
  157.             Startup.log.info("Inizializzazione rs api monitor in corso...");
  158.            
  159.             if(!ServerProperties.initialize(confDir,Startup.log)){
  160.                 return;
  161.             }
  162.             ServerProperties serverProperties = null;
  163.             try {
  164.                 serverProperties = ServerProperties.getInstance();
  165.             } catch (Exception e) {
  166.                 doError("Errore durante l'inizializzazione del serverProperties",e);
  167.             }
  168.            
  169.             // Inizializzo Controlli connessioni
  170.             try {
  171.                 Logger logR = Startup.log;
  172.                 ServicesUtils.initCheckConnectionDB(logR, serverProperties.isJdbcCloseConnectionCheckIsClosed(), serverProperties.isJdbcCloseConnectionCheckAutocommit());
  173.                
  174.                 DBManager.setCheckLogger(logR);
  175.                 DBManager.setCheckIsClosed(serverProperties.isJdbcCloseConnectionCheckIsClosed());
  176.                 DBManager.setCheckAutocommit(serverProperties.isJdbcCloseConnectionCheckAutocommit());
  177.             } catch (Exception e) {
  178.                 doError("Inizializzazione controlli connessione non riuscita",e);
  179.             }
  180.            
  181.             // Map (environment)
  182.             try {
  183.                 String mapConfig = serverProperties.getEnvMapConfig();
  184.                 if(StringUtils.isNotEmpty(mapConfig)) {
  185.                     Startup.log.info("Inizializzazione environment in corso...");
  186.                     MapProperties.initialize(Startup.log, mapConfig, serverProperties.isEnvMapConfigRequired());
  187.                     MapProperties mapProperties = MapProperties.getInstance();
  188.                     mapProperties.initEnvironment();
  189.                     String msgInit = "Environment inizializzato con le variabili definite nel file '"+mapConfig+"'"+
  190.                             "\n\tJavaProperties: "+mapProperties.getJavaMap().keys()+
  191.                             "\n\tEnvProperties: "+mapProperties.getEnvMap().keys()+
  192.                             "\n\tObfuscateMode: "+mapProperties.getObfuscateModeDescription()+
  193.                             "\n\tObfuscatedJavaKeys: "+mapProperties.getObfuscatedJavaKeys()+
  194.                             "\n\tObfuscatedEnvKeys: "+mapProperties.getObfuscatedEnvKeys();
  195.                     Startup.log.info(msgInit);
  196.                 }
  197.             } catch (Exception e) {
  198.                 doError("Errore durante l'inizializzazione dell'ambiente",e);
  199.             }
  200.            
  201.             // Load Security Provider
  202.             Startup.log.info("Inizializzazione security provider...");
  203.             try {
  204.                 if(serverProperties.isSecurityLoadBouncyCastleProvider()) {
  205.                     ProviderUtils.addBouncyCastleAfterSun(true);
  206.                     Startup.log.info("Aggiunto Security Provider org.bouncycastle.jce.provider.BouncyCastleProvider");
  207.                 }
  208.             } catch (Exception e) {
  209.                 doError("Errore durante l'inizializzazione dei security provider",e);
  210.             }
  211.             Startup.log.info("Inizializzazione security provider effettuata con successo");
  212.            
  213.             // inizializzo HSM Manager
  214.             try {
  215.                 String hsmConfig = serverProperties.getHSMConfigurazione();
  216.                 if(StringUtils.isNotEmpty(hsmConfig)) {
  217.                     Startup.log.info("Inizializzazione HSM in corso...");
  218.                     File f = new File(hsmConfig);
  219.                     HSMManager.init(f, serverProperties.isHSMRequired(), log, false);
  220.                     HSMUtils.setHsmConfigurableKeyPassword(serverProperties.isHSMKeyPasswordConfigurable());
  221.                     Startup.log.info("Inizializzazione HSM effettuata con successo");
  222.                 }
  223.             } catch (Exception e) {
  224.                 doError("Errore durante l'inizializzazione del manager HSM",e);
  225.             }
  226.            
  227.             // inizializzo BYOK Manager
  228.             BYOKManager byokManager = null;
  229.             try {
  230.                 String byokConfig = serverProperties.getBYOKConfigurazione();
  231.                 if(StringUtils.isNotEmpty(byokConfig)) {
  232.                     Startup.log.info("Inizializzazione BYOK in corso...");
  233.                     File f = new File(byokConfig);
  234.                     BYOKManager.init(f, serverProperties.isBYOKRequired(), log);
  235.                     byokManager = BYOKManager.getInstance();
  236.                     String msgInit = "Gestore BYOK inizializzato;"+
  237.                             "\n\tHSM registrati: "+byokManager.getKeystoreTypes()+
  238.                             "\n\tSecurityEngine registrati: "+byokManager.getSecurityEngineTypes()+
  239.                             "\n\tGovWaySecurityEngine: "+byokManager.getSecurityEngineGovWayDescription();
  240.                     Startup.log.info(msgInit);
  241.                 }
  242.             } catch (Exception e) {
  243.                 doError("Errore durante l'inizializzazione del manager BYOK",e);
  244.             }
  245.            
  246.             // Secrets (environment)
  247.             boolean reInitSecretMaps = false;
  248.             try {
  249.                 String secretsConfig = serverProperties.getBYOKEnvSecretsConfig();
  250.                 if(byokManager!=null && StringUtils.isNotEmpty(secretsConfig)) {
  251.                     Startup.log.info("Inizializzazione secrets in corso...");
  252.                    
  253.                     boolean useSecurityEngine = true;
  254.                     Map<String, Object> dynamicMap = new HashMap<>();
  255.                     DynamicInfo dynamicInfo = new  DynamicInfo();
  256.                     DynamicUtils.fillDynamicMap(log, dynamicMap, dynamicInfo);
  257.                     if(byokManager.isBYOKRemoteGovWayNodeUnwrapConfig()) {
  258.                         // i secrets cifrati verranno riletti quando i nodi sono attivi (verificato in InitRuntimeConfigReader)
  259.                         reInitSecretMaps = true;
  260.                         useSecurityEngine = false;
  261.                     }
  262.                    
  263.                     BYOKMapProperties.initialize(Startup.log, secretsConfig, serverProperties.isBYOKEnvSecretsConfigRequired(),
  264.                             useSecurityEngine,
  265.                             dynamicMap, true);
  266.                     BYOKMapProperties secretsProperties = BYOKMapProperties.getInstance();
  267.                     secretsProperties.initEnvironment();
  268.                     String msgInit = "Environment inizializzato con i secrets definiti nel file '"+secretsConfig+"'"+
  269.                             "\n\tJavaProperties: "+secretsProperties.getJavaMap().keys()+
  270.                             "\n\tEnvProperties: "+secretsProperties.getEnvMap().keys()+
  271.                             "\n\tObfuscateMode: "+secretsProperties.getObfuscateModeDescription();
  272.                     Startup.log.info(msgInit);
  273.                 }
  274.             } catch (Exception e) {
  275.                 doError("Errore durante l'inizializzazione dell'ambiente (secrets)",e);
  276.             }      
  277.            
  278.             // Database
  279.             if(!DatasourceProperties.initialize(confDir,Startup.log)){
  280.                 return;
  281.             }
  282.             Startup.log.info("Inizializzazione DBManager in corso...");
  283.             try{
  284.                 DatasourceProperties dbProperties = DatasourceProperties.getInstance();
  285.                 DBManager.initialize(dbProperties.getConfigDataSource(), dbProperties.getConfigDataSourceContext(), dbProperties.getConfigTipoDatabase(),
  286.                         dbProperties.getTracceDataSource(), dbProperties.getTracceDataSourceContext(), dbProperties.getTracceTipoDatabase(),
  287.                         dbProperties.getStatisticheDataSource(), dbProperties.getStatisticheDataSourceContext(), dbProperties.getStatisticheTipoDatabase(),
  288.                         dbProperties.isShowSql());
  289.             }catch(Exception e){
  290.                 throw new UtilsRuntimeException(e.getMessage(),e);
  291.             }
  292.             Startup.log.info("Inizializzazione DBManager effettuata con successo");
  293.            
  294.             // Extended Manager
  295.             Startup.log.info("Inizializzazione ExtendedInfoManager in corso...");
  296.             try{
  297.                 ExtendedInfoManager.initialize(new Loader(), null, null, null);
  298.             }catch(Exception e){
  299.                 throw new UtilsRuntimeException(e.getMessage(),e);
  300.             }
  301.             Startup.log.info("Inizializzazione ExtendedInfoManager effettuata con successo");
  302.            
  303.             // inizializza nodi runtime
  304.             Startup.log.info("Inizializzazione NodiRuntime in corso...");
  305.             try {
  306.                 boolean configFileRequired = false;
  307.                 ConfigurazioneNodiRuntime.initialize(serverProperties.getConfigurazioneNodiRuntime(), configFileRequired);
  308.             } catch (Exception e) {
  309.                 doError("Errore durante l'inizializzazione del gestore dei nodi run",e);
  310.             }
  311.             Startup.log.info("Inizializzazione NodiRuntime effettuata con successo");
  312.            
  313.             // Protocol Factory Manager
  314.             Startup.log.info("Inizializzazione ProtocolFactoryManager in corso...");
  315.             ServerProperties properties = null;
  316.             try {
  317.                 properties = ServerProperties.getInstance();
  318.                 ConfigurazionePdD configPdD = new ConfigurazionePdD();
  319.                 configPdD.setAttesaAttivaJDBC(-1);
  320.                 configPdD.setCheckIntervalJDBC(-1);
  321.                 configPdD.setLoader(new Loader(Startup.class.getClassLoader()));
  322.                 configPdD.setLog(Startup.log);
  323.                 ProtocolFactoryManager.initialize(Startup.log, configPdD,
  324.                         properties.getProtocolloDefault());
  325.             } catch (Exception e) {
  326.                 throw new UtilsRuntimeException(e.getMessage(),e);
  327.             }
  328.             Startup.log.info("ProtocolFactoryManager DBManager effettuata con successo");
  329.            
  330.             // Risorse statiche
  331.             Startup.log.info("Inizializzazione Risorse Statiche Console in corso...");
  332.             try {
  333.                 initResourceConsole();
  334.             } catch (Exception e) {
  335.                 throw new UtilsRuntimeException(e.getMessage(),e);
  336.             }
  337.             Startup.log.info("Inizializzazione Risorse Statiche Console effettuata con successo");
  338.            
  339.             Startup.log.info("Inizializzazione Soglia per Dimensione Messaggi in corso...");
  340.             try {
  341.                 DumpUtils.setThreshold_readInMemory(properties.getTransazioniDettaglioVisualizzazioneMessaggiThreshold());
  342.             } catch (Exception e) {
  343.                 throw new UtilsRuntimeException(e.getMessage(),e);
  344.             }
  345.             Startup.log.info("Inizializzazione Soglia per Dimensione Messaggi effettuata con successo");
  346.                        
  347.             // InitRuntimeConfigReader
  348.             if(reInitSecretMaps) {
  349.                 try{
  350.                     initRuntimeConfigReader = new InitRuntimeConfigReader(serverProperties, ConfigurazioneNodiRuntime.getConfigurazioneNodiRuntime(), reInitSecretMaps);
  351.                     initRuntimeConfigReader.start();
  352.                     Startup.log.info("RuntimeConfigReader avviato con successo.");
  353.                 } catch (Exception e) {
  354.                     /**doError("Errore durante l'inizializzazione del RuntimeConfigReader",e);*/
  355.                     // non sollevo l'eccezione, e' solo una informazione informativa, non voglio mettere un vincolo che serve per forza un nodo acceso
  356.                     Startup.log.error("Errore durante l'inizializzazione del RuntimeConfigReader: "+e.getMessage(),e);
  357.                 }
  358.             }
  359.            
  360.             Startup.initializedResources = true;
  361.            
  362.             Startup.log.info("Inizializzazione rs api monitor effettuata con successo.");
  363.         }
  364.     }

  365.    
  366.     private static void initResourceConsole() throws UtilsException, DriverRegistroServiziException, DriverRegistroServiziNotFound {
  367.         DBManager dbManager = DBManager.getInstance();
  368.         Connection connection = null;
  369.         try {
  370.             connection = dbManager.getConnectionConfig();
  371.             ServiceManagerProperties smp = dbManager.getServiceManagerPropertiesConfig();
  372.            
  373.             Logger logSql = LoggerProperties.getLoggerDAO();
  374.            
  375.             LoginBean lb = new LoginBean(connection, true, smp, logSql);
  376.            
  377.             Utility.setStaticConfigurazioneGenerale(lb.getConfigurazioneGenerale());
  378.            
  379.             boolean multitenantAbilitato = Utility.isMultitenantAbilitato();
  380.            
  381.             Utility.setStaticFiltroDominioAbilitato(multitenantAbilitato); // logiche piu' complesse vanno viste come realizzarle.
  382.            
  383.             DriverRegistroServiziDB driverDB = new DriverRegistroServiziDB(connection, logSql, DatasourceProperties.getInstance().getConfigTipoDatabase());
  384.            
  385.             FiltroRicerca filtroRicercaPdd = new FiltroRicerca();
  386.             filtroRicercaPdd.setTipo(PddTipologia.OPERATIVO.toString());
  387.             List<String> idsPdd = null;
  388.             try {
  389.                 idsPdd = driverDB.getAllIdPorteDominio(filtroRicercaPdd);
  390.             }catch(DriverRegistroServiziNotFound notFound) {    
  391.                 // ignore
  392.             }
  393.             initPdd(idsPdd, driverDB);
  394.            
  395.         } finally {
  396.             dbManager.releaseConnectionConfig(connection);
  397.         }
  398.     }
  399.     private static void initPdd(List<String> idsPdd, DriverRegistroServiziDB driverDB) throws DriverRegistroServiziException, DriverRegistroServiziNotFound {
  400.         if(idsPdd!=null && !idsPdd.isEmpty()) {
  401.             for (String idPdd : idsPdd) {
  402.                 FiltroRicercaSoggetti filtroSoggetti = new FiltroRicercaSoggetti();
  403.                 filtroSoggetti.setNomePdd(idPdd);
  404.                 List<IDSoggetto> idsSoggetti = null;
  405.                 try {
  406.                     idsSoggetti = driverDB.getAllIdSoggetti(filtroSoggetti);
  407.                 }catch(DriverRegistroServiziNotFound notFound) {    
  408.                     // ignore
  409.                 }
  410.                 if(idsSoggetti!=null && !idsSoggetti.isEmpty()) {
  411.                     for (IDSoggetto idSoggetto : idsSoggetti) {
  412.                         Utility.putIdentificativoPorta(idSoggetto.getTipo(), idSoggetto.getNome(), driverDB.getSoggetto(idSoggetto).getIdentificativoPorta());
  413.                     }
  414.                 }
  415.             }
  416.         }
  417.     }
  418.    
  419.     private static void doError(String msg,Exception e) {
  420.         String msgErrore = msg+": " + e.getMessage();
  421.         Startup.log.error(msgErrore,e);
  422.         throw new UtilsRuntimeException(msgErrore,e);
  423.     }
  424. }