mirror of
https://github.com/BioArchLinux/bioarchlinux-tools.git
synced 2025-03-09 22:53:31 +00:00
114 lines
3 KiB
Python
114 lines
3 KiB
Python
#!/usr/bin/python3
|
|
|
|
import json
|
|
import hmac
|
|
import logging
|
|
import os
|
|
import asyncio
|
|
|
|
from aiohttp import web
|
|
|
|
from agithub import GitHub
|
|
|
|
import lilac2.packages
|
|
|
|
#from . import issue
|
|
from . import config
|
|
from . import git
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
class IssueHandler:
|
|
def __init__(self, secret, token):
|
|
self.secret = secret.encode('ascii')
|
|
self.token = token
|
|
# need to create inside a loop
|
|
self.gh = None
|
|
|
|
def get_signature(self, body):
|
|
m = hmac.new(self.secret, digestmod='sha1')
|
|
m.update(body)
|
|
return 'sha1=' + m.hexdigest()
|
|
|
|
async def post(self, request):
|
|
if not self.gh:
|
|
self.gh = GitHub(self.token)
|
|
|
|
sig = request.headers.get('X-Hub-Signature')
|
|
body = await request.content.read()
|
|
our_sig = self.get_signature(body)
|
|
if not hmac.compare_digest(sig, our_sig):
|
|
logger.error('signature mismatch: %r != %r', sig, our_sig)
|
|
return web.Response(status=500)
|
|
|
|
res = await self.process(request, body)
|
|
if res is None:
|
|
res = web.Response(status=204)
|
|
return res
|
|
|
|
async def process(self, request, body):
|
|
event_type = request.headers.get('X-GitHub-Event')
|
|
|
|
if event_type == 'ping':
|
|
return web.Response(status=204, text='PONG!')
|
|
|
|
data = json.loads(body)
|
|
|
|
repo = data['repository']['full_name']
|
|
if repo != config.REPO_NAME:
|
|
return
|
|
|
|
if event_type == 'push':
|
|
asyncio.ensure_future(on_push())
|
|
return
|
|
|
|
# if event_type != 'issues':
|
|
# return
|
|
|
|
if data['action'] not in ['opened', 'edited']:
|
|
return
|
|
|
|
# asyncio.ensure_future(issue.process_issue(
|
|
# self.gh, data['issue'], data['action'] == 'edited'))
|
|
|
|
async def on_push() -> None:
|
|
await git.pull_repo(config.REPODIR, config.REPO_NAME)
|
|
loop = asyncio.get_running_loop()
|
|
await loop.run_in_executor(None, update_pkgname_map_sync)
|
|
|
|
def update_pkgname_map_sync():
|
|
s = lilac2.packages.get_all_pkgnames(config.REPODIR)
|
|
m = {pkgname: pkgbase for pkgbase, pkgname in s}
|
|
with open(config.REPODIR / 'pkgname_map.json', 'w') as f:
|
|
json.dump(m, f)
|
|
|
|
#def setup_app(app, secret, token):
|
|
# handler = IssueHandler(secret, token)
|
|
# app.router.add_post('/lilac/issue', handler.post)
|
|
|
|
def main():
|
|
import argparse
|
|
|
|
from nicelogger import enable_pretty_logging
|
|
|
|
parser = argparse.ArgumentParser(
|
|
description = 'HTTP services for build.archlinuxcn.org',
|
|
)
|
|
parser.add_argument('--port', default=9007, type=int,
|
|
help='port to listen on')
|
|
parser.add_argument('--ip', default='127.0.0.1',
|
|
help='address to listen on')
|
|
parser.add_argument('--loglevel', default='info',
|
|
choices=['debug', 'info', 'warn', 'error'],
|
|
help='log level')
|
|
args = parser.parse_args()
|
|
|
|
enable_pretty_logging(args.loglevel.upper())
|
|
|
|
app = web.Application()
|
|
# setup_app(app, os.environ['SECRET'], os.environ['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'])
|
|
|
|
web.run_app(app, host=args.ip, port=args.port)
|
|
|
|
if __name__ == '__main__':
|
|
main()
|