Created
October 7, 2014 15:27
-
-
Save marshyski/ff4a9865ae3ed76cee66 to your computer and use it in GitHub Desktop.
yum-nginx-api Basic Auth username & password
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
import os | |
import magic | |
from flask import Flask, request, jsonify, make_response | |
from werkzeug.utils import secure_filename | |
from werkzeug.contrib.fixers import ProxyFix | |
from subprocess import call | |
from flask.ext.httpauth import HTTPBasicAuth | |
upload_dir = '/opt/repos/pre-release' | |
allowed_ext = set(['rpm']) | |
allowed_mime = set(['application/x-rpm']) | |
app = Flask(__name__) | |
auth = HTTPBasicAuth() | |
app.config['upload_dir'] = upload_dir | |
#900MB limit set below | |
app.config['MAX_CONTENT_LENGTH'] = 90 * 1024 * 1024 * 1024 | |
@auth.get_password | |
def get_password(username): | |
if username == 'miguel': | |
return 'python' | |
return None | |
def allowed_file(filename): | |
return '.' in filename and \ | |
filename.rsplit('.', 1)[1] in allowed_ext | |
@auth.error_handler | |
def unauthorized(): | |
return make_response(jsonify(message='Unauthorized Access', status=403), 403) | |
@app.errorhandler(404) | |
def page_not_found(e): | |
return jsonify(message='Invaild URL, did you mean /api/upload', status=404), 404 | |
@app.errorhandler(405) | |
def method_not_allowed(e): | |
return jsonify(message='Method not allowed, post binary RPM to URL', status=405), 405 | |
@app.route('/api/upload', methods=['POST']) | |
@auth.login_required | |
def upload_file(): | |
file = request.files['file'] | |
filename = secure_filename(file.filename) | |
if file and allowed_file(file.filename): | |
file.save(os.path.join(app.config['upload_dir'], filename)) | |
file2 = upload_dir + '/' + filename | |
file_mime = magic.from_file(file2, mime=True) | |
filesize = os.path.getsize(file2) >> 20 | |
if file_mime in allowed_mime: | |
call(["createrepo", "-v", "-p", "--update", "--workers", "2", upload_dir]) | |
return jsonify(name=filename, size_mb=filesize, mime=file_mime, status=202) | |
else: | |
os.remove(file2) | |
return jsonify(name=filename, size_mb=filesize, mime=file_mime, status=415) | |
else: | |
return jsonify(name=filename, status=415) | |
app.wsgi_app = ProxyFix(app.wsgi_app) | |
if __name__ == '__main__': | |
app.run('0.0.0.0', debug = True) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment