2015-11-26 23:50:33 +03:00
|
|
|
|
# coding: utf-8
|
|
|
|
|
|
2016-10-11 03:37:04 +03:00
|
|
|
|
from hashlib import md5
|
2015-11-26 23:50:33 +03:00
|
|
|
|
import datetime
|
2016-10-11 03:37:04 +03:00
|
|
|
|
import uuid
|
2016-04-02 00:42:22 +03:00
|
|
|
|
|
2016-10-01 12:09:52 +03:00
|
|
|
|
from peewee import *
|
|
|
|
|
from playhouse.shortcuts import RetryOperationalError
|
|
|
|
|
from playhouse.postgres_ext import JSONField
|
2016-05-10 02:42:07 +03:00
|
|
|
|
from SWSCloudCore.config import config
|
2015-11-26 23:50:33 +03:00
|
|
|
|
|
2016-10-01 12:09:52 +03:00
|
|
|
|
|
|
|
|
|
class RetryDB(RetryOperationalError, PostgresqlDatabase):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
2015-11-26 23:50:33 +03:00
|
|
|
|
# connect to database
|
2016-10-01 12:09:52 +03:00
|
|
|
|
database = RetryDB(
|
2016-05-10 02:42:07 +03:00
|
|
|
|
config.get('Database', 'name'),
|
|
|
|
|
host=config.get('Database', 'host'),
|
|
|
|
|
port=config.getint('Database', 'port'),
|
|
|
|
|
user=config.get('Database', 'user'),
|
|
|
|
|
password=config.get('Database', 'password'),
|
2015-11-26 23:50:33 +03:00
|
|
|
|
threadlocals=True,
|
|
|
|
|
fields={'uuid': 'uuid'}
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class PgSQLModel(Model):
|
|
|
|
|
class Meta:
|
|
|
|
|
database = database
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class DataCenters(PgSQLModel):
|
2016-04-03 19:10:18 +03:00
|
|
|
|
"""
|
|
|
|
|
Модель датацентров
|
|
|
|
|
"""
|
2015-11-26 23:50:33 +03:00
|
|
|
|
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)
|
2016-04-03 19:10:18 +03:00
|
|
|
|
datacenter = ForeignKeyField(DataCenters)
|
2015-11-26 23:50:33 +03:00
|
|
|
|
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)
|
2015-11-29 00:08:10 +03:00
|
|
|
|
ipv4 = CharField()
|
|
|
|
|
ipv6 = CharField()
|
2015-12-01 02:45:57 +03:00
|
|
|
|
ipv4_gateway = CharField()
|
|
|
|
|
ipv6_gateway = CharField()
|
2016-04-03 19:10:18 +03:00
|
|
|
|
# 0: free, 1: used
|
2015-11-29 00:08:10 +03:00
|
|
|
|
status = IntegerField()
|
2015-11-26 23:50:33 +03:00
|
|
|
|
|
|
|
|
|
|
2016-05-16 09:24:27 +03:00
|
|
|
|
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)
|
|
|
|
|
|
|
|
|
|
|
2016-06-26 11:57:55 +03:00
|
|
|
|
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)
|
|
|
|
|
|
|
|
|
|
|
2016-05-16 09:24:27 +03:00
|
|
|
|
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)
|
|
|
|
|
|
|
|
|
|
|
2015-11-26 23:50:33 +03:00
|
|
|
|
class Users(PgSQLModel):
|
|
|
|
|
id = UUIDField(primary_key=True, unique=True)
|
|
|
|
|
email = CharField(unique=True, null=False)
|
|
|
|
|
password = CharField()
|
2016-04-03 19:10:18 +03:00
|
|
|
|
created = DateTimeField(default=datetime.datetime.now)
|
2015-11-26 23:50:33 +03:00
|
|
|
|
status = IntegerField()
|
|
|
|
|
|
2016-10-14 11:21:48 +03:00
|
|
|
|
@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()
|
|
|
|
|
|
2016-10-17 02:10:57 +03:00
|
|
|
|
@staticmethod
|
|
|
|
|
def get_by_id(user_id):
|
|
|
|
|
return Users.select().where(Users.id == user_id).get()
|
|
|
|
|
|
2015-11-26 23:50:33 +03:00
|
|
|
|
|
|
|
|
|
class UsersRecoveryCodes(PgSQLModel):
|
2016-04-03 19:10:18 +03:00
|
|
|
|
user = ForeignKeyField(Users)
|
2015-11-26 23:50:33 +03:00
|
|
|
|
recovery_code = CharField(null=False)
|
|
|
|
|
created = DateTimeField(default=datetime.datetime.now)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class UsersSecrets(PgSQLModel):
|
2016-04-03 19:10:18 +03:00
|
|
|
|
user = ForeignKeyField(Users)
|
2015-12-24 01:52:14 +03:00
|
|
|
|
# 4f235008-a9bd-11e5-a24e-28d244e159e9
|
2016-06-26 13:48:50 +03:00
|
|
|
|
secret = CharField(unique=False, null=False)
|
2015-12-24 01:52:14 +03:00
|
|
|
|
# 1.1.1.1,1.2.3.4
|
2015-11-26 23:50:33 +03:00
|
|
|
|
acl = TextField()
|
2015-12-14 01:49:38 +03:00
|
|
|
|
# 0 - inactive
|
|
|
|
|
# 1 - active
|
2015-11-26 23:50:33 +03:00
|
|
|
|
status = IntegerField()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class UsersDetails(PgSQLModel):
|
2016-04-03 19:10:18 +03:00
|
|
|
|
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='')
|
2016-04-09 16:52:33 +03:00
|
|
|
|
zipcode = IntegerField(null=True, default=0)
|
2015-11-26 23:50:33 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class UsersBalance(PgSQLModel):
|
2016-04-03 19:10:18 +03:00
|
|
|
|
"""
|
|
|
|
|
Текущий баланс пользователей
|
|
|
|
|
"""
|
|
|
|
|
user = ForeignKeyField(Users)
|
2015-11-26 23:50:33 +03:00
|
|
|
|
balance = FloatField(default=0, null=False)
|
|
|
|
|
|
2016-10-17 02:10:57 +03:00
|
|
|
|
@staticmethod
|
|
|
|
|
def get_by_account(user_id):
|
|
|
|
|
x = UsersBalance.select(UsersBalance.balance).where(UsersBalance.user == user_id).get()
|
|
|
|
|
return x.balance
|
|
|
|
|
|
2015-11-26 23:50:33 +03:00
|
|
|
|
|
|
|
|
|
class UsersBalanceTransactions(PgSQLModel):
|
2016-04-03 19:10:18 +03:00
|
|
|
|
"""
|
|
|
|
|
Транзакции
|
|
|
|
|
"""
|
|
|
|
|
user = ForeignKeyField(Users)
|
2015-11-26 23:50:33 +03:00
|
|
|
|
amount = FloatField(default=0, null=False)
|
|
|
|
|
created = DateTimeField(default=datetime.datetime.now)
|
|
|
|
|
notified = IntegerField(null=False, default=0)
|
2016-10-17 02:10:57 +03:00
|
|
|
|
# success, process, fail
|
2015-11-26 23:50:33 +03:00
|
|
|
|
status = TextField(null=False)
|
2016-10-17 03:35:52 +03:00
|
|
|
|
paid = DateTimeField()
|
2016-10-17 02:10:57 +03:00
|
|
|
|
# robokassa, webmoney, yandex_money, rbk_money, alfaclick, sberbank_online, paypal, invoice
|
|
|
|
|
method = CharField(null=False, default=0)
|
|
|
|
|
details = JSONField(default='{}')
|
2015-11-26 23:50:33 +03:00
|
|
|
|
|
|
|
|
|
|
2015-11-29 00:08:10 +03:00
|
|
|
|
class SSHKeys(PgSQLModel):
|
|
|
|
|
user = ForeignKeyField(Users)
|
|
|
|
|
sshkey = TextField(null=True)
|
2016-04-03 19:10:18 +03:00
|
|
|
|
# с какого ip был добавлен ключ
|
|
|
|
|
remote = TextField(null=True)
|
|
|
|
|
# когда был добавлен ключ
|
|
|
|
|
created = DateTimeField(default=datetime.datetime.now)
|
2015-11-29 00:08:10 +03:00
|
|
|
|
|
|
|
|
|
|
2015-11-26 23:50:33 +03:00
|
|
|
|
class Containers(PgSQLModel):
|
|
|
|
|
id = UUIDField(primary_key=True, unique=True)
|
2015-11-29 00:08:10 +03:00
|
|
|
|
datacenter = ForeignKeyField(DataCenters)
|
2015-11-26 23:50:33 +03:00
|
|
|
|
server = ForeignKeyField(Servers)
|
|
|
|
|
user = ForeignKeyField(Users)
|
2015-11-29 00:08:10 +03:00
|
|
|
|
ipv4 = CharField()
|
|
|
|
|
ipv6 = CharField()
|
2016-04-03 19:10:18 +03:00
|
|
|
|
# 0: inactive, 1: active, 2: ..., 3: ..., 4: ..., 5: ...
|
2015-11-26 23:50:33 +03:00
|
|
|
|
status = IntegerField()
|
|
|
|
|
|
2016-10-11 03:37:04 +03:00
|
|
|
|
@staticmethod
|
|
|
|
|
def get_items():
|
|
|
|
|
return Containers.select().execute()
|
|
|
|
|
|
2015-11-26 23:50:33 +03:00
|
|
|
|
|
2015-12-13 04:48:00 +03:00
|
|
|
|
class ContainersStatistics(PgSQLModel):
|
2015-11-26 23:50:33 +03:00
|
|
|
|
container = ForeignKeyField(Containers)
|
2015-12-14 05:00:33 +03:00
|
|
|
|
created = DateTimeField(default=datetime.datetime.now)
|
|
|
|
|
cpu = BigIntegerField(default=0, null=False)
|
|
|
|
|
memory = BigIntegerField(default=0, null=False)
|
2015-12-16 08:39:53 +03:00
|
|
|
|
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)
|
2015-12-15 11:22:41 +03:00
|
|
|
|
size = BigIntegerField(default=0, null=False)
|
2015-12-14 05:00:33 +03:00
|
|
|
|
net_tx = BigIntegerField(default=0, null=False)
|
|
|
|
|
net_rx = BigIntegerField(default=0, null=False)
|
|
|
|
|
net_total = BigIntegerField(default=0, null=False)
|
2015-11-26 23:50:33 +03:00
|
|
|
|
|
|
|
|
|
|
2016-05-16 09:24:27 +03:00
|
|
|
|
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()
|
|
|
|
|
|
2016-10-11 03:37:04 +03:00
|
|
|
|
@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
|
|
|
|
|
|
2016-10-17 02:10:57 +03:00
|
|
|
|
@staticmethod
|
|
|
|
|
def get_state(vm_id):
|
|
|
|
|
c = Vms.select(Vms.status).where(Vms.id == vm_id).first()
|
|
|
|
|
return c.status
|
|
|
|
|
|
2016-05-16 09:24:27 +03:00
|
|
|
|
|
2015-11-26 23:50:33 +03:00
|
|
|
|
class Tasks(PgSQLModel):
|
|
|
|
|
id = UUIDField(primary_key=True, unique=True)
|
2016-04-03 19:10:18 +03:00
|
|
|
|
datacenter = ForeignKeyField(DataCenters)
|
|
|
|
|
server = ForeignKeyField(Servers)
|
|
|
|
|
user = ForeignKeyField(Users)
|
2015-11-26 23:50:33 +03:00
|
|
|
|
created = DateTimeField(default=datetime.datetime.now)
|
2015-12-01 02:45:57 +03:00
|
|
|
|
task = CharField(null=False)
|
2016-04-20 03:39:13 +03:00
|
|
|
|
# 0 - new, 1 - working, 2 - completed
|
2015-12-01 02:45:57 +03:00
|
|
|
|
status = IntegerField(null=False, default=0)
|
2015-11-26 23:50:33 +03:00
|
|
|
|
plain = TextField()
|
|
|
|
|
|
2016-10-17 02:10:57 +03:00
|
|
|
|
@staticmethod
|
|
|
|
|
def exists_active_tasks(user_id):
|
|
|
|
|
if Tasks.select().where(Tasks.user == user_id, Tasks.status != 2).count() == 0:
|
|
|
|
|
return False
|
|
|
|
|
return True
|
|
|
|
|
|
2016-11-07 09:28:03 +03:00
|
|
|
|
@staticmethod
|
|
|
|
|
def count_items(status=None):
|
|
|
|
|
if status:
|
|
|
|
|
Tasks.select().where(Tasks.status == status).count()
|
|
|
|
|
return Tasks.select().count()
|
|
|
|
|
|
2016-10-11 03:37:04 +03:00
|
|
|
|
# @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)
|
|
|
|
|
# )
|
|
|
|
|
|
2015-11-26 23:50:33 +03:00
|
|
|
|
|
|
|
|
|
class Settings(PgSQLModel):
|
2016-04-03 19:10:18 +03:00
|
|
|
|
"""
|
|
|
|
|
Модель настроек
|
|
|
|
|
"""
|
2015-11-26 23:50:33 +03:00
|
|
|
|
key = TextField(unique=True, null=False)
|
|
|
|
|
val = TextField(null=True)
|
|
|
|
|
|
2016-10-27 10:47:16 +03:00
|
|
|
|
@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
|
|
|
|
|
|
2015-11-26 23:50:33 +03:00
|
|
|
|
|
|
|
|
|
class Admins(PgSQLModel):
|
|
|
|
|
id = UUIDField(primary_key=True, unique=True)
|
|
|
|
|
email = CharField(unique=True, null=False)
|
|
|
|
|
password = CharField()
|
|
|
|
|
status = IntegerField()
|
2015-12-23 02:31:43 +03:00
|
|
|
|
|
2016-10-11 03:37:04 +03:00
|
|
|
|
@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
|
|
|
|
|
|
2015-12-23 02:31:43 +03:00
|
|
|
|
|
|
|
|
|
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
|
2016-06-26 11:57:55 +03:00
|
|
|
|
# auth_serverapi
|
2015-12-23 02:31:43 +03:00
|
|
|
|
alert = CharField(null=False)
|
|
|
|
|
notified = DateTimeField(default=datetime.datetime.now)
|
|
|
|
|
details = TextField()
|