Merge pull request #3 in TM/task from ~UNODE/task:2.4.0 to 2.4.0

* commit '08c11da702':
  Testing
  Testing
  Testing certificates
  Unittesting basemodule
This commit is contained in:
Paul Beckingham 2014-05-18 01:35:10 +00:00
commit 14bfbb80b3
10 changed files with 438 additions and 2 deletions

View file

@ -110,7 +110,7 @@ class BaseTestCase(unittest.TestCase):
command = ["./task"]
command.extend(args)
p = Popen(command, stdin=stdin, stdout=PIPE, stderr=STDOUT)
p = Popen(command, stdin=stdin, stdout=PIPE, stderr=stderr)
out, err = p.communicate(input)
# In python3 we will be able use the following instead of the previous
# line to avoid locking if task is unexpectedly waiting for input
@ -120,7 +120,6 @@ class BaseTestCase(unittest.TestCase):
# p.kill()
# out, err = proc.communicate()
return p.returncode, out, err
@classmethod

186
test/basetest/taskd.py Normal file
View file

@ -0,0 +1,186 @@
# -*- coding: utf-8 -*-
import os
import tempfile
import shutil
import signal
from time import sleep
from subprocess import Popen
from .utils import find_unused_port, release_port, port_used, run_cmd_wait
try:
from subprocess import DEVNULL
except ImportError:
DEVNULL = open(os.devnull, 'w')
# Location relative to current script location
_curdir = os.path.dirname(os.path.abspath(__file__))
DEFAULT_CERT_PATH = os.path.abspath(os.path.join(_curdir, "..", "test_certs"))
class TaskdServer(object):
"""Manage a taskd instance
A temporary folder is used as data store of taskd.
This class can be instanciated multiple times if multiple taskd servers are
needed.
This class implements mechanisms to automatically select an available port
and prevent assigning the same port to different instances.
A server can be stopped and started multiple times, but should not be
started or stopped after being destroyed.
"""
def __init__(self, taskd="taskd", certpath=None, address="127.0.0.1"):
"""Initialize a Task server that runs in the background and stores data
in a temporary folder
:arg taskd: Taskd binary to launch the server (defaults: taskd in PATH)
:arg certpath: Folder where to find all certificates needed for taskd
:arg address: Address to bind to
"""
self.taskd = taskd
# Will hold the taskd subprocess if it's running
self.proc = None
self.datadir = tempfile.mkdtemp()
self.tasklog = os.path.join(self.datadir, "taskd.log")
self.taskpid = os.path.join(self.datadir, "taskd.pid")
# Make sure no TASKDDATA is defined
try:
del os.environ["TASKDDATA"]
except KeyError:
pass
if certpath is None:
certpath = DEFAULT_CERT_PATH
self.certpath = certpath
self.address = address
self.port = find_unused_port()
# Keep all certificate paths public for access by TaskClients
self.client_cert = os.path.join(self.certpath, "client.cert.pem")
self.client_key = os.path.join(self.certpath, "client.key.pem")
self.server_cert = os.path.join(self.certpath, "server.cert.pem")
self.server_key = os.path.join(self.certpath, "server.key.pem")
self.server_crl = os.path.join(self.certpath, "server.crl.pem")
self.ca_cert = os.path.join(self.certpath, "ca.cert.pem")
# Initialize taskd
cmd = (self.taskd, "init", "--data", self.datadir)
run_cmd_wait(cmd)
self.config("server", "{0}:{1}".format(self.address, self.port))
self.config("log", self.tasklog)
self.config("pid.file", self.taskpid)
self.config("root", self.datadir)
self.config("client.allow", "^task [2-9]")
# Setup all necessary certificates
self.config("client.cert", self.client_cert)
self.config("client.key", self.client_key)
self.config("server.cert", self.server_cert)
self.config("server.key", self.server_key)
self.config("server.crl", self.server_crl)
self.config("ca.cert", self.ca_cert)
def config(self, var, value):
"""Run setup `var` as `value` in taskd config
"""
cmd = (self.taskd, "config", "--force", "--data", self.datadir, var,
value)
run_cmd_wait(cmd)
# If server is running send a SIGHUP to force config reload
if self.proc is not None:
try:
self.proc.send_signal(signal.SIGHUP)
except:
pass
def status(self):
"""Check the status of the server by checking if it's still running and
listening for connections
:returns: True if running and listening, False otherwise (including
crashed and not started)
"""
if self.proc is None:
return False
if self.proc.poll() is not None:
return False
if not port_used(port=self.port):
return False
return True
def start(self):
"""Start the taskd server if it's not running.
If it's already running OSError will be raised
"""
if self.proc is None:
cmd = (self.taskd, "server", "--data", self.datadir)
self.proc = Popen(cmd, stdout=DEVNULL, stdin=DEVNULL)
else:
raise OSError("Taskd server is still running or crashed")
# Wait for server to listen by checking connectivity in the port
# Wait up to 5 minutes checking once second
minutes = 5
for i in range(minutes * 60):
if not self.status():
sleep(1)
else:
return
raise OSError("Task server failed to start and listen on port {0}"
" after {1} minutes".format(self.port, minutes))
def stop(self):
"""Stop the server by sending a SIGTERM and SIGKILL if fails to
terminate.
If it's already stopped OSError will be raised
"""
if self.proc is None:
raise OSError("Taskd server is not running")
self.proc.send_signal(signal.SIGTERM)
# Wait ~1 sec for taskd to finish and send a SIGKILL if still running
kill = True
for i in range(10):
sleep(0.1)
if self.proc.poll() is not None:
kill = False
break
if kill:
self.proc.kill()
# Wait for process to end to avoid zombies
self.proc.wait()
# Unset the process to inform that no process is running
self.proc = None
def destroy(self):
"""Cleanup the data folder and release server port for other instances
"""
# Ensure server is stopped first
if self.proc is not None:
self.stop()
try:
shutil.rmtree(self.datadir)
except OSError as e:
if e.errno == 2:
# Directory no longer exists
pass
else:
raise
release_port(self.port)
# vim: ai sts=4 et sw=4

