mirror of https://github.com/Aidaho12/haproxy-wi
parent
8ff3213065
commit
a50fe9a946
178
app/db_model.py
178
app/db_model.py
|
@ -5,12 +5,12 @@ from funct import get_config_var
|
||||||
mysql_enable = get_config_var('mysql', 'enable')
|
mysql_enable = get_config_var('mysql', 'enable')
|
||||||
|
|
||||||
if mysql_enable == '1':
|
if mysql_enable == '1':
|
||||||
mysql_user = funct.get_config_var('mysql', 'mysql_user')
|
mysql_user = get_config_var('mysql', 'mysql_user')
|
||||||
mysql_password = funct.get_config_var('mysql', 'mysql_password')
|
mysql_password = get_config_var('mysql', 'mysql_password')
|
||||||
mysql_db = funct.get_config_var('mysql', 'mysql_db')
|
mysql_db = get_config_var('mysql', 'mysql_db')
|
||||||
mysql_host = funct.get_config_var('mysql', 'mysql_host')
|
mysql_host = get_config_var('mysql', 'mysql_host')
|
||||||
mysql_port = funct.get_config_var('mysql', 'mysql_port')
|
mysql_port = get_config_var('mysql', 'mysql_port')
|
||||||
conn = MySQLDatabase(mysql_db, user=mysql_user, password=mysql_password, host=mysql_host, port=mysql_port)
|
conn = MySQLDatabase(mysql_db, user=mysql_user, password=mysql_password, host=mysql_host, port=int(mysql_port))
|
||||||
else:
|
else:
|
||||||
db = "/var/www/haproxy-wi/app/roxy-wi.db"
|
db = "/var/www/haproxy-wi/app/roxy-wi.db"
|
||||||
conn = SqliteDatabase(db)
|
conn = SqliteDatabase(db)
|
||||||
|
@ -23,11 +23,11 @@ class BaseModel(Model):
|
||||||
|
|
||||||
class User(BaseModel):
|
class User(BaseModel):
|
||||||
user_id = AutoField(column_name='id')
|
user_id = AutoField(column_name='id')
|
||||||
username = TextField(constraints=[SQL('UNIQUE')])
|
username = CharField(constraints=[SQL('UNIQUE')])
|
||||||
email = TextField(constraints=[SQL('UNIQUE')])
|
email = CharField(constraints=[SQL('UNIQUE')])
|
||||||
password = TextField(null=True)
|
password = CharField(null=True)
|
||||||
role = TextField()
|
role = CharField()
|
||||||
groups = TextField()
|
groups = CharField()
|
||||||
ldap_user = IntegerField(default=0)
|
ldap_user = IntegerField(default=0)
|
||||||
activeuser = IntegerField(default=1)
|
activeuser = IntegerField(default=1)
|
||||||
|
|
||||||
|
@ -37,9 +37,9 @@ class User(BaseModel):
|
||||||
|
|
||||||
class Server(BaseModel):
|
class Server(BaseModel):
|
||||||
server_id = AutoField(column_name='id')
|
server_id = AutoField(column_name='id')
|
||||||
hostname = TextField()
|
hostname = CharField()
|
||||||
ip = TextField()
|
ip = CharField()
|
||||||
groups = TextField()
|
groups = CharField()
|
||||||
type_ip = IntegerField(default=0)
|
type_ip = IntegerField(default=0)
|
||||||
enable = IntegerField(default=1)
|
enable = IntegerField(default=1)
|
||||||
master = IntegerField(default=0)
|
master = IntegerField(default=0)
|
||||||
|
@ -47,7 +47,7 @@ class Server(BaseModel):
|
||||||
alert = IntegerField(default=0)
|
alert = IntegerField(default=0)
|
||||||
metrics = IntegerField(default=0)
|
metrics = IntegerField(default=0)
|
||||||
port = IntegerField(default=22)
|
port = IntegerField(default=22)
|
||||||
desc = TextField(null=True)
|
desc = CharField(null=True)
|
||||||
active = IntegerField(default=0)
|
active = IntegerField(default=0)
|
||||||
keepalived = IntegerField(default=0)
|
keepalived = IntegerField(default=0)
|
||||||
nginx = IntegerField(default=0)
|
nginx = IntegerField(default=0)
|
||||||
|
@ -64,8 +64,8 @@ class Server(BaseModel):
|
||||||
|
|
||||||
class Role(BaseModel):
|
class Role(BaseModel):
|
||||||
role_id = AutoField(column_name='id')
|
role_id = AutoField(column_name='id')
|
||||||
name = TextField(constraints=[SQL('UNIQUE')])
|
name = CharField(constraints=[SQL('UNIQUE')])
|
||||||
description = DateTimeField()
|
description = CharField()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
table_name = 'role'
|
table_name = 'role'
|
||||||
|
@ -73,8 +73,8 @@ class Role(BaseModel):
|
||||||
|
|
||||||
class Telegram(BaseModel):
|
class Telegram(BaseModel):
|
||||||
id = AutoField()
|
id = AutoField()
|
||||||
token = TextField()
|
token = CharField()
|
||||||
chanel_name = TextField()
|
chanel_name = CharField()
|
||||||
groups = IntegerField()
|
groups = IntegerField()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -83,8 +83,8 @@ class Telegram(BaseModel):
|
||||||
|
|
||||||
class Slack(BaseModel):
|
class Slack(BaseModel):
|
||||||
id = AutoField()
|
id = AutoField()
|
||||||
token = TextField()
|
token = CharField()
|
||||||
chanel_name = TextField()
|
chanel_name = CharField()
|
||||||
groups = IntegerField()
|
groups = IntegerField()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -93,7 +93,7 @@ class Slack(BaseModel):
|
||||||
|
|
||||||
class UUID(BaseModel):
|
class UUID(BaseModel):
|
||||||
user_id = IntegerField()
|
user_id = IntegerField()
|
||||||
uuid = TextField()
|
uuid = CharField()
|
||||||
exp = DateTimeField(default=datetime.now)
|
exp = DateTimeField(default=datetime.now)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -103,7 +103,7 @@ class UUID(BaseModel):
|
||||||
|
|
||||||
class Token(BaseModel):
|
class Token(BaseModel):
|
||||||
user_id = IntegerField()
|
user_id = IntegerField()
|
||||||
token = TextField()
|
token = CharField()
|
||||||
exp = DateTimeField(default=datetime.now)
|
exp = DateTimeField(default=datetime.now)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -112,8 +112,8 @@ class Token(BaseModel):
|
||||||
|
|
||||||
|
|
||||||
class ApiToken(BaseModel):
|
class ApiToken(BaseModel):
|
||||||
token = TextField()
|
token = CharField()
|
||||||
user_name = TextField()
|
user_name = CharField()
|
||||||
user_group_id = IntegerField()
|
user_group_id = IntegerField()
|
||||||
user_role = IntegerField()
|
user_role = IntegerField()
|
||||||
create_date = DateTimeField(default=datetime.now)
|
create_date = DateTimeField(default=datetime.now)
|
||||||
|
@ -125,10 +125,10 @@ class ApiToken(BaseModel):
|
||||||
|
|
||||||
|
|
||||||
class Setting(BaseModel):
|
class Setting(BaseModel):
|
||||||
param = TextField()
|
param = CharField()
|
||||||
value = TextField(null=True)
|
value = CharField(null=True)
|
||||||
section = TextField()
|
section = CharField()
|
||||||
desc = TextField()
|
desc = CharField()
|
||||||
group = IntegerField(null=True, constraints=[SQL('DEFAULT 1')])
|
group = IntegerField(null=True, constraints=[SQL('DEFAULT 1')])
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -139,8 +139,8 @@ class Setting(BaseModel):
|
||||||
|
|
||||||
class Groups(BaseModel):
|
class Groups(BaseModel):
|
||||||
group_id = AutoField(column_name='id')
|
group_id = AutoField(column_name='id')
|
||||||
name = TextField(constraints=[SQL('UNIQUE')])
|
name = CharField(constraints=[SQL('UNIQUE')])
|
||||||
description = TextField(null=True)
|
description = CharField(null=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
table_name = 'groups'
|
table_name = 'groups'
|
||||||
|
@ -158,10 +158,10 @@ class UserGroups(BaseModel):
|
||||||
|
|
||||||
class Cred(BaseModel):
|
class Cred(BaseModel):
|
||||||
id = AutoField()
|
id = AutoField()
|
||||||
name = TextField()
|
name = CharField()
|
||||||
enable = IntegerField(constraints=[SQL('DEFAULT 1')])
|
enable = IntegerField(constraints=[SQL('DEFAULT 1')])
|
||||||
username = TextField()
|
username = CharField()
|
||||||
password = TextField(null=True)
|
password = CharField(null=True)
|
||||||
groups = IntegerField(constraints=[SQL('DEFAULT 1')])
|
groups = IntegerField(constraints=[SQL('DEFAULT 1')])
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -171,20 +171,20 @@ class Cred(BaseModel):
|
||||||
|
|
||||||
class Backup(BaseModel):
|
class Backup(BaseModel):
|
||||||
id = AutoField()
|
id = AutoField()
|
||||||
server = TextField()
|
server = CharField()
|
||||||
rhost = TextField()
|
rhost = CharField()
|
||||||
rpath = TextField()
|
rpath = CharField()
|
||||||
backup_type = TextField(column_name='type')
|
backup_type = CharField(column_name='type')
|
||||||
time = TextField()
|
time = CharField()
|
||||||
cred = IntegerField()
|
cred = IntegerField()
|
||||||
description = TextField(null=True)
|
description = CharField(null=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
table_name = 'backups'
|
table_name = 'backups'
|
||||||
|
|
||||||
|
|
||||||
class Metrics(BaseModel):
|
class Metrics(BaseModel):
|
||||||
serv = TextField()
|
serv = CharField()
|
||||||
curr_con = IntegerField()
|
curr_con = IntegerField()
|
||||||
cur_ssl_con = IntegerField()
|
cur_ssl_con = IntegerField()
|
||||||
sess_rate = IntegerField()
|
sess_rate = IntegerField()
|
||||||
|
@ -197,7 +197,7 @@ class Metrics(BaseModel):
|
||||||
|
|
||||||
|
|
||||||
class WafMetrics(BaseModel):
|
class WafMetrics(BaseModel):
|
||||||
serv = TextField()
|
serv = CharField()
|
||||||
conn = IntegerField()
|
conn = IntegerField()
|
||||||
date = DateTimeField(default=datetime.now)
|
date = DateTimeField(default=datetime.now)
|
||||||
|
|
||||||
|
@ -207,7 +207,7 @@ class WafMetrics(BaseModel):
|
||||||
|
|
||||||
|
|
||||||
class Version(BaseModel):
|
class Version(BaseModel):
|
||||||
version = TextField()
|
version = CharField()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
table_name = 'version'
|
table_name = 'version'
|
||||||
|
@ -216,8 +216,8 @@ class Version(BaseModel):
|
||||||
|
|
||||||
class Option(BaseModel):
|
class Option(BaseModel):
|
||||||
id = AutoField()
|
id = AutoField()
|
||||||
options = TextField()
|
options = CharField()
|
||||||
groups = TextField()
|
groups = CharField()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
table_name = 'options'
|
table_name = 'options'
|
||||||
|
@ -225,9 +225,9 @@ class Option(BaseModel):
|
||||||
|
|
||||||
class SavedServer(BaseModel):
|
class SavedServer(BaseModel):
|
||||||
id = AutoField()
|
id = AutoField()
|
||||||
server = TextField()
|
server = CharField()
|
||||||
description = TextField(null=True)
|
description = CharField(null=True)
|
||||||
groups = TextField()
|
groups = CharField()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
table_name = 'saved_servers'
|
table_name = 'saved_servers'
|
||||||
|
@ -245,10 +245,10 @@ class Waf(BaseModel):
|
||||||
|
|
||||||
class WafRules(BaseModel):
|
class WafRules(BaseModel):
|
||||||
id = AutoField()
|
id = AutoField()
|
||||||
serv = TextField()
|
serv = CharField()
|
||||||
rule_name = TextField()
|
rule_name = CharField()
|
||||||
rule_file = TextField()
|
rule_file = CharField()
|
||||||
desc = TextField(null=True)
|
desc = CharField(null=True)
|
||||||
en = IntegerField(constraints=[SQL('DEFAULT 1')])
|
en = IntegerField(constraints=[SQL('DEFAULT 1')])
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -270,10 +270,10 @@ class PortScannerSettings(BaseModel):
|
||||||
|
|
||||||
|
|
||||||
class PortScannerPorts(BaseModel):
|
class PortScannerPorts(BaseModel):
|
||||||
serv = TextField()
|
serv = CharField()
|
||||||
user_group_id = IntegerField()
|
user_group_id = IntegerField()
|
||||||
port = IntegerField()
|
port = IntegerField()
|
||||||
service_name = TextField()
|
service_name = CharField()
|
||||||
date = DateTimeField(default=datetime.now)
|
date = DateTimeField(default=datetime.now)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -282,10 +282,10 @@ class PortScannerPorts(BaseModel):
|
||||||
|
|
||||||
|
|
||||||
class PortScannerHistory(BaseModel):
|
class PortScannerHistory(BaseModel):
|
||||||
serv = TextField()
|
serv = CharField()
|
||||||
port = IntegerField()
|
port = IntegerField()
|
||||||
status = TextField()
|
status = CharField()
|
||||||
service_name = TextField()
|
service_name = CharField()
|
||||||
date = DateTimeField(default=datetime.now)
|
date = DateTimeField(default=datetime.now)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -295,11 +295,11 @@ class PortScannerHistory(BaseModel):
|
||||||
|
|
||||||
class ProvidersCreds(BaseModel):
|
class ProvidersCreds(BaseModel):
|
||||||
id = AutoField()
|
id = AutoField()
|
||||||
name = TextField()
|
name = CharField()
|
||||||
type = TextField()
|
type = CharField()
|
||||||
group = TextField()
|
group = CharField()
|
||||||
key = TextField()
|
key = CharField()
|
||||||
secret = TextField(null=True)
|
secret = CharField(null=True)
|
||||||
create_date = DateTimeField(default=datetime.now)
|
create_date = DateTimeField(default=datetime.now)
|
||||||
edit_date = DateTimeField(default=datetime.now)
|
edit_date = DateTimeField(default=datetime.now)
|
||||||
|
|
||||||
|
@ -309,38 +309,38 @@ class ProvidersCreds(BaseModel):
|
||||||
|
|
||||||
class ProvisionedServers(BaseModel):
|
class ProvisionedServers(BaseModel):
|
||||||
id = AutoField()
|
id = AutoField()
|
||||||
region = TextField()
|
region = CharField()
|
||||||
instance_type = TextField()
|
instance_type = CharField()
|
||||||
public_ip = IntegerField(null=True)
|
public_ip = IntegerField(null=True)
|
||||||
floating_ip = IntegerField(null=True)
|
floating_ip = IntegerField(null=True)
|
||||||
volume_size = IntegerField(null=True)
|
volume_size = IntegerField(null=True)
|
||||||
backup = IntegerField(null=True)
|
backup = IntegerField(null=True)
|
||||||
monitoring = IntegerField(null=True)
|
monitoring = IntegerField(null=True)
|
||||||
private_networking = IntegerField(null=True)
|
private_networking = IntegerField(null=True)
|
||||||
ssh_key_name = TextField(null=True)
|
ssh_key_name = CharField(null=True)
|
||||||
ssh_ids = TextField(null=True)
|
ssh_ids = CharField(null=True)
|
||||||
name = TextField()
|
name = CharField()
|
||||||
os = TextField()
|
os = CharField()
|
||||||
firewall = IntegerField()
|
firewall = IntegerField()
|
||||||
provider_id = IntegerField()
|
provider_id = IntegerField()
|
||||||
type = TextField()
|
type = CharField()
|
||||||
status = TextField()
|
status = CharField()
|
||||||
group_id = IntegerField()
|
group_id = IntegerField()
|
||||||
date = DateTimeField(default=datetime.now)
|
date = DateTimeField(default=datetime.now)
|
||||||
IP = TextField(null=True)
|
IP = CharField(null=True)
|
||||||
last_error = TextField(null=True)
|
last_error = CharField(null=True)
|
||||||
delete_on_termination = IntegerField(null=True)
|
delete_on_termination = IntegerField(null=True)
|
||||||
project = TextField(null=True)
|
project = CharField(null=True)
|
||||||
network_name = TextField(null=True)
|
network_name = CharField(null=True)
|
||||||
volume_type = TextField(null=True)
|
volume_type = CharField(null=True)
|
||||||
name_template = TextField(null=True)
|
name_template = CharField(null=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
table_name = 'provisioned_servers'
|
table_name = 'provisioned_servers'
|
||||||
|
|
||||||
|
|
||||||
class MetricsHttpStatus(BaseModel):
|
class MetricsHttpStatus(BaseModel):
|
||||||
serv = TextField()
|
serv = CharField()
|
||||||
ok_ans = IntegerField(column_name='2xx')
|
ok_ans = IntegerField(column_name='2xx')
|
||||||
redir_ans = IntegerField(column_name='3xx')
|
redir_ans = IntegerField(column_name='3xx')
|
||||||
not_found_ans = IntegerField(column_name='4xx')
|
not_found_ans = IntegerField(column_name='4xx')
|
||||||
|
@ -358,14 +358,14 @@ class SMON(BaseModel):
|
||||||
port = IntegerField(null=True)
|
port = IntegerField(null=True)
|
||||||
status = IntegerField(constraints=[SQL('DEFAULT 1')])
|
status = IntegerField(constraints=[SQL('DEFAULT 1')])
|
||||||
en = IntegerField(constraints=[SQL('DEFAULT 1')])
|
en = IntegerField(constraints=[SQL('DEFAULT 1')])
|
||||||
desc = TextField(null=True)
|
desc = CharField(null=True)
|
||||||
response_time = TextField(null=True)
|
response_time = CharField(null=True)
|
||||||
time_state = IntegerField(constraints=[SQL('DEFAULT 0')])
|
time_state = IntegerField(constraints=[SQL('DEFAULT 0')])
|
||||||
group = TextField(null=True)
|
group = CharField(null=True)
|
||||||
script = TextField(null=True)
|
script = CharField(null=True)
|
||||||
http = TextField(null=True)
|
http = CharField(null=True)
|
||||||
http_status = IntegerField(constraints=[SQL('DEFAULT 1')])
|
http_status = IntegerField(constraints=[SQL('DEFAULT 1')])
|
||||||
body = TextField(null=True)
|
body = CharField(null=True)
|
||||||
body_status = IntegerField(constraints=[SQL('DEFAULT 1')])
|
body_status = IntegerField(constraints=[SQL('DEFAULT 1')])
|
||||||
telegram_channel_id = IntegerField(null=True)
|
telegram_channel_id = IntegerField(null=True)
|
||||||
user_group = IntegerField()
|
user_group = IntegerField()
|
||||||
|
@ -376,12 +376,12 @@ class SMON(BaseModel):
|
||||||
|
|
||||||
|
|
||||||
class Alerts(BaseModel):
|
class Alerts(BaseModel):
|
||||||
message = TextField()
|
message = CharField()
|
||||||
level = TextField()
|
level = CharField()
|
||||||
ip = TextField()
|
ip = CharField()
|
||||||
port = IntegerField()
|
port = IntegerField()
|
||||||
user_group = IntegerField(constraints=[SQL('DEFAULT 1')])
|
user_group = IntegerField(constraints=[SQL('DEFAULT 1')])
|
||||||
service = TextField()
|
service = CharField()
|
||||||
date = DateTimeField(default=datetime.now)
|
date = DateTimeField(default=datetime.now)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -390,8 +390,8 @@ class Alerts(BaseModel):
|
||||||
|
|
||||||
|
|
||||||
class GeoipCodes(BaseModel):
|
class GeoipCodes(BaseModel):
|
||||||
code = TextField()
|
code = CharField()
|
||||||
name = TextField()
|
name = CharField()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
table_name = 'geoip_codes'
|
table_name = 'geoip_codes'
|
||||||
|
|
|
@ -13,7 +13,7 @@ nginx_save_configs_dir = ${main:fullpath}/configs/nginx_config/
|
||||||
#Enable MySQL DB. Default will be used Sqlite DB. Default disable
|
#Enable MySQL DB. Default will be used Sqlite DB. Default disable
|
||||||
enable = 0
|
enable = 0
|
||||||
mysql_user = haproxy-wi
|
mysql_user = haproxy-wi
|
||||||
mysql_password = haproxywi
|
mysql_password = haproxy-wi
|
||||||
mysql_db = haproxywi
|
mysql_db = haproxywi
|
||||||
mysql_host = 127.0.0.1
|
mysql_host = 127.0.0.1
|
||||||
mysql_port = 3306
|
mysql_port = 3306
|
||||||
|
|
|
@ -597,11 +597,11 @@ def get_user_id_by_uuid(uuid):
|
||||||
|
|
||||||
|
|
||||||
def get_user_role_by_uuid(uuid):
|
def get_user_role_by_uuid(uuid):
|
||||||
|
query = (Role.select(Role.role_id)
|
||||||
|
.join(User, on=(Role.name == User.role))
|
||||||
|
.join(UUID, on=(User.user_id == UUID.user_id))
|
||||||
|
.where(UUID.uuid == uuid))
|
||||||
try:
|
try:
|
||||||
query = (Role.select(Role.role_id)
|
|
||||||
.join(UUID, on=(User.user_id == UUID.user_id))
|
|
||||||
.join(User, on=(Role.name == User.role))
|
|
||||||
.where(UUID.uuid == uuid))
|
|
||||||
query_res = query.execute()
|
query_res = query.execute()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
out_error(e)
|
out_error(e)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
pyTelegramBotAPI==3.6.3
|
pyTelegramBotAPI==3.6.3
|
||||||
networkx==2.1
|
networkx==2.1
|
||||||
matplotlib==2.1.2
|
matplotlib==2.1.2
|
||||||
mysql-connector-python==8.0.11
|
|
||||||
paramiko-ng>=2.5.0
|
paramiko-ng>=2.5.0
|
||||||
slack-sdk>=3.4.0
|
slack-sdk>=3.4.0
|
||||||
peewee>=3.14.4
|
peewee>=3.14.4
|
||||||
|
PyMySQL>=1.0.2
|
||||||
|
|
|
@ -2,7 +2,7 @@ configparser==3.5.0
|
||||||
pyTelegramBotAPI==3.6.3
|
pyTelegramBotAPI==3.6.3
|
||||||
networkx==2.1
|
networkx==2.1
|
||||||
matplotlib==2.1.2
|
matplotlib==2.1.2
|
||||||
mysql-connector-python==8.0.11
|
|
||||||
paramiko-ng>=2.5.0
|
paramiko-ng>=2.5.0
|
||||||
slack-sdk>=3.4.0
|
slack-sdk>=3.4.0
|
||||||
peewee>=3.14.4
|
peewee>=3.14.4
|
||||||
|
PyMySQL>=1.0.2
|
||||||
|
|
|
@ -6,7 +6,7 @@ pyTelegramBotAPI>=3.6.3
|
||||||
networkx>=2.1
|
networkx>=2.1
|
||||||
matplotlib>=2.1.2
|
matplotlib>=2.1.2
|
||||||
future>=0.13.1
|
future>=0.13.1
|
||||||
mysql-connector-python>=8.0.11
|
|
||||||
jinja2>=2.10.1
|
jinja2>=2.10.1
|
||||||
slack-sdk>=3.4.0
|
slack-sdk>=3.4.0
|
||||||
peewee>=3.14.4
|
peewee>=3.14.4
|
||||||
|
PyMySQL>=1.0.2
|
||||||
|
|
Loading…
Reference in New Issue