diff options
Diffstat (limited to 'events/src/utils.py')
| -rw-r--r-- | events/src/utils.py | 51 |
1 files changed, 36 insertions, 15 deletions
diff --git a/events/src/utils.py b/events/src/utils.py index 851543e8f3b..6d4e0791a2b 100644 --- a/events/src/utils.py +++ b/events/src/utils.py @@ -9,23 +9,34 @@ # cases as published by the Free Software Foundation. # +import sys import json import os import logging +import logging.handlers import fcntl from errno import EBADF from threading import Thread import multiprocessing -from Queue import Queue +try: + from queue import Queue +except ImportError: + from Queue import Queue from datetime import datetime, timedelta +import base64 +import hmac +from hashlib import sha256 +from calendar import timegm -from eventsapiconf import (LOG_FILE, - WEBHOOKS_FILE, - DEFAULT_CONFIG_FILE, - CUSTOM_CONFIG_FILE, - UUID_FILE, - CERTS_DIR) -import eventtypes +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from gfevents.eventsapiconf import (LOG_FILE, + WEBHOOKS_FILE, + DEFAULT_CONFIG_FILE, + CUSTOM_CONFIG_FILE, + UUID_FILE, + CERTS_DIR) +from gfevents import eventtypes # Webhooks list @@ -88,7 +99,7 @@ def setup_logger(): logger.setLevel(logging.INFO) # create the logging file handler - fh = logging.FileHandler(LOG_FILE) + fh = logging.handlers.WatchedFileHandler(LOG_FILE) formatter = logging.Formatter("[%(asctime)s] %(levelname)s " "[%(module)s - %(lineno)s:%(funcName)s] " @@ -185,15 +196,25 @@ def autoload_webhooks(): load_webhooks() +def base64_urlencode(inp): + return base64.urlsafe_b64encode(inp).replace("=", "").strip() + + def get_jwt_token(secret, event_type, event_ts, jwt_expiry_time_seconds=60): - import jwt + exp = datetime.utcnow() + timedelta(seconds=jwt_expiry_time_seconds) payload = { - "exp": datetime.utcnow() + timedelta(seconds=jwt_expiry_time_seconds), + "exp": timegm(exp.utctimetuple()), "iss": "gluster", "sub": event_type, "iat": event_ts } - return jwt.encode(payload, secret, algorithm='HS256') + header = '{"alg":"HS256","typ":"JWT"}' + payload = json.dumps(payload, separators=(',', ':'), sort_keys=True) + msg = base64_urlencode(header) + "." + base64_urlencode(payload) + return "%s.%s" % ( + msg, + base64_urlencode(hmac.HMAC(str(secret), msg, sha256).digest()) + ) def save_https_cert(domain, port, cert_path): @@ -370,7 +391,7 @@ class PidFile(object): def webhook_monitor(proc_queue, webhooks): queues = {} for url, data in webhooks.items(): - if isinstance(data, str) or isinstance(data, unicode): + if isinstance(data, str): token = data secret = None else: @@ -391,8 +412,8 @@ def webhook_monitor(proc_queue, webhooks): class WebhookThreadPool(object): def start(self): - # Seperate process to emit messages to webhooks - # which maintains one thread per webhook. Seperate + # Separate process to emit messages to webhooks + # which maintains one thread per webhook. Separate # process is required since on reload we need to stop # and start the thread pool. In Python Threads can't be stopped # so terminate the process and start again. Note: In transit |