68
test/basetest/utils.py Normal file
View file

@ -0,0 +1,68 @@
# -*- coding: utf-8 -*-
import socket
from subprocess import Popen, PIPE
USED_PORTS = set()
def run_cmd_wait(cmd):
"Run a subprocess and wait for it to finish"
p = Popen(cmd, stdout=PIPE, stderr=PIPE)
out, err = p.communicate()
if p.returncode != 0:
raise IOError("Failed to run '{0}', exit code was '{1}', stdout"
" '{2}' and stderr '{3}'".format(cmd, p.returncode,
out, err))
def port_used(addr="localhost", port=None):
"Return True if port is in use, False otherwise"
if port is None:
raise TypeError("Argument 'port' may not be None")
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = s.connect_ex((addr, port))
s.close()
# result == 0 if connection was successful
return result == 0
def find_unused_port(addr="localhost", start=53589, track=True):
"""Find an unused port starting at `port`
If track=False the returned port will not be marked as in-use and the code
will rely entirely on the ability to connect to addr:port as detection
mechanism. Note this may cause problems if ports are assigned but not used
immediately
"""
maxport = 65535
unused = None
for port in xrange(start, maxport):
if not port_used(addr, port):
if track and port in USED_PORTS:
continue
unused = port
break
if unused is None:
raise ValueError("No available port in the range {0}-{1}".format(
start, maxport))
if track:
USED_PORTS.add(unused)
return unused
def release_port(port):
"""Forget that given port was marked as'in-use
"""
try:
USED_PORTS.remove(port)
except KeyError:
pass
# vim: ai sts=4 et sw=4

View file

