quinta-feira, 24 de setembro de 2015

Relatório de Conexões Através de Netstat com Java

O objetivo deste código de programa é monitorar conexões que são feitas na máquina. O Netstat permite exibir as conexões e as portas utilizadas no computador exibindo o computador remoto que está conectado assim como a sua porta utilizada. O objetivo principal aqui é a segurança e monitoramento da maquina. Conforme a opção do Netsat também é possível verificar qual é o programa que está sendo utilizado naquela conexão, mas essa informação em nem todos os casos é exibida. No programa, o comando roda a cada 5 minutos (300 segundos). Caso exista algum programa indevido é necessário fazer o reconhecimento e o bloqueio através do firewall. Na classe CommandLine é executado o comando, onde o Java chama o comando em CMD.EXE do sistema operacional. Na classe MyRun3 criamos o arquivo no local determinado nomeado com a data e a hora da execução. Na classe Begginer temos a programação da chamada a cada 5 minutos e da chamada principal do inicio do programa. Os pacotes devem sex exportados pelo Eclipse através da opção JAR Executável e na combobox deve ser selecionada a classe da chamada principal que contém o método Main no nosso caso a classe Begginer.


package Cap2;

import java.io.*;

public class CommandLine {
// Needed to run commands in the command line
private Runtime runtime;
private Process process;

// Output of the executed command
private String stdinData;
private String stderrData;

// Constructor
public CommandLine() {
runtime = Runtime.getRuntime();
process = null;
stdinData = "";
stderrData = "";
}

// Return executed command output data
public String getStdinData() {
return stdinData;
}

public String getStderrData() {
return stderrData;
}

// Execute a single command with all its arguments
public void execute(String command) {
try {
process = runtime.exec(command);
} catch (Exception ex) {
System.err.println(ex);
}

pullProcessData();
}

// Execute a single command in cmdArray,
// define environment settings in envp and
// set working directory to dir
public void execute(String[] cmdArray, String[] envp, File dir) {
try {
process = runtime.exec(cmdArray, envp, dir);
} catch (Exception ex) {
System.err.println(ex);
}

pullProcessData();
}

// Obtain all data sent by the process to stdout and stderr
private void pullProcessData() {
try {
StringBuffer stdinBuffer = new StringBuffer();
StringBuffer stderrBuffer = new StringBuffer();

InputStream stdinStream = process.getInputStream();
InputStream stderrStream = process.getErrorStream();

new InputStreamHandler(stdinBuffer, stdinStream);
new InputStreamHandler(stderrBuffer, stderrStream);

process.waitFor();

stdinData = stdinBuffer.toString();
stderrData = stderrBuffer.toString();
} catch (Exception ex) {
System.err.println(ex);
}
}

// Private inner class used to handle input streams
private class InputStreamHandler extends Thread {
private InputStream m_stream;
private StringBuffer m_captureBuffer;

InputStreamHandler(StringBuffer captureBuffer, InputStream stream) {
m_stream = stream;
m_captureBuffer = captureBuffer;
start();
}

public void run() {
try {
int nextChar;
while ((nextChar = m_stream.read()) != -1)
m_captureBuffer.append((char) nextChar);
} catch (IOException ioex) {
System.err.println(ioex);
}
}
}
}


package Cap2;

import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.GregorianCalendar;

