commit
05baa5587a
@ -0,0 +1,159 @@ |
||||
|
||||
# Created by https://www.toptal.com/developers/gitignore/api/python |
||||
# Edit at https://www.toptal.com/developers/gitignore?templates=python |
||||
|
||||
### Python ### |
||||
# Byte-compiled / optimized / DLL files |
||||
__pycache__/ |
||||
*.py[cod] |
||||
*$py.class |
||||
|
||||
# C extensions |
||||
*.so |
||||
|
||||
# Distribution / packaging |
||||
.Python |
||||
build/ |
||||
develop-eggs/ |
||||
dist/ |
||||
downloads/ |
||||
eggs/ |
||||
.eggs/ |
||||
lib/ |
||||
lib64/ |
||||
parts/ |
||||
sdist/ |
||||
var/ |
||||
wheels/ |
||||
share/python-wheels/ |
||||
*.egg-info/ |
||||
.installed.cfg |
||||
*.egg |
||||
MANIFEST |
||||
|
||||
# PyInstaller |
||||
# Usually these files are written by a python script from a template |
||||
# before PyInstaller builds the exe, so as to inject date/other infos into it. |
||||
*.manifest |
||||
*.spec |
||||
|
||||
# Installer logs |
||||
pip-log.txt |
||||
pip-delete-this-directory.txt |
||||
|
||||
# Unit test / coverage reports |
||||
htmlcov/ |
||||
.tox/ |
||||
.nox/ |
||||
.coverage |
||||
.coverage.* |
||||
.cache |
||||
nosetests.xml |
||||
coverage.xml |
||||
*.cover |
||||
*.py,cover |
||||
.hypothesis/ |
||||
.pytest_cache/ |
||||
cover/ |
||||
|
||||
# Translations |
||||
*.mo |
||||
*.pot |
||||
|
||||
# Django stuff: |
||||
*.log |
||||
local_settings.py |
||||
db.sqlite3 |
||||
db.sqlite3-journal |
||||
|
||||
# Flask stuff: |
||||
instance/ |
||||
.webassets-cache |
||||
|
||||
# Scrapy stuff: |
||||
.scrapy |
||||
|
||||
# Sphinx documentation |
||||
docs/_build/ |
||||
|
||||
# PyBuilder |
||||
.pybuilder/ |
||||
target/ |
||||
|
||||
# Jupyter Notebook |
||||
.ipynb_checkpoints |
||||
|
||||
# IPython |
||||
profile_default/ |
||||
ipython_config.py |
||||
|
||||
# pyenv |
||||
# For a library or package, you might want to ignore these files since the code is |
||||
# intended to run in multiple environments; otherwise, check them in: |
||||
# .python-version |
||||
|
||||
# pipenv |
||||
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. |
||||
# However, in case of collaboration, if having platform-specific dependencies or dependencies |
||||
# having no cross-platform support, pipenv may install dependencies that don't work, or not |
||||
# install all needed dependencies. |
||||
#Pipfile.lock |
||||
|
||||
# poetry |
||||
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. |
||||
# This is especially recommended for binary packages to ensure reproducibility, and is more |
||||
# commonly ignored for libraries. |
||||
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control |
||||
#poetry.lock |
||||
|
||||
# PEP 582; used by e.g. github.com/David-OConnor/pyflow |
||||
__pypackages__/ |
||||
|
||||
# Celery stuff |
||||
celerybeat-schedule |
||||
celerybeat.pid |
||||
|
||||
# SageMath parsed files |
||||
*.sage.py |
||||
|
||||
# Environments |
||||
.env |
||||
.venv |
||||
env/ |
||||
venv/ |
||||
ENV/ |
||||
env.bak/ |
||||
venv.bak/ |
||||
|
||||
# Spyder project settings |
||||
.spyderproject |
||||
.spyproject |
||||
|
||||
# Rope project settings |
||||
.ropeproject |
||||
|
||||
# mkdocs documentation |
||||
/site |
||||
|
||||
# mypy |
||||
.mypy_cache/ |
||||
.dmypy.json |
||||
dmypy.json |
||||
|
||||
# Pyre type checker |
||||
.pyre/ |
||||
|
||||
# pytype static type analyzer |
||||
.pytype/ |
||||
|
||||
# Cython debug symbols |
||||
cython_debug/ |
||||
|
||||
# PyCharm |
||||
# JetBrains specific template is maintainted in a separate JetBrains.gitignore that can |
||||
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore |
||||
# and can be added to the global gitignore or merged into this file. For a more nuclear |
||||
# option (not recommended) you can uncomment the following to ignore the entire idea folder. |
||||
#.idea/ |
||||
|
||||
# End of https://www.toptal.com/developers/gitignore/api/python |
@ -0,0 +1,62 @@ |
||||
#!/usr/bin/env python3 |
||||
"""Selfprivacy nix channel server.""" |
||||
import os |
||||
import requests |
||||
|
||||
from flask import Flask, request, jsonify, redirect |
||||
from flask_restful import Api, Resource, reqparse |
||||
|
||||
# Read the current nixos channel URL from file channel_url.txt |
||||
current_channel = open("channel_url.txt", "r").read() |
||||
|
||||
class Channel(Resource): |
||||
def get(self): |
||||
"""GET request returns the 301 redirect to the |
||||
current validated NixOS channel |
||||
""" |
||||
return redirect(current_channel, code=301) |
||||
|
||||
def post(self): |
||||
"""POST a new channel, save it to file and update |
||||
current variable""" |
||||
parser = reqparse.RequestParser() |
||||
parser.add_argument('channel', type=str, required=True, |
||||
help="Channel URL is required") |
||||
args = parser.parse_args() |
||||
channel = args['channel'] |
||||
# Save the new channel to file |
||||
with open("channel_url.txt", "w") as f: |
||||
f.write(channel) |
||||
# Update the current channel |
||||
current_channel = channel |
||||
return jsonify({"message": "Channel updated"}) |
||||
|
||||
class GetNewChannel(Resource): |
||||
def post(self): |
||||
r = requests.get("https://nixos.org/channels/nixos-21.05") |
||||
channel = r.url |
||||
# Save the new channel to file |
||||
with open("channel_url.txt", "w") as f: |
||||
f.write(channel) |
||||
# Update the current channel |
||||
current_channel = channel |
||||
return jsonify({"message": "Channel updated", "channel": channel}) |
||||
|
||||
def create_app(): |
||||
app = Flask(__name__) |
||||
api = Api(app) |
||||
|
||||
app.config['AUTH_KEY'] = os.environ.get('AUTH_KEY') or 'secret!' |
||||
@app.before_request |
||||
def before_request(): |
||||
# If request is not GET, check if the auth key is correct |
||||
if request.method != 'GET': |
||||
if request.headers.get('Authorization') != app.config['AUTH_KEY']: |
||||
return jsonify({"message": "Invalid auth key"}), 401 |
||||
|
||||
api.add_resource(Channel, '/nixos-selfpricacy') |
||||
return app |
||||
|
||||
if __name__ == '__main__': |
||||
app = create_app() |
||||
app.run(debug=False) |
@ -0,0 +1 @@ |
||||
https://releases.nixos.org/nixos/21.05/nixos-21.05.4719.0fd9ee1aa36 |
@ -0,0 +1,24 @@ |
||||
{ pkgs ? import <nixpkgs> {} }: |
||||
let |
||||
sp-python = pkgs.python39.withPackages (p: with p; [ |
||||
flask |
||||
flask-restful |
||||
setuptools |
||||
portalocker |
||||
pytest |
||||
pytest-mock |
||||
pytest-datadir |
||||
coverage |
||||
requests |
||||
]); |
||||
in |
||||
pkgs.mkShell { |
||||
buildInputs = [ |
||||
sp-python |
||||
pkgs.black |
||||
]; |
||||
shellHook = '' |
||||
PYTHONPATH=${sp-python}/${sp-python.sitePackages} |
||||
# maybe set more env-vars |
||||
''; |
||||
} |
Loading…
Reference in new issue