Programa em C para monitorar IPs e portas ativas
Publicado por Lauro Salmito Pinheiro 30/07/2009
[ Hits: 9.902 ]
Desenvolvi o PortMonitor para que os administradores de redes e segurança da informação possam gerar um relatório de status dos serviços e ficarem monitorando os serviços de vários servidores.
Distributed under GPLv2
Copyright (c) 2009 Lauro Salmito Pinheiro <laurosalmito@gmail.com>
/* * PortMonitor * Monitor dos status das portas dos hosts * * Distribute under GPLv2 * * Copyright (c) 2009 Lauro Salmito Pinheiro <laurosalmito@gmail.com> * */ #include <stdio.h> #include <sys/socket.h> #include <arpa/inet.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <netinet/in.h> #include <time.h> #include <gtk/gtk.h> #include <stdlib.h> #define BUFFSIZE 32 void displayUI(char *str) { GtkWidget* mainWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); GtkWidget* label,*box1,*button,*box2; box1 = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (mainWindow), box1); gtk_widget_show (box1); box2 = gtk_hbox_new (TRUE, 10); gtk_container_set_border_width (GTK_CONTAINER (box2), 0); gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, FALSE, 0); label = gtk_label_new (str); gtk_box_pack_start (GTK_BOX (box1), label, TRUE, FALSE, 0); gtk_widget_show (box2); gtk_window_set_default_size(GTK_WINDOW(mainWindow), 300, 200); gtk_window_set_title(GTK_WINDOW(mainWindow), " ..:: Port Monitor 1.0 ::.."); gtk_window_set_position(GTK_WINDOW(mainWindow), GTK_WIN_POS_CENTER_ALWAYS); gtk_signal_connect(GTK_OBJECT(mainWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL); button = gtk_button_new_with_label (" ! OK ! "); g_signal_connect_swapped (G_OBJECT (button), "clicked", G_CALLBACK (gtk_widget_destroy), G_OBJECT (mainWindow)); gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0); GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); gtk_widget_grab_default (button); gtk_widget_show (button); gtk_widget_show (label); gtk_widget_show_all(mainWindow); } void Die(char *mess) { perror(mess); exit(1);} void trim(char *s, const int len) { int end = len - 1; int start = 0; int i = 0; while ((start < len) && (s[start] <= ' ')) { start++; } while ((start < end) && (s[end] <= ' ')) { end--; } if (start > end) { memset(s, '{FONTE}', len); return; } for (i = 0; (i + start) <= end; i++) { s[i] = s[start + i]; } memset((s + i), '{FONTE}', len - i); } int connections(const char *ip,const char *port) { int sock,z,linger_return; struct sockaddr_in socket_struture; struct linger a; a.l_onoff=1; a.l_linger=0; sleep(1); if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { Die("Err:"); } memset(&socket_struture, 0, sizeof(socket_struture)); socket_struture.sin_family = AF_INET; socket_struture.sin_addr.s_addr = inet_addr(ip); socket_struture.sin_port = htons(atoi(port)); if ((z = connect(sock,(struct sockaddr *) &socket_struture,sizeof(socket_struture)) == 0)) { //printf("Porta %s Ativa:. - %d -\n",port,z); //Debug linger_return = setsockopt(sock, SOL_SOCKET, SO_LINGER,&a, sizeof(a)); close(sock); return 1; } else { // printf("Porta %s Desconectada:. - %d -\n",port,z); //De linger_return = setsockopt(sock, SOL_SOCKET, SO_LINGER,&a, sizeof(a)); close(sock); return 0; } } int main(int argc, char *argv[]) { FILE* filedest,*logfile; register int val; typedef char string[50]; string hosts[50]; string portas[50]; int j,i =0; gtk_init(&argc, &argv); char server[200]; if (argc>1) { if( (argc > 2 || (strcmp(argv[1],"-log")!=0)) && (argc > 2 || (strcmp(argv[1],"-x")!=0)) ) { printf("Numeros de parametros invalidos. Tente somente um parametro!\n"); exit(1); } } filedest = fopen("dest.conf","r"); if (filedest==NULL) { printf("Crie um arquivo no diretorio corrente chamado \"dest.conf\" - com os IPS e portas, separando-os com \":\"\n"); exit(0); } while (!feof(filedest)) { fscanf(filedest,"%s\t%s",hosts[i],portas[i]); i++; } fclose(filedest); for (;;) { time_t mytime; mytime = time(NULL); char *time_local; time_local = ctime(&mytime); trim(time_local,strlen(time_local)); for (j=0;j<i-1;j++) { val = connections(hosts[j],portas[j]); if (!argv[1]) { if (val==1) { printf("[%s] Host.::. %s - Porta -> %s ATIVA -\n",time_local,hosts[j],portas[j]); } else { printf("[%s] Host.::. %s - Porta -> %s DESCONACTDA -\n",time_local,hosts[j],portas[j]); } } else { if(strcmp(argv[1],"-log")==0) { //FILE* logfile; logfile = fopen("monitor.log","a+"); if (val==1) { fprintf(logfile,"[%s] Host.::. %s - Porta -> %s ATIVA -\n",time_local,hosts[j],portas[j]); } else { fprintf(logfile,"[%s] Host.::. %s - Porta -> %s DESCONACTDA -\n",time_local,hosts[j],portas[j]); } fclose(logfile); } if(strcmp(argv[1],"-x")==0) { if (val==0) { logfile = fopen("monitor.log","a+"); fprintf(logfile,"[%s] Host.::. %s - Porta -> %s DESCONACTDA -\n",time_local,hosts[j],portas[j]); fclose(logfile); sprintf(server,"Data/Hora::.%s\nHost::.%s\nPorta::.%s\nStatus::.* INATIVO *\n",time_local,hosts[j],portas[j]); displayUI(server); gtk_main(); } } } } } return(0); }
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Quero saber sobre os melhores aplicativos de office para usar em 2024 ... (3)
Queria saber se existe alguma forma de desistalar programa no ubuntu s... (3)
Toda vez que tento atualizar o clamav me deparo com erros ao atualizar... (0)