Create Access clas, add platform db models with peewee pwiz, fix JSONfield MySQL

This commit is contained in:
Stepan Zhukovsky 2022-09-20 20:54:32 +09:00
parent dad22dad06
commit 492745e374
6 changed files with 3251 additions and 0 deletions

14
Dockerfile Normal file
View File

@ -0,0 +1,14 @@
FROM python:3.10-alpine
LABEL maintainer="s.zhukovskii@ispsystem.com"
LABEL ru.isptech.git.SupportAccess.version=v0.0.1
WORKDIR /app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD [ "python", "./main.py" ]

54
main.py Normal file
View File

@ -0,0 +1,54 @@
import requests
from models_vm import VmAccount
from models_dci import AuthUser
from settings import PLATFORM
class Access(object):
"""
Allows you to get a link with an authorization key
For quick access to the web interface of the client platform.
The PLATFORM variable can be set as an environment variable.
Default PLATFORM='vm'
"""
def __init__(self, platform):
if platform == 'vm':
self.input_container = 'vm_box'
self.user_table = VmAccount
if platform == 'dci':
self.input_container = 'input'
self.user_table = AuthUser
def get_admin(self):
query_admin = (self.user_table.select(
self.user_table.id,
self.user_table.email,
self.user_table.state,
self.user_table.roles).where(
(self.user_table.id <= 10) &
(self.user_table.state == "active")
)
)
for field in query_admin:
if field.roles[0] == '@admin':
admin = dict(id=field.id, email=field.email, state=field.state)
break
return admin
def get_key(self, admin):
host = self.input_container
admin_id = admin['id']
url = 'http://{}:1500/auth/v4/user/{}/key'.format(host, admin_id)
headers = {"Internal-Auth": "on", "Accept": "application/json"}
req = requests.post(url, headers=headers, data={})
result = req.json()
return result
if __name__ == "__main__":
access = Access(PLATFORM)
account = access.get_admin()
print(account)
key = access.get_key(account)
print(key)

789
models_dci.py Normal file
View File

