Skip to content

Instantly share code, notes, and snippets.

@marshyski
Created October 7, 2014 15:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save marshyski/ff4a9865ae3ed76cee66 to your computer and use it in GitHub Desktop.
Save marshyski/ff4a9865ae3ed76cee66 to your computer and use it in GitHub Desktop.
yum-nginx-api Basic Auth username & password
#!/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