@ -0,0 +1,24 @@
-----BEGIN CERTIFICATE-----
MIIEGzCCAtOgAwIBAgIEU3emwDANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJT
RTEeMBwGA1UECgwVR8O2dGVib3JnIEJpdCBGYWN0b3J5MRIwEAYDVQQHDAlHw7Z0
ZWJvcmcxGjAYBgNVBAgMEVbDpHN0cmEgR8O2dGFsYW5kMR4wHAYDVQQDDBVHw7Z0
ZWJvcmcgQml0IEZhY3RvcnkwHhcNMTQwNTE3MTgxMzIwWhcNMTUwNTE3MTgxMzIw
WjB9MQswCQYDVQQGEwJTRTEeMBwGA1UECgwVR8O2dGVib3JnIEJpdCBGYWN0b3J5
MRIwEAYDVQQHDAlHw7Z0ZWJvcmcxGjAYBgNVBAgMEVbDpHN0cmEgR8O2dGFsYW5k
MR4wHAYDVQQDDBVHw7Z0ZWJvcmcgQml0IEZhY3RvcnkwggFSMA0GCSqGSIb3DQEB
AQUAA4IBPwAwggE6AoIBMQDCQyFXOUPIymI7+4nY1T7yNfe1b+vzznJgtJpPOZxW
gPJSiT0yVPmKAYpitn9x1ADncO61FmqTowaZKauwifLhAp8cC/r5N6Y/yppxSEZ+
czybasCNB/bsmpBB0OeTDAAZ6BF8zLzzFC/54g3JVhsSGwtYKfQlqUlfp89BeCrg
qzO1YO+uJ0K2dXPuyuFjH+Vwr6QLcVKRDvgc/I/C7lx+JKXd/lmiNS5uOc9RhFyD
0xtqCnyhWpa8Ed26Y0B8CAhHWdJWEU33iWLpvlLcfYvFus4cPnEjuIu/Ql64cgIW
xeQQ4lPZYLXVOh/2LeYwbTIBBtvNZdQb8S6VSJG9zex/nzrBq/4M9qlA9kpRW6TA
1G/eInMBzUp2LPW8V4HhspPqFo5SP2sfbaE5Pp2neCWPAgMBAAGjQzBBMA8GA1Ud
EwEB/wQFMAMBAf8wDwYDVR0PAQH/BAUDAwcEADAdBgNVHQ4EFgQUDZvEvP9T4ftv
3cVT711JQT5wPWswDQYJKoZIhvcNAQELBQADggExAC+aizDsErZVIuuSFZ0pI1+c
fsUdC7vKum/B+ANCLOezUgGzfHkohaVd1aY9Qvt7/0q0aTCd7ssiZ7pGZArx2ZEw
3vvKvU0xgwE5YZucExXDrdYqMYtjSDQ4Q+OwS4Q0AiADXpUDtjkIFcuXr7wf/5RN
M+wzl5W3fuNofAoXY6cE8MwrlgXZcjzKzkq0H2hR0ifwJ00uf1tQ0kgUHrKlTfHC
xnTD2IXcfhUNJtAutxV8eKOjmrT7X/hT2Hur2Xgp/a1K+95QaNJIc7PtdbOvfh4o
Kb4wGVy8fQNYaZXxYQgvfr8trgraTn73Vr7jYkeQAgn3yOdk5qyS14Dhnrvht2VX
DaoDPz3glAzNY6/oL3ElGbL7CVKBXUk/OdURlgyoXzKm7EPgp4zAHg8KiNtKrYk=
-----END CERTIFICATE-----

View file