public class MyRun3  {

public void executeCommand ( ) {
// TODO Auto-generated method stub

   String nomearquivo;
   StringBuilder sb = new StringBuilder();

   // cria um GregorianCalendar que vai conter a hora atual
   GregorianCalendar d = new GregorianCalendar();
   
   // anexa do StringBuilder os dados da hora
   sb.append( d.get( GregorianCalendar.YEAR) );
   sb.append( "_" );
   sb.append( d.get( GregorianCalendar.MONTH ) );
   sb.append( "_" );
   sb.append( d.get( GregorianCalendar.DAY_OF_MONTH ) );
   sb.append( "_" );
 
   sb.append( d.get( GregorianCalendar.HOUR_OF_DAY ) );
   sb.append( "h" );
   sb.append( d.get( GregorianCalendar.MINUTE ) );
   sb.append( "m" );
   sb.append( d.get( GregorianCalendar.SECOND ) );
   sb.append( "s" );

   // retorna a String do StringBuilder
   nomearquivo="d:\\filters\\logNetstat_";
   nomearquivo+=sb.toString();
   nomearquivo+=".txt";
 
 

CommandLine cl = new CommandLine();

cl.execute( "cmd /c netstat -an" );

System.out.print( cl.getStdinData() );
System.out.print( cl.getStderrData() );

OutputStream os = null;
try {
os = new FileOutputStream(nomearquivo);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
    OutputStreamWriter osw = new OutputStreamWriter(os);
    BufferedWriter bw = new BufferedWriter(osw);

    try {
    bw.write(cl.getStdinData() );
    bw.write(cl.getStderrData() );
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
 
    try {
bw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}




}

}


package Cap2;

public class Begginer {

public static void main(String[] args) {
// TODO Auto-generated method stub

MyRun3 myrun3 = new MyRun3();

while (true) {
myrun3.executeCommand();


for (int i = 0; i < 300 ; i++) {


try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}



}
}
}

}




quarta-feira, 23 de setembro de 2015

Socket em Java

Abaixo duas classes em Java para conexão de socket entre servidor e cliente. As classes são resultado das aulas de Sistemas Operacionais do prof Alessandro Brawerman. Na época em que pesquisei a respeito não encontrei nada tão simples e tão didático. Quando falamos em socket geralemente é acompanhado de estruturas complexas, mas abaixo as classes são simples. Deve ser configurada apenas a porta e o ip das máquinas.



import java.io.*;
import java.net.*;

import javax.swing.GroupLayout.ParallelGroup;

public class servidor {

public static void main(String args[]) throws IOException {
int porta = 10000;
Socket sock = null;

int porta2 = 10000;
String IP = "172.23.96.200";
BufferedReader teclado;

ServerSocket ss = new ServerSocket(porta2);
sock = ss.accept();
DataInputStream in = new DataInputStream(sock.getInputStream());
DataOutputStream out = new DataOutputStream(sock.getOutputStream());
//primeira msg do servidor
while (true) {
teclado = new BufferedReader(new InputStreamReader(System.in));
String texto = teclado.readLine();
out.writeUTF(texto);
System.out.println(in.readUTF());
if(texto.equals("terminar")){
break;
}
}

in.close();
out.close();
sock.close();
}
}



import java.io.*;
import java.net.*;
import java.util.Scanner;

public class cliente {

/**
 * @param args
 * @throws IOException
 */
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub

int porta = 12345;
String IP="172.23.96.73";
BufferedReader teclado;
Socket sock = new Socket(IP,porta);
DataInputStream in = new DataInputStream(sock.getInputStream());
DataOutputStream out = new DataOutputStream(sock.getOutputStream());
System.out.println(in.readUTF());
teclado = new BufferedReader(new InputStreamReader(System.in));
String texto = teclado.readLine();
out.writeUTF(texto);

if (texto.equals("terminar")) {
in.close();
out.close();
sock.close();
}
}

}



terça-feira, 15 de setembro de 2015

Busca Recursiva no Linux

Na busca por uma palavra chave de forma recursiva tive algumas dificuldades em encontrar um arquivo. Procurando por soluções de grep encontrei uma variação com comando find que funciona bem. O grep simples não retornou o resultado que eu esperava por uma questão de case sensitive que não utilizei na primeira busca.




Comandos:


find . -type f -exec grep -l "string" {} +


find . -type f -exec grep -l "p_deleterole" {} +


Com ignore case:

find . -type f -exec grep -li "ComBOBOx" {} +



Mais tarde testando apenas o grep:

grep -ri "word" .


Com opção para exibir o número da linha:

grep -ri "word" . -n



terça-feira, 5 de novembro de 2013

Estrutura BEGIN/END no PL/SQL

Para atualizações dinâmicas com select no PL/SQL são utilizados estruturas com BEGIN/END. Segue o formato padrão:


  1. -- Created on 05/11/2013 by BOAH
  2. DECLARE
  3.   -- Local variables here
  4.   i INTEGER;
  5. BEGIN
  6.   -- Test statements here
  7.   FOR i IN (SELECT * FROM torder) LOOP
  8.     UPDATE.... WHERE tu_id=i.id
  9.     DELETE....  WHERE tu_id=i.id
  10.     DBMS_OUTPUT.put_line('Atualizado: '|| i.id)--print result
  11.   END LOOP;
  12. END;

sexta-feira, 25 de outubro de 2013

Massacrando no Terminal do Linux

Durante minha experiência de trabalho na Levier, tive a oportunidade de trabalhar com uma profissional de ponta. A Karina é uma analista/programadora daquelas de tirar o chapéu, se eu não tivesse visto a velocidade com que ela opera um terminal linux provavelmente não acreditaria. Durante uma atualização via script sh (shell) no cliente fizemos um acompanhamento para evitar erros no cliente. Durante essa operação era feito um ssh para acessar o servidor de testes(IP.11) e produção(IP.9) e do servidor de produção um ssh para o servidor do cliente case houvesse problemas. O acompanhamento era feito por um team viewer direto na máquina do cliente enquanto ele rodava o script.
Durante a operação verificamos uma atualização falha devido a um script mais antigo ter sido rodado. Para corrigir a falha foi necessário comparar todos os arquivos de todas as pastas. No terminal shell do Linux isso pode ser feito rapidamente com um comando. Além das comparações de pastas foram comparados arquivos para verificar as diferenças usando comando diff, acesso mysql pelo terminal, e, além disso, alguns arquivos foram editados on line por editores como vi, nano e pico no próprio terminal. Outros arquivos foram copiados diretamente via scp, pois como haviam problemas o cliente liberou o acesso. Uma hora depois haviam sido corrigidos em torno de 35 arquivos. A base do cliente foi compactada pelo próprio terminal e copiada para o nosso servidor via scp. Segue, agora alguns dos comandos utilizados durante a operação.

