Monitoramento de Sistema
O sistema foi desenvolvido totalmente na linguagem Python e tem como objetivo captar informações do sistema operacional da máquina servidor conforme as requisições do cliente e mostrá-las através de uma interface de usuário.
Módulos utilizados
- Psutil - Biblioteca de plataforma cruzada para recuperar informações sobre os processos em execução e a utilização do sistema (CPU, memória, discos, rede, sensores) em Python.
- OS - Fornece a linguagem python uma maneira simples de usar funcionalidades que são dependentes de sistema operacional.
- Socket - Fornece acesso à interface de soquete BSD, responsável pela troca de informações entre cliente e servidor.
- Pickle - Responsável pela conversão de bytes para dados, implementa protocolos binários para serializar e desserializar uma estrutura de objeto Python.
- Time - Fornece várias funções relacionadas ao tempo.
- Cpuinfo - Fornece informações específicas da CPU.
- Nmap - Fornece um mapeamento da rede.
- PySimpleGUI - Responsável pela interface com o usuário.
Informações coletadas
- CPU : Retorna o nome, modelo, arquitetura, palavra e núcleos.
- ARMAZENAMENTO : Retorna o espaço total, livre e ocupado da memória RAM e do Disco Rígido.
- ARQUIVOS EM UM DETERMINADO DIRETÓRIO :
- Realiza uma busca em um diretório informado pelo usuário (nome e caminho do diretório) .
- Retorna a lista de arquivos presentes nesse diretório contendo o nome do arquivo, tamanho, data de criação e data de modificação.
- PROCESSOS :
- Realiza uma busca através do PID do processo informado pelo usuário.
- Retorna seu nome, executável, memória consumida e CPU consumido.
- REDE : A parte do programa relacionada a redes contém um scanner de portas que percorre um intervalo de portas informado pelo usuário e retorna o número e o status de cada porta.
Detalhamento sobre os métodos
Lado cliente
-
mostrar_menu()
- Define o layout da janela de menu através de uma lista contendo outras listas. Uma lista com um título como texto e outra lista com os títulos dos botões.
- Define a janela setando o título e o layout
- Se conecta ao servidor usando o connect()
- Itera a leitura dos eventos e dos valores da janela e envia os títulos dos botões como requisição ao servidor de acordo com os eventos de click em casa botão.
-
mostrar_info_cpu_memória()
- Recebe os bytes contendo a resposta do servidor
- Carrega a resposta em forma de uma lista de strings
- Define o layout da janela de cpu e memória através de uma lista contendo outras listas. Uma lista com o título de cada sessão e outra lista com as informações acessadas pelo índice da lista dos dados recebidos, todas como texto.
- Define a janela setando o título e o layout
- Itera a leitura dos eventos e dos valores da janela
-
mostrar_info_arquivos_diretorios()
- Define o layout da janela de arquivos/diretórios através de uma lista contendo outras listas. Uma lista com um texto de solicitação e um input de usuário para requerer o nome do diretório alvo da busca, uma lista com um texto de solicitação, um input de usuário para requerer o caminho do arquivo e um botão OK, uma lista definindo o titulo da tabela de arquivo e uma lista definindo uma tela de output.
- Define a janela setando o título e o layout
- Itera a leitura dos eventos e dos valores da janela e seta os inputs de usuário em variáveis como valores
- Envia os inputs para o servidor, recebe a lista de resposta e printa no output os dados acessados pelo índice da lista de resposta quando disparado o evento do botão OK
- Se o evento OK mostrar alguma exceção, o programa mostrará apenas uma mensagem de erro "O diretório não existe"
-
mostrar_info_processos()
- Define o layout da janela de arquivos/diretórios através de uma lista contendo outras listas. Uma lista com um texto de solicitação e um input de usuário para requerer o PID do processo e um botão OK e outra definindo uma tela de output.
- Define a janela setando o título e o layout
- Itera a leitura dos eventos e dos valores da janela e seta o input de usuário e uma variável como valor
- Envia o input para o servidor, recebe a lista de resposta e printa no output os dados acessados pelo índice da lista de resposta quando disparado o evento do botão OK
-
mostrar_scanner_portas():
- Define o layout da janela de scanner de portas através de uma lista contendo outras listas. Uma lista com um texto de solicitação e um input de usuário para requerer o Ip alvo, outra lista com um texto de solicitação e dois inputs para requerer o valor de porta mínima e porta máxima e um botão SCAM e outrdefinindo uma tela de output.
- Define a janela setando o título e o layout
- Itera a leitura dos eventos e dos valores da janela e seta os inputs de usuário em variáveis como valores
- Envia os inputs para o servidor, recebe a lista de resposta e printa, a cada dois segundos, no output os dados acessados pelo índice da lista de resposta quando disparado o evento do botão SCAM
Lado Servidor
-
conexao_cliente()
- Define o ip do host
- Define a porta de conexão
- Abre o socket
- Concatena host e porta
- Inicia a escuta de conexões e printa a mensagem de espera no console
- Quando o cliente se conecta, o servidor aceita a conexão, definindo host cliente e seu endereço após isso imprime a mensagem de “conectado” no console
- Itera o recebimento das requisições dos eventos captados pelo menu do cliente
- De acordo com cada requisição recebida, envia as respostas processadas porcada método do servidor
-
dados_cpu()
- Coleta as informações da CPU com o cpuinfo.get_cpu_info()
- Define o número total de nucleos com o psutil.cpu_count()
- Define os núcleos físicos com o psutil.cpu_count(logical=False)
- Monta os dados da CPU em string
- Retorna os dados da CPU
-
dados_memoria_ram()
- Coleta as informações sobre memória RAM com o psutil.virtual.memory()
- Calcula a memória total
- Calcula a memória utilizada
- Calcula o espaço de memória livre
- Monta os dados de memória em uma string
- Retorna os dados de memória
-
dados_disco()
- Coleta as informações sobre disco com o psutil.disk_usage(“.”)
- Calcula o espaço total de disco
- Calcula o espaço utilizado
- Calcula o espaço livre
- Monta os dados de disco em uma string
- Retorna os dados de disco
-
dados_cpu_memoria()
- Define uma lista de resposta vazia
- Adiciona os dados da CPU na lista de resposta
- Adiciona os dados da memória RAM na lista de resposta
- Adiciona os dados do disco rígido na lista de resposta
- Retorna a lista de resposta
-
dados_arquivos_diretorios(PARAM: cliente - conexão com o cliente)
- Recebe o nome do diretório alvo
- Recebe o caminho do diretório alvo
- Define a lista de resposta vazia
- Coleta os arquivos do diretório alvo com o os.listdir()
- Serpara o nome do diretório com o os.path.split()
- Se o nome do diretório for igual ao nome recebido, coleta a lista de arquivos presentes no diretório
- Percorre a lista de arquivos concatenando o caminho do diretório alvo com o nome de cada arquivo com os.path.join()
- Valida se o arquivo realmente é um arquivo
- Cria um dicionário com o nome de cada arquivo como indice
- Seta com uma lista vazia no dicionário
- Adiciona a lista vazia as informações do arquivo coletadas com o os.stat()
- Adiciona o dicionário completo a lista de resposta
- Retorna a lista de resposta
- Se o nome do diretório não for o mesmo que o o nome informado, uma mensagem de erro será adicionada a lista de resposta.
-
dados_processos(PARAM: cliente - conexão com o cliente)
- Recebe o PID do processo
- Define a lista de resposta vazia
- Coleta a lista de pids da máquina com o psutil.pids()
- Percorre a lista de pids coletando o processo de cada pid
- Se o pid da lista for igual ao pid recebido, adiciona o nome, o executável, a memória consumida e o cpu consumido do processo a lista de resposta
- Retorna a lista de resposta
-
dados_scanner_rede(PARAM: cliente - conexão com o cliente)
- Recebe o ip alvo
- Recebe a porta mínima
- Recebe a porta máxima
- Define o scanner com o nmap.PortScanner()
- Define a lista de resposta vazia
- Percorre o intervalo das portas mínima e máxima
- Define o ip e a porta que serão escaneadas com nmap.scan
- Coleta os status de ip e porta
- Adiciona a porta escaneada e seu status na lista de resposta
- Retorna a lista de resposta