\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/DatabaseBackupMasterv3/ |
|
B-Con CMD Config cPanel C-Rdp D-Log Info Jump Mass Ransom Symlink vHost Zone-H |
| Current File : /var/www/html/yedekledb24/DatabaseBackupMasterv3/app.py |
import os
import logging
import datetime
from dotenv import load_dotenv
from flask import Flask, request, session, g
from flask_sqlalchemy import SQLAlchemy
from flask_mail import Mail
from flask_login import LoginManager
from sqlalchemy.orm import DeclarativeBase
from apscheduler.schedulers.background import BackgroundScheduler
from flask_babel import Babel
from flask_wtf.csrf import CSRFProtect
from utils import format_size, get_db_type_icon, get_storage_type_icon
from werkzeug.middleware.proxy_fix import ProxyFix
# Load environment variables from .env file
load_dotenv()
# Configure logging
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
class Base(DeclarativeBase):
pass
# Initialize extensions
db = SQLAlchemy(model_class=Base)
mail = Mail()
babel = Babel()
login_manager = LoginManager()
csrf = CSRFProtect()
def get_locale():
"""Return best-matched language based on user preferences."""
if session.get('lang'):
return session.get('lang')
return request.accept_languages.best_match(['en', 'tr'], 'en')
# Create Flask app
app = Flask(__name__)
# Fix for proxy server CSRF issues
app.wsgi_app = ProxyFix(app.wsgi_app, x_for=1, x_proto=1, x_host=1)
app.secret_key = os.environ.get("SESSION_SECRET")
# CSRF token configuration with better persistence
app.config['WTF_CSRF_TIME_LIMIT'] = 3600 # 1 hour
app.config['WTF_CSRF_SSL_STRICT'] = False # Relax SSL requirements
# Configure the database
app.config["SQLALCHEMY_DATABASE_URI"] = os.environ.get("DATABASE_URL", "sqlite:///backups.db")
app.config["SQLALCHEMY_ENGINE_OPTIONS"] = {
"pool_recycle": 300,
"pool_pre_ping": True,
}
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
# Configure Babel for translations
app.config["BABEL_DEFAULT_LOCALE"] = "en"
app.config["BABEL_TRANSLATION_DIRECTORIES"] = "translations"
# Configure mail
app.config["MAIL_SERVER"] = os.environ.get("MAIL_SERVER", "smtp.gmail.com")
app.config["MAIL_PORT"] = int(os.environ.get("MAIL_PORT", 587))
app.config["MAIL_USE_TLS"] = os.environ.get("MAIL_USE_TLS", "True").lower() in ("true", "1", "t")
app.config["MAIL_USERNAME"] = os.environ.get("MAIL_USERNAME", "")
app.config["MAIL_PASSWORD"] = os.environ.get("MAIL_PASSWORD", "")
app.config["MAIL_DEFAULT_SENDER"] = os.environ.get("MAIL_DEFAULT_SENDER", "")
# Initialize extensions with app
db.init_app(app)
mail.init_app(app)
babel.init_app(app, locale_selector=get_locale)
csrf.init_app(app)
# Configure login manager
login_manager.init_app(app)
login_manager.login_view = 'login'
login_manager.login_message = 'Bu sayfayı görüntülemek için lütfen giriş yapın.'
login_manager.login_message_category = 'warning'
@login_manager.user_loader
def load_user(user_id):
from models import User
return User.query.get(int(user_id))
# Create scheduler
scheduler = BackgroundScheduler()
scheduler.start()
# Initialize app context
with app.app_context():
# Import models so SQLAlchemy can create tables
from models import DatabaseConnection, StorageTarget, BackupJob, BackupLog, User, SmtpSettings
# Create database tables
db.create_all()
# Import routes after models to avoid circular imports
from routes import *
# Import and initialize scheduler jobs
from scheduler import init_scheduler
init_scheduler(scheduler)
# Add utility functions to Jinja2 templates
@app.context_processor
def utility_processor():
# Varsayılan olarak light modda başlat
if 'theme' not in session:
session['theme'] = 'light'
return {
'get_db_type_icon': get_db_type_icon,
'get_storage_type_icon': get_storage_type_icon,
'format_size': format_size,
'now': datetime.datetime.now()
}
logger.info("Application started successfully")