@ -0,0 +1,32 @@
-----BEGIN RSA PRIVATE KEY-----
MIIFewIBAAKCATEAwkMhVzlDyMpiO/uJ2NU+8jX3tW/r885yYLSaTzmcVoDyUok9
MlT5igGKYrZ/cdQA53DutRZqk6MGmSmrsIny4QKfHAv6+TemP8qacUhGfnM8m2rA
jQf27JqQQdDnkwwAGegRfMy88xQv+eINyVYbEhsLWCn0JalJX6fPQXgq4KsztWDv
ridCtnVz7srhYx/lcK+kC3FSkQ74HPyPwu5cfiSl3f5ZojUubjnPUYRcg9Mbagp8
oVqWvBHdumNAfAgIR1nSVhFN94li6b5S3H2LxbrOHD5xI7iLv0JeuHICFsXkEOJT
2WC11Tof9i3mMG0yAQbbzWXUG/EulUiRvc3sf586wav+DPapQPZKUVukwNRv3iJz
Ac1Kdiz1vFeB4bKT6haOUj9rH22hOT6dp3gljwIDAQABAoIBMDWWCvZih341xY9C
Pa4gdLKfjGryKqYgRpDCgOZlv+hkvXNjBAyEQCl/b0r3iIQ/tNgi4NX3DwMWr1VE
l2WlR+glrvovm9VvMl7aZmvlQfzTkN5WPjMpBUYTBMQC+j4ny0daKqjAWUa8RNer
MZ5eMC14ZFK3j+9rmR/XzGYE3d8HmsXnrXXewppOH+K4+B89xy6kZJ37bokwmmza
IWWd4tcC5QvkV7Cvna9qRNkrrREeUT9xNCjeFRXHv001D0Eva5pz1nEnHiDtz5ah
keMRn+hM/edj0SJjJImBF6cUhADdt7Kp+Avlf1g5gAgLoiYn6w/tKzEKuEGuqCe7
Sq2ACXXqzfxr+QUrNxIdVp6FNQr98kX3fBDO1ESQmQXbiSf798MQUNELxl5do8u+
MfsxltECgZkAzQAeDNyFH17mKwO4tVpoyzURjAoBUwR+ahauiq61VawBFyKvkccP
RaDmslKWb8oFrS5GecF/aF+B4SUBjD516MEYxnAfdgMVxVZt+wIkdZXWmButfFL5
B7kwU9CZ4HBzhpp8fdfO2BbRcXrXE117GkEDymLpGei9S2eHOJaPUJT3U5LRTg4l
qvnKNKJMbgB9sYBRat70Wv0CgZkA8pcgTJUjTlQ1nUfbf3KaMj2MPBfzyFFfl2Lm
wWdFW4RmPEF8R1RFlgRYF+2Jb3ewnu1TiEQmrmAB1kZQ6P/SeDfGK1OQVG75ClwQ
Gz4w9hr0gYQRiACZnhcfE1sNeEt3oD4Kb7TKnUK1F1Bgb/rJaV6mOA2MEQBSUSC9
A/r9jqmLif9RJDpXo+6uzF74EQ6uMw1EzSUwhnsCgZgGXMSR/Z4cFSPrndfzuPSb
qe/7eqwD2ZXa0Q1lvHpgSFBYWXk9ewIcVRwT2MBWg9ydPVxulvTPVnd/d1iO87lR
Gf0c24n+baYVU9NiAPUEuTvJyMIfo6ua88JuN4EvGA5d1RmcBkCjMEIb1YYrUbFq
ZS4q79rwNOr7FiF6PiIAjD8I1vusAoBkyA/ghlD88QL1qVfdi0HmOQKBmQDgqtPP
+SMcjOKmigEftGxX8SZqFSjCMZKdKoxZO6JBUoo4bdGCYeqcN+O6LVRmNmwNk/AT
uEI2plWtM6wFTb+HdOgEAj0d5TShwodsI5nGo0oklMKDuUKL5g/yphYAfawJbMvP
jplDMZ9zOw5FRva3rl+0c99vc2PJHM/Q2udu81h28k0chyfZe9jJD38glP8B6tz4
POQG9wKBmEja9a6og+oEBuSXL+kW07neMkhYl4/SegqoRItwBgUD1mWrWSp1wumG
BNyM5j0rwcVH2EATXF31AxAyRV9JvWYl9DnvZ2E5ZedBqGMrlPBlk8dVEoAowd5x
bV3wLTGXuZckvRRClLyb4a9PPWbXgrHY3pT7X34f5fyNuEDok53yxiJ6DQ9p7Rpk
chM11UKgKHb19nNDCl34
-----END RSA PRIVATE KEY-----

View file