@ -0,0 +1,789 @@
import json
from peewee import (
Model, SQL,
IntegerField,
CharField,
TextField,
DateTimeField,
ForeignKeyField,
CompositeKey,
FloatField,
AutoField
)
from settings import database
class JSONField(TextField):
"""
Class to "fake" a JSON field with a text field.
Not efficient but works nicely
"""
def db_value(self, value):
"""Convert the python value for storage in the database."""
return value if value is None else json.dumps(value)
def python_value(self, value):
"""Convert the database value to a pythonic value."""
return value if value is None else json.loads(value)
class UnknownField(object):
def __init__(self, *_, **__): pass
class BaseModel(Model):
class Meta:
database = database
class AlertSetting(BaseModel):
channel = UnknownField(null=True) # json
enabled = IntegerField(constraints=[SQL("DEFAULT 1")])
metric = UnknownField(null=True) # json
metric_id = CharField(null=True)
name = CharField(null=True)
class Meta:
table_name = 'alert_setting'
class AuthAcl(BaseModel):
ip_list = UnknownField() # json
name = CharField(constraints=[SQL("DEFAULT ''")], unique=True)
class Meta:
table_name = 'auth_acl'
class AuthUser(BaseModel):
auth_source = CharField(constraints=[SQL("DEFAULT 'local'")])
avatar = TextField(null=True)
avatar_content_type = CharField(null=True)
avatar_filename = CharField(null=True)
created_date = DateTimeField(null=True)
email = CharField(constraints=[SQL("DEFAULT ''")], unique=True)
email_confirm = IntegerField(constraints=[SQL("DEFAULT 0")])
full_name = CharField(null=True)
ip_list = UnknownField(null=True) # json
lang = CharField(constraints=[SQL("DEFAULT 'en'")])
password = CharField(null=True)
phone_number = CharField(null=True)
property = UnknownField(null=True) # json
roles = UnknownField() # json
ssh_priv_key = TextField(null=True)
ssh_pub_key = TextField(null=True)
state = CharField()
totp = CharField(null=True)
uuid = CharField(null=True, unique=True)
class Meta:
table_name = 'auth_user'
class AuthConfirmToken(BaseModel):
expires_at = DateTimeField(null=True)
resend_token_after = DateTimeField(null=True)
token = CharField(null=True, unique=True)
user = ForeignKeyField(
column_name='user', field='id', model=AuthUser, null=True, unique=True
)
class Meta:
table_name = 'auth_confirm_token'
class AuthGdprDoc(BaseModel):
change_date = DateTimeField(null=True)
desc_condition = CharField(null=True)
entry_date = DateTimeField(null=True)
locale = CharField(null=True)
name = CharField(unique=True)
required = IntegerField(constraints=[SQL("DEFAULT 0")])
state = CharField()
url = CharField(null=True)
class Meta:
table_name = 'auth_gdpr_doc'
class AuthGdprJournal(BaseModel):
action_date = DateTimeField(null=True)
action_type = CharField()
doc = ForeignKeyField(
column_name='doc', field='id', model=AuthGdprDoc, null=True
)
ip = CharField(null=True)
user_email = CharField()
class Meta:
table_name = 'auth_gdpr_journal'
class AuthGeneratedSshkey(BaseModel):
generation_date = DateTimeField(null=True)
privkey = TextField(null=True)
pubkey = TextField(null=True)
class Meta:
table_name = 'auth_generated_sshkey'
class AuthProduct(BaseModel):
docker_compose_file = TextField(null=True)
name = CharField(null=True)
script = TextField(null=True)
version = CharField(null=True)
class Meta:
table_name = 'auth_product'
indexes = (
(('name', 'version'), True),
)
class AuthInstance(BaseModel):
dbkey = TextField(null=True)
demo = IntegerField(constraints=[SQL("DEFAULT 0")])
failure_reason = UnknownField(null=True) # json
limits = UnknownField(null=True) # json
mysql = UnknownField(null=True) # json
name = CharField(null=True)
owner = ForeignKeyField(
column_name='owner', field='id', model=AuthUser, null=True
)
product = ForeignKeyField(
column_name='product', field='id', model=AuthProduct, null=True
)
roles = UnknownField(null=True) # json
started = DateTimeField(null=True)
status = CharField()
class Meta:
table_name = 'auth_instance'
class AuthInstanceHistory(BaseModel):
create_time = DateTimeField(constraints=[SQL("DEFAULT CURRENT_TIMESTAMP")])
event_info = UnknownField(null=True) # json
event_type = CharField(null=True)
prev_time = DateTimeField(null=True)
ref = ForeignKeyField(
column_name='ref', field='id', model=AuthInstance, null=True
)
request_id = CharField(null=True)
request_ip = CharField(null=True)
request_owner = CharField(null=True)
request_user = CharField(null=True)
class Meta:
table_name = 'auth_instance_history'
class AuthKey(BaseModel):
expires_at = DateTimeField(null=True)
name = CharField(constraints=[SQL("DEFAULT ''")], unique=True)
user = ForeignKeyField(column_name='user', field='id', model=AuthUser)
class Meta:
table_name = 'auth_key'
class AuthLicense(BaseModel):
instance = ForeignKeyField(
column_name='instance', field='id', model=AuthInstance,
null=True, unique=True
)
last_update = DateTimeField(null=True)
lic_data = UnknownField(null=True) # json
lic_request = UnknownField(null=True) # json
product = CharField(null=True)
signature_expire_date = DateTimeField(null=True)
status = CharField()
class Meta:
table_name = 'auth_license'
class AuthPermission(BaseModel):
data = UnknownField() # json
plugin = CharField(constraints=[SQL("DEFAULT ''")])
service = CharField(constraints=[SQL("DEFAULT ''")])
class Meta:
table_name = 'auth_permission'
indexes = (
(('service', 'plugin'), True),
)
class AuthPricelist(BaseModel):
bill_id = IntegerField(null=True, unique=True)
name = CharField(null=True)
params = UnknownField(null=True) # json
class Meta:
table_name = 'auth_pricelist'
class AuthServer(BaseModel):
demo = IntegerField(constraints=[SQL("DEFAULT 0")])
host = CharField(null=True)
instance = ForeignKeyField(
column_name='instance', field='id', model=AuthInstance,
null=True, unique=True
)
login = CharField(null=True)
machine_id = CharField(null=True)
password = CharField(null=True)
port = IntegerField(null=True)
class Meta:
table_name = 'auth_server'
indexes = (
(('host', 'port'), True),
)
class AuthService(BaseModel):
bill_id = IntegerField(null=True, unique=True)
info = UnknownField(null=True) # json
instance = ForeignKeyField(
column_name='instance', field='id', model=AuthInstance,
null=True, unique=True
)
params = UnknownField(null=True) # json
payment_form = TextField(null=True)
status = CharField(null=True)
class Meta:
table_name = 'auth_service'
indexes = (
(('instance', 'bill_id'), True),
)
class AuthServiceDbkey(BaseModel):
dbkey = TextField(null=True)
name = CharField(null=True, unique=True)
class Meta:
table_name = 'auth_service_dbkey'
class AuthSession(BaseModel):
expires_at = DateTimeField(null=True)
is_internal = IntegerField(constraints=[SQL("DEFAULT 0")])
name = CharField(null=True, unique=True)
owner = ForeignKeyField(
column_name='owner', field='id', model=AuthUser, null=True
)
trustee = ForeignKeyField(
backref='auth_user_trustee_set', column_name='trustee', field='id',
model=AuthUser, null=True
)
updated_at = DateTimeField(null=True)
xsrf_token = CharField(null=True)
class Meta:
table_name = 'auth_session'
class AuthToken(BaseModel):
client_ip = CharField(null=True)
description = CharField(constraints=[SQL("DEFAULT ''")])
expires_at = DateTimeField(null=True)
last_used = DateTimeField()
name = CharField(constraints=[SQL("DEFAULT ''")], unique=True)
need_2fa = IntegerField(constraints=[SQL("DEFAULT 0")])
owner = ForeignKeyField(column_name='owner', field='id', model=AuthUser)
trustee = ForeignKeyField(
backref='auth_user_trustee_set', column_name='trustee',
field='id', model=AuthUser
)
class Meta:
table_name = 'auth_token'
class AuthTrusteeUser(BaseModel):
instance = ForeignKeyField(
column_name='instance', field='id', model=AuthInstance, null=True
)
role = CharField(null=True)
trustee = ForeignKeyField(
column_name='trustee', field='id', model=AuthUser, null=True
)
user = ForeignKeyField(
backref='auth_user_user_set', column_name='user',
field='id', model=AuthUser, null=True
)
class Meta:
table_name = 'auth_trustee_user'
indexes = (
(('user', 'trustee', 'instance'), True),
)
class AuthUser2Acl(BaseModel):
acl = ForeignKeyField(column_name='acl', field='id', model=AuthAcl)
user = ForeignKeyField(column_name='user', field='id', model=AuthUser)
class Meta:
table_name = 'auth_user2acl'
indexes = (
(('user', 'acl'), True),
)
class AuthUserRole(BaseModel):
instance = ForeignKeyField(
column_name='instance', field='id', model=AuthInstance, null=True
)
roles = UnknownField() # json
state = CharField()
trustee = ForeignKeyField(
column_name='trustee', field='id', model=AuthUser
)
user = ForeignKeyField(
backref='auth_user_user_set', column_name='user',
field='id', model=AuthUser
)
class Meta:
table_name = 'auth_user_role'
indexes = (
(('user', 'trustee', 'instance'), True),
)
class AuthUserSetting(BaseModel):
data = UnknownField(null=True) # json
instance = ForeignKeyField(
column_name='instance', field='id', model=AuthInstance, null=True
)
name = CharField(null=True)
user = ForeignKeyField(
column_name='user', field='id', model=AuthUser, null=True
)
class Meta:
table_name = 'auth_user_setting'
indexes = (
(('user', 'name', 'instance'), True),
)
class AuthUserSshkey(BaseModel):
name = CharField()
owner = ForeignKeyField(
column_name='owner', field='id', model=AuthUser, null=True
)
ssh_pub_key = TextField(null=True)
class Meta:
table_name = 'auth_user_sshkey'
indexes = (
(('name', 'owner'), True),
)
class AuthUsersLocks(BaseModel):
description = CharField(constraints=[SQL("DEFAULT ''")])
service_name = CharField()
user = ForeignKeyField(column_name='user', field='id', model=AuthUser)
class Meta:
table_name = 'auth_users_locks'
indexes = (
(('user', 'service_name'), True),
)
primary_key = CompositeKey('service_name', 'user')
class BackupAlembicVersion(BaseModel):
version_num = CharField(primary_key=True)
class Meta:
table_name = 'backup_alembic_version'
class BackupTask(BaseModel):
connection_params = TextField()
cron_expression = CharField()
enabled = IntegerField()
limit_count = IntegerField()
limit_size_mib = IntegerField()
name = CharField()
note = TextField()
schedule_type = CharField()
storage_type = CharField()
class Meta:
table_name = 'backup_task'
class BackupFile(BaseModel):
date = DateTimeField()
downloadable = IntegerField()
name = CharField()
size = FloatField()
storage_type = CharField()
task = ForeignKeyField(
column_name='task', field='id', model=BackupTask, null=True
)
class Meta:
table_name = 'backup_file'
class CsDocuments(BaseModel):
lang = CharField(constraints=[SQL("DEFAULT ''")])
name = CharField(constraints=[SQL("DEFAULT ''")])
product = CharField(constraints=[SQL("DEFAULT ''")])
required = IntegerField(constraints=[SQL("DEFAULT 0")])
url = CharField(constraints=[SQL("DEFAULT ''")])
class Meta:
table_name = 'cs_documents'
indexes = (
(('product', 'lang', 'name'), True),
)
class CsSettings(BaseModel):
lang = CharField(constraints=[SQL("DEFAULT ''")])
product = CharField(constraints=[SQL("DEFAULT ''")])
prop_key = CharField(constraints=[SQL("DEFAULT ''")])
prop_value = CharField(constraints=[SQL("DEFAULT ''")])
class Meta:
table_name = 'cs_settings'
indexes = (
(('product', 'lang', 'prop_key'), True),
)
class IpmiProxyLocation(BaseModel):
docker_compose = TextField(null=True)
instance = IntegerField(null=True)
location = IntegerField(null=True)
status = CharField(constraints=[SQL("DEFAULT 'setting_up'")])
status_info = UnknownField(null=True) # json
supported_ipmi_consoles = UnknownField(null=True) # json
class Meta:
table_name = 'ipmi_proxy_location'
indexes = (
(('instance', 'location'), True),
)
class IpmiProxyConnection(BaseModel):
close_time = DateTimeField(null=True)
connection_data = UnknownField(null=True) # json
device_data = UnknownField(null=True) # json
intel_amt = IntegerField(null=True)
ipmi = IntegerField(null=True)
listen_web_port = IntegerField(null=True, unique=True)
location = ForeignKeyField(
column_name='location_id', field='id', model=IpmiProxyLocation
)
type = CharField(constraints=[SQL("DEFAULT 'web'")])
user = IntegerField(null=True)
vnc_port = IntegerField(null=True)
class Meta:
table_name = 'ipmi_proxy_connection'
class IpmiProxyJavaAgreement(BaseModel):
instance = IntegerField(null=True, unique=True)
java_agree = IntegerField(constraints=[SQL("DEFAULT 1")])
class Meta:
table_name = 'ipmi_proxy_java_agreement'
class IpmiProxyPlugin(BaseModel):
instance = IntegerField(null=True, unique=True)
class Meta:
table_name = 'ipmi_proxy_plugin'
class IspSettings(BaseModel):
name = CharField(primary_key=True)
value = TextField()
class Meta:
table_name = 'isp_settings'
class JournalEvents(BaseModel):
data = UnknownField(null=True) # json
date_time = DateTimeField(
constraints=[SQL("DEFAULT CURRENT_TIMESTAMP(3)")]
)
entity_id = IntegerField()
entity_name = CharField()
entity_owner = IntegerField()
entity_type = CharField()
instance_id = IntegerField(index=True)
ip = CharField()
roles = UnknownField(null=True) # json
trustee_email = CharField(index=True)
trustee_id = IntegerField()
type = CharField()
user_email = CharField(index=True)
user_id = IntegerField()
class Meta:
table_name = 'journal_events'
class MsgsChannel(BaseModel):
comment = TextField(null=True)
creation_date = DateTimeField(null=True)
delivery_method = CharField()
enabled = IntegerField(constraints=[SQL("DEFAULT 1")])
language = CharField()
name = CharField()
params = UnknownField(null=True) # json
state = CharField()
class Meta:
table_name = 'msgs_channel'
class MsgsDeliveryMethod(BaseModel):
delivery_method = CharField(primary_key=True)
dm_params = UnknownField(null=True) # json
class Meta:
table_name = 'msgs_delivery_method'
class MsgsMessageDesign(BaseModel):
design = CharField(primary_key=True)
class Meta:
table_name = 'msgs_message_design'
class MsgsMessageDesignVariant(BaseModel):
delivery_method = CharField()
design = CharField()
design_content = TextField(null=True)
language = CharField()
class Meta:
table_name = 'msgs_message_design_variant'
indexes = (
(('design', 'delivery_method', 'language'), True),
(('design', 'delivery_method', 'language'), True),
)
primary_key = CompositeKey('delivery_method', 'design', 'language')
class MsgsNoticeReceiver(BaseModel):
delivery_method = CharField()
receivers = UnknownField(null=True) # json
user = IntegerField(null=True)
class Meta:
table_name = 'msgs_notice_receiver'
indexes = (
(('user', 'delivery_method'), True),
)
class MsgsTemplate(BaseModel):
priority = CharField()
template = CharField(primary_key=True)
class Meta:
table_name = 'msgs_template'
class MsgsTemplate2Category(BaseModel):
category = CharField()
template = CharField()
class Meta:
table_name = 'msgs_template2category'
indexes = (
(('template', 'category'), True),
(('template', 'category'), True),
)
primary_key = CompositeKey('category', 'template')
class MsgsTemplateVariant(BaseModel):
delivery_method = CharField()
language = CharField()
template = CharField()
tv_params = UnknownField(null=True) # json
class Meta:
table_name = 'msgs_template_variant'
indexes = (
(('template', 'delivery_method', 'language'), True),
(('template', 'delivery_method', 'language'), True),
)
primary_key = CompositeKey('delivery_method', 'language', 'template')
class MsgsUser(BaseModel):
language = CharField()
user = AutoField()
class Meta:
table_name = 'msgs_user'
class MsgsUser2DeliveryMethod(BaseModel):
delivery_method = CharField()
u2dm_params = UnknownField(null=True) # json
user = IntegerField()
class Meta:
table_name = 'msgs_user2delivery_method'
indexes = (
(('user', 'delivery_method'), True),
(('user', 'delivery_method'), True),
)
primary_key = CompositeKey('delivery_method', 'user')
class MsgsUserSubscription(BaseModel):
category = CharField()
delivery_method = CharField()
user = IntegerField()
class Meta:
table_name = 'msgs_user_subscription'
indexes = (
(('user', 'delivery_method', 'category'), True),
)
primary_key = CompositeKey('category', 'delivery_method', 'user')
class NcNotice(BaseModel):
create_timestamp = IntegerField(null=True)
entity = UnknownField(null=True) # json
params = UnknownField(null=True) # json
status = CharField(constraints=[SQL("DEFAULT 'sended'")])
timestamp = IntegerField(null=True)
type = CharField(null=True)
class Meta:
table_name = 'nc_notice'
class NcUser(BaseModel):
last_notice_timestamp = IntegerField(constraints=[SQL("DEFAULT 0")])
read_timestamp = IntegerField(constraints=[SQL("DEFAULT 0")])
class Meta:
table_name = 'nc_user'
class NcNotice2User(BaseModel):
notice = ForeignKeyField(
column_name='notice', field='id', model=NcNotice, null=True
)
read_timestamp = IntegerField(constraints=[SQL("DEFAULT 0")])
user = ForeignKeyField(
column_name='user', field='id', model=NcUser, null=True
)
class Meta:
table_name = 'nc_notice2user'
indexes = (
(('user', 'notice'), True),
)
class PsPlugin(BaseModel):
content = TextField()
current_version = CharField(null=True)
filename = CharField(null=True)
intname = CharField(null=True, unique=True)
metadata = UnknownField() # json
name = CharField(null=True, unique=True)
plugin_requirement = UnknownField(null=True) # json
product = CharField()
remote = IntegerField(constraints=[SQL("DEFAULT 0")])
status = CharField(constraints=[SQL("DEFAULT 'disabled'")])
version = CharField(null=True)
class Meta:
table_name = 'ps_plugin'
class PsPluginLicense(BaseModel):
instance = IntegerField(null=True)
license = UnknownField(null=True) # json
plugin = IntegerField(null=True)
class Meta:
table_name = 'ps_plugin_license'
indexes = (
(('instance', 'plugin'), True),
)
class ReportAlembicVersion(BaseModel):
version_num = CharField(primary_key=True)
class Meta:
table_name = 'report_alembic_version'
class ReportFile(BaseModel):
additional_info = UnknownField(null=True) # json
content = TextField(null=True)
create_datetime = DateTimeField()
entity = CharField()
entity_ids = UnknownField() # json
filename = CharField(null=True)
is_read = IntegerField()
status = CharField()
status_info = UnknownField(null=True) # json
type = CharField()
class Meta:
table_name = 'report_file'
class TaskmgrTask(BaseModel):
before_execute = UnknownField(null=True) # json
bin_args = UnknownField(null=True) # json
bin_path = CharField(constraints=[SQL("DEFAULT ''")])
callback_params = UnknownField(null=True) # json
defer_resolve = UnknownField(null=True) # json
defer_wait = UnknownField(null=True) # json
depends_on = UnknownField(null=True) # json
env = UnknownField(null=True) # json
instance_id = CharField(null=True)
lock_tag = UnknownField(null=True) # json
name = CharField(constraints=[SQL("DEFAULT ''")])
notify = UnknownField(null=True) # json
on_start = UnknownField(null=True) # json
output = TextField()
queue = UnknownField(null=True) # json
registration_time = DateTimeField(
constraints=[SQL("DEFAULT CURRENT_TIMESTAMP")]
)
request_info = UnknownField(null=True) # json
return_code = IntegerField()
service = CharField(constraints=[SQL("DEFAULT ''")])
status = CharField(constraints=[SQL("DEFAULT 'created'")])
stdin = UnknownField(null=True) # json
ttl = IntegerField()
work_dir = CharField(constraints=[SQL("DEFAULT ''")])
worker_id = CharField(null=True)
class Meta:
table_name = 'taskmgr_task'