Comparação de arquivos:
  1. diff arquivo1 arquivo2

Criar um arquivo com as diferenças:
  1. diff arquivo1 arquivo2 >> diferencas.txt

Busca por palavra chave em arquivos dentro de pastas e subpastas:
  1. grep -R 'palavra' pasta/ | more

Compara todas as pastas:
  1. diff -qrbw

O -bw ignora espaços em branco (white) e linhas (b).

Para usar o editor vi:
  1. vi nome_arquivo

Para usar o editor nano:
  1. nano nome_arquivo

Para usar o editor pico:
  1. pico nome_arquivo

Acesso ao Banco de Dados
  1. mysql -uroot -p

O -u indica o usuário e o root é o nome do usuário que pode ser substituído por outro usuário ativo. O -p é a senha é possivel colocar a senha diretamente ao lado do -p como é feito com o usuário mas como o comando ficará armazenado em history não é indicado.

Para mostrar as bases ativas:
  1. show database

Para acessar uma das bases:
  1. use nome_db

Para rodar um script sql diretamente no terminal linux antes de acessar a base:
  1. mysql nome_db --user=marcelo -p < script.sql

mysql import => também pode ser usado para importação

Para criar um back up do banco remoto:
  1. mysqldump nome_db > back_up.sql

Para acompanhar o mysqldump:
-c => gera sql (insert completo)
-t => no create
-d => esqueleto do banco

Outra opção seria:
  1. mysqldump -u[usuario] -p[senha] nome_db > back_up.sql

Compactar o arquivo
  1. tar -fvzx back_up.sql

Copia remota:
  1. scp root@200.195.161.50:/home/usuario/cliente/arquivo.tgz

O IP nesse caso era um IP externo. O inicio 200.195 indica uma máquina dentro do território brasileiro.





Outros comandos que utilizei para desenvolvimento:
Para baixar projeto do svn:
  1. svn co http://ip/pasta/projeto

Para evitar conflitos de desenvolvimento no Netbeans é necessário apagar arquivos do controle do svn:
  1. rm -rf pasta/projeto/nbproject

Mudar permissões de usuário para pasta e subpastas:
  1. chmod -R 777 pasta/

Para mudar o dono da pasta:
  1. chown -R novo_usuario pasta/







segunda-feira, 31 de dezembro de 2012

Listar Arquivos com Java

Bom, já faz alguns meses que não faço post para o Blog em virtude do término da faculdade e entregas de trabalhos, apresentações finais de TCC e documentação fora as provas. Então peço desculpas a todos.

No post de hoje um programa simples para listar arquivos em um diretório, a função não é recursiva portanto o diretório tem que ser específico. Estou trabalhando em um projeto e na parte de deploy são necessárias as libs e ao invés de capturar nome por nome é mais fácil listá-las em um programa. Tentei pelo MS-DOS mas a cópia não foi possível. Como sempre perdemos tempo nestas questões simples. Então, segue o programa em Java para facilitar o próximo trabalho.




  1. import java.io.File;
  2.  
  3.  
  4. public class ListaArquivos {
  5.  
  6.         public static void main(String[] args) {
  7.  
  8.                 String dir = "C:\\Users\\marcelo\\workspaceHelios\\Monitoring1_3\\WebContent\\WEB-INF\\lib";
  9.  
  10.                 File diretorio = new File(dir);
  11.                 File fList[] = diretorio.listFiles();
  12.  
  13.                 System.out.println("Numero de arquivos no diretorio : " + fList.length );
  14.  
  15.                 for ( int i = 0; i < fList.length; i++ ){
  16.                         System.out.println(fList[i].getName() );
  17.                 }
  18.                
  19.         }
  20.  
  21. }

quarta-feira, 10 de outubro de 2012

eSpeak - Fazendo seu Computador Falar

Hoje, testei o programa eSpeak e achei bem interessante. O aplicativo permite que textos sejam digitados ou, capturados de arquivos e transformados em fonemas/frases audíveis. A aplicação pode ser bem interessante para a área de automação, para exibir avisos como: "esteira ligada", "chave um desligada", etc..

O programa roda no Windows também, mas acredito que, o forte seja utilizar através de linha de comando Shell no Linux ou, evocando por outras linguagens como Java. O programa funciona em vários idiomas, porém, a voz ainda é um pouco metalizada.


Para instalar utilize a linha de comando:
sudo apt-get install espeak

Para testar (em inglês):
espeak "hello world"

Para utilizar em português:
espeak -v pt "esteira ligada"


Segue o manual:
http://espeak.sourceforge.net/