@ -0,0 +1,24 @@
-----BEGIN CERTIFICATE-----
MIIEETCCAsmgAwIBAgIEU3emwTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJT
RTEeMBwGA1UECgwVR8O2dGVib3JnIEJpdCBGYWN0b3J5MRIwEAYDVQQHDAlHw7Z0
ZWJvcmcxGjAYBgNVBAgMEVbDpHN0cmEgR8O2dGFsYW5kMR4wHAYDVQQDDBVHw7Z0
ZWJvcmcgQml0IEZhY3RvcnkwHhcNMTQwNTE3MTgxMzIxWhcNMTUwNTE3MTgxMzIx
WjBAMR4wHAYDVQQKDBVHw7Z0ZWJvcmcgQml0IEZhY3RvcnkxHjAcBgNVBAMMFUfD
tnRlYm9yZyBCaXQgRmFjdG9yeTCCAVIwDQYJKoZIhvcNAQEBBQADggE/ADCCAToC
ggExAO6f5rY86ZHF7MxsvX03waVX7epxqPtaJHFjWByqnRl3k25nqakVUXYWWqhv
N1asRJQEPTteDqdhfWs6+Qut/5a6H/Jbco/MYqinLLEgoeot7N32bjchpQRWKTzg
fKcvfChC2Bce7QmJes4PTDMGQdSMSEbkpJFACzrsges56UW6t85/yipPJkkHBeG5
I+bXjpmXkQPwp+cKsA8HvMrn/jdfMSbhJIhApwPoQqgjKEbKxVu4gy430Q1nRN0j
/0k0BN8PLNDnEuAE0cd7+jvR/RZvfpFVkc7JCG2Mhm//DBMue12juAuPLcw/KwJ4
joNYPWoUzOv6HS8fVs90k5gUCEeKR8zkhTlKWLlz2jsWjhHqovYKi8720ZBAzuR1
Tp+dr9/+x+ujCq3lZ5jo/BHgyY8CAwEAAaN2MHQwDAYDVR0TAQH/BAIwADATBgNV
HSUEDDAKBggrBgEFBQcDAjAPBgNVHQ8BAf8EBQMDB6AAMB0GA1UdDgQWBBRysTeC
R7WPMegs0+3S+ofbHnCxIDAfBgNVHSMEGDAWgBQNm8S8/1Ph+2/dxVPvXUlBPnA9
azANBgkqhkiG9w0BAQsFAAOCATEAUxK/EELzmDJCawzDPIK0wRraozCLfnyUZHC+
D6doLzi1xNH70wQS2WowA/zE7HLpVPfA/VrhE/xTPtWcoQx57AvcYnPYH2wkBdoR
ExpA6tPlL/g25tn90wByafQ6TnaVWClLRPkfqOYg5yV/31xp7Q5A5/8tA0vomGRI
X/U3wAkpsmwo0EhawYGNuzflsBl91EvWgEYDE3Xv1fgfsgL/mNRmIj5kFLGUbafc
iB7bl5vyD04HUuPRb86e+wrnxzmaPXA116YGb1PZolT7avCP+twjjbPA6lMCxRxR
Tv3h/Cgp2zaTRzHuMt22JSc6CPKd+KAeCsnMDNXpchpj5d7W0fjelMW9gNTIlKxz
hgG3zhyC2CXtkZyE8IK0hFCgdBfQpjv6AMmH2SNlsN0rBy71RA==
-----END CERTIFICATE-----

View file

