From bf372323f611e9c6861a2502eb6cd2ccf6ec7c1c Mon Sep 17 00:00:00 2001 From: MaZderMind Date: Sat, 19 Jul 2014 15:20:04 +0200 Subject: [PATCH] initial implementation --- c3t_rpc_client.py | 153 ++++++++++++++++++++++++++++++++++ script-Z-preroll-generator.py | 39 +++++++++ script-Z-tracker-changes.sql | 7 ++ 3 files changed, 199 insertions(+) create mode 100644 c3t_rpc_client.py create mode 100755 script-Z-preroll-generator.py create mode 100644 script-Z-tracker-changes.sql diff --git a/c3t_rpc_client.py b/c3t_rpc_client.py new file mode 100644 index 0000000..9cf99b5 --- /dev/null +++ b/c3t_rpc_client.py @@ -0,0 +1,153 @@ +#!/usr/bin/python3 +# Copyright (C) 2014 derpeter +# derpeter@berlin.ccc.de +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +import xmlrpc.client +import hashlib +import hmac +import socket +import urllib +import xml +import sys + + +## client constructor ##### +# group: worker group +# secret: client secret +# host: client hostname (will be taken from local host if set to None) +# url: tracker url (without the rpc) +# method: method to access +############################ +def C3TClient(url, method, group, host, secret, args): + url = url + "rpc" +# if host == None: +# host = socket.getfqdn() + + ##################### + # generate signature + ##################### + # assemble static part of signature arguments + # 1. URL 2. method name 3. worker group token 4. hostname + sig_args = url + "&" + method + "&" + group + "&" + host + "&" + + #### add method args + if len(args) > 0: + i = 0 + while i < len(args): + sig_args = str(sig_args) + str(args[i]) + if i < (len(args) -1): + sig_args = sig_args + "&" + i = i + 1 + + ##### quote URL and generate the hash + #hash signature + sig_args_enc = urllib.parse.quote_plus(sig_args) + + #### generate the hmac hash with key + hash = hmac.new(bytes(secret, 'utf-8'), bytes(sig_args_enc, 'utf-8'), hashlib.sha256) + + #### add signature as last parameter to the arg list + args.append(hash.hexdigest()) + + #### create xmlrpc client + print('creating XML RPC proxy: ' + url + "?group=" + group + "&hostname=" + host) + try: + proxy = xmlrpc.client.ServerProxy(url + "?group=" + group + "&hostname=" + host); + except xmlrpc.client.Fault as err: + print("A fault occurred") + print("Fault code: %d" % err.faultCode) + print("Fault string: %s" % err.faultString) + sys.exit() + except xmlrpc.client.ProtocolError as err: + print("A protocol error occurred") + print("URL: %s" % err.url) + print("HTTP/HTTPS headers: %s" % err.headers) + print("Error code: %d" % err.errcode) + print("Error message: %s" % err.errmsg) + sys.exit() + except socket.gaierror as err: + print("A socket error occurred") + print(err) + sys.exit() + except xmlrpc.client.ProtocolError as err: + print("A Protocol occurred") + print(err) + sys.exit() + + #### call the given method with args + try: + print(method + str(args)) + result = getattr(proxy,method)(*args) + except xml.parsers.expat.ExpatError as err: + print("A expat err occured") + print(err) + sys.exit() + except xmlrpc.client.Fault as err: + print("A fault occurred") + print("Fault code: %d" % err.faultCode) + print("Fault string: %s" % err.faultString) + sys.exit() + except xmlrpc.client.ProtocolError as err: + print("A protocol error occurred") + print("URL: %s" % err.url) + print("HTTP/HTTPS headers: %s" % err.headers) + print("Error code: %d" % err.errcode) + print("Error message: %s" % err.errmsg) + sys.exit() + #### return the result + return result + +def open_rpc(method, args, url, group, host, secret): + result = C3TClient(url, method, group, host, secret, args) + return result + +### get Tracker Version +def getVersion(): + tmp_args = ["1"]; + return str(open_rpc("C3TT.getVersion",tmp_args)) + +### check for new ticket on tracker an get assignement +def assignNextUnassignedForState(from_state, to_state, url, group, host, secret): + tmp_args = [from_state, to_state] + xml = open_rpc("C3TT.assignNextUnassignedForState",tmp_args,url, group, host, secret) + # if get no xml there seems to be no ticket for this job + if xml == False: + return False + else: + print(xml) + return xml['id'] + +### get ticket properties +def getTicketProperties(id ,url, group, host, secret): + tmp_args = [id] + xml = open_rpc("C3TT.getTicketProperties",tmp_args, url, group, host, secret) + if xml == False: + print("no xml in answer") + return None + else: + print(xml) + return xml + +### set Ticket status on done +def setTicketDone(id, url, group, host, secret): + tmp_args = [id] + xml = open_rpc("C3TT.setTicketDone", tmp_args , url, group, host, secret) + print(xml) + +### set ticket status on failed an supply a error text +def setTicketFailed(id,error , url, group, host, secret): + tmp_args = [id, error] + xml = open_rpc("C3TT.setTicketFailed", tmp_args , url, group, host, secret) diff --git a/script-Z-preroll-generator.py b/script-Z-preroll-generator.py new file mode 100755 index 0000000..3f66d4d --- /dev/null +++ b/script-Z-preroll-generator.py @@ -0,0 +1,39 @@ +#!/usr/bin/python3 +import xmlrpc.client +import socket +import time +import sys +import os +import c3t_rpc_client as rpc + +print("C3TT preroll generator") + +if os.environ.get('CRS_TOKEN') is None or os.environ.get('CRS_SECRET') is None: + print('CRS_TOKEN or CRS_SECRET is empty. did you source the tracker-scripts-profile?') + sys.exit(1) + +ticket_type = 'recording' +ticket_state = 'generating' + +host = socket.getfqdn() +url = os.environ['CRS_TRACKER'] +token = os.environ['CRS_TOKEN'] +secret = os.environ['CRS_SECRET'] + +def generatePreroll(ticket): + print('generating preroll for', ticket) + +while True: + print('Asking RPC for {0}-tickets which are ready for state {1}'.format(ticket_type, ticket_state)) + + ticket_id = rpc.assignNextUnassignedForState(ticket_type, ticket_state, url, token, host, secret) + if ticket_id != False: + ticket = rpc.getTicketProperties(str(ticket_id), url, token, host, secret) + generatePreroll(ticket) + + else: + print('No ticket found') + + print('Sleeping for 30 seconds') + time.sleep(30); + diff --git a/script-Z-tracker-changes.sql b/script-Z-tracker-changes.sql new file mode 100644 index 0000000..0d76c3a --- /dev/null +++ b/script-Z-tracker-changes.sql @@ -0,0 +1,7 @@ +ALTER type enum_ticket_state ADD VALUE 'generating' after 'recorded'; +ALTER type enum_ticket_state ADD VALUE 'generated' after 'generating'; + +INSERT into tbl_ticket_state VALUES ('recording', 'generating', 0, 10, true), ('recording', 'generated', 0, 5, false); +UPDATE tbl_ticket_state SET sort = sort + 2 WHERE ticket_type = 'recording' AND sort > 4; +UPDATE tbl_ticket_state SET sort = 5 WHERE ticket_type = 'recording' AND ticket_state = 'generating'; +UPDATE tbl_ticket_state SET sort = 6 WHERE ticket_type = 'recording' AND ticket_state = 'generated';