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.config.rs.server.config;

  21. import java.io.File;
  22. import java.io.InputStream;
  23. import java.util.HashMap;
  24. import java.util.Map;
  25. import java.util.Properties;

  26. import javax.servlet.ServletContextEvent;
  27. import javax.servlet.ServletContextListener;

  28. import org.apache.commons.lang.StringUtils;
  29. import org.openspcoop2.core.config.driver.ExtendedInfoManager;
  30. import org.openspcoop2.core.constants.CostantiDB;
  31. import org.openspcoop2.monitor.engine.alarm.AlarmConfigProperties;
  32. import org.openspcoop2.monitor.engine.alarm.AlarmEngineConfig;
  33. import org.openspcoop2.monitor.engine.alarm.AlarmManager;
  34. import org.openspcoop2.pdd.config.ConfigurazioneNodiRuntime;
  35. import org.openspcoop2.pdd.core.byok.BYOKMapProperties;
  36. import org.openspcoop2.pdd.core.dynamic.DynamicInfo;
  37. import org.openspcoop2.pdd.core.dynamic.DynamicUtils;
  38. import org.openspcoop2.pdd.services.ServicesUtils;
  39. import org.openspcoop2.utils.LoggerWrapperFactory;
  40. import org.openspcoop2.utils.UtilsRuntimeException;
  41. import org.openspcoop2.utils.certificate.byok.BYOKManager;
  42. import org.openspcoop2.utils.certificate.hsm.HSMManager;
  43. import org.openspcoop2.utils.certificate.hsm.HSMUtils;
  44. import org.openspcoop2.utils.certificate.ocsp.OCSPManager;
  45. import org.openspcoop2.utils.json.YamlSnakeLimits;
  46. import org.openspcoop2.utils.properties.MapProperties;
  47. import org.openspcoop2.utils.resources.Loader;
  48. import org.openspcoop2.utils.security.ProviderUtils;
  49. import org.openspcoop2.web.ctrlstat.core.Connettori;
  50. import org.openspcoop2.web.ctrlstat.core.ControlStationCore;
  51. import org.openspcoop2.web.ctrlstat.core.DBManager;
  52. import org.openspcoop2.web.ctrlstat.driver.DriverControlStationDB;
  53. import org.openspcoop2.web.ctrlstat.servlet.ConsoleHelper;
  54. import org.openspcoop2.web.lib.users.dao.InterfaceType;
  55. import org.slf4j.Logger;
  56. /**
  57.  * Questa classe si occupa di inizializzare tutte le risorse necessarie al webService.
  58.  *
  59.  *
  60.  * @author Andrea Poli (apoli@link.it)
  61.  * @author $Author$
  62.  * @version $Rev$, $Date$
  63.  *
  64.  */

  65. public class Startup implements ServletContextListener {

  66.     private static Logger log = null;
  67.     public static Logger getLog() {
  68.         return log;
  69.     }

  70.     private static InitRuntimeConfigReader initRuntimeConfigReader;
  71.    
  72.     @Override
  73.     public void contextDestroyed(ServletContextEvent sce) {
  74.         if(Startup.log!=null)
  75.             Startup.log.info("Undeploy webService in corso...");

  76.          if(initRuntimeConfigReader!=null) {
  77.                 initRuntimeConfigReader.setStop(true);
  78.          }
  79.        
  80.         if(Startup.log!=null)
  81.             Startup.log.info("Undeploy webService effettuato.");

  82.     }

  83.     @Override
  84.     public void contextInitialized(ServletContextEvent sce) {
  85.        
  86.         Startup.initLog();
  87.        
  88.         Startup.initResources();

  89.     }
  90.    

  91.     // LOG
  92.    
  93.     private static boolean initializedLog = false;
  94.    
  95.     public static boolean isInitializedLog() {
  96.         return initializedLog;
  97.     }

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

  121.         }catch(Exception e){
  122.             // ignore
  123.         }
  124.        
  125.         if(!Startup.initializedLog){
  126.            
  127.             try{
  128.                 Startup.log = LoggerWrapperFactory.getLogger(Startup.class);
  129.                 LoggerProperties.initialize(Startup.log, confDir, null);
  130.                 Startup.initializedLog = true;
  131.                 Startup.log = LoggerProperties.getLoggerCore();
  132.                
  133.             }catch(Exception e){
  134.                 throw new UtilsRuntimeException(e.getMessage(),e);
  135.             }
  136.         }
  137.        
  138.         return confDir;
  139.     }
  140.    
  141.    
  142.     // RESOURCES
  143.    
  144.     private static boolean initializedResources = false;
  145.    
  146.     public static synchronized void initResources(){
  147.         if(!Startup.initializedResources){
  148.            
  149.             String confDir = Startup.initLog();
  150.            
  151.             Startup.log.info("Inizializzazione rs api config in corso...");
  152.            
  153.             if(!ServerProperties.initialize(confDir,Startup.log)){
  154.                 return;
  155.             }
  156.             ServerProperties serverProperties = null;
  157.             try {
  158.                 serverProperties = ServerProperties.getInstance();
  159.             } catch (Exception e) {
  160.                 doError("Errore durante l'inizializzazione del serverProperties",e);
  161.             }
  162.            
  163.             // Inizializzo Controlli connessioni
  164.             try {
  165.                 Logger logR = Startup.log;
  166.                 ServicesUtils.initCheckConnectionDB(logR, serverProperties.isJdbcCloseConnectionCheckIsClosed(), serverProperties.isJdbcCloseConnectionCheckAutocommit());
  167.                
  168.                 DriverControlStationDB.setCheckLogger(logR);
  169.                 DriverControlStationDB.setCheckIsClosed(serverProperties.isJdbcCloseConnectionCheckIsClosed());
  170.                 DriverControlStationDB.setCheckAutocommit(serverProperties.isJdbcCloseConnectionCheckAutocommit());
  171.                 DBManager.setCheckLogger(logR);
  172.                 DBManager.setCheckIsClosed(serverProperties.isJdbcCloseConnectionCheckIsClosed());
  173.                 DBManager.setCheckAutocommit(serverProperties.isJdbcCloseConnectionCheckAutocommit());
  174.             } catch (Exception e) {
  175.                 doError("Inizializzazione controlli connessione non riuscita",e);
  176.             }
  177.            
  178.             // Map (environment)
  179.             try {
  180.                 String mapConfig = serverProperties.getEnvMapConfig();
  181.                 if(StringUtils.isNotEmpty(mapConfig)) {
  182.                     Startup.log.info("Inizializzazione environment in corso...");
  183.                     MapProperties.initialize(Startup.log, mapConfig, serverProperties.isEnvMapConfigRequired());
  184.                     MapProperties mapProperties = MapProperties.getInstance();
  185.                     mapProperties.initEnvironment();
  186.                     String msgInit = "Environment inizializzato con le variabili definite nel file '"+mapConfig+"'"+
  187.                             "\n\tJavaProperties: "+mapProperties.getJavaMap().keys()+
  188.                             "\n\tEnvProperties: "+mapProperties.getEnvMap().keys()+
  189.                             "\n\tObfuscateMode: "+mapProperties.getObfuscateModeDescription()+
  190.                             "\n\tObfuscatedJavaKeys: "+mapProperties.getObfuscatedJavaKeys()+
  191.                             "\n\tObfuscatedEnvKeys: "+mapProperties.getObfuscatedEnvKeys();
  192.                     Startup.log.info(msgInit);
  193.                 }
  194.             } catch (Exception e) {
  195.                 doError("Errore durante l'inizializzazione dell'ambiente",e);
  196.             }
  197.            
  198.             // Load Security Provider
  199.             Startup.log.info("Inizializzazione security provider...");
  200.             try {
  201.                 if(serverProperties.isSecurityLoadBouncyCastleProvider()) {
  202.                     ProviderUtils.addBouncyCastleAfterSun(true);
  203.                     Startup.log.info("Aggiunto Security Provider org.bouncycastle.jce.provider.BouncyCastleProvider");
  204.                 }
  205.             } catch (Exception e) {
  206.                 doError("Errore durante l'inizializzazione dei security provider",e);
  207.             }
  208.             Startup.log.info("Inizializzazione security provider effettuata con successo");
  209.            
  210.             // inizializzo HSM Manager
  211.             try {
  212.                 String hsmConfig = serverProperties.getHSMConfigurazione();
  213.                 if(StringUtils.isNotEmpty(hsmConfig)) {
  214.                     Startup.log.info("Inizializzazione HSM in corso...");
  215.                     File f = new File(hsmConfig);
  216.                     HSMManager.init(f, serverProperties.isHSMRequired(), log, false);
  217.                     HSMUtils.setHsmConfigurableKeyPassword(serverProperties.isHSMKeyPasswordConfigurable());
  218.                     Startup.log.info("Inizializzazione HSM effettuata con successo");
  219.                 }
  220.             } catch (Exception e) {
  221.                 doError("Errore durante l'inizializzazione del manager HSM",e);
  222.             }
  223.            
  224.             // inizializzo BYOK Manager
  225.             BYOKManager byokManager = null;
  226.             try {
  227.                 String byokConfig = serverProperties.getBYOKConfigurazione();
  228.                 if(StringUtils.isNotEmpty(byokConfig)) {
  229.                     Startup.log.info("Inizializzazione BYOK in corso...");
  230.                     File f = new File(byokConfig);
  231.                     BYOKManager.init(f, serverProperties.isBYOKRequired(), log);
  232.                     byokManager = BYOKManager.getInstance();
  233.                     String msgInit = "Gestore BYOK inizializzato;"+
  234.                             "\n\tHSM registrati: "+byokManager.getKeystoreTypes()+
  235.                             "\n\tSecurityEngine registrati: "+byokManager.getSecurityEngineTypes()+
  236.                             "\n\tGovWaySecurityEngine: "+byokManager.getSecurityEngineGovWayDescription();
  237.                     Startup.log.info(msgInit);
  238.                 }
  239.             } catch (Exception e) {
  240.                 doError("Errore durante l'inizializzazione del manager BYOK",e);
  241.             }
  242.            
  243.             // inizializzo OCSP Manager
  244.             Startup.log.info("Inizializzazione OCSP in corso...");
  245.             try {
  246.                 String ocspConfig = serverProperties.getOCSPConfigurazione();
  247.                 if(StringUtils.isNotEmpty(ocspConfig)) {
  248.                     File f = new File(ocspConfig);
  249.                     OCSPManager.init(f, serverProperties.isOCSPRequired(), serverProperties.isOCSPLoadDefault(), log);
  250.                 }
  251.             } catch (Exception e) {
  252.                 doError("Errore durante l'inizializzazione del manager OCSP",e);
  253.             }
  254.             Startup.log.info("Inizializzazione OCSP effettuata con successo");
  255.            
  256.             // Secrets (environment)
  257.             boolean reInitSecretMaps = false;
  258.             try {
  259.                 String secretsConfig = serverProperties.getBYOKEnvSecretsConfig();
  260.                 if(byokManager!=null && StringUtils.isNotEmpty(secretsConfig)) {
  261.                     Startup.log.info("Inizializzazione secrets in corso...");

  262.                     boolean useSecurityEngine = true;
  263.                     Map<String, Object> dynamicMap = new HashMap<>();
  264.                     DynamicInfo dynamicInfo = new  DynamicInfo();
  265.                     DynamicUtils.fillDynamicMap(log, dynamicMap, dynamicInfo);
  266.                     if(byokManager.isBYOKRemoteGovWayNodeUnwrapConfig()) {
  267.                         // i secrets cifrati verranno riletti quando i nodi sono attivi (verificato in InitRuntimeConfigReader)
  268.                         reInitSecretMaps = true;
  269.                         useSecurityEngine = false;
  270.                     }
  271.                    
  272.                     BYOKMapProperties.initialize(Startup.log, secretsConfig, serverProperties.isBYOKEnvSecretsConfigRequired(),
  273.                             useSecurityEngine,
  274.                             dynamicMap, true);
  275.                     BYOKMapProperties secretsProperties = BYOKMapProperties.getInstance();
  276.                     secretsProperties.initEnvironment();
  277.                     String msgInit = "Environment inizializzato con i secrets definiti nel file '"+secretsConfig+"'"+
  278.                             "\n\tJavaProperties: "+secretsProperties.getJavaMap().keys()+
  279.                             "\n\tEnvProperties: "+secretsProperties.getEnvMap().keys()+
  280.                             "\n\tObfuscateMode: "+secretsProperties.getObfuscateModeDescription();
  281.                     Startup.log.info(msgInit);
  282.                 }
  283.             } catch (Exception e) {
  284.                 doError("Errore durante l'inizializzazione dell'ambiente (secrets)",e);
  285.             }      
  286.            
  287.             // Database
  288.             if(!DatasourceProperties.initialize(confDir,Startup.log)){
  289.                 return;
  290.             }
  291.             try {
  292.                 if(!org.openspcoop2.web.ctrlstat.config.DatasourceProperties.initialize(DatasourceProperties.getInstance().getPropertiesConsole(),Startup.log)){
  293.                     return;
  294.                 }
  295.             }catch(Exception e) {
  296.                 Startup.log.error("Inizializzazione database console fallita: "+e.getMessage(),e);
  297.             }
  298.            
  299.             // Extended Manager
  300.             Startup.log.info("Inizializzazione ExtendedInfoManager in corso...");
  301.             try{
  302.                 ExtendedInfoManager.initialize(new Loader(), null, null, null);
  303.             }catch(Exception e){
  304.                 throw new UtilsRuntimeException(e.getMessage(),e);
  305.             }
  306.             Startup.log.info("Inizializzazione ExtendedInfoManager effettuata con successo");
  307.            
  308.             // inizializza nodi runtime
  309.             Startup.log.info("Inizializzazione NodiRuntime in corso...");
  310.             try {
  311.                 boolean configFileRequired = false;
  312.                 ConfigurazioneNodiRuntime.initialize(serverProperties.getConfigurazioneNodiRuntime(), configFileRequired);
  313.             } catch (Exception e) {
  314.                 doError("Errore durante l'inizializzazione del gestore dei nodi run",e);
  315.             }
  316.             Startup.log.info("Inizializzazione NodiRuntime effettuata con successo");
  317.            
  318.             // Risorse Statiche
  319.             Startup.log.info("Inizializzazione Risorse Statiche Console in corso...");
  320.             try {
  321.                 ConsoleHelper.setTipoInterfacciaAPI(InterfaceType.STANDARD);
  322.                
  323.                 ControlStationCore.setUtenzePasswordEncryptEngineApiMode(serverProperties.getUtenzeCryptConfig());
  324.                
  325.                 ControlStationCore.setApplicativiPasswordEncryptEngineApiMode(serverProperties.getApplicativiCryptConfig());
  326.                 ControlStationCore.setApplicativiApiKeyPasswordGeneratedLengthApiMode(serverProperties.getApplicativiApiKeyPasswordGeneratedLength());
  327.                 if(serverProperties.isApplicativiBasicPasswordEnableConstraints()) {
  328.                     ControlStationCore.setApplicativiPasswordVerifierEngineApiMode(serverProperties.getApplicativiPasswordVerifier());
  329.                 }
  330.                
  331.                 ControlStationCore.setSoggettiPasswordEncryptEngineApiMode(serverProperties.getSoggettiCryptConfig());
  332.                 ControlStationCore.setSoggettiApiKeyPasswordGeneratedLengthApiMode(serverProperties.getSoggettiApiKeyPasswordGeneratedLength());
  333.                 if(serverProperties.isSoggettiBasicPasswordEnableConstraints()) {
  334.                     ControlStationCore.setSoggettiPasswordVerifierEngineApiMode(serverProperties.getSoggettiPasswordVerifier());
  335.                 }
  336.                
  337.                 Properties yamlSnakeLimits = serverProperties.getApiYamlSnakeLimits();
  338.                 if(yamlSnakeLimits!=null && !yamlSnakeLimits.isEmpty()) {
  339.                     YamlSnakeLimits.initialize(Startup.log, yamlSnakeLimits);
  340.                 }
  341.                
  342.                 ControlStationCore.setIsSoggettiApplicativiCredenzialiBasicPermitSameCredentialsApiMode(serverProperties.isSoggettiApplicativiCredenzialiBasicPermitSameCredentials());
  343.                 ControlStationCore.setIsSoggettiApplicativiCredenzialiSslPermitSameCredentialsApiMode(serverProperties.isSoggettiApplicativiCredenzialiSslPermitSameCredentials());
  344.                 ControlStationCore.setIsSoggettiApplicativiCredenzialiPrincipalPermitSameCredentialsApiMode(serverProperties.isSoggettiApplicativiCredenzialiPrincipalPermitSameCredentials());
  345.                
  346.             } catch (Exception e) {
  347.                 throw new UtilsRuntimeException(e.getMessage(),e);
  348.             }
  349.             Startup.log.info("Inizializzazione Risorse Statiche Console effettuata con successo");
  350.            
  351.             Startup.log.info("Inizializzazione Connettori in corso...");
  352.             try{
  353.                 Connettori.initialize(log, true, confDir, ServerProperties.getInstance().getProtocolloDefault());
  354.             }catch(Exception e){
  355.                 throw new UtilsRuntimeException(e.getMessage(),e);
  356.             }
  357.             Startup.log.info("Inizializzazione Connettori effettuata con successo");
  358.            
  359.             // Allarmi
  360.             try {
  361.                 if(ServerProperties.getInstance().isConfigurazioneAllarmiEnabled()!=null && ServerProperties.getInstance().isConfigurazioneAllarmiEnabled().booleanValue()) {
  362.                     Startup.log.info("Inizializzazione Allarmi in corso...");
  363.                     AlarmEngineConfig alarmEngineConfig = AlarmConfigProperties.getAlarmConfiguration(log, ServerProperties.getInstance().getAllarmiConfigurazione(), ServerProperties.getInstance().getConfDirectory());
  364.                     AlarmManager.setAlarmEngineConfig(alarmEngineConfig);
  365.                     CostantiDB.setAllarmiEnabled(true);
  366.                     Startup.log.info("Inizializzazione Allarmi effettuata con successo");
  367.                 }
  368.             } catch (Exception e) {
  369.                 doError("Errore durante l'inizializzazione degli allarmi",e);
  370.             }
  371.                
  372.             // InitRuntimeConfigReader
  373.             if(reInitSecretMaps) {
  374.                 try{
  375.                     initRuntimeConfigReader = new InitRuntimeConfigReader(serverProperties, ConfigurazioneNodiRuntime.getConfigurazioneNodiRuntime(), reInitSecretMaps);
  376.                     initRuntimeConfigReader.start();
  377.                     Startup.log.info("RuntimeConfigReader avviato con successo.");
  378.                 } catch (Exception e) {
  379.                     /**doError("Errore durante l'inizializzazione del RuntimeConfigReader",e);*/
  380.                     // non sollevo l'eccezione, e' solo una informazione informativa, non voglio mettere un vincolo che serve per forza un nodo acceso
  381.                     Startup.log.error("Errore durante l'inizializzazione del RuntimeConfigReader: "+e.getMessage(),e);
  382.                 }
  383.             }
  384.            
  385.             Startup.initializedResources = true;
  386.            
  387.             Startup.log.info("Inizializzazione rs api config effettuata con successo.");
  388.         }
  389.     }

  390.     private static void doError(String msg,Exception e) {
  391.         String msgErrore = msg+": " + e.getMessage();
  392.         Startup.log.error(msgErrore,e);
  393.         throw new UtilsRuntimeException(msgErrore,e);
  394.     }
  395. }