@ -0,0 +1,32 @@
-----BEGIN RSA PRIVATE KEY-----
MIIFfAIBAAKCATEA7p/mtjzpkcXszGy9fTfBpVft6nGo+1okcWNYHKqdGXeTbmep
qRVRdhZaqG83VqxElAQ9O14Op2F9azr5C63/lrof8ltyj8xiqKcssSCh6i3s3fZu
NyGlBFYpPOB8py98KELYFx7tCYl6zg9MMwZB1IxIRuSkkUALOuyB6znpRbq3zn/K
Kk8mSQcF4bkj5teOmZeRA/Cn5wqwDwe8yuf+N18xJuEkiECnA+hCqCMoRsrFW7iD
LjfRDWdE3SP/STQE3w8s0OcS4ATRx3v6O9H9Fm9+kVWRzskIbYyGb/8MEy57XaO4
C48tzD8rAniOg1g9ahTM6/odLx9Wz3STmBQIR4pHzOSFOUpYuXPaOxaOEeqi9gqL
zvbRkEDO5HVOn52v3/7H66MKreVnmOj8EeDJjwIDAQABAoIBMHT8y91Ya6JeCMQI
I7Y6GaP4QdoIszHXdbppXA9hzfdoWk1sYQ9WNkPQnc2qCNVjS5PNqD9s035YG2bw
2JxTR9UblwH4t2esakoI+64zM25d6ZzAbjR1ODOyEjGYVUSZ0SLj8pETRl7AmgZg
FZmGXcvYoq6u9ceIQHk47lDmaWkYK3j/yZuIhlqTKN0LKYDI+U5vslbeK1LnRiJn
nHnaco4lQyC5ccBGhisf1qCgLGGiecPgy4bFX6W+Sc4sXRg7SNt9itrW+ZNVqPnI
g8bJ6QNYOifu+gZ1XFVN5kd1IfaqfXHHCnoRe/5QRTI0ifYM+nJ71sN7NLmLe2Gx
aaNAP/ZPaU/Y+Za++2EpknGkcungSrY3ZXslHMlbzRkkIhmB96mpnSQKzrWjR48n
SFWIIBECgZkA+TbyCZGV2Mm2M9G6aMCVWfJLx8q5YvXhOaaAxHEAefpN58qP76Ww
Q3Arz7YhVIyjK88JgXnblHpRUNLw/xFy4W3yx55YWePcTZeRiYfx5MXFwPYmeyxK
wMjiq4Xf5dL465+udERADol560kBq2SK32GKoYTwgEZJTuHA/ZYEVlkalYsgTa67
lCwMmu06MfSCnYhruesmXYMCgZkA9R8kYqjUGFMpRjRmV+JPitIb8rXW61bRQ+KE
ahQanxfVFaWkwErU+A2VkKLcZmyhBThR2xFe1YBdXbEP3JaOFCxwx3YDG/b4Zg4Q
C1oinXfFmspRoMbY1S+rtOKWw75flkg6bFptFnw1Xbda0OjWd7Nvgtk/NhPCb+4W
8pQThAIIS0CvsoKspuqT7Z86iGABTcQSr/yPUgUCgZkA1c7gBHmU17Lm0LpkdS6U
c+C+RyCTwGU236EL5H0WbY/jerN8nZvHB3SbAc899S3bZ+BuRVjonA/855yyCgNM
Tj9oBP7CygwFm8QnppitXRqYOJ52EULEt3Uhkwp+NsyzpmMO5s0PL+meYc/20Lan
tlIW/8/wDf0/M5/XVTh5bCNx/U6pXjxEzjCkd96DCQy/aqv50D4AYkUCgZkAtYEp
4CRDaP+rQGDsp4bcf161czNSwVC4BBxnEGVykPuEvVK6e+jtagAlD8SIjw9A7CyX
8C8cmdtDR20k4aJZ8nY1zHyGMN7fcDJZjw5fM1rM56GIcBTN2o5CBt8B5E/DV/SD
zlfnDw9KNOrgRHEk3d3wZGOZeuGGyHr0YwtiqA0ZNx/e+b/pOG/aucl9/h2Y2Yym
icnqFkECgZhxYTS8xvZFm6WzjjDd4QyWYfGNPNEa0vCktYpz3GJ3hxKQQGj4N/lk
w7mrGGOiOM9lR9rUmc0g8qXO7fGpxE8Djt5Os4+orO9PLNfdr0sJSp3T4Vb99d71
NwYQWmo2j855EYPziLN0x+0OqsjLNjyvX7EJgsRJYA8nn52D1LeBxBNOJZWqrV9R
4vIwLFDO8/bpjIDJrqjMgg==
-----END RSA PRIVATE KEY-----

View file

