\x89PNG\r\n\x1a\n\x00\x00\x00\x0DIHDR\x00\x00\x00\x01\x00 \x00\x00\x01\x08\x06\x00\x00\x00\x1F\x15\xC4\x89\x00\x00\x00 \x0AIDATx\x9Ccb\x00\x00\x00\x06\x00\x03\x1A\x05\x9D\x00\x00 \x00\x00IEND\xAE\x42\x60\x82
| Path : /var/www/html/yedekledb24/DatabaseBackupMasterv8/ |
|
B-Con CMD Config cPanel C-Rdp D-Log Info Jump Mass Ransom Symlink vHost Zone-H |
| Current File : /var/www/html/yedekledb24/DatabaseBackupMasterv8/models.py.bak |
import datetime
import os
from app import db
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import UserMixin
class DatabaseConnection(db.Model):
"""Model for database connection configuration."""
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), nullable=False)
db_type = db.Column(db.String(16), nullable=False) # mysql, postgresql, mariadb
host = db.Column(db.String(128), nullable=False)
port = db.Column(db.Integer, nullable=False)
username = db.Column(db.String(64), nullable=False)
password = db.Column(db.String(128), nullable=False)
database = db.Column(db.String(64), nullable=False)
pg_version = db.Column(db.String(8), nullable=True) # PostgreSQL version (13, 14, 15, 16, 17)
created_at = db.Column(db.DateTime, default=datetime.datetime.utcnow)
backup_jobs = db.relationship('BackupJob', backref='database', lazy=True)
def __repr__(self):
return f'<DatabaseConnection {self.name}>'
class StorageTarget(db.Model):
"""Model for backup storage target configuration."""
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), nullable=False)
storage_type = db.Column(db.String(16), nullable=False) # smb, nfs, ftp
host = db.Column(db.String(128), nullable=False)
port = db.Column(db.Integer, nullable=True) # Optional for some storage types
username = db.Column(db.String(64), nullable=True) # Optional for some storage types
password = db.Column(db.String(128), nullable=True) # Optional for some storage types
path = db.Column(db.String(256), nullable=False)
created_at = db.Column(db.DateTime, default=datetime.datetime.utcnow)
backup_jobs = db.relationship('BackupJob', backref='storage', lazy=True)
def __repr__(self):
return f'<StorageTarget {self.name}>'
class BackupJob(db.Model):
"""Model for backup job configuration."""
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), nullable=False)
database_id = db.Column(db.Integer, db.ForeignKey('database_connection.id'), nullable=False)
storage_id = db.Column(db.Integer, db.ForeignKey('storage_target.id'), nullable=False)
schedule_type = db.Column(db.String(16), nullable=False) # daily, weekly, monthly, etc.
schedule_value = db.Column(db.String(64), nullable=False) # cron expression or specific value
retention_days = db.Column(db.Integer, default=30) # How many days to keep backups
enabled = db.Column(db.Boolean, default=True)
created_at = db.Column(db.DateTime, default=datetime.datetime.utcnow)
last_run = db.Column(db.DateTime, nullable=True)
# Şifreleme ayarları - veritabanı yapısı add_encryption_tables.sql dosyası ile güncellendi
encrypt_backup = db.Column(db.Boolean, default=False)
encryption_type = db.Column(db.String(16), nullable=True) # symmetric, asymmetric
encryption_key_id = db.Column(db.Integer, db.ForeignKey('encryption_key.id', name='fk_backup_job_encryption_key'), nullable=True)
encryption_passphrase = db.Column(db.String(256), nullable=True)
# Şifreleme ilişkileri
encryption_key = db.relationship('EncryptionKey', backref='backup_jobs', lazy=True, foreign_keys=[encryption_key_id])
logs = db.relationship('BackupLog', backref='job', lazy=True)
def __repr__(self):
return f'<BackupJob {self.name}>'
class BackupLog(db.Model):
"""Model for backup execution logs."""
id = db.Column(db.Integer, primary_key=True)
job_id = db.Column(db.Integer, db.ForeignKey('backup_job.id'), nullable=False)
timestamp = db.Column(db.DateTime, default=datetime.datetime.utcnow)
status = db.Column(db.String(16), nullable=False) # success, failed
message = db.Column(db.Text, nullable=True)
backup_file = db.Column(db.String(256), nullable=True) # Path to the backup file
backup_size = db.Column(db.BigInteger, nullable=True) # Size of the backup in bytes
duration = db.Column(db.Float, nullable=True) # Duration of backup in seconds
# Şifreleme durum bilgisi - veritabanı yapısı add_encryption_tables.sql dosyası ile güncellendi
encrypted = db.Column(db.Boolean, default=False)
encryption_type = db.Column(db.String(16), nullable=True) # symmetric, asymmetric
def __repr__(self):
return f'<BackupLog {self.job.name} {self.timestamp} {self.status}>'
class User(UserMixin, db.Model):
"""Model for user authentication."""
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
password_hash = db.Column(db.String(256), nullable=False)
is_admin = db.Column(db.Boolean, default=False)
created_at = db.Column(db.DateTime, default=datetime.datetime.utcnow)
last_login = db.Column(db.DateTime, nullable=True)
def set_password(self, password):
"""Set password hash from a plaintext password."""
self.password_hash = generate_password_hash(password)
def check_password(self, password):
"""Check if the provided password matches the stored password hash."""
return check_password_hash(self.password_hash, password)
def can_view(self):
"""All users can view content."""
return True
def can_manage_db_connections(self):
"""Only admins can manage database connections."""
return self.is_admin
def can_manage_storage(self):
"""Only admins can manage storage targets."""
return self.is_admin
def can_manage_backup_jobs(self):
"""Only admins can manage backup jobs."""
return self.is_admin
def can_manage_users(self):
"""Only admins can manage users."""
return self.is_admin
def __repr__(self):
return f'<User {self.username}>'
class EncryptionKey(db.Model):
"""Model for GPG encryption keys."""
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), nullable=False)
email = db.Column(db.String(128), nullable=False)
key_type = db.Column(db.String(16), nullable=False) # RSA, DSA, etc.
key_length = db.Column(db.Integer, nullable=False, default=2048) # Key length in bits
fingerprint = db.Column(db.String(64), nullable=False, unique=True)
public_key = db.Column(db.Text, nullable=False) # Public key data (ASCII-armored)
private_key = db.Column(db.Text, nullable=True) # Private key data (ASCII-armored, may be null)
created_at = db.Column(db.DateTime, default=datetime.datetime.utcnow)
created_by = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=True)
creator = db.relationship('User', backref='encryption_keys', lazy=True)
def __repr__(self):
return f'<EncryptionKey {self.name} ({self.email})>'
def short_fingerprint(self):
"""Return the short version of fingerprint (last 8 chars)."""
if self.fingerprint and len(self.fingerprint) >= 8:
return self.fingerprint[-8:]
return self.fingerprint
class SmtpSettings(db.Model):
"""Model for SMTP email settings."""
id = db.Column(db.Integer, primary_key=True)
mail_server = db.Column(db.String(128), nullable=False)
mail_port = db.Column(db.Integer, nullable=False)
mail_use_tls = db.Column(db.Boolean, default=True)
mail_use_ssl = db.Column(db.Boolean, default=False)
mail_username = db.Column(db.String(128), nullable=False)
mail_password = db.Column(db.String(128), nullable=False)
mail_default_sender = db.Column(db.String(128), nullable=False)
notification_emails = db.Column(db.String(256), nullable=False)
created_at = db.Column(db.DateTime, default=datetime.datetime.utcnow)
updated_at = db.Column(db.DateTime, default=datetime.datetime.utcnow, onupdate=datetime.datetime.utcnow)
def __repr__(self):
return f'<SmtpSettings {self.mail_server}>'
@staticmethod
def get_settings():
"""Get the SMTP settings (there should only be one record)"""
settings = SmtpSettings.query.first()
if settings is None:
# Return default settings from environment variables if no DB record
return {
'mail_server': os.environ.get('MAIL_SERVER', 'smtp.gmail.com'),
'mail_port': int(os.environ.get('MAIL_PORT', 587)),
'mail_use_tls': os.environ.get('MAIL_USE_TLS', 'True').lower() in ('true', '1', 't'),
'mail_use_ssl': os.environ.get('MAIL_USE_SSL', 'False').lower() in ('true', '1', 't'),
'mail_username': os.environ.get('MAIL_USERNAME', ''),
'mail_password': os.environ.get('MAIL_PASSWORD', ''),
'mail_default_sender': os.environ.get('MAIL_DEFAULT_SENDER', ''),
'notification_emails': os.environ.get('BACKUP_NOTIFICATION_EMAILS', '')
}
return {
'mail_server': settings.mail_server,
'mail_port': settings.mail_port,
'mail_use_tls': settings.mail_use_tls,
'mail_use_ssl': settings.mail_use_ssl,
'mail_username': settings.mail_username,
'mail_password': settings.mail_password,
'mail_default_sender': settings.mail_default_sender,
'notification_emails': settings.notification_emails
}