initial implementation
This commit is contained in:
parent
2ec14ca175
commit
bf372323f6
3 changed files with 199 additions and 0 deletions
153
c3t_rpc_client.py
Normal file
153
c3t_rpc_client.py
Normal file
|
@ -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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
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)
|
39
script-Z-preroll-generator.py
Executable file
39
script-Z-preroll-generator.py
Executable file
|
@ -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);
|
||||
|
7
script-Z-tracker-changes.sql
Normal file
7
script-Z-tracker-changes.sql
Normal file
|
@ -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';
|
Loading…
Add table
Reference in a new issue