Chat  

C# Lettura History log IBM iSeries

C# Lettura History log IBM iSeries

PDFStampaE-mail

L'history log di iSeries è l'equivalente del eventlog per windows o syslog per le distribuzioni Linux. All'interno di esso vengono scritti tutti gli eventi di sistema di una certa rilevanza.

Mentre per le piattaforme windows e linux è piuttosto semplice leggere i logs degli eventi non è così scontato per iSeries.Il fatto che la piattaforma OS/400 sia chiusa povera di risorse e obsoleta mette in difficoltà chiunque nel reperire dati di sistema ma essendo ancora molto diffusa è possibile incontrarla sulla propria strada.

 

Il concetto di fondo è lanciare comandi remoti da windows alla piattaforma OS/400 e catturarne il risultato. Esiste una libreria di IBM contenuta nel pacchetto client access (che ogni utilizzatore di iSeries possiede) che permette di lanciare comandi o applicazione da remoto.Il suo nome è:

cwbx.dll

Nel progetto di visual studio è necessario aggiungerla come reference e poi importarla nel progetto:

using cwbx;
AS400System system = new AS400System();
system.Define(Server);
system.UserID = USER;
system.Password = PASSWORD;
system.Connect(cwbcoServiceEnum.cwbcoServiceRemoteCmd);

a questo punto si è connessi al server iSeries ed è possibile eseguire comandi tipici in questo modo:

cwbx.Command cmd = new cwbx.Command();
system.Signon();
cmd.system = system;
cmd.Run(@"DSPLOG OUTPUT(*PRTWRAP) PERIOD(('" + time_string + "' " + dt_String + ") (*AVAIL *CURRENT))");

 

 la funzione Run permette di eseguire il comando prestabilito, in questo caso lo scopo è quello di generare uno spool dell'history log da una data/ora in avanti(time_string e dt_string). è necessario creare lo spool perchè non esiste un output tipo file.

Fatto ciò è necessario copiare lo spool in un file fisico su iSeries:

cmd.Run("CRTPF FILE(QGPL/JOB) RCDLEN(255)");

Ora si copia il file spool nel file fisico e si cancella il file di spool:

cmd.Run("CPYSPLF FILE(QPDSPLOG) TOFILE(QGPL/JOB) SPLNBR(*LAST) JOB(" + USER + "/QPRTJOB) MBROPT(*REPLACE)");
cmd.Run("DLTSPLF FILE(QPDSPLOG) JOB(" + USER + "/QPRTJOB) SPLNBR(*ANY) JOBSYSNAME(*ANY) CRTDATE(*LAST)");

a questo punto è possibile lanciare una query di select all'interno del file per recuperarne il contenuto:

 

String ConString =  "Provider=IBMDA400.DataSource.1;" +"Data source=" + Server + ";" +
		"User Id=" + USER + ";" +
		"Password=" + PASSWORD + ";Force Translate=1";
 
		OleDbConnection con = new OleDbConnection(ConString);
		con.Open();
		OleDbCommand cmd = new OleDbCommand("SELECT * from qgpl.job");
 
		cmd.Connection = con;
		OleDbDataReader reader = cmd.ExecuteReader();
 
		String Result= String.Empty;
		if (reader.HasRows)
		{
			 while (reader.Read())
			{
 
 				Result = Result + reader.GetString(0).Trim() + "\n";
 
			}
 
		}
		else
		{
			MessageBox.Show("Nessun dato");
		}
		con.Close();

il file ha un solo campo e in Result otteniamo tutte le linee del file.

La difficoltà ora consiste nel parsing di ogni messaggio fattibile utilizzando le regular expression, in ogni caso con questa metodologia possiamo lanciare da remoto qualunque comando OS/400 e catturarne il risultato.

 

 

© 2018 - Andrea Facchin
   
| Domenica, 23. Settembre 2018 || Designed by: LernVid.com |