# Copyright 2017 Lars Wirzenius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import errno import json import os import random import socket import sys import time import cliapp import requests from yarnutils import * srcdir = os.environ['SRCDIR'] datadir = os.environ['DATADIR'] vars = Variables(datadir) def random_free_port(): MAX = 1000 for i in range(MAX): port = random.randint(1025, 2**15-1) s = socket.socket() try: s.bind(('0.0.0.0', port)) except OSError as e: if e.errno == errno.EADDRINUSE: continue print('cannot find a random free port') raise s.close() break print('picked port', port) return port def wait_for_port(port): MAX = 5 t = time.time() while time.time() < t + MAX: try: s = socket.socket() s.connect(('127.0.0.1', port)) except OSError as e: raise else: return def unescape(s): t = '' while s: if s.startswith('\\n'): t += '\n' s = s[2:] else: t += s[0] s = s[1:] return t def write(filename, data): with open(filename, 'w') as f: f.write(data) def cat(filename): MAX_CAT_WAIT = 5 # in seconds t = time.time() while time.time() < t + MAX_CAT_WAIT: if os.path.exists(filename): return open(filename, 'r').read() def store_token(user, token): filename = '{}.jwt'.format(user) write(filename, token) def get_token(user): filename = '{}.jwt'.format(user) return cat(filename) def http(vars, func, url, **kwargs): status, content_type, headers, body = func(url, **kwargs) vars['status_code'] = status vars['content_type'] = content_type vars['headers'] = headers vars['body'] = body def get(url, token): headers = { 'Authorization': 'Bearer {}'.format(token), } r = requests.get(url, headers=headers, verify=False) return r.status_code, r.headers['Content-Type'], dict(r.headers), r.text def get_blob(url, token): headers = { 'Authorization': 'Bearer {}'.format(token), } r = requests.get(url, headers=headers, verify=False) return r.status_code, r.headers['Content-Type'], dict(r.headers), r.content def post(url, body, token): headers = { 'Authorization': 'Bearer {}'.format(token), 'Content-Type': 'application/json', } r = requests.post(url, headers=headers, data=body, verify=False) return r.status_code, r.headers['Content-Type'], dict(r.headers), r.text def put(url, body, token): headers = { 'Authorization': 'Bearer {}'.format(token), 'Content-Type': 'application/json', } r = requests.put(url, headers=headers, data=body, verify=False) return r.status_code, r.headers['Content-Type'], dict(r.headers), r.text def put_blob(url, body, token): headers = { 'Authorization': 'Bearer {}'.format(token), 'Content-Type': 'application/octet-stream', } r = requests.put(url, headers=headers, data=body, verify=False) return r.status_code, r.headers['Content-Type'], dict(r.headers), r.text def delete(url, token): headers = { 'Authorization': 'Bearer {}'.format(token), } r = requests.delete(url, headers=headers, verify=False) return r.status_code, r.headers['Content-Type'], dict(r.headers), r.text