380 lines
10 KiB
Python
380 lines
10 KiB
Python
# coding: utf-8
|
||
|
||
from hashlib import md5
|
||
import datetime
|
||
import uuid
|
||
|
||
from peewee import *
|
||
from playhouse.shortcuts import RetryOperationalError
|
||
from playhouse.postgres_ext import JSONField
|
||
from SWSCloudCore.config import config
|
||
|
||
|
||
class RetryDB(RetryOperationalError, PostgresqlDatabase):
|
||
pass
|
||
|
||
|
||
# connect to database
|
||
database = RetryDB(
|
||
config.get('Database', 'name'),
|
||
host=config.get('Database', 'host'),
|
||
port=config.getint('Database', 'port'),
|
||
user=config.get('Database', 'user'),
|
||
password=config.get('Database', 'password'),
|
||
threadlocals=True,
|
||
fields={'uuid': 'uuid'}
|
||
)
|
||
|
||
|
||
class PgSQLModel(Model):
|
||
class Meta:
|
||
database = database
|
||
|
||
|
||
class DataCenters(PgSQLModel):
|
||
"""
|
||
Модель датацентров
|
||
"""
|
||
id = UUIDField(unique=True, primary_key=True, null=False)
|
||
code = CharField(unique=True)
|
||
name = CharField(unique=True)
|
||
country = CharField()
|
||
city = CharField()
|
||
status = IntegerField(default=0)
|
||
|
||
|
||
class Servers(PgSQLModel):
|
||
id = UUIDField(unique=True, primary_key=True)
|
||
datacenter = ForeignKeyField(DataCenters)
|
||
secret = CharField()
|
||
created = DateTimeField(default=datetime.datetime.now())
|
||
status = IntegerField()
|
||
ip = CharField(unique=True)
|
||
hostname = CharField()
|
||
|
||
|
||
class ServersSettings(PgSQLModel):
|
||
server = ForeignKeyField(Servers)
|
||
key = CharField()
|
||
val = CharField()
|
||
|
||
|
||
class Ips(PgSQLModel):
|
||
datacenter = ForeignKeyField(DataCenters)
|
||
server = ForeignKeyField(Servers)
|
||
ipv4 = CharField()
|
||
ipv6 = CharField()
|
||
ipv4_gateway = CharField()
|
||
ipv6_gateway = CharField()
|
||
# 0: free, 1: used
|
||
status = IntegerField()
|
||
|
||
|
||
class Plans(PgSQLModel):
|
||
id = UUIDField(primary_key=True, unique=True)
|
||
name = CharField(unique=True, null=False)
|
||
status = CharField(null=False, default='active')
|
||
storage = IntegerField(null=False)
|
||
swap = IntegerField(null=False)
|
||
memory = IntegerField(null=False)
|
||
cores = IntegerField(null=False)
|
||
|
||
|
||
class PlansContainers(PgSQLModel):
|
||
datacenter = ForeignKeyField(DataCenters, unique=True)
|
||
name = CharField(default='')
|
||
price_ip = IntegerField(null=False)
|
||
price_storage_gb = IntegerField(null=False)
|
||
price_memory_mb = IntegerField(null=False)
|
||
price_traffic_gb = IntegerField(null=False)
|
||
|
||
|
||
class PlansVMs(PgSQLModel):
|
||
id = UUIDField(primary_key=True, unique=True)
|
||
name = CharField(unique=True, null=False)
|
||
status = CharField(null=False, default='active')
|
||
price = FloatField(null=False)
|
||
storage = IntegerField(null=False)
|
||
swap = IntegerField(null=False)
|
||
memory = IntegerField(null=False)
|
||
cores = IntegerField(null=False)
|
||
|
||
|
||
class Users(PgSQLModel):
|
||
id = UUIDField(primary_key=True, unique=True)
|
||
email = CharField(unique=True, null=False)
|
||
password = CharField()
|
||
created = DateTimeField(default=datetime.datetime.now)
|
||
status = IntegerField()
|
||
|
||
@staticmethod
|
||
def auth(email, password, status=1):
|
||
if Users.select().where(
|
||
Users.email == email, Users.password == Users.hash_password(password), Users.status == status
|
||
).count() == 0:
|
||
return False
|
||
return True
|
||
|
||
@staticmethod
|
||
def hash_password(password):
|
||
return md5(password).hexdigest()
|
||
|
||
@staticmethod
|
||
def get_by_id(user_id):
|
||
return Users.select().where(Users.id == user_id).get()
|
||
|
||
|
||
class UsersRecoveryCodes(PgSQLModel):
|
||
user = ForeignKeyField(Users)
|
||
recovery_code = CharField(null=False)
|
||
created = DateTimeField(default=datetime.datetime.now)
|
||
|
||
|
||
class UsersSecrets(PgSQLModel):
|
||
user = ForeignKeyField(Users)
|
||
# 4f235008-a9bd-11e5-a24e-28d244e159e9
|
||
secret = CharField(unique=False, null=False)
|
||
# 1.1.1.1,1.2.3.4
|
||
acl = TextField()
|
||
# 0 - inactive
|
||
# 1 - active
|
||
status = IntegerField()
|
||
|
||
|
||
class UsersDetails(PgSQLModel):
|
||
user = ForeignKeyField(Users)
|
||
fname = CharField(null=True, default='')
|
||
lname = CharField(null=True, default='')
|
||
address = CharField(null=True, default='')
|
||
city = CharField(null=True, default='')
|
||
country = CharField(null=True, default='')
|
||
state = CharField(null=True, default='')
|
||
zipcode = IntegerField(null=True, default=0)
|
||
|
||
|
||
class UsersBalance(PgSQLModel):
|
||
"""
|
||
Текущий баланс пользователей
|
||
"""
|
||
user = ForeignKeyField(Users)
|
||
balance = FloatField(default=0, null=False)
|
||
|
||
@staticmethod
|
||
def get_by_account(user_id):
|
||
x = UsersBalance.select(UsersBalance.balance).where(UsersBalance.user == user_id).get()
|
||
return x.balance
|
||
|
||
|
||
class UsersBalanceTransactions(PgSQLModel):
|
||
"""
|
||
Транзакции
|
||
"""
|
||
user = ForeignKeyField(Users)
|
||
amount = FloatField(default=0, null=False)
|
||
created = DateTimeField(default=datetime.datetime.now)
|
||
notified = IntegerField(null=False, default=0)
|
||
# success, process, fail
|
||
status = TextField(null=False)
|
||
paid = DateTimeField()
|
||
# robokassa, webmoney, yandex_money, rbk_money, alfaclick, sberbank_online, paypal, invoice
|
||
method = CharField(null=False, default=0)
|
||
details = JSONField(default='{}')
|
||
|
||
|
||
class SSHKeys(PgSQLModel):
|
||
user = ForeignKeyField(Users)
|
||
sshkey = TextField(null=True)
|
||
# с какого ip был добавлен ключ
|
||
remote = TextField(null=True)
|
||
# когда был добавлен ключ
|
||
created = DateTimeField(default=datetime.datetime.now)
|
||
|
||
|
||
class Containers(PgSQLModel):
|
||
id = UUIDField(primary_key=True, unique=True)
|
||
datacenter = ForeignKeyField(DataCenters)
|
||
server = ForeignKeyField(Servers)
|
||
user = ForeignKeyField(Users)
|
||
ipv4 = CharField()
|
||
ipv6 = CharField()
|
||
# 0: inactive, 1: active, 2: ..., 3: ..., 4: ..., 5: ...
|
||
status = IntegerField()
|
||
|
||
@staticmethod
|
||
def get_items():
|
||
return Containers.select().execute()
|
||
|
||
|
||
class ContainersStatistics(PgSQLModel):
|
||
container = ForeignKeyField(Containers)
|
||
created = DateTimeField(default=datetime.datetime.now)
|
||
cpu = BigIntegerField(default=0, null=False)
|
||
memory = BigIntegerField(default=0, null=False)
|
||
size = BigIntegerField(default=0, null=False)
|
||
net_tx = BigIntegerField(default=0, null=False)
|
||
net_rx = BigIntegerField(default=0, null=False)
|
||
net_total = BigIntegerField(default=0, null=False)
|
||
|
||
|
||
class ContainersStatisticsState(PgSQLModel):
|
||
container = ForeignKeyField(Containers)
|
||
updated = DateTimeField(default=datetime.datetime.now)
|
||
cpu = BigIntegerField(default=0, null=False)
|
||
memory = BigIntegerField(default=0, null=False)
|
||
size = BigIntegerField(default=0, null=False)
|
||
net_tx = BigIntegerField(default=0, null=False)
|
||
net_rx = BigIntegerField(default=0, null=False)
|
||
net_total = BigIntegerField(default=0, null=False)
|
||
|
||
|
||
class Vms(PgSQLModel):
|
||
id = UUIDField(primary_key=True, unique=True)
|
||
datacenter = ForeignKeyField(DataCenters)
|
||
server = ForeignKeyField(Servers)
|
||
user = ForeignKeyField(Users)
|
||
plan = ForeignKeyField(PlansVMs)
|
||
# 386, x86_64
|
||
hostname = CharField()
|
||
platform = CharField()
|
||
os_name = CharField()
|
||
os_suite = CharField()
|
||
ipv4 = CharField()
|
||
ipv6 = CharField()
|
||
# 0: inactive, 1: active, 2: ..., 3: ..., 4: ..., 5: ...
|
||
status = IntegerField()
|
||
|
||
@staticmethod
|
||
def get_items():
|
||
return Vms.select()
|
||
|
||
@staticmethod
|
||
def get_item(vm_id):
|
||
return Vms.select().where(Vms.id == vm_id).first()
|
||
|
||
@staticmethod
|
||
def exists(vm_id):
|
||
if Vms.select().where(Vms.id == vm_id).count() == 0:
|
||
return False
|
||
return True
|
||
|
||
@staticmethod
|
||
def set_status(vm_id, status):
|
||
"""
|
||
|
||
:param vm_id:
|
||
:param status:
|
||
:return:
|
||
"""
|
||
x = Vms.update(status=status).where(Vms.id == vm_id)
|
||
x.execute()
|
||
return True
|
||
|
||
@staticmethod
|
||
def get_state(vm_id):
|
||
c = Vms.select(Vms.status).where(Vms.id == vm_id).first()
|
||
return c.status
|
||
|
||
|
||
class Tasks(PgSQLModel):
|
||
id = UUIDField(primary_key=True, unique=True)
|
||
datacenter = ForeignKeyField(DataCenters)
|
||
server = ForeignKeyField(Servers)
|
||
user = ForeignKeyField(Users)
|
||
created = DateTimeField(default=datetime.datetime.now)
|
||
task = CharField(null=False)
|
||
# 0 - new, 1 - working, 2 - completed
|
||
status = IntegerField(null=False, default=0)
|
||
plain = TextField()
|
||
|
||
@staticmethod
|
||
def exists_active_tasks(user_id):
|
||
if Tasks.select().where(Tasks.user == user_id, Tasks.status != 2).count() == 0:
|
||
return False
|
||
return True
|
||
|
||
@staticmethod
|
||
def count_items(status=None):
|
||
if status:
|
||
Tasks.select().where(Tasks.status == status).count()
|
||
return Tasks.select().count()
|
||
|
||
# @staticmethod
|
||
# def set_task(datacenter_id, server_id, task, status, **args):
|
||
# task_id = uuid.uuid4()
|
||
# plain = dict()
|
||
# for arg in args:
|
||
# plain[arg] = str(args[arg])
|
||
#
|
||
# Tasks.create(
|
||
# id=task_id,
|
||
# datacenter=datacenter_id,
|
||
# server=server_id,
|
||
# task=task,
|
||
# status=status,
|
||
# user=self.user_id,
|
||
# plain=json.dumps(plain)
|
||
# )
|
||
|
||
|
||
class Settings(PgSQLModel):
|
||
"""
|
||
Модель настроек
|
||
"""
|
||
key = TextField(unique=True, null=False)
|
||
val = TextField(null=True)
|
||
|
||
@staticmethod
|
||
def get_item(key):
|
||
if Settings.select().where(Settings.key == key).count() == 0:
|
||
return None
|
||
return Settings.select(Settings.val).where(Settings.key == key).first().val
|
||
|
||
|
||
class Admins(PgSQLModel):
|
||
id = UUIDField(primary_key=True, unique=True)
|
||
email = CharField(unique=True, null=False)
|
||
password = CharField()
|
||
status = IntegerField()
|
||
|
||
@staticmethod
|
||
def auth(email, password, status=1):
|
||
"""
|
||
|
||
:param email:
|
||
:param password:
|
||
:param status:
|
||
:return:
|
||
"""
|
||
password_hash = md5(password).hexdigest()
|
||
|
||
if Admins.select().where(
|
||
Admins.email == email,
|
||
Admins.password == password_hash,
|
||
Admins.status == status).count() == 0:
|
||
return False
|
||
return True
|
||
|
||
|
||
class Notifications(PgSQLModel):
|
||
user = ForeignKeyField(Users)
|
||
# 0 - unread
|
||
# 1 - read
|
||
status = IntegerField(null=False)
|
||
# Default
|
||
# Primary
|
||
# Success
|
||
# Info
|
||
# Warning
|
||
# Danger
|
||
message_type = CharField(null=False)
|
||
title = TextField()
|
||
message = TextField()
|
||
|
||
|
||
class NotificationsSecurity(PgSQLModel):
|
||
# auth_web
|
||
# auth_api
|
||
# auth_serverapi
|
||
alert = CharField(null=False)
|
||
notified = DateTimeField(default=datetime.datetime.now)
|
||
details = TextField()
|