Skip to content

Commit

Permalink
Merge pull request #6 from blink-zero/v1.0.1beta-release
Browse files Browse the repository at this point in the history
Update Dependencies and Codebase for Compatibility with Latest Libraries
  • Loading branch information
blink-zero committed Jun 22, 2024
2 parents fcb727e + 6ba394f commit b39f5f7
Show file tree
Hide file tree
Showing 13 changed files with 178 additions and 128 deletions.
10 changes: 7 additions & 3 deletions apps/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,14 @@ def register_extensions(app):

# Function to configure database
def configure_database(app):
initialized = False

@app.before_first_request
@app.before_request
def initialize_database():
db.create_all()
nonlocal initialized
if not initialized:
db.create_all()
initialized = True

@app.teardown_request
def shutdown_session(exception=None):
Expand Down Expand Up @@ -67,4 +71,4 @@ def create_app(config):
@login_manager.unauthorized_handler
def unauthorized():
# Customize the unauthorized page here
return render_template('error/403.html')
return render_template('error/403.html')
12 changes: 1 addition & 11 deletions apps/auth/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,7 @@
from flask_login import login_user, logout_user, login_required, current_user
from apps.auth import blueprint
from apps.models import User
import json

def log_json(level, message, **kwargs):
log_entry = {
"level": level,
"timestamp": datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
"user": session.get('username', 'anonymous'),
"message": message,
**kwargs
}
logging.getLogger('json_logger').info(json.dumps(log_entry))
from apps.utils.logging import log_json

@blueprint.route('/', methods=['GET', 'POST'])
@blueprint.route('/login', methods=['GET', 'POST'])
Expand Down
31 changes: 3 additions & 28 deletions apps/home/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,32 +35,7 @@
import uuid

from apps.models.vm_image_model import VmImageModel

# Configure logging to use JSON format
logging.basicConfig(level=logging.INFO, format='%(message)s')
logger = logging.getLogger()

# Configure separate file handlers for JSON logs and console logs
json_handler = logging.FileHandler('logs/app_json.log')
json_handler.setLevel(logging.INFO)
json_handler.setFormatter(logging.Formatter('%(message)s'))
json_logger = logging.getLogger('json_logger')
json_logger.addHandler(json_handler)

console_handler = logging.FileHandler('logs/app.log')
console_handler.setLevel(logging.INFO)
console_handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S'))
logger.addHandler(console_handler)

def log_json(level, message, **kwargs):
log_entry = {
"level": level,
"timestamp": datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
"user": session.get('username', 'anonymous'),
"message": message,
**kwargs
}
logging.getLogger('json_logger').info(json.dumps(log_entry))
from apps.utils.logging import log_json

def admin_required(func):
@wraps(func)
Expand Down Expand Up @@ -110,10 +85,10 @@ def logs():
def download_log():
log_json('INFO', 'Downloaded logs file')
pwd = os.getcwd()
filepath = f'{pwd}/logs/app.log'
filepath = f'{pwd}/logs/app_json.log'

if os.path.exists(filepath):
return send_file(filepath, as_attachment=True, attachment_filename='app.log')
return send_file(filepath, as_attachment=True, download_name='app_json.log')
else:
log_json('ERROR', 'Log file not found', path=filepath)
abort(404)
Expand Down
11 changes: 1 addition & 10 deletions apps/home/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import ansible_runner
import yaml
import json
from apps.utils.logging import log_json


def model_to_dict(instance):
Expand Down Expand Up @@ -194,16 +195,6 @@ def set_environment_variables(config):
for var_name, var_value in config.items():
os.environ[var_name.upper()] = var_value

def log_json(level, message, **kwargs):
log_entry = {
"level": level,
"timestamp": datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
"user": session.get('username', 'anonymous'),
"message": message,
**kwargs
}
logging.getLogger('json_logger').info(json.dumps(log_entry))

def create_yaml_file_from_designation(designation):
yaml_file_path = 'apps/plugins/ansible-deploy-vm/vars/other.yml'

Expand Down
4 changes: 2 additions & 2 deletions apps/models/domain_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ def domain_admin_password(self, value):
@event.listens_for(DomainModel, 'before_insert')
def generate_domain_designation(mapper, connection, target):
last_designation = connection.scalar(
select([DomainModel.designation]).order_by(db.desc(DomainModel.id)).limit(1)
select(DomainModel.designation).order_by(db.desc(DomainModel.id)).limit(1)
)

if last_designation:
Expand All @@ -52,4 +52,4 @@ def increment_alphabetic_string(s):
if s[1] == 'Z':
return alphabet[alphabet.index(s[0]) + 1] + 'A'
else:
return s[0] + alphabet[alphabet.index(s[1]) + 1]
return s[0] + alphabet[alphabet.index(s[1]) + 1]
4 changes: 2 additions & 2 deletions apps/models/non_domain_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class NonDomainModel(db.Model):
@event.listens_for(NonDomainModel, 'before_insert')
def generate_nondomain_designation(mapper, connection, target):
last_designation = connection.scalar(
select([NonDomainModel.designation]).order_by(db.desc(NonDomainModel.id)).limit(1)
select(NonDomainModel.designation).order_by(db.desc(NonDomainModel.id)).limit(1)
)