@ -0,0 +1,25 @@
-----BEGIN CERTIFICATE-----
MIIEMzCCAuugAwIBAgIEU3emwDANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJT
RTEeMBwGA1UECgwVR8O2dGVib3JnIEJpdCBGYWN0b3J5MRIwEAYDVQQHDAlHw7Z0
ZWJvcmcxGjAYBgNVBAgMEVbDpHN0cmEgR8O2dGFsYW5kMR4wHAYDVQQDDBVHw7Z0
ZWJvcmcgQml0IEZhY3RvcnkwHhcNMTQwNTE3MTgxMzIwWhcNMTUwNTE3MTgxMzIw
WjBAMR4wHAYDVQQKDBVHw7Z0ZWJvcmcgQml0IEZhY3RvcnkxHjAcBgNVBAMMFUfD
tnRlYm9yZyBCaXQgRmFjdG9yeTCCAVIwDQYJKoZIhvcNAQEBBQADggE/ADCCAToC
ggExAM2soV1TPLKp8SjqTtxBHj+Uu9SJM56eyHaK6kwCN6DQyA8dea+cqNJLRWKw
dIyK0HqAdE9xf0Q9VkR5JuGCHB80802c3AkwnXdE3syFYEGISqTbFZr14V0m87fn
axnGHZ0dyKWoRQbJ2purbWpQ23jZIUZQUhTD4e84aqnUco9aUCyzJ3gkvDgFeBg9
EwHMlaavkddJa+In5qOcSrTNJq+XmNrMly0ifr/CA/LfWAk7LEvqk/JjaLS5DWs+
VnLaQSSD82CEorypFqo4mR1u/Q5G7+AWXatJEbnf4SbI0agcU/IZMLzPPhfNvNEL
jPelfrrXi3LqI+Y53w85PvdEd2S/SeS6QN1rK3KHQ8b/2QjekROfxCRBNn/SZCgN
PqcD/kwzDxSdRrqECaMcmxIVsJMCAwEAAaOBlzCBlDAMBgNVHRMBAf8EAjAAMB4G
A1UdEQQXMBWCDXRhc2t0b29scy5vcmeHBGFrjWswEwYDVR0lBAwwCgYIKwYBBQUH
AwEwDwYDVR0PAQH/BAUDAwegADAdBgNVHQ4EFgQU/CLd6IX4ns73IW9JtetxKjEz
GOcwHwYDVR0jBBgwFoAUDZvEvP9T4ftv3cVT711JQT5wPWswDQYJKoZIhvcNAQEL
BQADggExADjPCZnLCxWYK5YklECLa8avBedw5p0Z17Fu38ZkAmhnUEqpyzqy/ZQ/
P0FrZpqs0KNnPgYm7tRqWqYKc/kPHLfJO5HZGyeMzMLc5xGKH92YNRPMJHtiGOKf
KAf9N+OIdfyzasMX+4JoVIuRiawilldJY/kolHewBBMTR8r+UK/KqfhBRFQCWAbh
/kOn/nHd0/uSYZY3AgpEePpJLZ2uVvZWRfic+JjLhqHDNYn2Xc8CViWDqjC6R6ZJ
XFovWXBcs8R4C3kWoaJOisyPNFGCg/nCELSpm2BehcUwr76TRVtMU+Ge3aOTBWjP
DoHbp2VvC2L2PI6lcksfH+nnnHAgxIqKgnP11seB6t55ecwtTiaoKrYMUd1E++iH
8hCm7ND5cJb4yJ+clGCdpXoOq+bN83k=
-----END CERTIFICATE-----

View file

@ -0,0 +1,14 @@
-----BEGIN X509 CRL-----
MIICKTCB4gIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJTRTEeMBwGA1UE
CgwVR8O2dGVib3JnIEJpdCBGYWN0b3J5MRIwEAYDVQQHDAlHw7Z0ZWJvcmcxGjAY
BgNVBAgMEVbDpHN0cmEgR8O2dGFsYW5kMR4wHAYDVQQDDBVHw7Z0ZWJvcmcgQml0
IEZhY3RvcnkXDTE0MDUxNzE4MTMyMFoXDTE1MDUxNzE4MTMyMFowAKAvMC0wHwYD
VR0jBBgwFoAUDZvEvP9T4ftv3cVT711JQT5wPWswCgYDVR0UBAMCAQAwDQYJKoZI
hvcNAQEFBQADggExAJRdlrW0zbhr2R9iScc9bkflv7x2f8Cha/M+To8fik8OsDs0
xmNOSTfbisA60YvFudBSGXwUzGyx8nAoYJgFrpIrG3gco8uCPnFPW5f2yvumelxA
KYGLic2iAIHb290UttfcM+ft/5eILciFaPkycSyppA5ZBRnJ7N20ppat071bFZOo
c+jT6+DLI3ondy6HPBkuCyfUjjVd8bJFEx2JjBFd6rjOgwlPN/j1Pb83oZ5A8ETV
JSdxADBf0DLMW7zE+J8OU4Q7aAW2bwdDqxZglBT8lNvGDkD4/BsFYAmaSvdm9JRM
iCbnTxgbFVHwR4d0x2bQ1Qy2l1CALRHlhmvha3mWdOGDNKanQRT3Xb7iOL0N02le
+1vZMtwH7W03eqTimSPH7nmgWUP7cvCA4ErldD4=
-----END X509 CRL-----

View file

