71 lines
2.2 KiB
Python
71 lines
2.2 KiB
Python
import os
|
|
import logging
|
|
import subprocess
|
|
from flask import Flask, request, jsonify
|
|
|
|
app = Flask(__name__)
|
|
|
|
WEBBUMP_DIR = "/etc/webbump"
|
|
LOG_FILE = "/var/log/webbump.log"
|
|
|
|
logging.basicConfig(
|
|
filename=LOG_FILE,
|
|
level=logging.INFO,
|
|
format="%(asctime)s [%(levelname)s] %(message)s",
|
|
)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
@app.route('/status', methods=['GET'])
|
|
def status():
|
|
"""Minimal endpoint for health check."""
|
|
return "OK", 200
|
|
|
|
@app.route("/webhook", methods=["POST"])
|
|
def gitea_webhook():
|
|
data = request.json
|
|
if not data:
|
|
logger.error("Received webhook without JSON")
|
|
return jsonify({"error": "Invalid JSON"}), 400
|
|
|
|
# Repository name
|
|
repo_name = data.get("repository", {}).get("name")
|
|
if not repo_name:
|
|
logger.error("Could not get Repository name from JSON")
|
|
return jsonify({"error": "Repository name not found"}), 400
|
|
|
|
# Determine event type from header
|
|
event_type = request.headers.get("X-Gitea-Event", "").lower()
|
|
if event_type == "push":
|
|
args = []
|
|
|
|
elif event_type == "release":
|
|
version = data.get("release", {}).get("tag_name")
|
|
if not version:
|
|
logger.error("Release version not found")
|
|
return jsonify({"error": "Release version not found"}), 400
|
|
args = [version]
|
|
else:
|
|
logger.warn("Ignored event type: " + event_type)
|
|
return jsonify({"message": f"Ignored event type: {event_type}"}), 200
|
|
|
|
script_path = os.path.join(WEBBUMP_DIR, repo_name, event_type)
|
|
if not os.path.isfile(script_path) or not os.access(script_path, os.X_OK):
|
|
logger.warn("No scripts executed for " + repo_name + " " + event_type)
|
|
return jsonify({"message": "No scripts executed for " + repo_name + " " + event_type}), 200
|
|
|
|
# Run the script
|
|
try:
|
|
subprocess.run([script_path, *args], check=True)
|
|
except subprocess.CalledProcessError as e:
|
|
logger.error(repo_name + " " + event_type + " script failed with exit code: " + e)
|
|
return jsonify({"error": f"Script failed: {e}"}), 500
|
|
|
|
logger.info("Script executed successfully")
|
|
return jsonify({"message": f"Executed {script_path}"}), 200
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
app.run(host='0.0.0.0', port=5000, debug=True)
|