paws/paws/routes.py
2020-01-17 07:32:40 -05:00

114 lines
2.7 KiB
Python

import os
import sys
import asyncio
import aiohttp
import aiohttp_jinja2
import jinja2
from ipaddress import ip_address as address
from urllib.parse import urlparse
from .config import PAWSCONFIG, MASTOCONFIG, VERSION, script_path, logging
from .functions import color
from . import middleware
def webserver():
from . import views
web = aiohttp.web.Application(middlewares=[
middleware.http_filter,
middleware.http_signatures,
middleware.http_redirect
])
web.on_response_prepare.append(middleware.http_server_header)
web.add_routes([
aiohttp.web.route('GET', '/paws', views.get_paws),
aiohttp.web.route('POST', '/paws', views.post_paws),
aiohttp.web.route('GET', '/paws/login', views.get_login),
aiohttp.web.route('POST', '/paws/login', views.post_login),
aiohttp.web.route('GET', '/paws/logout', views.get_logout),
aiohttp.web.route('GET', '/paws/auth', views.get_auth),
aiohttp.web.route('GET', '/paws/style.css', views.get_style),
aiohttp.web.route('POST', '/paws/inbox', views.post_inbox),
aiohttp.web.route('GET', '/paws/actor', views.get_actor)
])
async def global_vars(request):
return {
'VERSION': VERSION,
'len': len,
'request': request,
'domain': MASTOCONFIG['domain'],
'urlparse': urlparse,
'lighten': color().lighten,
'darken': color().darken,
'saturate': color().saturate,
'desaturate': color().desaturate,
'rgba': color().rgba
}
aiohttp_jinja2.setup(
web,
loader=jinja2.FileSystemLoader(f'{script_path}/templates'),
autoescape=jinja2.select_autoescape(['html', 'css']),
context_processors=[global_vars],
lstrip_blocks=True,
trim_blocks=True
)
return web
async def start_webserver():
app = webserver()
runner = aiohttp.web.AppRunner(app, access_log_format='%{X-Real-Ip}i "%r" %s %b "%{User-Agent}i"')
await runner.setup()
listen = PAWSCONFIG['host']
port = PAWSCONFIG['port']
if listen.startswith('unix:'):
if sys.platform != 'win32':
sock_listen = listen.replace('unix:', '')
logging.info(f'Starting webserver at socket: {sock_listen}')
site = aiohttp.web.UnixSite(runner, sock_listen)
else:
logging.error('Windows cannot use unix sockets. Use an IP address instead. Exiting...')
sys.exit()
else:
try:
address(listen)
except ValueError:
logging.warning('Invalid IP address. Listening on "0.0.0.0" instead.')
listen = '127.0.0.1'
try:
int(port)
except ValueError:
logging.warning('Invalid port. Using 3621 instead.')
port = 3621
logging.info(f'Starting webserver at address: {listen}:{port}')
site = aiohttp.web.TCPSite(runner, listen, port)
await site.start()
def main():
try:
loop = asyncio.get_event_loop()
asyncio.ensure_future(start_webserver())
loop.run_forever()
except KeyboardInterrupt:
logging.info('Bye!')