@ -0,0 +1,32 @@
-----BEGIN RSA PRIVATE KEY-----
MIIFfAIBAAKCATEAzayhXVM8sqnxKOpO3EEeP5S71Ikznp7IdorqTAI3oNDIDx15
r5yo0ktFYrB0jIrQeoB0T3F/RD1WRHkm4YIcHzTzTZzcCTCdd0TezIVgQYhKpNsV
mvXhXSbzt+drGcYdnR3IpahFBsnam6ttalDbeNkhRlBSFMPh7zhqqdRyj1pQLLMn
eCS8OAV4GD0TAcyVpq+R10lr4ifmo5xKtM0mr5eY2syXLSJ+v8ID8t9YCTssS+qT
8mNotLkNaz5WctpBJIPzYISivKkWqjiZHW79Dkbv4BZdq0kRud/hJsjRqBxT8hkw
vM8+F8280QuM96V+uteLcuoj5jnfDzk+90R3ZL9J5LpA3WsrcodDxv/ZCN6RE5/E
JEE2f9JkKA0+pwP+TDMPFJ1GuoQJoxybEhWwkwIDAQABAoIBMQC6ewRP1rGZGKa0
v0VDRLOFWHi5arDn5/XALZHj2rrPT52kvsffJv6WtXKy2WTDLPV7rM5IXZLTr31x
VhufqdWPofXb8BY9KtwLEOGltGSi5k0vjgjX2Io+aJvfqa6cztl45FFRifEUB57z
OApbs/ZaaxxVYWwascQ/nvpvA1XfjjZVYRavQzd439SUvYNnRTSGzndAKKztfjns
HX19iT6JBfO2/5rfB8zjSHe+0kcRSB/ebKoI6NGvOa/jRqxO1vJ5Xq2RWjCI38SL
abNDI6+0UynpjQn7cHZWvlMno5l1K/4DSzYPthD44rJPfx6UTrJrcYHkukuv/n+C
yN5PdK0ORTd2XvVDPWImbjbWp8BdUHE2q+R4Brl12agcQXBzR1N71BJiGl6N/i2e
iATiMA3BAoGZAOerWQ+al5i0kYEFG9OfEJUBuUB2FhLgojpM7ZuE6PJAChv99Y7Q
U/kXgUoF7j11NK3VS2CtCDrAgUSuzVdHQa9UXvj6c7DKus4OdE+vqVxci28Vmz2a
5EjFSu2Ijt6t06aDnpRCqDaqv7vwqB/Cn5YV5vaBIfSfnLSlMAGPPMzFf86MYKR2
LYTfqiJP8VmGGTKM5UB7m89hAoGZAONGYdabtRvALgOvb6zwMiXNm2Pi5mlc1YOj
WX4CxKcCbV3psf0mTc2pM2I6nfhRsbFC2Jb2awd1qsIoG+GDsmI7Xbe38krn05U4
lZm93xlGBkn7sbwQ5xO74SW8bgs+OSZzEkfJcfB8XQb6XQRJNrkxu1Shx9IuxhML
5eQ2a5xKilvrzzhlGQQgizCqVhy5HMFGgSpIbIhzAoGYWIhVx63HYzcWJ90g7jVq
a9c1yVmXQ+2OcYM2hmk7cGBivKHHtqUMgjOmV/h+PARPdmL9pFtbusAYZnv6wvDb
PDqc9L8ZeSVwUBCcCFvT+BTxwCjco6VOujSTVsUJ/DUnngnMj1IN4J5OGW91gHWq
8Ps7wVZF+KsKgsph1ya7EHIlTnS89fynlpC2/tfYHuMtO/E2JvdV6uECgZkA1pbi
1BYqt2wKRlKEOB6GyujKWlKnyT3tH6DBY9hLQ4FoMC7ybpqXBaNHr+y2sPq5syvx
gwBh6CYyt6XVRWXqrRNuloPpEs63GQLXRdVf6+YRFBPBKlgvRpOzrsSuhpEWtvYZ
gYxzt2RFFcyYvO4/7DZHsU4bdJnTTbKDOqojiutanhYVjyLtrtbndWiva+lgfCEM
3haJ238CgZgbnkF4IlwNat95eKl+ddIBAl3/SDAMct/McLLYN1R8j+zhtotUf5wA
/wSHZgPpa7GbBymVERycogmyIs5LbfKpIPBNcwtl2O/So6R/+qCj39uMPrVIodqp
Dkb7OBhH+uo6xzQLi/Jd2CbMAqq1MVWmDEIftJjAPacWDjJODlg6lg0+c/2MZav8
PXsW0Mtrlz2wCGhkcaQffA==
-----END RSA PRIVATE KEY-----