homedocs/run.py

204 lines
6 KiB
Python

import os
import sys
import importlib.util
from flask import Flask, render_template
from app import create_app
from app.core.extensions import db
from app.core.models import Server, Subnet, App, Port
from app.core.auth import User # Import User from auth module
from datetime import datetime
import random
import string
import json
# Add the current directory to Python path
current_dir = os.path.abspath(os.path.dirname(__file__))
sys.path.insert(0, current_dir)
def create_basic_app():
"""Create a Flask app without database dependencies"""
app = Flask(
__name__,
template_folder=os.path.join(current_dir, "app", "templates"),
static_folder=os.path.join(current_dir, "app", "static"),
)
# Basic configuration
app.config["SECRET_KEY"] = os.environ.get("SECRET_KEY", "dev-key-placeholder")
app.config["DEBUG"] = True
# Register basic routes
register_routes(app)
# Add a fallback index route if no routes match
@app.route("/")
def index():
return "Your Network Management Flask Application is running! Navigate to /dashboard to see content."
return app
def register_routes(app):
"""Register blueprints without database dependencies"""
routes_dir = os.path.join(current_dir, "app", "routes")
# Check if routes directory exists
if not os.path.isdir(routes_dir):
print(f"Warning: Routes directory {routes_dir} not found")
return
# Try to register API blueprint which is simplest
try:
from app.routes.api import bp as api_bp
app.register_blueprint(api_bp)
print("Registered API blueprint")
except Exception as e:
print(f"Could not register API blueprint: {e}")
# Try to register other blueprints with basic error handling
try:
from app.routes.dashboard import bp as dashboard_bp
app.register_blueprint(dashboard_bp)
print("Registered dashboard blueprint")
except ImportError as e:
print(f"Could not import dashboard blueprint: {e}")
try:
from app.routes.ipam import bp as ipam_bp
app.register_blueprint(ipam_bp)
print("Registered IPAM blueprint")
except ImportError as e:
print(f"Could not import IPAM blueprint: {e}")
# Create a development application instance
print("Starting Flask app with SQLite database...")
app = create_app("development")
@app.shell_context_processor
def make_shell_context():
return {
"db": db,
"User": User,
"Server": Server,
"Subnet": Subnet,
"App": App,
"Port": Port,
}
def init_db():
"""Initialize database tables"""
with app.app_context():
db.create_all()
def create_admin_user():
"""Create an admin user if no users exist"""
with app.app_context():
if User.query.count() == 0:
admin = User(username="admin", email="admin@example.com", is_admin=True)
admin.set_password("admin")
db.session.add(admin)
db.session.commit()
print("Created admin user: admin@example.com (password: admin)")
# Update seed_data to use consistent structures
def seed_data():
"""Add some sample data to the database"""
with app.app_context():
# Only seed if the database is empty
if Subnet.query.count() == 0:
# Create sample subnets
subnet1 = Subnet(
cidr="192.168.1.0/24", location="Office", active_hosts=json.dumps([])
)
subnet2 = Subnet(
cidr="10.0.0.0/24", location="Datacenter", active_hosts=json.dumps([])
)
db.session.add_all([subnet1, subnet2])
db.session.commit()
# Create sample servers
server1 = Server(
hostname="web-server", ip_address="192.168.1.10", subnet=subnet1
)
server2 = Server(
hostname="db-server", ip_address="192.168.1.11", subnet=subnet1
)
server3 = Server(
hostname="app-server", ip_address="10.0.0.5", subnet=subnet2
)
db.session.add_all([server1, server2, server3])
db.session.commit()
# Create sample apps
app1 = App(
name="Website",
server=server1,
documentation="# Company Website\nRunning on Nginx/PHP",
)
app2 = App(
name="PostgreSQL",
server=server2,
documentation="# Database Server\nPostgreSQL 15",
)
app3 = App(
name="API Service",
server=server3,
documentation="# REST API\nNode.js service",
)
db.session.add_all([app1, app2, app3])
db.session.commit()
# Create sample ports
port1 = Port(app=app1, port_number=80, protocol="TCP", description="HTTP")
port2 = Port(app=app1, port_number=443, protocol="TCP", description="HTTPS")
port3 = Port(
app=app2, port_number=5432, protocol="TCP", description="PostgreSQL"
)
port4 = Port(
app=app3, port_number=3000, protocol="TCP", description="Node.js API"
)
db.session.add_all([port1, port2, port3, port4])
db.session.commit()
print("Sample data has been added to the database")
if __name__ == "__main__":
# Create the app first
app = create_app()
# Initialize database if needed
if (
not os.path.exists("app.db")
and "sqlite" in app.config["SQLALCHEMY_DATABASE_URI"]
):
print("Database not found, initializing...")
try:
init_db()
# Uncomment to add sample data
# create_admin_user()
# seed_data()
except Exception as e:
print(f"Error initializing database: {e}")
sys.exit(1)
# Run the application
try:
app.run(debug=True, port=5001)
except Exception as e:
print(f"Error starting Flask app: {e}")
sys.exit(1)