2357
models_vm.py Normal file

File diff suppressed because it is too large Load Diff

7
requirements.txt Normal file
View File

@ -0,0 +1,7 @@
certifi==2022.9.14
charset-normalizer==2.1.1
idna==3.4
peewee==3.15.2
PyMySQL==1.0.2
requests==2.28.1
urllib3==1.26.12

30
settings.py Normal file
View File

@ -0,0 +1,30 @@
import os
import json
from peewee import MySQLDatabase
PLATFORM = os.environ.get("PLATFORM", "vm") # or dci
DB_ENGINE = os.environ.get("DB_ENGINE", "mysql")
DB_HOST = os.environ.get("DB_HOST", "mysql")
DB_PORT = os.environ.get("DB_PORT", 3306)
DB_USER = os.environ.get("DB_USER", "root")
DB_PASSWORD = os.environ.get("DB_PASSWORD", None) # not secure!!!
DB_NAME = os.environ.get("DB_NAME", "isp") # or auth for dci
if DB_PASSWORD is None:
with open('config.json', 'r') as f:
platform_config = json.load(f)
DB_PASSWORD = platform_config.get("MysqlRootPassword")
database = MySQLDatabase(
DB_NAME, **{
'charset': 'utf8',
'sql_mode': 'PIPES_AS_CONCAT',
'use_unicode': True,
'host': DB_HOST,
'port': DB_PORT,
'user': DB_USER,
'password': DB_PASSWORD
}
)