mirror of
https://gitlab.com/crafty-controller/crafty-4.git
synced 2025-01-19 01:35:28 +01:00
45c3f73eca
This reverts the 4.4.1 release revert commit 29ce7a2cdeb59b4d769f4b107a24cece44b7a214.
435 lines
18 KiB
Python
435 lines
18 KiB
Python
import datetime
|
|
import uuid
|
|
import peewee
|
|
import logging
|
|
|
|
from app.classes.shared.console import Console
|
|
from app.classes.shared.migration import Migrator, MigrateHistory
|
|
from app.classes.models.roles import Roles
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def migrate(migrator: Migrator, database, **kwargs):
|
|
"""
|
|
Write your migrations here.
|
|
"""
|
|
db = database
|
|
|
|
# **********************************************************************************
|
|
# Servers New Model from Old (easier to migrate without dunmping Database)
|
|
# **********************************************************************************
|
|
class Servers(peewee.Model):
|
|
server_id = peewee.CharField(primary_key=True, default=str(uuid.uuid4()))
|
|
created = peewee.DateTimeField(default=datetime.datetime.now)
|
|
server_uuid = peewee.CharField(default="", index=True)
|
|
server_name = peewee.CharField(default="Server", index=True)
|
|
path = peewee.CharField(default="")
|
|
backup_path = peewee.CharField(default="")
|
|
executable = peewee.CharField(default="")
|
|
log_path = peewee.CharField(default="")
|
|
execution_command = peewee.CharField(default="")
|
|
auto_start = peewee.BooleanField(default=0)
|
|
auto_start_delay = peewee.IntegerField(default=10)
|
|
crash_detection = peewee.BooleanField(default=0)
|
|
stop_command = peewee.CharField(default="stop")
|
|
executable_update_url = peewee.CharField(default="")
|
|
server_ip = peewee.CharField(default="127.0.0.1")
|
|
server_port = peewee.IntegerField(default=25565)
|
|
logs_delete_after = peewee.IntegerField(default=0)
|
|
type = peewee.CharField(default="minecraft-java")
|
|
show_status = peewee.BooleanField(default=1)
|
|
created_by = peewee.IntegerField(default=-100)
|
|
shutdown_timeout = peewee.IntegerField(default=60)
|
|
ignored_exits = peewee.CharField(default="0")
|
|
|
|
class Meta:
|
|
table_name = "servers"
|
|
database = db
|
|
|
|
# **********************************************************************************
|
|
# Role Servers Class
|
|
# **********************************************************************************
|
|
class RoleServers(peewee.Model):
|
|
role_id = peewee.ForeignKeyField(Roles, backref="role_server")
|
|
server_id = peewee.ForeignKeyField(Servers, backref="role_server")
|
|
permissions = peewee.CharField(default="00000000")
|
|
|
|
class Meta:
|
|
table_name = "role_servers"
|
|
primary_key = peewee.CompositeKey("role_id", "server_id")
|
|
database = db
|
|
|
|
# **********************************************************************************
|
|
# Webhooks Class
|
|
# **********************************************************************************
|
|
class Webhooks(peewee.Model):
|
|
id = peewee.AutoField()
|
|
server_id = peewee.ForeignKeyField(Servers, backref="webhook_server", null=True)
|
|
name = peewee.CharField(default="Custom Webhook", max_length=64)
|
|
url = peewee.CharField(default="")
|
|
webhook_type = peewee.CharField(default="Custom")
|
|
bot_name = peewee.CharField(default="Crafty Controller")
|
|
trigger = peewee.CharField(default="server_start,server_stop")
|
|
body = peewee.CharField(default="")
|
|
color = peewee.CharField(default="#005cd1")
|
|
enabled = peewee.BooleanField(default=True)
|
|
|
|
class Meta:
|
|
table_name = "webhooks"
|
|
database = db
|
|
|
|
# **********************************************************************************
|
|
# Schedules Class
|
|
# **********************************************************************************
|
|
class Schedules(peewee.Model):
|
|
schedule_id = peewee.IntegerField(unique=True, primary_key=True)
|
|
server_id = peewee.ForeignKeyField(Servers, backref="schedule_server")
|
|
enabled = peewee.BooleanField()
|
|
action = peewee.CharField()
|
|
interval = peewee.IntegerField()
|
|
interval_type = peewee.CharField()
|
|
start_time = peewee.CharField(null=True)
|
|
command = peewee.CharField(null=True)
|
|
name = peewee.CharField()
|
|
one_time = peewee.BooleanField(default=False)
|
|
cron_string = peewee.CharField(default="")
|
|
parent = peewee.IntegerField(null=True)
|
|
delay = peewee.IntegerField(default=0)
|
|
next_run = peewee.CharField(default="")
|
|
|
|
class Meta:
|
|
table_name = "schedules"
|
|
database = db
|
|
|
|
# **********************************************************************************
|
|
# Backups Class
|
|
# **********************************************************************************
|
|
class Backups(peewee.Model):
|
|
excluded_dirs = peewee.CharField(null=True)
|
|
max_backups = peewee.IntegerField()
|
|
max_backups = peewee.IntegerField()
|
|
server_id = peewee.ForeignKeyField(Servers, backref="backups_server")
|
|
compress = peewee.BooleanField(default=False)
|
|
shutdown = peewee.BooleanField(default=False)
|
|
before = peewee.CharField(default="")
|
|
after = peewee.CharField(default="")
|
|
|
|
class Meta:
|
|
table_name = "backups"
|
|
database = db
|
|
|
|
this_migration = MigrateHistory.get_or_none(
|
|
MigrateHistory.name == "20240217_rework_servers_uuid_part2"
|
|
)
|
|
if this_migration is not None:
|
|
Console.debug("Update database already done, skipping this part")
|
|
return
|
|
else:
|
|
servers_columns = db.get_columns("servers")
|
|
if not any(
|
|
column_data.name == "server_uuid" for column_data in servers_columns
|
|
):
|
|
Console.debug(
|
|
"Servers.server_uuid already deleted in Crafty version 4.3.0, skipping this part"
|
|
)
|
|
return
|
|
|
|
try:
|
|
logger.debug("Migrating Data from Int to UUID (Foreign Keys)")
|
|
Console.debug("Migrating Data from Int to UUID (Foreign Keys)")
|
|
|
|
# Changes on Webhooks Log Table
|
|
for webhook in Webhooks.select():
|
|
old_server_id = webhook.server_id_id
|
|
try:
|
|
server = Servers.get_by_id(old_server_id)
|
|
server_uuid = server.server_uuid
|
|
except:
|
|
server_uuid = old_server_id
|
|
Webhooks.update(server_id=server_uuid).where(
|
|
Webhooks.id == webhook.id
|
|
).execute()
|
|
|
|
# Changes on Schedules Log Table
|
|
for schedule in Schedules.select():
|
|
old_server_id = schedule.server_id_id
|
|
try:
|
|
server = Servers.get_by_id(old_server_id)
|
|
server_uuid = server.server_uuid
|
|
except:
|
|
server_uuid = old_server_id
|
|
Schedules.update(server_id=server_uuid).where(
|
|
Schedules.schedule_id == schedule.schedule_id
|
|
).execute()
|
|
|
|
# Changes on Backups Log Table
|
|
for backup in Backups.select():
|
|
old_server_id = backup.server_id_id
|
|
try:
|
|
server = Servers.get_by_id(old_server_id)
|
|
server_uuid = server.server_uuid
|
|
except:
|
|
server_uuid = old_server_id
|
|
Backups.update(server_id=server_uuid).where(
|
|
Backups.server_id == old_server_id
|
|
).execute()
|
|
|
|
# Changes on RoleServers Log Table
|
|
for role_servers in RoleServers.select():
|
|
old_server_id = role_servers.server_id_id
|
|
try:
|
|
server = Servers.get_by_id(old_server_id)
|
|
server_uuid = server.server_uuid
|
|
except:
|
|
server_uuid = old_server_id
|
|
RoleServers.update(server_id=server_uuid).where(
|
|
RoleServers.role_id == role_servers.id
|
|
and RoleServers.server_id == old_server_id
|
|
).execute()
|
|
|
|
logger.debug("Migrating Data from Int to UUID (Foreign Keys) : SUCCESS")
|
|
Console.debug("Migrating Data from Int to UUID (Foreign Keys) : SUCCESS")
|
|
|
|
except Exception as ex:
|
|
logger.error("Error while migrating Data from Int to UUID (Foreign Keys)")
|
|
logger.error(ex)
|
|
Console.error("Error while migrating Data from Int to UUID (Foreign Keys)")
|
|
Console.error(ex)
|
|
last_migration = MigrateHistory.get_by_id(MigrateHistory.select().count())
|
|
last_migration.delete()
|
|
return
|
|
|
|
try:
|
|
logger.debug("Migrating Data from Int to UUID (Primary Keys)")
|
|
Console.debug("Migrating Data from Int to UUID (Primary Keys)")
|
|
# Migrating servers from the old id type to the new one
|
|
for server in Servers.select():
|
|
Servers.update(server_id=server.server_uuid).where(
|
|
Servers.server_id == server.server_id
|
|
).execute()
|
|
|
|
logger.debug("Migrating Data from Int to UUID (Primary Keys) : SUCCESS")
|
|
Console.debug("Migrating Data from Int to UUID (Primary Keys) : SUCCESS")
|
|
|
|
except Exception as ex:
|
|
logger.error("Error while migrating Data from Int to UUID (Primary Keys)")
|
|
logger.error(ex)
|
|
Console.error("Error while migrating Data from Int to UUID (Primary Keys)")
|
|
Console.error(ex)
|
|
last_migration = MigrateHistory.get_by_id(MigrateHistory.select().count())
|
|
last_migration.delete()
|
|
return
|
|
|
|
return
|
|
|
|
|
|
def rollback(migrator: Migrator, database, **kwargs):
|
|
"""
|
|
Write your rollback migrations here.
|
|
"""
|
|
db = database
|
|
|
|
# Condition to prevent running rollback each time we've got a rollback to do
|
|
this_migration = MigrateHistory.get_or_none(
|
|
MigrateHistory.name == "20240217_rework_servers_uuid_part2"
|
|
)
|
|
if this_migration is None:
|
|
Console.debug("Update database already done, skipping this part")
|
|
return
|
|
|
|
# **********************************************************************************
|
|
# Servers New Model from Old (easier to migrate without dunmping Database)
|
|
# **********************************************************************************
|
|
class Servers(peewee.Model):
|
|
server_id = peewee.CharField(primary_key=True, default=str(uuid.uuid4()))
|
|
created = peewee.DateTimeField(default=datetime.datetime.now)
|
|
server_uuid = peewee.CharField(default="", index=True)
|
|
server_name = peewee.CharField(default="Server", index=True)
|
|
path = peewee.CharField(default="")
|
|
backup_path = peewee.CharField(default="")
|
|
executable = peewee.CharField(default="")
|
|
log_path = peewee.CharField(default="")
|
|
execution_command = peewee.CharField(default="")
|
|
auto_start = peewee.BooleanField(default=0)
|
|
auto_start_delay = peewee.IntegerField(default=10)
|
|
crash_detection = peewee.BooleanField(default=0)
|
|
stop_command = peewee.CharField(default="stop")
|
|
executable_update_url = peewee.CharField(default="")
|
|
server_ip = peewee.CharField(default="127.0.0.1")
|
|
server_port = peewee.IntegerField(default=25565)
|
|
logs_delete_after = peewee.IntegerField(default=0)
|
|
type = peewee.CharField(default="minecraft-java")
|
|
show_status = peewee.BooleanField(default=1)
|
|
created_by = peewee.IntegerField(default=-100)
|
|
shutdown_timeout = peewee.IntegerField(default=60)
|
|
ignored_exits = peewee.CharField(default="0")
|
|
|
|
class Meta:
|
|
table_name = "servers"
|
|
database = db
|
|
|
|
# **********************************************************************************
|
|
# Role Servers Class
|
|
# **********************************************************************************
|
|
class RoleServers(peewee.Model):
|
|
role_id = peewee.ForeignKeyField(Roles, backref="role_server")
|
|
server_id = peewee.ForeignKeyField(Servers, backref="role_server")
|
|
permissions = peewee.CharField(default="00000000")
|
|
|
|
class Meta:
|
|
table_name = "role_servers"
|
|
primary_key = peewee.CompositeKey("role_id", "server_id")
|
|
database = db
|
|
|
|
# **********************************************************************************
|
|
# Webhooks Class
|
|
# **********************************************************************************
|
|
class Webhooks(peewee.Model):
|
|
id = peewee.AutoField()
|
|
server_id = peewee.ForeignKeyField(Servers, backref="webhook_server", null=True)
|
|
name = peewee.CharField(default="Custom Webhook", max_length=64)
|
|
url = peewee.CharField(default="")
|
|
webhook_type = peewee.CharField(default="Custom")
|
|
bot_name = peewee.CharField(default="Crafty Controller")
|
|
trigger = peewee.CharField(default="server_start,server_stop")
|
|
body = peewee.CharField(default="")
|
|
color = peewee.CharField(default="#005cd1")
|
|
enabled = peewee.BooleanField(default=True)
|
|
|
|
class Meta:
|
|
table_name = "webhooks"
|
|
database = db
|
|
|
|
# **********************************************************************************
|
|
# Schedules Class
|
|
# **********************************************************************************
|
|
class Schedules(peewee.Model):
|
|
schedule_id = peewee.IntegerField(unique=True, primary_key=True)
|
|
server_id = peewee.ForeignKeyField(Servers, backref="schedule_server")
|
|
enabled = peewee.BooleanField()
|
|
action = peewee.CharField()
|
|
interval = peewee.IntegerField()
|
|
interval_type = peewee.CharField()
|
|
start_time = peewee.CharField(null=True)
|
|
command = peewee.CharField(null=True)
|
|
name = peewee.CharField()
|
|
one_time = peewee.BooleanField(default=False)
|
|
cron_string = peewee.CharField(default="")
|
|
parent = peewee.IntegerField(null=True)
|
|
delay = peewee.IntegerField(default=0)
|
|
next_run = peewee.CharField(default="")
|
|
|
|
class Meta:
|
|
table_name = "schedules"
|
|
database = db
|
|
|
|
# **********************************************************************************
|
|
# Backups Class
|
|
# **********************************************************************************
|
|
class Backups(peewee.Model):
|
|
excluded_dirs = peewee.CharField(null=True)
|
|
max_backups = peewee.IntegerField()
|
|
max_backups = peewee.IntegerField()
|
|
server_id = peewee.ForeignKeyField(Servers, backref="backups_server")
|
|
compress = peewee.BooleanField(default=False)
|
|
shutdown = peewee.BooleanField(default=False)
|
|
before = peewee.CharField(default="")
|
|
after = peewee.CharField(default="")
|
|
|
|
class Meta:
|
|
table_name = "backups"
|
|
database = db
|
|
|
|
try:
|
|
logger.debug("Migrating Data from UUID to Int (Primary Keys)")
|
|
Console.debug("Migrating Data from UUID to Int (Primary Keys)")
|
|
# Migrating servers from the old id type to the new one
|
|
new_id = 0
|
|
for server in Servers.select():
|
|
new_id += 1
|
|
Servers.update(server_uuid=server.server_id).where(
|
|
Servers.server_id == server.server_id
|
|
).execute()
|
|
Servers.update(server_id=new_id).where(
|
|
Servers.server_id == server.server_id
|
|
).execute()
|
|
|
|
logger.debug("Migrating Data from UUID to Int (Primary Keys) : SUCCESS")
|
|
Console.debug("Migrating Data from UUID to Int (Primary Keys) : SUCCESS")
|
|
|
|
except Exception as ex:
|
|
logger.error("Error while migrating Data from UUID to Int (Primary Keys)")
|
|
logger.error(ex)
|
|
Console.error("Error while migrating Data from UUID to Int (Primary Keys)")
|
|
Console.error(ex)
|
|
last_migration = MigrateHistory.get_by_id(MigrateHistory.select().count())
|
|
last_migration.delete()
|
|
return
|
|
|
|
try:
|
|
logger.debug("Migrating Data from UUID to Int (Foreign Keys)")
|
|
Console.debug("Migrating Data from UUID to Int (Foreign Keys)")
|
|
# Changes on Webhooks Log Table
|
|
for webhook in Webhooks.select():
|
|
old_server_id = webhook.server_id_id
|
|
try:
|
|
server = Servers.get_or_none(Servers.server_uuid == old_server_id)
|
|
new_server_id = server.server_id
|
|
except:
|
|
new_server_id = old_server_id
|
|
Webhooks.update(server_id=new_server_id).where(
|
|
Webhooks.id == webhook.id
|
|
).execute()
|
|
|
|
# Changes on Schedules Log Table
|
|
for schedule in Schedules.select():
|
|
old_server_id = schedule.server_id_id
|
|
try:
|
|
server = Servers.get_or_none(Servers.server_uuid == old_server_id)
|
|
new_server_id = server.server_id
|
|
except:
|
|
new_server_id = old_server_id
|
|
Schedules.update(server_id=new_server_id).where(
|
|
Schedules.schedule_id == schedule.schedule_id
|
|
).execute()
|
|
|
|
# Changes on Backups Log Table
|
|
for backup in Backups.select():
|
|
old_server_id = backup.server_id_id
|
|
try:
|
|
server = Servers.get_or_none(Servers.server_uuid == old_server_id)
|
|
new_server_id = server.server_id
|
|
except:
|
|
new_server_id = old_server_id
|
|
Backups.update(server_id=new_server_id).where(
|
|
Backups.server_id == old_server_id
|
|
).execute()
|
|
|
|
# Changes on RoleServers Log Table
|
|
for role_servers in RoleServers.select():
|
|
old_server_id = role_servers.server_id_id
|
|
try:
|
|
server = Servers.get_or_none(Servers.server_uuid == old_server_id)
|
|
new_server_id = server.server_id
|
|
except:
|
|
new_server_id = old_server_id
|
|
RoleServers.update(server_id=new_server_id).where(
|
|
RoleServers.role_id == role_servers.id
|
|
and RoleServers.server_id == old_server_id
|
|
).execute()
|
|
|
|
logger.debug("Migrating Data from UUID to Int (Foreign Keys) : SUCCESS")
|
|
Console.debug("Migrating Data from UUID to Int (Foreign Keys) : SUCCESS")
|
|
|
|
except Exception as ex:
|
|
logger.error("Error while migrating Data from UUID to Int (Foreign Keys)")
|
|
logger.error(ex)
|
|
Console.error("Error while migrating Data from UUID to Int (Foreign Keys)")
|
|
Console.error(ex)
|
|
last_migration = MigrateHistory.get_by_id(MigrateHistory.select().count())
|
|
last_migration.delete()
|
|
return
|
|
|
|
return
|