if last_designation:
Expand All @@ -37,4 +37,4 @@ def increment_alphabetic_string(s):
if s[1] == 'Z':
return alphabet[alphabet.index(s[0]) + 1] + 'A'
else:
return s[0] + alphabet[alphabet.index(s[1]) + 1]
return s[0] + alphabet[alphabet.index(s[1]) + 1]
12 changes: 1 addition & 11 deletions apps/settings/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
from flask import flash, send_from_directory
from werkzeug.utils import secure_filename
import zipfile
from apps.utils.logging import log_json

def allowed_file(filename):
ALLOWED_EXTENSIONS = {'zip'}
Expand All @@ -39,16 +40,6 @@ def decorated_view(*args, **kwargs):
return func(*args, **kwargs)
return decorated_view

def log_json(level, message, **kwargs):
log_entry = {
"level": level,
"timestamp": datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
"user": session.get('username', 'anonymous'),
"message": message,
**kwargs
}
logging.getLogger('json_logger').info(json.dumps(log_entry))

@blueprint.route('/settings')
@login_required
@admin_required
Expand Down Expand Up @@ -760,7 +751,6 @@ def import_data():
'configmodel': ConfigModel,
'nondomainmodel': NonDomainModel,
'domainmodel': DomainModel,
'setupstatus': SetupStatus,
'pluginmodel': PluginModel,
'defaultvmsettingsmodel': DefaultVmSettingsModel,
}
Expand Down
2 changes: 1 addition & 1 deletion apps/templates/accounts/login.html
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
{% endif %}
</form>
<div class="mt-4">
<span class="text-muted" style="font-size: 12px;">Application Version: 1.0.0beta</span>
<span class="text-muted" style="font-size: 12px;">Application Version: 1.0.1beta</span>
</div>
</div>
</div>
Expand Down
2 changes: 1 addition & 1 deletion apps/templates/includes/sidebar.html
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@

<!-- Application Version -->
<div class="sidebar-footer text-center py-2 mt-auto">
<span class="app-version">Version: 1.0.0beta</span>
<span class="app-version">Version: 1.0.1beta</span>
</div>
</nav>
</div>
28 changes: 28 additions & 0 deletions apps/utils/logging.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import json
from datetime import datetime
import logging
from flask import session

# Custom JSON encoder for logging
class CustomJSONEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, bytes):
return obj.decode('utf-8')
return super().default(obj)

# Custom JSON log formatter
class JSONFormatter(logging.Formatter):
def format(self, record):
log_record = {
"timestamp": datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
"level": record.levelname,
"message": record.msg,
"user": getattr(record, 'user', 'anonymous'),
**getattr(record, 'extra', {})
}
return json.dumps(log_record, cls=CustomJSONEncoder)

def log_json(level, message, **kwargs):
json_logger = logging.getLogger('json_logger')
extra_info = {"extra": kwargs, "user": session.get('username', 'anonymous')}
json_logger.log(getattr(logging, level), message, extra=extra_info)
29 changes: 29 additions & 0 deletions docker-compose.yml.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
version: '3'
services:
app:
container_name: deployaroo-app
restart: always
build: .
ports:
- "8000:8000"
environment:
SECRET_KEY: 'your_secret_key' # Change this
ENCRYPTION_KEY: 'your_encryption_key' # Change this
APP_ADMIN_USER: 'administrator' # Change this
APP_ADMIN_PASSWORD: 'password' # Change this
# Volumes are optional
volumes:
- ./deployaroo-data/logs:/home/project/app/logs
- ./deployaroo-data/backups:/home/project/app/apps/backups
command: gunicorn -w 10 -b :8000 run:app --timeout 3600

nginx:
container_name: deployaroo-nginx
restart: always
image: "nginx:latest"
ports:
- "80:80"
volumes:
- ./nginx:/etc/nginx/conf.d
depends_on:
- app
18 changes: 9 additions & 9 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
flask==2.1.3
flask_login==0.5.0
flask==3.0.3
flask_login==0.6.3
flask-sslify==0.1.5
gunicorn==20.1.0
flask_migrate==3.1.0
flask_sqlalchemy==2.5.1
sqlalchemy==1.4.29
Werkzeug==2.0.3
gunicorn==22.0.0
flask_migrate==4.0.7
flask_sqlalchemy==3.1.1
sqlalchemy==2.0.16
Werkzeug==3.0.3
requests>=2.27.1
pyvmomi==8.0.0.1.2
ansible_runner==2.3.2
markdown==3.4.3
flask-paginate==2022.1.8
flask-paginate==2024.4.12
retrying==1.3.4
pywinrm==0.4.3
pywinrm==0.4.3
Loading

0 comments on commit b39f5f7

Please sign in to comment.