├── .gitignore ├── README.md ├── main.py ├── script.sql └── slide apresentação └── slide.pptx /.gitignore: -------------------------------------------------------------------------------- 1 | app.txt -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # API Python 2 semestre CCO 2 | 3 | **Essa aplicação foi feita no intuito de capturar os dados da máquina de uma maneira flexível sem que os comandos ficassem blocados no código.** 4 | **Este projeto foi feito como uma tentativa de ajudar colegas e alunos da SPTech.** 5 | 6 | 7 | ### Como funciona? 8 | **Conexão banco:** 9 | ```python 10 | import mysql.connector 11 | 12 | bdsql = mysql.connector.connect(host="localhost", user="seuUser", 13 | password="senhaUser", database="nomeBanco") 14 | 15 | mycursor = bdsql.cursor() 16 | ``` 17 | **Instale a biblioteca no terminal:** 18 | ``` 19 | pip install mysql-connector-python 20 | ``` 21 | **Explicação:** 22 | 23 | Ao importar a biblioteca do mysql connector, criamos uma variável para receber a conexão com o banco, onde **```mysql.connector```** é o módulo que estamos importando e **```.connect```** é uma função para criar a conexão com o banco de dados e nela passamos os argumentos para a conexão com aquele banco. 24 | Após isso criamos um cursor, ou seja, algo que nos permite executar um código dentro do nosso banco de dados, então criamos uma variável para receber esse cursor onde **```bdsql.cursor()```** bdsql é a variável criada para me conectar ao banco e a função **```cursor()```** é o responsável por executar algum código dentro dessa conexão com o banco. 25 | 26 | **Pegar endereço mac da maquina:** 27 | ```python 28 | from getmac import get_mac_address as mac 29 | 30 | print(mac()) 31 | ``` 32 | **Instale a biblioteca antes:** 33 | ``` 34 | pip install getmac 35 | ``` 36 | **Explicação:** 37 | Da biblioteca **```getmac```** queremos pegar o endereço mac da máquina, então importamos a função **```get_mac_address```** e damos um apelido para essa função de **```mac```** e como o **```get_mac_address```** é uma função para executar basta colocar o **()** no apelido **```mac```** para o Python entender que você está "chamando" a função. 38 | 39 | ### Uso de Thread: 40 | **Caso você queira um programa fazendo multitarefas, você pode utilizar o conceito de Thread, thread basicamente é você executar determinadas partes do código sem que tenha que esperar outras partes serem executadas, você pode criar várias Threads para assim trabalhar com várias tarefas simultaneamente.** 41 | 42 | **Exemplo:** 43 | ```python 44 | import threading 45 | 46 | def exemplo(nome): 47 | for i in range(5): 48 | print(f"{nome} contou até {i+1}") 49 | 50 | def exemplo2(nome): 51 | for i in range(7): 52 | print(f"{nome} contou até {i+1}") 53 | 54 | 55 | threading.Thread(target=exemplo, args=('Pedro',)).start() 56 | threading.Thread(target=exemplo2, args=('Gustavo',)).start() 57 | ``` 58 | 59 | **Explicação:** 60 | Aqui estamos importando o modulo de threading, para podermos usar a Thread, estamos criando duas funções que vão ser as funções a serem executadas simultaneamente, **```threading.Thread(target=exemplo, args=('Pedro',)).start()```** onde **```threading```** é o modulo que estamos importando **```Thread```** é a classe que estamos executando no módulo **```threading```** que recebe os parametros **```target```** que é a função que queremos executar e **```args```** que são os argumentos(parametros) que queremos passar para aquela função **```start()```** é uma função utilizada para iniciar as Threads. 61 | 62 | **Observação:** 63 | Se o seu computador não tiver mais cores do que a quantidade de Thread que você criou, as Threads trabalharam em escalonamento, ou seja, uma será executada e após um tempo executa a próxima, depois volta para a primeira e assim sucessivamente. 64 | 65 | ### Documentação das bibliotecas utilizadas: 66 | 67 | - [Psutil](https://psutil.readthedocs.io/en/latest/) 68 | - [Threading](https://docs.python.org/3/library/threading.html) 69 | - [Mysql.connector](https://dev.mysql.com/doc/connector-python/en/connector-python-example-connecting.html) 70 | - [Getmac](https://pypi.org/project/getmac/) 71 | 72 | 73 | ### Feito por: 74 | 75 | - [@Pedro Henrique Jesuino Varela](https://github.com/Pedro-Jsn) 76 | - [@Vinícius Da Silva Sousa](https://github.com/VS-Sousa) 77 | - [@Gustavo Antonio](https://github.com/GustavoAntonio12) 78 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | from time import sleep 2 | 3 | def main(): 4 | from getmac import get_mac_address as mac 5 | 6 | bdsql, mycursor = conectar() 7 | 8 | query = ('SELECT * FROM servidor WHERE id = %s') 9 | params = (mac(), ) 10 | mycursor.execute(query, params) 11 | 12 | resposta = mycursor.fetchall() 13 | 14 | if(len(resposta) > 0): 15 | selecionarParametro(mycursor, mac()) 16 | else : 17 | cadastrarServidor(bdsql, mycursor, mac()) 18 | 19 | def cadastrarServidor(bdsql, cursor, mac): 20 | query = ("INSERT INTO servidor(id) VALUES (%s)") 21 | params = (mac,) 22 | cursor.execute(query, params) 23 | 24 | bdsql.commit() 25 | 26 | def selecionarParametro(cursor, mac): 27 | 28 | query = ("SELECT * from parametro WHERE fkServidor = %s") 29 | params = (mac, ) 30 | cursor.execute(query, params) 31 | 32 | resposta = cursor.fetchall() 33 | 34 | if(len(resposta) > 0): 35 | executarMonitoramento(resposta) 36 | else: 37 | print("Nenhuma componente cadastrado para monitoramento, cadastre na sua dashboard!") 38 | sleep(3) 39 | 40 | def executarMonitoramento(resposta): 41 | while True: 42 | script = """ 43 | import threading 44 | """ 45 | 46 | i=1 47 | for row in resposta: 48 | script += f""" 49 | def executar_{i}(servidor, componente, metrica): 50 | import psutil 51 | bdsql, cursores = conectar() 52 | 53 | query = ("SELECT comando, isTupla FROM metrica WHERE idMetrica = %s") 54 | val = (metrica, ) 55 | cursores.execute(query, val) 56 | 57 | resposta = cursores.fetchall() # resposta retorna isto [(comando, isTupla)] 58 | isTupla = resposta[0][1] 59 | 60 | comando = resposta[0][0] 61 | leitura = eval(comando) 62 | 63 | if isTupla == 0: 64 | query = ("INSERT INTO leitura(fkServidor, fkComponente, fkMetrica, horario, valorLido) VALUES(%s, %s, %s, now(), %s)") 65 | val = (servidor, componente, metrica, leitura, ) 66 | 67 | cursores.execute(query, val) 68 | bdsql.commit() 69 | else: 70 | for row in leitura: 71 | query = ("INSERT INTO leitura(fkServidor, fkComponente, fkMetrica, horario, valorLido) VALUES(%s, %s, %s, now(), %s)") 72 | val = (servidor, componente, metrica, row, ) 73 | 74 | cursores.execute(query, val) 75 | bdsql.commit() 76 | 77 | threading.Thread(target=executar_{i}, args=('{row[0]}', {row[1]}, {row[2]},)).start() 78 | """ 79 | i += 1 80 | if script != None: 81 | exec(script) 82 | 83 | sleep(10) 84 | print("Executando...") 85 | 86 | 87 | def conectar(): 88 | import mysql.connector 89 | 90 | bdsql = mysql.connector.connect(host="localhost", user="seuUser", password="senhaUser", database="nomeBanco") 91 | mycursor = bdsql.cursor() 92 | 93 | return (bdsql, mycursor) 94 | 95 | if __name__ == '__main__': 96 | main() -------------------------------------------------------------------------------- /script.sql: -------------------------------------------------------------------------------- 1 | CREATE DATABASE appPython; 2 | USE appPython; 3 | 4 | # DROP DATABASE appPython; 5 | 6 | CREATE TABLE servidor( 7 | id CHAR(17) PRIMARY KEY 8 | ); 9 | 10 | SELECT * FROM servidor; 11 | 12 | INSERT INTO servidor VALUES(); 13 | 14 | CREATE TABLE componente( 15 | idComponente INT PRIMARY KEY AUTO_INCREMENT 16 | ,fkServidor CHAR(17) 17 | ,tipoComponente VARCHAR(25) 18 | ,FOREIGN KEY (fkServidor) REFERENCES servidor(id) 19 | ); 20 | 21 | INSERT INTO componente(fkServidor, tipoComponente) 22 | VALUES('0c:9d:92:00:02:b5', "CPU") 23 | ,('0c:9d:92:00:02:b5', "DISCO") 24 | ,('0c:9d:92:00:02:b5', "RAM"); 25 | 26 | CREATE TABLE metrica( 27 | idMetrica INT PRIMARY KEY AUTO_INCREMENT 28 | ,nomeMetrica VARCHAR(50) 29 | ,comando VARCHAR(75) 30 | ,unidadeMedida VARCHAR(50) 31 | ,tipoComponente VARCHAR(50) 32 | ,isTupla INT 33 | ); 34 | 35 | INSERT INTO metrica(nomeMetrica, comando, unidadeMedida, tipoComponente, isTupla) 36 | VALUES("CPU Percent", "psutil.cpu_percent()", "%", "CPU", 0) 37 | ,("CPU Percent por core", "psutil.cpu_percent(interval=1, percpu=True)", "%", "CPU", 1) 38 | ,("Disco percent", "psutil.disk_usage('/').percent", "%", "DISCO", 0) 39 | ,("RAM Percent", "psutil.virtual_memory().percent", "%", "RAM", 0); 40 | 41 | CREATE TABLE parametro( 42 | fkServidor CHAR(17) 43 | ,fkComponente INT 44 | ,fkMetrica INT 45 | ,FOREIGN KEY (fkServidor) REFERENCES servidor(id) 46 | ,FOREIGN KEY (fkComponente) REFERENCES componente(idComponente) 47 | ,FOREIGN KEY (fkMetrica) REFERENCES metrica(idMetrica) 48 | ); 49 | 50 | INSERT INTO parametro(fkServidor, fkComponente, fkMetrica) 51 | VALUES('0c:9d:92:00:02:b5', 1, 1) 52 | ,('0c:9d:92:00:02:b5', 1, 2) 53 | ,('0c:9d:92:00:02:b5', 2, 3) 54 | ,('0c:9d:92:00:02:b5', 3, 4); 55 | 56 | CREATE TABLE leitura( 57 | idLeitura INT AUTO_INCREMENT 58 | ,fkServidor CHAR(17) 59 | ,fkComponente INT 60 | ,fkMetrica INT 61 | ,horario DATETIME 62 | ,valorLido DECIMAL(8,2) 63 | ,FOREIGN KEY (fkServidor) REFERENCES servidor(id) 64 | ,FOREIGN KEY (fkComponente) REFERENCES componente(idComponente) 65 | ,FOREIGN KEY (fkMetrica) REFERENCES metrica(idMetrica) 66 | ,PRIMARY KEY(idLeitura, fkServidor, fkComponente, fkMetrica, horario) 67 | ); 68 | 69 | SELECT * FROM leitura; 70 | 71 | CREATE VIEW medicoes AS 72 | SELECT fkComponente, tipoComponente, valorLido, horario FROM leitura 73 | INNER JOIN componente ON fkComponente = idComponente 74 | ORDER BY fkComponente; 75 | 76 | SELECT * FROM medicoes; -------------------------------------------------------------------------------- /slide apresentação/slide.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pedro-Jsn/API-Python-2sem/2c26ed55d7f1b3ae596c8111192d66c5f15fca4e/slide apresentação/slide.pptx --------------------------------------------------------------------------------