protected virtual void Login() { try { if (AppContext.Principal != null) { AppContext.Principal.Logout(); } PrincipalBase.Login(); MyLogger.LogText(string.Format("CONNECTED TO {0}:{1} AS USER {2}", SettingsMng.Instance.GetActiveServer(), SettingsMng.Instance.GetDBName(), SettingsMng.Instance.GetDBUser()), "Service::Login"); } catch (Exception ex) { MyLogger.LogException(ex, "ServiceBase::Login"); if (AppContext.Principal != null) { AppContext.Principal.Close(); } } }
public void Run(object parameter = null) { Status = CheckStatus((ISchemaInfo)parameter); if (Status != EComponentStatus.READY) { return; } Status = EComponentStatus.WORKING; try { //Before calling. Maybe could be an error UpdateLastExecution((ISchemaInfo)parameter); Status = DoRun(parameter); Status = EComponentStatus.OK; //After calling. Real last update UpdateLastExecution((ISchemaInfo)parameter); MyLogger.LogText("COMPLETE", string.Format("{0}::Run", ID)); } catch (Exception ex) { MyLogger.LogText("FINALIZED WITH ERROR", string.Format("{0}::Run", ID)); MyLogger.LogException(ex, string.Format("{0}::Run", ID)); Status = EComponentStatus.ERROR; } return; }
protected override void OnStart(string[] args) { try { Initialize(); } catch (Exception ex) { MyLogger.LogException(ex, "ServiceBase::OnStart"); Dispose(); } }
protected void StartTimer() { try { TimerGuid = TimerMng.Instance.InitTimer(ETimerType.System, ServiceTimerController, PollInterval); MyLogger.LogText(string.Format("Service Timer Started. TICK EVERY {0}s", PollInterval), "Service::StartTimer"); } catch (Exception ex) { MyLogger.LogException(ex, "ServiceBase::StartTimer"); } }
protected override void OnStop() { try { Close(); } catch (Exception ex) { MyLogger.LogException(ex, "ServiceBase::OnStop"); } finally { MyLogger.LogText("Service Stopped", "ServiceBase::OnStop"); } }
protected virtual void Execute() { try { //To avoid overlapped executions if (Running) { MyLogger.LogText("LAST EXECUTION IS STILL BUSY. NOT EXECUTED TO AVOID OVERLAPPING", "ServiceBase::Execute"); return; } Running = true; foreach (ISchemaInfo item in Schemas) { MyLogger.LogText(String.Format("PROCESSING SCHEMA '{0}'...", item.Name), "ServiceBase::Execute"); if (!LoadSchema(item)) { MyLogger.LogText(String.Format("ERROR LOADING SCHEMA {0}", item.Name), "ServiceBase::Execute"); Running = false; return; } foreach (KeyValuePair <string, ICronJob> cronjob in CronJobs) { Thread cronThread = ExecuteTask(cronjob.Value, item); while (cronThread != null && cronThread.IsAlive) { } ; } } Running = false; } catch (Exception ex) { Running = false; MyLogger.LogException(ex, "ServiceBase::Execute"); Login(); } }
protected virtual void LoadCronJobs() { try { foreach (KeyValuePair <string, ICronJob> item in CronJobs) { if (item.Value.Status == EComponentStatus.DISABLED) { MyLogger.LogText(string.Format("{0} is DISABLED", item.Key), "ServiceBase::LoadCronjobs"); } else { MyLogger.LogText(string.Format("{0} is ENABLED EVERY {1}s", item.Key, item.Value.Interval), "ServiceBase::LoadCronjobs"); } } } catch (Exception ex) { MyLogger.LogException(ex, "ServiceBase::LoadCronJobs"); } }
protected virtual bool LoadSchema(ISchemaInfo schema) { try { if (AppContext.Principal == null) { Login(); } AppContext.Principal.ChangeUserSchema(schema, true); return(AppContext.Principal != null); } catch (Exception ex) { MyLogger.LogException(ex, "ServiceBase::LoadSchema"); if (AppContext.Principal != null) { AppContext.Principal.Close(); } return(false); } }
protected static void DoCreateBackup(string dbHost, string dbName, string dbUser, List <ISchemaInfo> schemas, string outputFile) { System.Diagnostics.Process process = null; try { //Obtención de la ruta de pg_dump string path_pg_dump = Reg32GetPGBinPath() + Paths.PG_DUMP; if (path_pg_dump == string.Empty) { return; } if (!File.Exists(path_pg_dump)) { throw new iQException(Errors.BACKUP_APP_NOT_FOUND); } string msg = "Creating db credentials file " + outputFile; MyLogger.LogText(msg, "AppControllerBase::DoCreateBackup"); Console.WriteLine(msg); string db_pass = SettingsMng.Instance.GetDBPassword(); //Creamos el fichero pgpass.conf para que no salte el prompt pidiendo password string pgpassPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); pgpassPath += Paths.PG_PASS; if (!Directory.Exists(Path.GetPathRoot(pgpassPath))) { Directory.CreateDirectory(Path.GetPathRoot(pgpassPath)); } StreamWriter sw = File.CreateText(pgpassPath); sw.WriteLine(dbHost + ":*:*:" + dbUser + ":" + db_pass); sw.Close(); if (!Directory.Exists(Path.GetDirectoryName(outputFile))) { Directory.CreateDirectory(Path.GetDirectoryName(outputFile)); } //Crea un nuevo proceso process = new System.Diagnostics.Process(); if (schemas == null) { //Ejecución del pg_dump process.StartInfo.FileName = path_pg_dump; process.StartInfo.Arguments = string.Format("{0} {1} {2} {3} {4} {5} {6} {7} {8}" , new string[] { "--format=c" , "--ignore-version" , "--oids" , "--blobs" , "--verbose" , "--host=" + dbHost , "-U " + dbUser , @"--file=""" + string.Format(outputFile, "FULL") + @"""" , @"""" + dbName + @"""" } ); process.Start(); process.WaitForExit(); } else { //COMMON SCHEMA try { //Ejecución del pg_dump process.StartInfo.FileName = path_pg_dump; process.StartInfo.Arguments = string.Format("{0} {1} {2} {3} {4} {5} {6} {7} {8} {9}" , new string[] { "--format=c" , "--ignore-version" , "--oids" , "--blobs" , "--verbose" , "--host=" + dbHost , "-U " + dbUser , @"--file=""" + string.Format(outputFile, AppContext.CommonSchema) + @"""" , "--schema=" + AppContext.CommonSchema , @"""" + dbName + @"""" } ); process.Start(); process.WaitForExit(); } catch (Exception ex) { MyLogger.LogException(ex, "AppControllerBase::DoCreateBackup"); } //DETAILED SCHEMAS foreach (ISchemaInfo schema in schemas) { try { //Ejecución del pg_dump process.StartInfo.FileName = path_pg_dump; process.StartInfo.Arguments = string.Format("{0} {1} {2} {3} {4} {5} {6} {7} {8} {9}" , new string[] { "--format=c" , "--ignore-version" , "--oids" , "--blobs" , "--verbose" , "--host=" + dbHost , "-U " + dbUser , @"--file=""" + string.Format(outputFile, schema.SchemaCode) + @"""" , "--schema=" + schema.SchemaCode , @"""" + dbName + @"""" } ); process.Start(); process.WaitForExit(); } catch (Exception ex) { MyLogger.LogException(ex, "AppControllerBase::DoCreateBackup"); } } } //Borramos el fichero pgpass.conf File.Delete(pgpassPath); SettingsMng.Instance.SetBackupsLastDate(DateTime.Now); SettingsMng.Instance.SaveSettings(); } catch (Exception ex) { MyLogger.LogException(ex, "AppControllerBase::DoCreateBackup"); if (process != null) { MyLogger.LogText("process.StartInfo.Arguments = " + process.StartInfo.Arguments); } } }
protected Thread ExecuteTask(ICronJob cronjob, object parameter) { if (cronjob == null) { return(null); } try { switch (cronjob.CheckStatus((ISchemaInfo)parameter)) { case EComponentStatus.DISABLED: { if (LogLevel == ELogLevel.ALL) { MyLogger.LogText(string.Format("{0} DISABLED", cronjob.ID), "ServiceBase::ExecuteTask"); } return(null); } case EComponentStatus.WORKING: { if (LogLevel == ELogLevel.ALL || LogLevel == ELogLevel.WARN) { MyLogger.LogText(string.Format("{0} STILL BUSY", cronjob.ID), "ServiceBase::ExecuteTask"); } return(null); } case EComponentStatus.UNAVAILABLE: { if (LogLevel == ELogLevel.ALL) { MyLogger.LogText(string.Format("{0} OUT OF DATE ", cronjob.ID), "ServiceBase::ExecuteTask"); } return(null); } case EComponentStatus.READY: { if (LogLevel == ELogLevel.ALL || LogLevel == ELogLevel.WARN) { MyLogger.LogText(string.Format("{0} STARTED ", cronjob.ID), "ServiceBase::ExecuteTask"); } #if DEBUG cronjob.Run(parameter); return(null); #else Thread taskthread = new Thread(new ParameterizedThreadStart(cronjob.Run)); taskthread.Start(parameter); return(taskthread); #endif } } return(null); } catch (Exception ex) { MyLogger.LogException(ex, "ServiceBase::ExecuteTask"); return(null); } }