| 1 | """ |
|---|
| 2 | Test infrastructure for integration-y tests that run actual nodes, like those |
|---|
| 3 | in ``allmydata.test.test_system``. |
|---|
| 4 | |
|---|
| 5 | Ported to Python 3. |
|---|
| 6 | """ |
|---|
| 7 | |
|---|
| 8 | from typing import Optional |
|---|
| 9 | import os |
|---|
| 10 | from functools import partial |
|---|
| 11 | |
|---|
| 12 | from twisted.internet import reactor |
|---|
| 13 | from twisted.internet import defer |
|---|
| 14 | from twisted.internet.defer import inlineCallbacks |
|---|
| 15 | from twisted.internet.task import deferLater |
|---|
| 16 | from twisted.application import service |
|---|
| 17 | |
|---|
| 18 | from foolscap.api import flushEventualQueue |
|---|
| 19 | |
|---|
| 20 | from allmydata import client |
|---|
| 21 | from allmydata.introducer.server import create_introducer |
|---|
| 22 | from allmydata.util import fileutil, log, pollmixin |
|---|
| 23 | from allmydata.util.deferredutil import async_to_deferred |
|---|
| 24 | from allmydata.storage import http_client |
|---|
| 25 | from allmydata.storage_client import ( |
|---|
| 26 | NativeStorageServer, |
|---|
| 27 | HTTPNativeStorageServer, |
|---|
| 28 | ) |
|---|
| 29 | |
|---|
| 30 | from twisted.python.filepath import ( |
|---|
| 31 | FilePath, |
|---|
| 32 | ) |
|---|
| 33 | |
|---|
| 34 | from .common import ( |
|---|
| 35 | SameProcessStreamEndpointAssigner, |
|---|
| 36 | ) |
|---|
| 37 | |
|---|
| 38 | from . import common_util as testutil |
|---|
| 39 | from ..scripts.common import ( |
|---|
| 40 | write_introducer, |
|---|
| 41 | ) |
|---|
| 42 | |
|---|
| 43 | # our system test uses the same Tub certificates each time, to avoid the |
|---|
| 44 | # overhead of key generation |
|---|
| 45 | SYSTEM_TEST_CERTS = [ |
|---|
| 46 | """-----BEGIN CERTIFICATE----- |
|---|
| 47 | MIICojCCAYoCAQEwDQYJKoZIhvcNAQELBQAwFzEVMBMGA1UEAwwMbmV3cGJfdGhp |
|---|
| 48 | bmd5MB4XDTIwMDEwMjAxNDAzM1oXDTIxMDEwMTAxNDAzM1owFzEVMBMGA1UEAwwM |
|---|
| 49 | bmV3cGJfdGhpbmd5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1iNV |
|---|
| 50 | z07PYwZwucl87QlL2TFZvDxD4flZ/p3BZE3DCT5Efn9w2NT4sHXL1e+R/qsDFuNG |
|---|
| 51 | bw1y1TRM0DGK6Wr0XRT2mLQULNgB8y/HrhcSdONsYRyWdj+LimyECKjwh0iSkApv |
|---|
| 52 | Yj/7IOuq6dOoh67YXPdf75OHLShm4+8q8fuwhBL+nuuO4NhZDJKupYHcnuCkcF88 |
|---|
| 53 | LN77HKrrgbpyVmeghUkwJMLeJCewvYVlambgWRiuGGexFgAm6laS3rWetOcdm9eg |
|---|
| 54 | FoA9PKNN6xvPatbj99MPoLpBbzsI64M0yT/wTSw1pj/Nom3rwfMa2OH8Kk7c8R/r |
|---|
| 55 | U3xj4ZY1DTlGERvejQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQAwyQjQ3ZgtJ3JW |
|---|
| 56 | r3/EPdqSUBamTfXIpOh9rXmRjPpbe+MvenqIzl4q+GnkL5mdEb1e1hdKQZgFQ5Q5 |
|---|
| 57 | tbcNIz6h5C07KaNtbqhZCx5c/RUEH87VeXuAuOqZHbZWJ18q0tnk+YgWER2TOkgE |
|---|
| 58 | RI2AslcsJBt88UUOjHX6/7J3KjPFaAjW1QV3TTsHxk14aYDYJwPdz+ijchgbOPQ0 |
|---|
| 59 | i+ilhzcB+qQnOC1s4xQSFo+zblTO7EgqM9KpupYfOVFh46P1Mak2W8EDvhz0livl |
|---|
| 60 | OROXJ6nR/13lmQdfVX6T45d+ITBwtmW2nGAh3oI3JlArGKHaW+7qnuHR72q9FSES |
|---|
| 61 | cEYA/wmk |
|---|
| 62 | -----END CERTIFICATE----- |
|---|
| 63 | -----BEGIN PRIVATE KEY----- |
|---|
| 64 | MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDWI1XPTs9jBnC5 |
|---|
| 65 | yXztCUvZMVm8PEPh+Vn+ncFkTcMJPkR+f3DY1PiwdcvV75H+qwMW40ZvDXLVNEzQ |
|---|
| 66 | MYrpavRdFPaYtBQs2AHzL8euFxJ042xhHJZ2P4uKbIQIqPCHSJKQCm9iP/sg66rp |
|---|
| 67 | 06iHrthc91/vk4ctKGbj7yrx+7CEEv6e647g2FkMkq6lgdye4KRwXzws3vscquuB |
|---|
| 68 | unJWZ6CFSTAkwt4kJ7C9hWVqZuBZGK4YZ7EWACbqVpLetZ605x2b16AWgD08o03r |
|---|
| 69 | G89q1uP30w+gukFvOwjrgzTJP/BNLDWmP82ibevB8xrY4fwqTtzxH+tTfGPhljUN |
|---|
| 70 | OUYRG96NAgMBAAECggEAJ5xztBx0+nFnisZ9yG8uy6d4XPyc5gE1J4dRDdfgmyYc |
|---|
| 71 | j3XNjx6ePi4cHZ/qVryVnrc+AS7wrgW1q9FuS81QFKPbFdZB4SW3/p85BbgY3uxu |
|---|
| 72 | 0Ovz3T3V9y4polx12eCP0/tKLVd+gdF2VTik9Sxfs5rC8VNN7wmJNuK4A/k15sgy |
|---|
| 73 | BIu/R8NlMNGQySNhtccp+dzB8uTyKx5zFZhVvnAK/3YX9BC2V4QBW9JxO4S8N0/9 |
|---|
| 74 | 48e9Sw/fGCfQ/EFPKGCvTvfuRqJ+4t5k10FygXJ+s+y70ifYi+aSsjJBuranbLJp |
|---|
| 75 | g5TwhuKnTWs8Nth3YRLbcJL4VBIOehjAWy8pDMMtlQKBgQD0O8cHb8cOTGW0BijC |
|---|
| 76 | NDofhA2GooQUUR3WL324PXWZq0DXuBDQhJVBKWO3AYonivhhd/qWO8lea9MEmU41 |
|---|
| 77 | nKZ7maS4B8AJLJC08P8GL1uCIE/ezEXEi9JwC1zJiyl595Ap4lSAozH0DwjNvmGL |
|---|
| 78 | 5mIdYg0BliqFXbloNJkNlb7INwKBgQDgdGEIWXc5Y1ncWNs6iDIV/t2MlL8vLrP0 |
|---|
| 79 | hpkl/QiMndOQyD6JBo0+ZqvOQTSS4NTSxBROjPxvFbEJ3eH8Pmn8gHOf46fzP1OJ |
|---|
| 80 | wlYv0gYzkN4FE/tN6JnO2u9pN0euyyZLM1fnEcrMWColMN8JlWjtA7Gbxm8lkfa4 |
|---|
| 81 | 3vicaJtlWwKBgQCQYL4ZgVR0+Wit8W4qz+EEPHYafvwBXqp6sXxqa7qXawtb+q3F |
|---|
| 82 | 9nqdGLCfwMNA+QA37ksugI1byfXmpBH902r/aiZbvAkj4zpwHH9F0r0PwbY1iSA9 |
|---|
| 83 | PkLahX0Gj8OnHFgWynsVyGOBWVnk9oSHxVt+7zWtGG5uhKdUGLPZugocJQKBgB61 |
|---|
| 84 | 7bzduOFiRZ5PjhdxISE/UQL2Kz6Cbl7rt7Kp72yF/7eUnnHTMqoyFBnRdCcQmi4I |
|---|
| 85 | ZBrnUXbFigamlFAWHhxNWwSqeoVeychUjcRXQT/291nMhRsA02KpNA66YJV6+E9b |
|---|
| 86 | xBA6r/vLqGCUUkAWcFfVpIyC1xxV32MmJvAHpBN3AoGAPF3MUFiO0iKNZfst6Tm3 |
|---|
| 87 | rzrldLawDo98DRZ7Yb2kWlWZYqUk/Nvryvo2cns75WGSMDYVbbRp+BY7kZmNYa9K |
|---|
| 88 | iQzKDL54ZRu6V+getJdeAO8yXoCmnZKxt5OHvOSrQMfAmFKSwLwxBbZBfXEyuune |
|---|
| 89 | yfusXLtCgajpreoVIa0xWdQ= |
|---|
| 90 | -----END PRIVATE KEY----- |
|---|
| 91 | """, # 0 |
|---|
| 92 | """-----BEGIN CERTIFICATE----- |
|---|
| 93 | MIICojCCAYoCAQEwDQYJKoZIhvcNAQELBQAwFzEVMBMGA1UEAwwMbmV3cGJfdGhp |
|---|
| 94 | bmd5MB4XDTIwMDEwMjAxNDAzM1oXDTIxMDEwMTAxNDAzM1owFzEVMBMGA1UEAwwM |
|---|
| 95 | bmV3cGJfdGhpbmd5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApDzW |
|---|
| 96 | 4ZBeK9w4xpRaed6lXzeCO0Xmr3f0ynbueSdiZ89FWoAMgK+SiBIOViYV6hfm0Wah |
|---|
| 97 | lemSNzFGx5LvDSg2uwSqEP23DeM9O/SQPgIAiLeeEsYZJcgg2jz92YfFEaahsGdI |
|---|
| 98 | 6qSP4XI2/5dgKRpPOYDGyw6R5PQR6w22Xq1WD1jBvImk/k09I9jHRn40pYbaJzbg |
|---|
| 99 | U2aIjvOruo2kqe4f6iDqE0piYimAZJUvemu1UoyV5NG590hGkDuWsMD77+d2FxCj |
|---|
| 100 | 9Nzb+iuuG3ksnanHPyXi1hQmzp5OmzVWaevCHinNjWgsuSuLGO9H2SLf3wwp2UCs |
|---|
| 101 | EpKtzoKrnZdEg/anNwIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQChxtr67o1aZZMJ |
|---|
| 102 | A6gESPtFjZLw6wG0j50JsrWKLvoXVts1ToJ9u2nx01aFKjBwb4Yg+vdJfDgIIAEm |
|---|
| 103 | jS56h6H2DfJlkTWHmi8Vx1wuusWnrNwYMI53tdlRIpD2+Ne7yeoLQZcVN2wuPmxD |
|---|
| 104 | Mbksg4AI4csmbkU/NPX5DtMy4EzM/pFvIcxNIVRUMVTFzn5zxhKfhyPqrMI4fxw1 |
|---|
| 105 | UhUbEKO+QgIqTNp/dZ0lTbFs5HJQn6yirWyyvQKBPmaaK+pKd0RST/T38OU2oJ/J |
|---|
| 106 | LojRs7ugCJ+bxJqegmQrdcVqZZGbpYeK4O/5eIn8KOlgh0nUza1MyjJJemgBBWf7 |
|---|
| 107 | HoXB8Fge |
|---|
| 108 | -----END CERTIFICATE----- |
|---|
| 109 | -----BEGIN PRIVATE KEY----- |
|---|
| 110 | MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCkPNbhkF4r3DjG |
|---|
| 111 | lFp53qVfN4I7Reavd/TKdu55J2Jnz0VagAyAr5KIEg5WJhXqF+bRZqGV6ZI3MUbH |
|---|
| 112 | ku8NKDa7BKoQ/bcN4z079JA+AgCIt54SxhklyCDaPP3Zh8URpqGwZ0jqpI/hcjb/ |
|---|
| 113 | l2ApGk85gMbLDpHk9BHrDbZerVYPWMG8iaT+TT0j2MdGfjSlhtonNuBTZoiO86u6 |
|---|
| 114 | jaSp7h/qIOoTSmJiKYBklS96a7VSjJXk0bn3SEaQO5awwPvv53YXEKP03Nv6K64b |
|---|
| 115 | eSydqcc/JeLWFCbOnk6bNVZp68IeKc2NaCy5K4sY70fZIt/fDCnZQKwSkq3Ogqud |
|---|
| 116 | l0SD9qc3AgMBAAECggEBAIu55uaIOFYASZ1IYaEFNpRHWVisI5Js76nAfSo9w46l |
|---|
| 117 | 3E8eWYSx2mxBUEkipco/A3RraFVuHaMvHRR1gUMkT0vUsAs8jxwVk+cKLh1S/rlR |
|---|
| 118 | 3f4C4yotlSWWdjE3PQXDShQWCwb1ciNPVFMmqfzOEVDOqlHe12h97TCYverWdT0f |
|---|
| 119 | 3LZICLQsZd1WPKnPNXrsRRDCBuRLapdg+M0oJ+y6IiCdm+qM7Qvaoef6hlvm5ECz |
|---|
| 120 | LCM92db5BKTuPOQXMx2J8mjaBgU3aHxRV08IFgs7mI6q0t0FM7LlytIAJq1Hg5QU |
|---|
| 121 | 36zDKo8tblkPijWZWlqlZCnlarrd3Ar/BiLEiuOGDMECgYEA1GOp0KHy0mbJeN13 |
|---|
| 122 | +TDsgP7zhmqFcuJREu2xziNJPK2S06NfGYE8vuVqBGzBroLTQ3dK7rOJs9C6IjCE |
|---|
| 123 | mH7ZeHzfcKohpZnl443vHMSpgdh/bXTEO1aQZNbJ2hLYs8ie/VqqHR0u6YtpUqZL |
|---|
| 124 | LgaUA0U8GnlsO55B8kyCelckmDkCgYEAxfYQMPEEzg1tg2neqEfyoeY0qQTEJTeh |
|---|
| 125 | CPMztowSJpIyF1rQH6TaG0ZchkiAkw3W58RVDfvK72TuVlC5Kz00C2/uPnrqm0dX |
|---|
| 126 | iMPeML5rFlG3VGCrSTnAPI+az6P65q8zodqcTtA8xoxgPOlc/lINOxiTEMxLyeGF |
|---|
| 127 | 8GyP+sCM2u8CgYEAvMBR05OJnEky9hJEpBZBqSZrQGL8dCwDh0HtCdi8JovPd/yx |
|---|
| 128 | 8JW1aaWywXnx6uhjXoru8hJm54IxWV8rB+d716OKY7MfMfACqWejQDratgW0wY7L |
|---|
| 129 | MjztGGD2hLLJGYXLHjfsBPHBllaKZKRbHe1Er19hWdndQWKVEwPB1X4KjKkCgYEA |
|---|
| 130 | nWHmN3K2djbYtRyLR1CEBtDlVuaSJmCWp23q1BuCJqYeKtEpG69NM1f6IUws5Dyh |
|---|
| 131 | eXtuf4KKMU8V6QueW1D6OomPaJ8CO9c5MWM/F5ObwY/P58Y/ByVhvwQQeToONC5g |
|---|
| 132 | JzKNCF+nodZigKqrIwoKuMvtx/IT4vloKd+1jA5fLYMCgYBoT3HLCyATVdDSt1TZ |
|---|
| 133 | SbEDoLSYt23KRjQV93+INP949dYCagtgh/kTzxBopw5FljISLfdYizIRo2AzhhfP |
|---|
| 134 | WWpILlnt19kD+sNirJVqxJacfEZsu5baWTedI/yrCuVsAs/s3/EEY6q0Qywknxtp |
|---|
| 135 | Fwh1/8y5t14ib5fxOVhi8X1nEA== |
|---|
| 136 | -----END PRIVATE KEY----- |
|---|
| 137 | """, # 1 |
|---|
| 138 | """-----BEGIN CERTIFICATE----- |
|---|
| 139 | MIICojCCAYoCAQEwDQYJKoZIhvcNAQELBQAwFzEVMBMGA1UEAwwMbmV3cGJfdGhp |
|---|
| 140 | bmd5MB4XDTIwMDEwMjAxNDAzM1oXDTIxMDEwMTAxNDAzM1owFzEVMBMGA1UEAwwM |
|---|
| 141 | bmV3cGJfdGhpbmd5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwMTn |
|---|
| 142 | hXnpKHGAir3WYbOxefVrMA07OZNAsNa29nBwLA+NVIJNUFgquibMj7QYo8+M45oY |
|---|
| 143 | 6LKr4yRcBryZVvyxfdr92xp8+kLeVApk2WLjkdBTRagHh9qdrY0hQmagCBN6/hLG |
|---|
| 144 | Xug8VksQUdhX3vu6ZyMvTLfKRkDOMRVkRGRGg/dOcvom7zpqMCGYenMG2FStr6UV |
|---|
| 145 | 3s3dlCSZZTdTX5Uoq6yfUUJE3nITGKjpnpJKqIs3PWCIxdj7INIcjJKvIdUcavIV |
|---|
| 146 | 2hEhh60A8ltmtdpQAXVBE+U7aZgS1fGAWS2A0a3UwuP2pkQp6OyKCUVHpZatbl9F |
|---|
| 147 | ahDN2QBzegv/rdJ1zwIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQAl4OQZ+FB9ZSUv |
|---|
| 148 | FL/KwLNt+ONU8Sve/xiX+8vKAvgKm2FrjyK+AZPwibnu+FSt2G4ndZBx4Wvpe5V+ |
|---|
| 149 | gCsbzSXlh9cDn2SRXyprt2l/8Fj4eUMaThmLKOK200/N/s2SpmBtnuflBrhNaJpw |
|---|
| 150 | DEi2KEPuXsgvkuVzXN06j75cUHwn5LeWDAh0RalkVuGbEWBoFx9Hq8WECdlCy0YS |
|---|
| 151 | y09+yO01qz70y88C2rPThKw8kP4bX8aFZbvsnRHsLu/8nEQNlrELcfBarPVHjJ/9 |
|---|
| 152 | imxOdymJkV152V58voiXP/PwXhynctQbF7e+0UZ+XEGdbAbZA0BMl7z+b09Z+jF2 |
|---|
| 153 | afm4mVox |
|---|
| 154 | -----END CERTIFICATE----- |
|---|
| 155 | -----BEGIN PRIVATE KEY----- |
|---|
| 156 | MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDAxOeFeekocYCK |
|---|
| 157 | vdZhs7F59WswDTs5k0Cw1rb2cHAsD41Ugk1QWCq6JsyPtBijz4zjmhjosqvjJFwG |
|---|
| 158 | vJlW/LF92v3bGnz6Qt5UCmTZYuOR0FNFqAeH2p2tjSFCZqAIE3r+EsZe6DxWSxBR |
|---|
| 159 | 2Ffe+7pnIy9Mt8pGQM4xFWREZEaD905y+ibvOmowIZh6cwbYVK2vpRXezd2UJJll |
|---|
| 160 | N1NflSirrJ9RQkTechMYqOmekkqoizc9YIjF2Psg0hyMkq8h1Rxq8hXaESGHrQDy |
|---|
| 161 | W2a12lABdUET5TtpmBLV8YBZLYDRrdTC4/amRCno7IoJRUellq1uX0VqEM3ZAHN6 |
|---|
| 162 | C/+t0nXPAgMBAAECggEAF+2ZK4lZdsq4AQDVhqUuh4v+NSW/T0NHCWxto6OLWPzJ |
|---|
| 163 | N09BV5LKIvdD9yaM1HCj9XCgXOooyfYuciuhARo20f+H+VWNY+c+/8GWiSFsTCJG |
|---|
| 164 | 4+Oao7NwVSWqljp07Ou2Hamo9AjxzGhe6znmlmg62CiW63f45MWQkqksHA0yb5jg |
|---|
| 165 | /onJ2//I+OI+aTKNfjt1G6h2x7oxeGTU1jJ0Hb2xSh+Mpqx9NDfb/KZyOndhSG5N |
|---|
| 166 | xRVosQ6uV+9mqHxTTwTZurTG31uhZzarkMuqxhcHS94ub7berEc/OlqvbyMKNZ3A |
|---|
| 167 | lzuvq0NBZhEUhAVgORAIS17r/q2BvyG4u5LFbG2p0QKBgQDeyyOl+A7xc4lPE2OL |
|---|
| 168 | Z3KHJPP4RuUnHnWFC+bNdr5Ag8K7jcjZIcasyUom9rOR0Fpuw9wmXpp3+6fyp9bJ |
|---|
| 169 | y6Bi5VioR0ZFP5X+nXxIN3yvgypu6AZvkhHrEFer+heGHxPlbwNKCKMbPzDZPBTZ |
|---|
| 170 | vlC7g7xUUcpNmGhrOKr3Qq5FlwKBgQDdgCmRvsHUyzicn8TI3IJBAOcaQG0Yr/R2 |
|---|
| 171 | FzBqNfHHx7fUZlJfKJsnu9R9VRZmBi4B7MA2xcvz4QrdZWEtY8uoYp8TAGILfW1u |
|---|
| 172 | CP4ZHrzfDo/67Uzk2uTMTd0+JOqSm/HiVNguRPvC8EWBoFls+h129GKThMvKR1hP |
|---|
| 173 | 1oarfAGIiQKBgQCIMAq5gHm59JMhqEt4QqMKo3cS9FtNX1wdGRpbzFMd4q0dstzs |
|---|
| 174 | ha4Jnv3Z9YHtBzzQap9fQQMRht6yARDVx8hhy6o3K2J0IBtTSfdXubtZGkfNBb4x |
|---|
| 175 | Y0vaseG1uam5jbO+0u5iygbSN/1nPUfNln2JMkzkCh8s8ZYavMgdX0BiPwKBgChR |
|---|
| 176 | QL/Hog5yoy5XIoGRKaBdYrNzkKgStwObuvNKOGUt5DckHNA3Wu6DkOzzRO1zKIKv |
|---|
| 177 | LlmJ7VLJ3qln36VcaeCPevcBddczkGyb9GxsHOLZCroY4YsykLzjW2cJXy0qd3/E |
|---|
| 178 | A8mAQvc7ttsebciZSi2x1BOX82QxUlDN8ptaKglJAoGBAMnLN1TQB0xtWYDPGcGV |
|---|
| 179 | 2IvgX7OTRRlMVrTvIOvP5Julux9z1r0x0cesl/jaXupsBUlLLicPyBMSBJrXlr24 |
|---|
| 180 | mrgkodk4TdqO1VtBCZBqak97DHVezstMrbpCGlUD5jBnsHVRLERvS09QlGhqMeNL |
|---|
| 181 | jpNQbWH9VhutzbvpYquKrhvK |
|---|
| 182 | -----END PRIVATE KEY----- |
|---|
| 183 | """, # 2 |
|---|
| 184 | """-----BEGIN CERTIFICATE----- |
|---|
| 185 | MIICojCCAYoCAQEwDQYJKoZIhvcNAQELBQAwFzEVMBMGA1UEAwwMbmV3cGJfdGhp |
|---|
| 186 | bmd5MB4XDTIwMDEwMjAxNDAzM1oXDTIxMDEwMTAxNDAzM1owFzEVMBMGA1UEAwwM |
|---|
| 187 | bmV3cGJfdGhpbmd5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAypqi |
|---|
| 188 | YTni3s60Uo8vgGcFvjWWkB5CD9Fx9pW/2KcxRJ/u137Y+BG8qWMA4lgII3ZIuvo4 |
|---|
| 189 | 6rLDiXnAnDZqUtrvZ90O/gH6RyQqX3AI4EwPvCnRIIe0okRcxnxYBL/LfBY54xuv |
|---|
| 190 | 46JRYZP4c9IImqQH9QVo2/egtEzcpbmT/mfhpf6NGQWC3Xps2BqDT2SV/DrX/wPA |
|---|
| 191 | 8P1atE1AxNp8ENxK/cjFAteEyDZOsDSa757ZHKAdM7L8rZ1Fd2xAA1Dq7IyYpTNE |
|---|
| 192 | IX72xytWxllcNvSUPLT+oicsSZBadc/p3moc3tR/rNdgrHKybedadru/f9Gwpa+v |
|---|
| 193 | 0sllZlEcVPSYddAzWwIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQCmk60Nj5FPvemx |
|---|
| 194 | DSSQjJPyJoIDpTxQ4luSzIq4hPwlUXw7dqrvHyCWgn2YVe9xZsGrT/+n376ecmgu |
|---|
| 195 | sw4s4qVhR9bzKkTMewjC2wUooTA5v9HYsNWZy3Ah7hHPbDHlMADYobjB5/XolNUP |
|---|
| 196 | bCM9xALEdM9DxpC4vjUZexlRKmjww9QKE22jIM+bqsK0zqDSq+zHpfHNGGcS3vva |
|---|
| 197 | OvI6FPc1fAr3pZpVzevMSN2zufIJwjL4FT5/uzwOCaSCwgR1ztD5CSbQLTLlwIsX |
|---|
| 198 | S7h2WF9078XumeRjKejdjEjyH4abKRq8+5LVLcjKEpg7OvktuRpPoGPCEToaAzuv |
|---|
| 199 | h+RSQwwY |
|---|
| 200 | -----END CERTIFICATE----- |
|---|
| 201 | -----BEGIN PRIVATE KEY----- |
|---|
| 202 | MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDKmqJhOeLezrRS |
|---|
| 203 | jy+AZwW+NZaQHkIP0XH2lb/YpzFEn+7Xftj4EbypYwDiWAgjdki6+jjqssOJecCc |
|---|
| 204 | NmpS2u9n3Q7+AfpHJCpfcAjgTA+8KdEgh7SiRFzGfFgEv8t8FjnjG6/jolFhk/hz |
|---|
| 205 | 0giapAf1BWjb96C0TNyluZP+Z+Gl/o0ZBYLdemzYGoNPZJX8Otf/A8Dw/Vq0TUDE |
|---|
| 206 | 2nwQ3Er9yMUC14TINk6wNJrvntkcoB0zsvytnUV3bEADUOrsjJilM0QhfvbHK1bG |
|---|
| 207 | WVw29JQ8tP6iJyxJkFp1z+neahze1H+s12CscrJt51p2u79/0bClr6/SyWVmURxU |
|---|
| 208 | 9Jh10DNbAgMBAAECggEBALv7Q+Rf+C7wrQDZF6LUc9CrGfq4CGVy2IGJKgqT/jOF |
|---|
| 209 | DO9nI1rv4hNr55sbQNneWtcZaYvht2mrzNlj57zepDjDM7DcFuLBHIuWgLXT/NmC |
|---|
| 210 | FyZOo3vXYBlNr8EgT2XfnXAp9UWJCmc2CtUzsIYC4dsmXMeTd8kyc5tUl4r5ybTf |
|---|
| 211 | 1g+RTck/IGgqdfzpuTsNl79FW2rP9z111Py6dbqgQzhuSAune9dnLFvZst8dyL8j |
|---|
| 212 | FStETMxBM6jrCF1UcKXzG7trDHiCdzJ8WUhx6opN/8OasQGndwpXto6FZuBy/AVP |
|---|
| 213 | 4kVQNpUXImYcLEpva0MqGRHg+YN+c84C71CMchnF4aECgYEA7J2go4CkCcZNKCy5 |
|---|
| 214 | R5XVCqNFYRHjekR+UwH8cnCa7pMKKfP+lTCiBrO2q8zwWwknRMyuycS5g/xbSpg1 |
|---|
| 215 | L6hi92CV1YQy1/JhlQedekjejNTTuLOPKf78AFNSfc7axDnes2v4Bvcdp9gsbUIO |
|---|
| 216 | 10cXh0tOSLE7P9y+yC86KQkFAPECgYEA2zO0M2nvbPHv2jjtymY3pflYm0HzhM/T |
|---|
| 217 | kPtue3GxOgbEPsHffBGssShBTE3yCOX3aAONXJucMrSAPL9iwUfgfGx6ADdkwBsA |
|---|
| 218 | OjDlkxvTbP/9trE6/lsSPtGpWRdJNHqXN4Hx7gXJizRwG7Ym+oHvIIh53aIjdFoE |
|---|
| 219 | HLQLpxObuQsCgYAuMQ99G83qQpYpc6GwAeYXL4yJyK453kky9z5LMQRt8rKXQhS/ |
|---|
| 220 | F0FqQYc1vsplW0IZQkQVC5yT0Z4Yz+ICLcM0O9zEVAyA78ZxC42Io9UedSXn9tXK |
|---|
| 221 | Awc7IQkHmmxGxm1dZYSEB5X4gFEb+zted3h2ZxMfScohS3zLI70c6a/aYQKBgQCU |
|---|
| 222 | phRuxUkrTUpFZ1PCbN0R/ezbpLbaewFTEV7T8b6oxgvxLxI6FdZRcSYO89DNvf2w |
|---|
| 223 | GLCVe6VKMWPBTlxPDEostndpjCcTq3vU+nHE+BrBkTvh14BVGzddSFsaYpMvNm8z |
|---|
| 224 | ojiJHH2XnCDmefkm6lRacJKL/Tcj4SNmv6YjUEXLDwKBgF8WV9lzez3d/X5dphLy |
|---|
| 225 | 2S7osRegH99iFanw0v5VK2HqDcYO9A7AD31D9nwX46QVYfgEwa6cHtVCZbpLeJpw |
|---|
| 226 | qXnYXe/hUU3yn5ipdNJ0Dm/ZhJPDD8TeqhnRRhxbZmsXs8EzfwB2tcUbASvjb3qA |
|---|
| 227 | vAaPlOSU1wXqhAsG9aVs8gtL |
|---|
| 228 | -----END PRIVATE KEY----- |
|---|
| 229 | """, # 3 |
|---|
| 230 | """-----BEGIN CERTIFICATE----- |
|---|
| 231 | MIICojCCAYoCAQEwDQYJKoZIhvcNAQELBQAwFzEVMBMGA1UEAwwMbmV3cGJfdGhp |
|---|
| 232 | bmd5MB4XDTIwMDEwMjAxNDAzNFoXDTIxMDEwMTAxNDAzNFowFzEVMBMGA1UEAwwM |
|---|
| 233 | bmV3cGJfdGhpbmd5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzUqQ |
|---|
| 234 | M08E7F2ZE99bFHvpsR6LmgIJOOoGMXacTcEUhRF63E6+730FjxER2a30synv9GGS |
|---|
| 235 | 3G9FstUmfhyimufkbTumri8Novw5CWZQLiE1rmMBI5nPcR2wAzy9z2odR6bfAwms |
|---|
| 236 | yyc3IPYg1BEDBPZl0LCQrQRRU/rVOrbCf7IMq+ATazmBg01gXMzq2M953ieorkQX |
|---|
| 237 | MsHVR/kyW0Q0yzhYF1OtIqbXxrdiZ+laTLWNqivj/FdegiWPCf8OcqpcpbgEjlDW |
|---|
| 238 | gBcC/vre+0E+16nfUV8xHL5jseJMJqfT508OtHxAzp+2D7b54NvYNIvbOAP+F9gj |
|---|
| 239 | aXy5mOvjXclK+hNmDwIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQAjZzTFKG7uoXxm |
|---|
| 240 | BPHfQvsKHIB/Cx9zMKj6pLwJzCPHQBzKOMoUen09oq+fb77RM7WvdX0pvFgEXaJW |
|---|
| 241 | q/ImooRMo+paf8GOZAuPwdafb2/OGdHZGZ2Cbo/ICGo1wGDCdMvbxTxrDNq1Yae+ |
|---|
| 242 | m+2epN2pXAO1rlc7ktRkojM/qi3zXtbLjTs3IoPDXWhYPHdI1ThkneRmvxpzB1rW |
|---|
| 243 | 2SBqj2snvyI+/3k3RHmldcdOrTlgWQ9hq05jWR8IVtRUFFVn9A+yQC3gnnLIUhwP |
|---|
| 244 | HJWwTIPuYW25TuxFxYZXIbnAiluZL0UIjd3IAwxaafvB6uhI7v0K789DKj2vRUkY |
|---|
| 245 | E8ptxZH4 |
|---|
| 246 | -----END CERTIFICATE----- |
|---|
| 247 | -----BEGIN PRIVATE KEY----- |
|---|
| 248 | MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQDNSpAzTwTsXZkT |
|---|
| 249 | 31sUe+mxHouaAgk46gYxdpxNwRSFEXrcTr7vfQWPERHZrfSzKe/0YZLcb0Wy1SZ+ |
|---|
| 250 | HKKa5+RtO6auLw2i/DkJZlAuITWuYwEjmc9xHbADPL3Pah1Hpt8DCazLJzcg9iDU |
|---|
| 251 | EQME9mXQsJCtBFFT+tU6tsJ/sgyr4BNrOYGDTWBczOrYz3neJ6iuRBcywdVH+TJb |
|---|
| 252 | RDTLOFgXU60iptfGt2Jn6VpMtY2qK+P8V16CJY8J/w5yqlyluASOUNaAFwL++t77 |
|---|
| 253 | QT7Xqd9RXzEcvmOx4kwmp9PnTw60fEDOn7YPtvng29g0i9s4A/4X2CNpfLmY6+Nd |
|---|
| 254 | yUr6E2YPAgMBAAECggEBAIiL6uQl0AmDrBj6vHMghGzp+0MBza6MgngOA6L4JTTp |
|---|
| 255 | ToYQ3pEe4D6rxOq7+QHeiBtNd0ilvn9XpVXGqCVOzrIVNiWvaGubRjjJU9WLA1Ct |
|---|
| 256 | y4kpekAr1fIhScMXOsh45ub3XXZ27AVBkM5dTlvTpB8uAd0C/TFVqtR10WLsQ99h |
|---|
| 257 | Zm9Jczgs/6InYTssnAaqdeCLAf1LbmO4zwFsJfJOeSGGT6WBwlpHwMAgPhg8OLEu |
|---|
| 258 | kVWG7BEJ0hxcODk/es/vce9SN7BSyIzNY+qHcGtsrx/o0eO2Av/Z7ltV4Sz6UN1K |
|---|
| 259 | 0y0OTiDyT/l62U2OugSN3wQ4xPTwlrWl7ZUHJmvpEaECgYEA+w2JoB2i1OV2JTPl |
|---|
| 260 | Y0TKSKcZYdwn7Nwh4fxMAJNJ8UbpPqrZEo37nxqlWNJrY/jKX3wHVk4ESSTaxXgF |
|---|
| 261 | UY7yKT0gRuD9+vE0gCbUmJQJTwbceNJUu4XrJ6SBtf72WgmphL+MtyKdwV8XltVl |
|---|
| 262 | Yp0hkswGmxl+5+Js6Crh7WznPl8CgYEA0VYtKs2YaSmT1zraY6Fv3AIQZq012vdA |
|---|
| 263 | 7nVxmQ6jKDdc401OWARmiv0PrZaVNiEJ1YV8KxaPrKTfwhWqxNegmEBgA1FZ66NN |
|---|
| 264 | SAm8P9OCbt8alEaVkcATveXTeOCvfpZUO3sqZdDOiYLiLCsokHblkcenK85n0yT6 |
|---|
| 265 | CzhTbvzDllECgYEAu9mfVy2Vv5OK2b+BLsw0SDSwa2cegL8eo0fzXqLXOzCCKqAQ |
|---|
| 266 | GTAgTSbU/idEr+NjGhtmKg/qaQioogVyhVpenLjeQ+rqYDDHxfRIM3rhlD5gDg/j |
|---|
| 267 | 0wUbtegEHrgOgcSlEW16zzWZsS2EKxq16BoHGx6K+tcS/FOShg5ASzWnuiUCgYEA |
|---|
| 268 | sMz+0tLX8aG7CqHbRyBW8FMR9RY/kRMY1Q1+Bw40wMeZfSSSkYYN8T9wWWT/2rqm |
|---|
| 269 | qp7V0zJ34BFUJoDUPPH84fok3Uh9EKZYpAoM4z9JP0jREwBWXMYEJnOQWtwxfFGN |
|---|
| 270 | DLumgF2Nwtg3G6TL2s+AbtJYH4hxagQl5woIdYmnyzECgYEAsLASpou16A3uXG5J |
|---|
| 271 | +5ZgF2appS9Yfrqfh6TKywMsGG/JuiH3djdYhbJFIRGeHIIDb4XEXOHrg/SFflas |
|---|
| 272 | If0IjFRh9WCvQxnoRha3/pKRSc3OEka1MR/ZREK/d/LQEPmsRJVzY6ABKqmPAMDD |
|---|
| 273 | 5CnG6Hz/rP87BiEKd1+3PGp8GCw= |
|---|
| 274 | -----END PRIVATE KEY----- |
|---|
| 275 | """, # 4 |
|---|
| 276 | """-----BEGIN CERTIFICATE----- |
|---|
| 277 | MIICojCCAYoCAQEwDQYJKoZIhvcNAQELBQAwFzEVMBMGA1UEAwwMbmV3cGJfdGhp |
|---|
| 278 | bmd5MB4XDTIwMDEwMjAxNDAzNFoXDTIxMDEwMTAxNDAzNFowFzEVMBMGA1UEAwwM |
|---|
| 279 | bmV3cGJfdGhpbmd5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0sap |
|---|
| 280 | 75YbbkEL85LFava3FrO1jpgVteQ4NGxxy1Nu9w2hPfMMeCPWjB8UfAwFk+LVPyvW |
|---|
| 281 | LAXd1zWL5rGpQ2ytIVQlTraR5EnALA1sMcQYbFz1ISPTYB031bEN/Ch8JWYwCG5A |
|---|
| 282 | X2H4D6BC7NgT6YyWDt8vxQnqAisPHQ/OK4ABD15CwkTyPimek2/ufYN2dapg1xhG |
|---|
| 283 | IUD96gqetJv9bu0r869s688kADIComsYG+8KKfFN67S3rSHMIpZPuGTtoHGnVO89 |
|---|
| 284 | XBm0vNe0UxQkJEGJzZPn0tdec0LTC4GNtTaz5JuCjx/VsJBqrnTnHHjx0wFz8pff |
|---|
| 285 | afCimRwA+LCopxPE1QIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQBOkAnpBb3nY+dG |
|---|
| 286 | mKCjiLqSsuEPqpNiBYR+ue/8aVDnOKLKqAyQuyRZttQ7bPpKHaw7pwyCZH8iHnt6 |
|---|
| 287 | pMCLCftNSlV2Fa8msRmuf5AiGjUvR1M8VtHWNYE8pedWrJqUgBhF/405B99yd8CT |
|---|
| 288 | kQJXKF18LObj7YKNsWRoMkVgqlQzWDMEqbfmy9MhuLx2EZPsTB1L0BHNGGDVBd9o |
|---|
| 289 | cpPLUixcc12u+RPMKq8x3KgwsnUf5vX/pCnoGcCy4JahWdDgcZlf0hUKGT7PUem5 |
|---|
| 290 | CWW8SMeqSWQX9XpE5Qlm1+W/QXdDXLbbHqDtvBeUy3iFQe3C9RSkp0qdutxkAlFk |
|---|
| 291 | f5QHXfJ7 |
|---|
| 292 | -----END CERTIFICATE----- |
|---|
| 293 | -----BEGIN PRIVATE KEY----- |
|---|
| 294 | MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDSxqnvlhtuQQvz |
|---|
| 295 | ksVq9rcWs7WOmBW15Dg0bHHLU273DaE98wx4I9aMHxR8DAWT4tU/K9YsBd3XNYvm |
|---|
| 296 | salDbK0hVCVOtpHkScAsDWwxxBhsXPUhI9NgHTfVsQ38KHwlZjAIbkBfYfgPoELs |
|---|
| 297 | 2BPpjJYO3y/FCeoCKw8dD84rgAEPXkLCRPI+KZ6Tb+59g3Z1qmDXGEYhQP3qCp60 |
|---|
| 298 | m/1u7Svzr2zrzyQAMgKiaxgb7wop8U3rtLetIcwilk+4ZO2gcadU7z1cGbS817RT |
|---|
| 299 | FCQkQYnNk+fS115zQtMLgY21NrPkm4KPH9WwkGqudOccePHTAXPyl99p8KKZHAD4 |
|---|
| 300 | sKinE8TVAgMBAAECggEALU5EotoqJUXYEtAenUJQ0pFoWjE4oXNf3Wzd/O1/MZ19 |
|---|
| 301 | ZjqDGKPjbxUTKyLOZB5i5gQ/MhFEwQiifMD9eB+5CyvyJPw7Wc28f/uWoQ/cjBZj |
|---|
| 302 | Hm979PHy2X0IW4Y8QTG462b/cUE2t+0j1ZMQnKf6bVHuC7V41mR5CC8oitMl5y5g |
|---|
| 303 | 34yJmWXlIA0ep/WotLMqvil6DnSM/2V8Ch4SxjnzPpjbe4Kj+woucGNr4UKstZER |
|---|
| 304 | 8iuHTsR64LjoGktRnnMwZxGZQI7EC428zsliInuWMdXe//w2chLdkirqpSrIQwSZ |
|---|
| 305 | 3jNWStqBXGYaRg5Z1ilBvHtXxkzDzbAlzRBzqfEwwQKBgQDqYdMRrzHJaXWLdsyU |
|---|
| 306 | 6jAuNX9tLh7PcicjP93SbPujS6mWcNb+D/au+VhWD+dZQDPRZttXck7wvKY1lw1V |
|---|
| 307 | MK0TYI7ydf8h3DFx3Mi6ZD4JVSU1MH233C3fv/FHenDoOvMXXRjUZxaRmuzFJvzt |
|---|
| 308 | 6QlKIfSvwT+1wrOACNfteXfZUQKBgQDmN3Uuk01qvsETPwtWBp5RNcYhS/zGEQ7o |
|---|
| 309 | Q4K+teU453r1v8BGsQrCqulIZ3clMkDru2UroeKn1pzyVAS2AgajgXzfXh3VeZh1 |
|---|
| 310 | vHTLP91BBYZTTWggalEN4aAkf9bxX/hA+9Bw/dzZcQW2aNV7WrYuCSvp3SDCMina |
|---|
| 311 | anQq/PaSRQKBgHjw23HfnegZI89AENaydQQTFNqolrtiYvGcbgC7vakITMzVEwrr |
|---|
| 312 | /9VP0pYuBKmYKGTgF0RrNnKgVX+HnxibUmOSSpCv9GNrdJQVYfpT6XL1XYqxp91s |
|---|
| 313 | nrs7FuxUMNiUOoWOw1Yuj4W4lH4y3QaCXgnDtbfPFunaOrdRWOIv8HjRAoGAV3NT |
|---|
| 314 | mSitbNIfR69YIAqNky3JIJbb42VRc1tJzCYOd+o+pCF96ZyRCNehnDZpZQDM9n8N |
|---|
| 315 | 9GAfWEBHCCpwS69DVFL422TGEnSJPJglCZwt8OgnWXd7CW05cvt1OMgzHyekhxLg |
|---|
| 316 | 4Dse7J5pXBxAlAYmVCB5xPGR4xLpISX1EOtcwr0CgYEA5rA2IUfjZYb4mvFHMKyM |
|---|
| 317 | xWZuV9mnl3kg0ULttPeOl3ppwjgRbWpyNgOXl8nVMYzxwT/A+xCPA18P0EcgNAWc |
|---|
| 318 | frJqQYg3NMf+f0K1wSaswUSLEVrQOj25OZJNpb21JEiNfEd5DinVVj4BtVc6KSpS |
|---|
| 319 | kvjbn2WhEUatc3lPL3V0Fkw= |
|---|
| 320 | -----END PRIVATE KEY----- |
|---|
| 321 | """, # 5 |
|---|
| 322 | """-----BEGIN CERTIFICATE----- |
|---|
| 323 | MIICojCCAYoCAQEwDQYJKoZIhvcNAQELBQAwFzEVMBMGA1UEAwwMbmV3cGJfdGhp |
|---|
| 324 | bmd5MB4XDTIwMDEwMjAxNTExM1oXDTIxMDEwMTAxNTExM1owFzEVMBMGA1UEAwwM |
|---|
| 325 | bmV3cGJfdGhpbmd5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1c5y |
|---|
| 326 | S9IZHF9MIuwdafzhMkgP37I3RVpHEbpnPwnLFqSWelS5m2eDkwWd5SkfGjrmQ5q0 |
|---|
| 327 | PEpqLlh3zHGw9yQjnHS3CCS1PwQ1kmwvpIK3HM5y8GM7ry1zkam8ZR4iX6Y7VG9g |
|---|
| 328 | 9mhiVVFoVhe1gHeiC/3Mp6XeNuEiD0buM+8qZx9B21I+iwzy4wva7Gw0fJeq9G1c |
|---|
| 329 | lq2rhpD1LlIEodimWOi7lOEkNmUiO1SvpdrGdxUDpTgbdg6r5pCGjOXLd74tAQHP |
|---|
| 330 | P/LuqRNJDXtwvHtLIVQnW6wjjy4oiWZ8DXOdc9SkepwQLIF5Wh8O7MzF5hrd6Cvw |
|---|
| 331 | SOD3EEsJbyycAob6RwIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQBDNcbKVUyGOAVm |
|---|
| 332 | k3iVuzkkkymlTAMm/gsIs6loLJrkSqNg160FdVKJoZFjQtqoqLgLrntdCJ377nZ9 |
|---|
| 333 | 1i+yzbZsA4DA7nxj0IEdnd7rRYgGLspGqWeKSTROATeT4faLTXenecm0v2Rpxqc7 |
|---|
| 334 | dSyeZJXOd2OoUu+Q64hzXCDXC6LNM+xZufxV9qv+8d+CipV6idSQZaUWSVuqFCwD |
|---|
| 335 | PT0R4eWfkMMaM8QqtNot/hVCEaKT+9rG0mbpRe/b/qBy5SR0u+XgGEEIV+33L59T |
|---|
| 336 | FXY+DpI1Dpt/bJFoUrfj6XohxdTdqYVCn1F8in98TsRcFHyH1xlkS3Y0RIiznc1C |
|---|
| 337 | BwAoGZ4B |
|---|
| 338 | -----END CERTIFICATE----- |
|---|
| 339 | -----BEGIN PRIVATE KEY----- |
|---|
| 340 | MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDVznJL0hkcX0wi |
|---|
| 341 | 7B1p/OEySA/fsjdFWkcRumc/CcsWpJZ6VLmbZ4OTBZ3lKR8aOuZDmrQ8SmouWHfM |
|---|
| 342 | cbD3JCOcdLcIJLU/BDWSbC+kgrccznLwYzuvLXORqbxlHiJfpjtUb2D2aGJVUWhW |
|---|
| 343 | F7WAd6IL/cynpd424SIPRu4z7ypnH0HbUj6LDPLjC9rsbDR8l6r0bVyWrauGkPUu |
|---|
| 344 | UgSh2KZY6LuU4SQ2ZSI7VK+l2sZ3FQOlOBt2DqvmkIaM5ct3vi0BAc8/8u6pE0kN |
|---|
| 345 | e3C8e0shVCdbrCOPLiiJZnwNc51z1KR6nBAsgXlaHw7szMXmGt3oK/BI4PcQSwlv |
|---|
| 346 | LJwChvpHAgMBAAECggEBAK0KLeUBgIM++Y7WDCRInzYjrn08bpE5tIU7mO4jDfQg |
|---|
| 347 | dw1A3wtQZuOpyxW6B0siWlRis/aLv44M2cBkT3ZmEFBDAhOcKfh7fqQn3RNHG847 |
|---|
| 348 | pDi8B4UKwxskBa7NCcLh9eirUA19hABLJ6dt/t6fdE5CNc2FZ+iAoyE8JfNwYKAd |
|---|
| 349 | 6Fa3HqUBPNWt8ryj4ftgpMNBdfmLugEM4N20SXJA28hOq2lUcwNKQQ1xQrovl0ig |
|---|
| 350 | iMbMWytV4gUPKC9Wra66OYIkk/K8teiUNIYA4JwAUVTs1NEWoyfwUTz1onutCkMl |
|---|
| 351 | 5vY7JAqRoDWoSUX6FI+IHUdyqPAMdOMhC37gjrxoo2ECgYEA7trDMu6xsOwEckDh |
|---|
| 352 | iz148kejMlnTTuCNetOFBw3njFgxISx0PrDLWmJmnHMxPv9AAjXYb2+UCCm3fj6Q |
|---|
| 353 | OB8o4ZJm0n504qbFHcb2aI22U5hZ99ERvqx8WBnJ2RarIBmg06y0ktxq8gFR2qxF |
|---|
| 354 | 0hWAOcDn1DWQ8QI0XBiFFcJTGtcCgYEA5SdlIXRnVZDKi5YufMAORG9i74dXUi0Y |
|---|
| 355 | 02UoVxJ+q8VFu+TT8wrC5UQehG3gX+79Cz7hthhDqOSCv6zTyE4Evb6vf9OLgnVe |
|---|
| 356 | E5iLF033zCxLSS9MgiZ+jTO+wK3RsapXDtGcSEk2P82Pj5seNf4Ei1GNCRlm1DbX |
|---|
| 357 | 71wlikprHhECgYABqmLcExAIJM0vIsav2uDiB5/atQelMCmsZpcx4mXv85l8GrxA |
|---|
| 358 | x6jTW4ZNpvv77Xm7yjZVKJkGqYvPBI6q5YS6dfPjmeAkyHbtazrCpeJUmOZftQSD |
|---|
| 359 | qN5BGwTuT5sn4SXe9ABaWdEhGONCPBtMiLvZK0AymaEGHTbSQZWD/lPoBwKBgGhk |
|---|
| 360 | qg2zmd/BNoSgxkzOsbE7jTbR0VX+dXDYhKgmJM7b8AjJFkWCgYcwoTZzV+RcW6rj |
|---|
| 361 | 2q+6HhizAV2QvmpiIIbQd+Mj3EpybYk/1R2ox1qcUy/j/FbOcpihGiVtCjqF/2Mg |
|---|
| 362 | 2rGTqMMoQl6JrBmsvyU44adjixTiZz0EHZYCkQoBAoGBAMRdmoR4mgIIWFPgSNDM |
|---|
| 363 | ISLJxKvSFPYDLyAepLfo38NzKfPB/XuZrcOoMEWRBnLl6dNN0msuzXnPRcn1gc1t |
|---|
| 364 | TG7db+hivAyUoRkIW3dB8pRj9dDUqO9OohjKsJxJaQCyH5vPkQFSLbTIgWrHhU+3 |
|---|
| 365 | oSPiK/YngDV1AOmPDH7i62po |
|---|
| 366 | -----END PRIVATE KEY----- |
|---|
| 367 | """, #6 |
|---|
| 368 | """-----BEGIN CERTIFICATE----- |
|---|
| 369 | MIICojCCAYoCAQEwDQYJKoZIhvcNAQELBQAwFzEVMBMGA1UEAwwMbmV3cGJfdGhp |
|---|
| 370 | bmd5MB4XDTIwMDEwMjAxNTExMloXDTIxMDEwMTAxNTExMlowFzEVMBMGA1UEAwwM |
|---|
| 371 | bmV3cGJfdGhpbmd5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAojGu |
|---|
| 372 | fQaTVT9DJWJ/zogGfrryEJXYVy9c441O5MrLlRx7nCIWIUs2NEhHDJdqJjYOTdmk |
|---|
| 373 | K98VhdMpDPZwxjgvvZrh43lStBRIW3zZxv747rSl2VtpSqD/6UNWJe5u4SR7oga4 |
|---|
| 374 | JfITOKHg/+ASxnOxp/iu6oT6jBL6T7KSPh6Rf2+it2rsjhktRreFDJ2hyroNq1w4 |
|---|
| 375 | ZVNCcNPgUIyos8u9RQKAWRNchFh0p0FCS9xNrn3e+yHnt+p6mOOF2gMzfXT/M2hq |
|---|
| 376 | KQNmc5D3yNoH2smWoz7F3XsRjIB1Ie4VWoRRaGEy7RwcwiDfcaemD0rQug6iqH7N |
|---|
| 377 | oomF6f3R4DyvVVLUkQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQB/8SX6qyKsOyex |
|---|
| 378 | v3wubgN3FPyU9PqMfEzrFM6X5sax0VMVbSnekZrrXpdnXYV+3FBu2GLLQc900ojj |
|---|
| 379 | vKD+409JIriTcwdFGdLrQPTCRWkEOae8TlXpTxuNqJfCPVNxFN0znoat1bSRsX1U |
|---|
| 380 | K0mfEETQ3ARwlTkrF9CM+jkU3k/pnc9MoCLif8P7OAF38AmIbuTUG6Gpzy8RytJn |
|---|
| 381 | m5AiA3sds5R0rpGUu8mFeBpT6jIA1QF2g+QNHKOQcfJdCdfqTjKw5y34hjFqbWG9 |
|---|
| 382 | RxWGeGNZkhC/jADCt+m+R6+hlyboLuIcVp8NJw6CGbr1+k136z/Dj+Fdhm6FzF7B |
|---|
| 383 | qULeRQJ+ |
|---|
| 384 | -----END CERTIFICATE----- |
|---|
| 385 | -----BEGIN PRIVATE KEY----- |
|---|
| 386 | MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCiMa59BpNVP0Ml |
|---|
| 387 | Yn/OiAZ+uvIQldhXL1zjjU7kysuVHHucIhYhSzY0SEcMl2omNg5N2aQr3xWF0ykM |
|---|
| 388 | 9nDGOC+9muHjeVK0FEhbfNnG/vjutKXZW2lKoP/pQ1Yl7m7hJHuiBrgl8hM4oeD/ |
|---|
| 389 | 4BLGc7Gn+K7qhPqMEvpPspI+HpF/b6K3auyOGS1Gt4UMnaHKug2rXDhlU0Jw0+BQ |
|---|
| 390 | jKizy71FAoBZE1yEWHSnQUJL3E2ufd77Iee36nqY44XaAzN9dP8zaGopA2ZzkPfI |
|---|
| 391 | 2gfayZajPsXdexGMgHUh7hVahFFoYTLtHBzCIN9xp6YPStC6DqKofs2iiYXp/dHg |
|---|
| 392 | PK9VUtSRAgMBAAECggEANjn0A3rqUUr4UQxwfIV/3mj0O1VN4kBEhxOcd+PRUsYW |
|---|
| 393 | EapXycPSmII9ttj8tU/HUoHcYIqSMI7bn6jZJXxtga/BrALJAsnxMx031k8yvOQK |
|---|
| 394 | uvPT7Q6M4NkReVcRHRbMeuxSLuWTRZDhn8qznEPb9rOvD1tsRN6nb3PdbwVbUcZh |
|---|
| 395 | 2F6JDrTyI/Df6nrYQAWOEe2ay7tzgrNYE4vh+DW7oVmyHRgFYA+DIG5Q+7OVWeW5 |
|---|
| 396 | bwYYPKlo4/B0L+GfMKfMVZ+5TvFWAK0YD1e/CW1Gv+i/8dWm4O7UNGg5mTnrIcy1 |
|---|
| 397 | g5wkKbyea02/np2B/XBsSWXDl6rTDHL7ay0rH2hjEQKBgQDMKSm3miQTIcL/F2kG |
|---|
| 398 | ieapmRtSc7cedP967IwUfjz4+pxPa4LiU47OCGp1bmUTuJAItyQyu/5O3uLpAriD |
|---|
| 399 | PTU+oVlhqt+lI6+SJ4SIYw01/iWI3EF2STwXVnohWG1EgzuFM/EqoB+mrodNONfG |
|---|
| 400 | UmP58vI9Is8fdugXgpTz4Yq9pQKBgQDLYJoyMVrYTvUn5oWft8ptsWZn6JZXt5Bd |
|---|
| 401 | aXh+YhNmtCrSORL3XjcH4yjlcn7X8Op33WQTbPo7QAJ1CumJzAI88BZ/8za638xb |
|---|
| 402 | nLueviZApCt0bNMEEdxDffxHFc5TyHE+obMKFfApbCnD0ggO6lrZ8jK9prArLOCp |
|---|
| 403 | mRU9SSRffQKBgAjoBszeqZI4F9SfBdLmMyzU5A89wxBOFFMdfKLsOua1sBn627PZ |
|---|
| 404 | 51Hvpg1HaptoosfujWK1NsvkB0wY9UmsYuU/jrGnDaibnO4oUSzN/WaMlsCYszZg |
|---|
| 405 | zYFLIXrQ67tgajlOYcf1Qkw4MujYgPlC4N+njI/EM/rwagGUjcDx5uaNAoGASyqz |
|---|
| 406 | EuYG63eTSGH89SEaohw0+yaNmnHv23aF4EAjZ4wjX3tUtTSPJk0g6ly84Nbb8d1T |
|---|
| 407 | hZJ7kbaAsf2Mfy91jEw4JKYhjkP05c8x0OP6g12p6efmvdRUEmXX/fXjQjgNEtb0 |
|---|
| 408 | sz+UedrOPN+9trWLSo4njsyyw+JcTpKTtQj5dokCgYEAg9Y3msg+GvR5t/rPVlKd |
|---|
| 409 | keZkrAp0xBJZgqG7CTPXWS1FjwbAPo7x4ZOwtsgjCuE52lar4j+r2Il+CDYeLfxN |
|---|
| 410 | h/Jfn6S9ThUh+B1PMvKMMnJUahg8cVL8uQuBcbAy8HPRK78WO2BTnje44wFAJwTc |
|---|
| 411 | 0liuYqVxZIRlFLRl8nGqog8= |
|---|
| 412 | -----END PRIVATE KEY----- |
|---|
| 413 | """, #7 |
|---|
| 414 | """-----BEGIN CERTIFICATE----- |
|---|
| 415 | MIICojCCAYoCAQEwDQYJKoZIhvcNAQELBQAwFzEVMBMGA1UEAwwMbmV3cGJfdGhp |
|---|
| 416 | bmd5MB4XDTIwMDEwMjAxNTExMloXDTIxMDEwMTAxNTExMlowFzEVMBMGA1UEAwwM |
|---|
| 417 | bmV3cGJfdGhpbmd5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu9oO |
|---|
| 418 | cFlNukUcLfFrfkEaUiilcHLmn5OokQbj95CGd2ehQCCVwrkunYLBisthRaancFFb |
|---|
| 419 | /yM998B0IUsKTsoLi5DAN3/SkSm6GiQIGO05E4eBPljwJ61QQMxh8+1TwQ9HTun1 |
|---|
| 420 | ZE1lhVN1aRmI9VsbyTQLjXh9OFNLSJEKb29mXsgzYwYwNOvo+idzXpy4bMyNoGxY |
|---|
| 421 | Y+s2FIKehNHHCv4ravDn8rf6DtDOvyN4d0/QyNws9FpAZMXmLwtBJ9exOqKFW43w |
|---|
| 422 | 97NxgdNiTFyttrTKTi0b+9v3GVdcEZw5b2RMIKi6ZzPof6/0OlThK6C3xzFK3Bp4 |
|---|
| 423 | PMjTfXw5yyRGVBnZZwIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQA4Ms6LqzMu757z |
|---|
| 424 | bxISiErRls6fcnq0fpSmiPNHNKM7YwG9KHYwPT6A0UMt30zDwNOXCQBI19caGeeO |
|---|
| 425 | MLPWa7Gcqm2XZB2jQwvLRPeFSy9fm6RzJFeyhrh/uFEwUetwYmi/cqeIFDRDBQKn |
|---|
| 426 | bOaXkBk0AaSmI5nRYfuqpMMjaKOFIFcoADw4l9wWhv6DmnrqANzIdsvoSXi5m8RL |
|---|
| 427 | FcZQDZyHFlHh3P3tLkmQ7ErM2/JDwWWPEEJMlDm/q47FTOQSXZksTI3WRqbbKVv3 |
|---|
| 428 | iQlJjpgi9yAuxZwoM3M4975iWH4LCZVMCSqmKCBt1h9wv4LxqX/3kfZhRdy1gG+j |
|---|
| 429 | 41NOSwJ/ |
|---|
| 430 | -----END CERTIFICATE----- |
|---|
| 431 | -----BEGIN PRIVATE KEY----- |
|---|
| 432 | MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC72g5wWU26RRwt |
|---|
| 433 | 8Wt+QRpSKKVwcuafk6iRBuP3kIZ3Z6FAIJXCuS6dgsGKy2FFpqdwUVv/Iz33wHQh |
|---|
| 434 | SwpOyguLkMA3f9KRKboaJAgY7TkTh4E+WPAnrVBAzGHz7VPBD0dO6fVkTWWFU3Vp |
|---|
| 435 | GYj1WxvJNAuNeH04U0tIkQpvb2ZeyDNjBjA06+j6J3NenLhszI2gbFhj6zYUgp6E |
|---|
| 436 | 0ccK/itq8Ofyt/oO0M6/I3h3T9DI3Cz0WkBkxeYvC0En17E6ooVbjfD3s3GB02JM |
|---|
| 437 | XK22tMpOLRv72/cZV1wRnDlvZEwgqLpnM+h/r/Q6VOEroLfHMUrcGng8yNN9fDnL |
|---|
| 438 | JEZUGdlnAgMBAAECggEALlZdlW0R9U6y4spYf65Dddy84n4VUWu0+wE+HoUyBiYz |
|---|
| 439 | 6oOfLYdMbmIgp8H/XpT7XINVNBxXXtPEUaoXAtRoAKdWItqO8Gvgki4tKSjrGVwl |
|---|
| 440 | j2GU69SepT1FNExoiojgSCEB/RnyXu71WVWJKSyuL/V8nAsKqGgze9T7Q/2wvNQt |
|---|
| 441 | SQqLxZlrWF0P8WqaAiSrHV4GnDrdeF+k1KBo2+pSaDNv6cNwOyVG8EII9tqhF8kj |
|---|
| 442 | 6nD6846ish6OqmlSisaSGopJZL1DCQzszFMxKd2+iBDY7Kn6hVIhRaNnaZUFhpKM |
|---|
| 443 | dNh6hBqOycMepAp0sz5pdo+fxpifkoR/cPWgyC3QkQKBgQDixe9VsiZ7u2joxF/9 |
|---|
| 444 | JcAExKhqE28OUmIwt6/j+uzYShxN6Oo9FUo3ICtAPCCFsjhvb3Qum7FspmxrqtNy |
|---|
| 445 | fzclibZJPO8ey2PzqaiOfiVfgJmNSvoCOdgM4OqFLtRO6eSTzhJeI4VPrPcq/5la |
|---|
| 446 | 0FuOi1WZs/Au9llqLqGSDH3UAwKBgQDUD/bSJbOk5SvNjFtFm0ClVJr66mJ5e4uN |
|---|
| 447 | 4VGv8KGFAJ+ExIxujAukfKdwLjS1wEy2RePcshfT8Y9FVh/Q1KzzrQi3Gwmfq1G6 |
|---|
| 448 | Dpu2HlJpaZl+9T81x2KS8GP3QNczWMe2nh7Lj+6st+b4F+6FYbVTFnHaae27sXrD |
|---|
| 449 | XPX15+uxzQKBgGy+pBWBF4kwBo/QU4NuTdU7hNNRPGkuwl1ASH1Xv6m8aDRII8Nk |
|---|
| 450 | 6TDkITltW98g5oUxehI7oOpMKCO9SCZYsNY0YpBeQwCOYgDfc6/Y+A0C+x9RO/BD |
|---|
| 451 | UsJiPLPfD/pDmNPz9sTj3bKma+RXq29sCOujD0pkiiHLCnerotkJWnGHAoGAAkCJ |
|---|
| 452 | JoIv/jhQ1sX+0iZr8VWMr819bjzZppAWBgBQNtFi4E4WD7Z9CSopvQ9AkA2SwvzL |
|---|
| 453 | BrT9e8q88sePXvBjRdM4nHk1CPUQ0SEGllCMH4J3ltmT6kZLzbOv3BhcMLdop4/W |
|---|
| 454 | U+MbbcomMcxPRCtdeZxraR5m3+9qlliOZCYqYqECgYA5eLdxgyHxCS33QGFHRvXI |
|---|
| 455 | TLAHIrr7wK1xwgkmZlLzYSQ8Oqh1UEbgoMt4ulRczP2g7TCfvANw2Sw0H2Q5a6Fj |
|---|
| 456 | cnwVcXJ38DLg0GCPMwzE8dK7d8tKtV6kGiKy+KFvoKChPjE6uxhKKmCJaSwtQEPS |
|---|
| 457 | vsjX3iiIgUQPsSz8RrNFfQ== |
|---|
| 458 | -----END PRIVATE KEY----- |
|---|
| 459 | """, #8 |
|---|
| 460 | """-----BEGIN CERTIFICATE----- |
|---|
| 461 | MIICojCCAYoCAQEwDQYJKoZIhvcNAQELBQAwFzEVMBMGA1UEAwwMbmV3cGJfdGhp |
|---|
| 462 | bmd5MB4XDTIwMDEwMjAxNTExMloXDTIxMDEwMTAxNTExMlowFzEVMBMGA1UEAwwM |
|---|
| 463 | bmV3cGJfdGhpbmd5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5DNu |
|---|
| 464 | CKhhl6wCbgoCkFemwJh3ATbAjhInHpvQWIFDfSK1USElCKxqosIxiBQCx3Zs2d/U |
|---|
| 465 | GeIA7QAM2atNdXaateacEaKMmGE9LEtO0Dg5lmT43WzmGkG9NmCwK3JjAekc5S9d |
|---|
| 466 | HKNtEQo7o8RKfj81zlDSq2kzliy98cimk24VBBGkS2Cn7Vy/mxMCqWjQazTXbpoS |
|---|
| 467 | lXw6LiY5wFXQmXOB5GTSHvqyCtBQbOSSbJB77z/fm7bufTDObufTbJIq53WPt00Y |
|---|
| 468 | f+JNnzkX1X0MaBCUztoZwoMaExWucMe/7xsQ46hDn6KB4b0lZk+gsK45QHxvPE1R |
|---|
| 469 | 72+ZkkIrGS/ljIKahQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQDib1653CneSmy2 |
|---|
| 470 | gYzGeMlrI05Jqo3JuHNMQHzAjIrb4ee57VA4PTQa1ygGol/hVv6eTvZr3p2ospDS |
|---|
| 471 | 5Kfwj1HLO4jSMX1Bnm1FG0naQogz2CD3xfYjbYOVRhAxpld1MNyRveIOhDRARY7N |
|---|
| 472 | XNAaNPZ1ALrwbENSYArr18xDzgGWe/dgyRCEpCFIsztiA+7jGvrmAZgceIE8K3h3 |
|---|
| 473 | fkvNmXBH58ZHAGTiyRriBZqS+DXrBrQOztXSJwFnOZnRt6/efeBupt8j5hxVpBLW |
|---|
| 474 | vtjpBc23uUcbbHOY2AW2Bf+vIr4/LmJ/MheKV+maa2990vmC93tvWlFfc74mgUkW |
|---|
| 475 | HJfXDmR6 |
|---|
| 476 | -----END CERTIFICATE----- |
|---|
| 477 | -----BEGIN PRIVATE KEY----- |
|---|
| 478 | MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDkM24IqGGXrAJu |
|---|
| 479 | CgKQV6bAmHcBNsCOEicem9BYgUN9IrVRISUIrGqiwjGIFALHdmzZ39QZ4gDtAAzZ |
|---|
| 480 | q011dpq15pwRooyYYT0sS07QODmWZPjdbOYaQb02YLArcmMB6RzlL10co20RCjuj |
|---|
| 481 | xEp+PzXOUNKraTOWLL3xyKaTbhUEEaRLYKftXL+bEwKpaNBrNNdumhKVfDouJjnA |
|---|
| 482 | VdCZc4HkZNIe+rIK0FBs5JJskHvvP9+btu59MM5u59NskirndY+3TRh/4k2fORfV |
|---|
| 483 | fQxoEJTO2hnCgxoTFa5wx7/vGxDjqEOfooHhvSVmT6CwrjlAfG88TVHvb5mSQisZ |
|---|
| 484 | L+WMgpqFAgMBAAECggEABTdPuo7uvCLIY2+DI319aEWT4sk3mYe8sSxqlLtPqZqT |
|---|
| 485 | fmk9iXc3cMTzkOK0NY71af19waGy17f6kzchLCAr5SCCTLzkbc87MLn/8S530oI4 |
|---|
| 486 | VgdZMxxxkL6hCD0zGiYT7QEqJa9unMcZGeMwuLYFKtQaHKTo8vPO26n0dMY9YLxj |
|---|
| 487 | cNUxsKLcKk8dbfKKt4B4fZgB7nU0BG9YbKYZ3iZ7/3mG+6jA6u+VYc/WHYQjTmpL |
|---|
| 488 | oLFN7NOe3R7jIx/kJ1OqNWqsFoLpyiiWd1Mr0l3EdD1kCudptMgD8hd++nx2Yk2w |
|---|
| 489 | K4+CpOVIN/eCxDDaAOJgYjCtOayVwUkDAxRRt9VnAQKBgQD5s1j6RJtBNTlChVxS |
|---|
| 490 | W3WpcG4q8933AiUY/Chx0YTyopOiTi7AGUaA8AOLFBcO2npa+vzC+lvuOyrgOtVW |
|---|
| 491 | sD10H2v5jNKlbeBp+Q9rux2LAyp4TvzdXWKhVyZrdtITF0hn6vEYNp7MtyWRFb1O |
|---|
| 492 | 3Ie5HQBPHtzllFOMynacjOdjpQKBgQDp9TrbfOmwGWmwPKmaFKuy8BKxjJM+ct0X |
|---|
| 493 | 4Xs1uSy9Z9Y8QlDNbNaooI8DA1NY0jDVHwemiGC4bYsBNKNRcbI0s2nr0hQMft42 |
|---|
| 494 | P/NpugHv0YXiVz+5bfim4woTiHHbfREqchlIGo3ryClAiDU9fYZwTOtb9jPIhX3G |
|---|
| 495 | 9v+OsoMlYQKBgQDJUQW90S5zJlwh+69xXvfAQjswOimNCpeqSzK4gTn0/YqV4v7i |
|---|
| 496 | Nf6X2eqhaPMmMJNRYuYCtSMFMYLiAc0a9UC2rNa6/gSfB7VU+06phtTMzSKimNxa |
|---|
| 497 | BP6OIduB7Ox2I+Fmlw8GfJMPbeHF1YcpW7e5UV58a9+g4TNzYZC7qwarWQKBgQCA |
|---|
| 498 | FFaCbmHonCD18F/REFvm+/Lf7Ft3pp5PQouXH6bUkhIArzVZIKpramqgdaOdToSZ |
|---|
| 499 | SAGCM8rvbFja8hwurBWpMEdeaIW9SX8RJ/Vz/fateYDYJnemZgPoKQcNJnded5t8 |
|---|
| 500 | Jzab+J2VZODgiTDMVvnQZOu8To6OyjXPRM0nK6cMQQKBgQDyX44PHRRhEXDgJFLU |
|---|
| 501 | qp2ODL54Qadc/thp2m+JmAvqmCCLwuYlGpRKVkLLuZW9W6RlVqarOC3VD3wX5PRZ |
|---|
| 502 | IsyCGLi+Jbrv9JIrYUXE80xNeQVNhrrf02OW0KHbqGxRaNOmp1THPw98VUGR2J/q |
|---|
| 503 | YAp6XUXU7LEBUrowye+Ty2o7Lg== |
|---|
| 504 | -----END PRIVATE KEY----- |
|---|
| 505 | """, #9 |
|---|
| 506 | """-----BEGIN CERTIFICATE----- |
|---|
| 507 | MIICojCCAYoCAQEwDQYJKoZIhvcNAQELBQAwFzEVMBMGA1UEAwwMbmV3cGJfdGhp |
|---|
| 508 | bmd5MB4XDTIwMDEwMjAxNTExMVoXDTIxMDEwMTAxNTExMVowFzEVMBMGA1UEAwwM |
|---|
| 509 | bmV3cGJfdGhpbmd5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1k2R |
|---|
| 510 | PWYihftppo3CoxeseFwgg7guxZVkP7aAur5uBzSeAB7sBG1G2bRrwMX71S4xPwot |
|---|
| 511 | zYiEoxUrTStUqEKjL2aozfHsXnHZ7kwwUgZFDZUg+ve2tZDA3HCUr4tLYKlyFqpx |
|---|
| 512 | 2nCouc45MjQ4wAxRl4rQxIUG2uSTzvP+xXtjoJYMIEEyCpcsRXfqfVkEUe9nrPsF |
|---|
| 513 | 0Ibzk7Cyt75HDI4uEzBuHux0DYuGy6R02jz/vf/dIZ4WepjSY06xpblTHZgieDRX |
|---|
| 514 | fU2+YOcvb0eDHyA8Q5p8ropK71MNIP5+kffFd90SVr4EkCA8S+cd6FdKQasRr+jF |
|---|
| 515 | 9MUhMS4ObvlrYTG+hwIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQCy62MZ3+59/VpX |
|---|
| 516 | c9Hsmb4/BMWt0irLJit4w4SkuYKGFLCMKZI4LN4pEkXaiE1eqF2DNS1qOvl5luty |
|---|
| 517 | Zz4oggrqilwuFeH98o9Zeg9SYnouuypORVP/3DPbJF/jiQg5J8kJb1sy+BjRiT8I |
|---|
| 518 | 5X6/cCBYT+MljFz5tpqWOtWTgA30e1BV8JFj8F4dgUcWsAVT/I4l9zgMLUnhcO6E |
|---|
| 519 | wLtEE0I6aT1RHJB28ndwJzj4La98Oirw7LAEAWbExWYB90ypLaGY+JVJe3f5fijC |
|---|
| 520 | fJpQ2mbs4syXDmb5bU2C2pGPTKZPcyx15iQrq1uHInD0facOw+pmllAFxuG96lA1 |
|---|
| 521 | +o2VzKwP |
|---|
| 522 | -----END CERTIFICATE----- |
|---|
| 523 | -----BEGIN PRIVATE KEY----- |
|---|
| 524 | MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDWTZE9ZiKF+2mm |
|---|
| 525 | jcKjF6x4XCCDuC7FlWQ/toC6vm4HNJ4AHuwEbUbZtGvAxfvVLjE/Ci3NiISjFStN |
|---|
| 526 | K1SoQqMvZqjN8execdnuTDBSBkUNlSD697a1kMDccJSvi0tgqXIWqnHacKi5zjky |
|---|
| 527 | NDjADFGXitDEhQba5JPO8/7Fe2OglgwgQTIKlyxFd+p9WQRR72es+wXQhvOTsLK3 |
|---|
| 528 | vkcMji4TMG4e7HQNi4bLpHTaPP+9/90hnhZ6mNJjTrGluVMdmCJ4NFd9Tb5g5y9v |
|---|
| 529 | R4MfIDxDmnyuikrvUw0g/n6R98V33RJWvgSQIDxL5x3oV0pBqxGv6MX0xSExLg5u |
|---|
| 530 | +WthMb6HAgMBAAECggEAeCyRSNwQeg/NZD/UqP6qkegft52+ZMBssinWsGH/c3z3 |
|---|
| 531 | KVwtwCHDfGvnjPe5TAeWSCKeIsbukkFZwfGNjLmppvgrqymCAkhYDICfDDBF4uMA |
|---|
| 532 | 1pu40sJ01Gkxh+tV/sOmnb1BEVzh0Sgq/NM6C8ActR18CugKOw+5L3G2KeoSqUbT |
|---|
| 533 | 2hcPUsnik10KwqW737GQW4LtEQEr/iRmQkxI3+HBzvPWjFZzjOcpUph+FW5TXtaU |
|---|
| 534 | T26mt1j+FjbdvvhCuRMY/VZBJ5h1RKU95r57F1AjW/C0RRJ8FxR1CeSy4IlmQBrh |
|---|
| 535 | 6wAa3Tdm0k/n4ZspC9bF5eVTJEtb0AohiYZrIa8MuQKBgQD8yjCLYa41H304odCx |
|---|
| 536 | NwPRJcmlIk5YGxPrhHAT9GEgU6n/no7YMVx1L7fNLcMjAyx54jauEU7J19Aki7eV |
|---|
| 537 | SIdU9TwqmkOAFfM6TOEJZiOi66gABOxeK2yDyfmR6Apaw3caku4O058t4KVwHSCB |
|---|
| 538 | DanYCMzxCBqS9jUTTyAh0fMg6wKBgQDZBkIukg3FKPor5LzkUXIKnNHYPfHbERHw |
|---|
| 539 | piWS6GZwqhuWNlOCWxiBR4rEUU/RbFQZw/FCi5OuAk2lBC0LBmC0/Sz4/+xDdCbv |
|---|
| 540 | uNhMOTRcy9nFVpmpIWCx4N/KmXHEuFxli/JNXux7iki74AVC9VPrAt/kCvwf06Df |
|---|
| 541 | oDb8ljdR1QKBgQChVOD6c5Lc8IXYeN1Z3IShHH6+11AsxstFyjZFZff+y6Z5L1Z2 |
|---|
| 542 | /7nESHoDhqs9Uy81cnv3R7CC/Ssnx8uYiLtmK0UE44Mk4d1jXeFZQEiKF+AWcw3v |
|---|
| 543 | Y8NTsLmItxC0sH75BMDN0Z2LiA3Nqaku8+trpuI1Cjj7hgqFkkAtlXKXlQKBgBMb |
|---|
| 544 | c/Q5s7CqHOyEZQUNDqdUiz0opwSMijHPzvsSLwK4V1lwSwXtE0k+jT8fkZF0oirq |
|---|
| 545 | j3E2bLgjR8bBiV2xIA6PQ8hgb+K4dT0h3xlG6A9Le07egwTbBXJjxBBIVjXlrWzb |
|---|
| 546 | V2fsdZGi6ShxXsU4aD0GscOYG/6JWV6W8oBmkVRJAoGAepIZ+OYmFjb7uxdh4EtP |
|---|
| 547 | hluEtx5bLOLuo6c0S149omUXUhbsuyzTZS6Ip9ySDMnK3954c4Q4WJ4yQKixQNVq |
|---|
| 548 | 78aDfy4hP/8TE/Q9CRddUof2P33PJMhVNqzTRYMpqV+zxifvtw3hoDTLKHTQxCR2 |
|---|
| 549 | M1+O4VvokU5pBqUpGXiMDfs= |
|---|
| 550 | -----END PRIVATE KEY----- |
|---|
| 551 | """, #10 |
|---|
| 552 | """-----BEGIN CERTIFICATE----- |
|---|
| 553 | MIICojCCAYoCAQEwDQYJKoZIhvcNAQELBQAwFzEVMBMGA1UEAwwMbmV3cGJfdGhp |
|---|
| 554 | bmd5MB4XDTIwMDEwMjAxNTExMVoXDTIxMDEwMTAxNTExMVowFzEVMBMGA1UEAwwM |
|---|
| 555 | bmV3cGJfdGhpbmd5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnbCU |
|---|
| 556 | M37hG7zrCyyJEI6pZmOomnI+CozbP5KAhWSV5y7R5H6lcAEG2UDV+lCUxHT2ufOa |
|---|
| 557 | i1H16bXyBt7VoMTHIH50S58NUCUEXcuRWVR16tr8CzcTHQAkfIrmhY2XffPilX7h |
|---|
| 558 | aw35UkoVmXcqSDNNJD6jmvWexvmbhzVWW8Vt5Pivet2/leVuqPXB54/alSbkC74m |
|---|
| 559 | x6X5XKQc6eyPsb1xvNBuiSpFzdqbEn7lUwj6jFTkh9tlixgmgx+J0XoQXbawyrAg |
|---|
| 560 | rcIQcse/Ww+KBA1KSccFze+XBTbIull4boYhbJqkb6DW5bY7/me2nNxE9DRGwq+S |
|---|
| 561 | kBsKq3YKeCf8LEhfqQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQAD+tWGFhINYsWT |
|---|
| 562 | ibKWlCGgBc5uB7611cLCevx1yAL6SaOECVCQXzaaXIaETSbyY03UO2yBy3Pl10FV |
|---|
| 563 | GYXLrAWTFZsNVJm55XIibTNw1UBPNwdIoCSzAYuOgMF0GHhTTQU0hNYWstOnnE2T |
|---|
| 564 | 6lSAZQZFkaW4ZKs6sUp42Em9Bu99PehyIgnw14qb9NPg5qKdi2GAvkImZCrGpMdK |
|---|
| 565 | OF31U7Ob0XQ0lxykcNgG4LlUACd+QxLfNpmLBZUGfikexYa1VqBFm3oAvTt8ybNQ |
|---|
| 566 | qr7AKXDFnW75aCBaMpQWzrstA7yYZ3D9XCd5ZNf6d08lGM/oerDAIGnZOZPJgs5U |
|---|
| 567 | FaWPHdS9 |
|---|
| 568 | -----END CERTIFICATE----- |
|---|
| 569 | -----BEGIN PRIVATE KEY----- |
|---|
| 570 | MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCdsJQzfuEbvOsL |
|---|
| 571 | LIkQjqlmY6iacj4KjNs/koCFZJXnLtHkfqVwAQbZQNX6UJTEdPa585qLUfXptfIG |
|---|
| 572 | 3tWgxMcgfnRLnw1QJQRdy5FZVHXq2vwLNxMdACR8iuaFjZd98+KVfuFrDflSShWZ |
|---|
| 573 | dypIM00kPqOa9Z7G+ZuHNVZbxW3k+K963b+V5W6o9cHnj9qVJuQLvibHpflcpBzp |
|---|
| 574 | 7I+xvXG80G6JKkXN2psSfuVTCPqMVOSH22WLGCaDH4nRehBdtrDKsCCtwhByx79b |
|---|
| 575 | D4oEDUpJxwXN75cFNsi6WXhuhiFsmqRvoNbltjv+Z7ac3ET0NEbCr5KQGwqrdgp4 |
|---|
| 576 | J/wsSF+pAgMBAAECggEAPSu1ofBTRN5ZU4FYPlsJLdX1Hsy4coFHv/aF8rkdSYwp |
|---|
| 577 | EflrFfLgBEEZgLvnqfoxh9sPFYKa4amaFL42ouIS2PEVDgzKLk/dzMDeRof0IkIG |
|---|
| 578 | yhb4TCS1ArcjS6WsociNGi8ZJN1L3Xctv9WxSkbUYv4Fm2Qyzr8fbSjssjb5NXwD |
|---|
| 579 | K11fsj6Pfy/mQrI0TSTlzWC7ARIlCMTWQ8G8zEU6bMFIG6DMjt2J4VgYVXUKetZA |
|---|
| 580 | VPuS+pwkH2obQe6FLRuiNxH4GitVAASYPea6foER4AggBMRp8q8F6+WssjoyEORb |
|---|
| 581 | 0sJxmnxhznoTRMCuTsUj6XMgmOTOnA3lQXsIB0DYcQKBgQDO6mMRVVFWzgkE9Q5/ |
|---|
| 582 | 36n06KvGYF9TCRDL9vRC8kCqcGd1Hy6jRj0D8049KUHaN74pfWg6gsQjPkKzwKnC |
|---|
| 583 | vxNl72tVvLqm7Fo531BGfKK/46ZvxeWMMraNW4+9LhwMPu2LN5OEdwwCgyaURpxh |
|---|
| 584 | ktCp+RrGjz08Kn82X1jJPdwxDQKBgQDDGMvZ7ZUDGq5+RJkmHJ58lQtiaMZclmYV |
|---|
| 585 | R9YwOxJV6ino3EYrGOtUkqiemgAACdMWE/JMJlB1/JINawJwUsZ2XDp/9jNLPgLc |
|---|
| 586 | gphCmagaO34U/YMaJbJIK2gkCX7p8EcD+x45qWa0bEMPW38QfN/qQdUPjNmpuIiI |
|---|
| 587 | Zleyl1TqDQKBgQCvIoat0ighsAzETGN0aqzhJdrW8xVcJA06hpFi5MdFPBTldno0 |
|---|
| 588 | KqxUXqj3badWe94SIhqJg8teBUHSAZ3uv2o82nRgQnk99km8OD8rGi1q+9YRP1C2 |
|---|
| 589 | 5OnNJhW4y4FkABNxxZ2v/k+FBNsvn8CXefvyEm3OaMks1s+MBxIQa7KnNQKBgFwX |
|---|
| 590 | HUo+GiN/+bPCf6P8yFa4J8qI+HEF0SPkZ9cWWx5QzP2M1FZNie++1nce7DcYbBo0 |
|---|
| 591 | yh9lyn8W/H328AzDFckS2c5DEY1HtSQPRP3S+AWB5Y7U54h1GMV2L88q6ExWzb60 |
|---|
| 592 | T10aeE9b9v+NydmniC5UatTPQIMbht8Tp/u18TAVAoGBAJphAfiqWWV2M5aBCSXq |
|---|
| 593 | WxLZ71AJ0PZBmRa/9iwtccwXQpMcW6wHK3YSQxci+sB97TElRa3/onlVSpohrUtg |
|---|
| 594 | VCvCwfSHX1LmrfWNSkoJZwCQt+YYuMqW86K0tzLzI1EMjIH9LgQvB6RR26PZQs+E |
|---|
| 595 | jr1ZvRc+wPTq6sxCF1h9ZAfN |
|---|
| 596 | -----END PRIVATE KEY----- |
|---|
| 597 | """, #11 |
|---|
| 598 | ] |
|---|
| 599 | |
|---|
| 600 | # To disable the pre-computed tub certs, uncomment this line. |
|---|
| 601 | # SYSTEM_TEST_CERTS = [] |
|---|
| 602 | |
|---|
| 603 | |
|---|
| 604 | def flush_but_dont_ignore(res): |
|---|
| 605 | d = flushEventualQueue() |
|---|
| 606 | def _done(ignored): |
|---|
| 607 | return res |
|---|
| 608 | d.addCallback(_done) |
|---|
| 609 | return d |
|---|
| 610 | |
|---|
| 611 | |
|---|
| 612 | def _render_config(config): |
|---|
| 613 | """ |
|---|
| 614 | Convert a ``dict`` of ``dict`` of ``unicode`` to an ini-format string. |
|---|
| 615 | """ |
|---|
| 616 | return u"\n\n".join(list( |
|---|
| 617 | _render_config_section(k, v) |
|---|
| 618 | for (k, v) |
|---|
| 619 | in config.items() |
|---|
| 620 | )) |
|---|
| 621 | |
|---|
| 622 | def _render_config_section(heading, values): |
|---|
| 623 | """ |
|---|
| 624 | Convert a ``unicode`` heading and a ``dict`` of ``unicode`` to an ini-format |
|---|
| 625 | section as ``unicode``. |
|---|
| 626 | """ |
|---|
| 627 | return u"[{}]\n{}\n".format( |
|---|
| 628 | heading, _render_section_values(values) |
|---|
| 629 | ) |
|---|
| 630 | |
|---|
| 631 | def _render_section_values(values): |
|---|
| 632 | """ |
|---|
| 633 | Convert a ``dict`` of ``unicode`` to the body of an ini-format section as |
|---|
| 634 | ``unicode``. |
|---|
| 635 | """ |
|---|
| 636 | return u"\n".join(list( |
|---|
| 637 | u"{} = {}".format(k, v) |
|---|
| 638 | for (k, v) |
|---|
| 639 | in sorted(values.items()) |
|---|
| 640 | )) |
|---|
| 641 | |
|---|
| 642 | |
|---|
| 643 | @async_to_deferred |
|---|
| 644 | async def spin_until_cleanup_done(value=None, timeout=10): |
|---|
| 645 | """ |
|---|
| 646 | At the end of the test, spin until the reactor has no more DelayedCalls |
|---|
| 647 | and file descriptors (or equivalents) registered. This prevents dirty |
|---|
| 648 | reactor errors, while also not hard-coding a fixed amount of time, so it |
|---|
| 649 | can finish faster on faster computers. |
|---|
| 650 | |
|---|
| 651 | There is also a timeout: if it takes more than 10 seconds (by default) for |
|---|
| 652 | the remaining reactor state to clean itself up, the presumption is that it |
|---|
| 653 | will never get cleaned up and the spinning stops. |
|---|
| 654 | |
|---|
| 655 | Make sure to run as last thing in tearDown. |
|---|
| 656 | """ |
|---|
| 657 | def num_fds(): |
|---|
| 658 | if hasattr(reactor, "handles"): |
|---|
| 659 | # IOCP! |
|---|
| 660 | return len(reactor.handles) |
|---|
| 661 | else: |
|---|
| 662 | # Normal reactor; having internal readers still registered is fine, |
|---|
| 663 | # that's not our code. |
|---|
| 664 | return len( |
|---|
| 665 | set(reactor.getReaders()) - set(reactor._internalReaders) |
|---|
| 666 | ) + len(reactor.getWriters()) |
|---|
| 667 | |
|---|
| 668 | for i in range(timeout * 1000): |
|---|
| 669 | # There's a single DelayedCall for AsynchronousDeferredRunTest's |
|---|
| 670 | # timeout... |
|---|
| 671 | if (len(reactor.getDelayedCalls()) < 2 and num_fds() == 0): |
|---|
| 672 | break |
|---|
| 673 | await deferLater(reactor, 0.001) |
|---|
| 674 | return value |
|---|
| 675 | |
|---|
| 676 | |
|---|
| 677 | class SystemTestMixin(pollmixin.PollMixin, testutil.StallMixin): |
|---|
| 678 | |
|---|
| 679 | # If set to True, use Foolscap for storage protocol. If set to False, HTTP |
|---|
| 680 | # will be used when possible. If set to None, this suggests a bug in the |
|---|
| 681 | # test code. |
|---|
| 682 | FORCE_FOOLSCAP_FOR_STORAGE : Optional[bool] = None |
|---|
| 683 | |
|---|
| 684 | # If True, reduce the timeout on connections: |
|---|
| 685 | REDUCE_HTTP_CLIENT_TIMEOUT : bool = True |
|---|
| 686 | |
|---|
| 687 | def setUp(self): |
|---|
| 688 | if os.getenv("TAHOE_DEBUG_BLOCKING") == "1": |
|---|
| 689 | from .blocking import catch_blocking_in_event_loop |
|---|
| 690 | catch_blocking_in_event_loop(self) |
|---|
| 691 | |
|---|
| 692 | self._http_client_pools = [] |
|---|
| 693 | http_client.StorageClientFactory.start_test_mode(self._got_new_http_connection_pool) |
|---|
| 694 | self.addCleanup(http_client.StorageClientFactory.stop_test_mode) |
|---|
| 695 | self.port_assigner = SameProcessStreamEndpointAssigner() |
|---|
| 696 | self.port_assigner.setUp() |
|---|
| 697 | self.addCleanup(self.port_assigner.tearDown) |
|---|
| 698 | |
|---|
| 699 | self.sparent = service.MultiService() |
|---|
| 700 | self.sparent.startService() |
|---|
| 701 | |
|---|
| 702 | def _got_new_http_connection_pool(self, pool): |
|---|
| 703 | # Make sure the pool closes cached connections quickly: |
|---|
| 704 | pool.cachedConnectionTimeout = 0.1 |
|---|
| 705 | # Register the pool for shutdown later: |
|---|
| 706 | self._http_client_pools.append(pool) |
|---|
| 707 | # Disable retries: |
|---|
| 708 | pool.retryAutomatically = False |
|---|
| 709 | # Make a much more aggressive timeout for connections, we're connecting |
|---|
| 710 | # locally after all... and also make sure it's lower than the delay we |
|---|
| 711 | # add in tearDown, to prevent dirty reactor issues. |
|---|
| 712 | getConnection = pool.getConnection |
|---|
| 713 | |
|---|
| 714 | def getConnectionWithTimeout(*args, **kwargs): |
|---|
| 715 | d = getConnection(*args, **kwargs) |
|---|
| 716 | d.addTimeout(1, reactor) |
|---|
| 717 | return d |
|---|
| 718 | |
|---|
| 719 | if self.REDUCE_HTTP_CLIENT_TIMEOUT: |
|---|
| 720 | pool.getConnection = getConnectionWithTimeout |
|---|
| 721 | |
|---|
| 722 | def close_idle_http_connections(self): |
|---|
| 723 | """Close all HTTP client connections that are just hanging around.""" |
|---|
| 724 | return defer.gatherResults( |
|---|
| 725 | [pool.closeCachedConnections() for pool in self._http_client_pools] |
|---|
| 726 | ) |
|---|
| 727 | |
|---|
| 728 | def tearDown(self): |
|---|
| 729 | log.msg("shutting down SystemTest services") |
|---|
| 730 | d = self.sparent.stopService() |
|---|
| 731 | d.addBoth(flush_but_dont_ignore) |
|---|
| 732 | d.addBoth(lambda x: self.close_idle_http_connections().addCallback(lambda _: x)) |
|---|
| 733 | d.addBoth(spin_until_cleanup_done) |
|---|
| 734 | return d |
|---|
| 735 | |
|---|
| 736 | def getdir(self, subdir): |
|---|
| 737 | return os.path.join(self.basedir, subdir) |
|---|
| 738 | |
|---|
| 739 | def add_service(self, s): |
|---|
| 740 | s.setServiceParent(self.sparent) |
|---|
| 741 | return s |
|---|
| 742 | |
|---|
| 743 | def _create_introducer(self): |
|---|
| 744 | """ |
|---|
| 745 | :returns: (via Deferred) an Introducer instance |
|---|
| 746 | """ |
|---|
| 747 | iv_dir = self.getdir("introducer") |
|---|
| 748 | if not os.path.isdir(iv_dir): |
|---|
| 749 | _, web_port_endpoint = self.port_assigner.assign(reactor) |
|---|
| 750 | main_location_hint, main_port_endpoint = self.port_assigner.assign(reactor) |
|---|
| 751 | introducer_config = ( |
|---|
| 752 | u"[node]\n" |
|---|
| 753 | u"nickname = introducer \N{BLACK SMILING FACE}\n" + |
|---|
| 754 | u"web.port = {}\n".format(web_port_endpoint) + |
|---|
| 755 | u"tub.port = {}\n".format(main_port_endpoint) + |
|---|
| 756 | u"tub.location = {}\n".format(main_location_hint) |
|---|
| 757 | ).encode("utf-8") |
|---|
| 758 | |
|---|
| 759 | fileutil.make_dirs(iv_dir) |
|---|
| 760 | fileutil.write( |
|---|
| 761 | os.path.join(iv_dir, 'tahoe.cfg'), |
|---|
| 762 | introducer_config, |
|---|
| 763 | ) |
|---|
| 764 | if SYSTEM_TEST_CERTS: |
|---|
| 765 | os.mkdir(os.path.join(iv_dir, "private")) |
|---|
| 766 | f = open(os.path.join(iv_dir, "private", "node.pem"), "w") |
|---|
| 767 | f.write(SYSTEM_TEST_CERTS[0]) |
|---|
| 768 | f.close() |
|---|
| 769 | return create_introducer(basedir=iv_dir) |
|---|
| 770 | |
|---|
| 771 | def _get_introducer_web(self): |
|---|
| 772 | with open(os.path.join(self.getdir("introducer"), "node.url"), "r") as f: |
|---|
| 773 | return f.read().strip() |
|---|
| 774 | |
|---|
| 775 | @inlineCallbacks |
|---|
| 776 | def set_up_nodes(self, NUMCLIENTS=5): |
|---|
| 777 | """ |
|---|
| 778 | Create an introducer and ``NUMCLIENTS`` client nodes pointed at it. All |
|---|
| 779 | of the nodes are running in this process. |
|---|
| 780 | |
|---|
| 781 | As a side-effect, set: |
|---|
| 782 | |
|---|
| 783 | * ``numclients`` to ``NUMCLIENTS`` |
|---|
| 784 | * ``introducer`` to the ``_IntroducerNode`` instance |
|---|
| 785 | * ``introweb_url`` to the introducer's HTTP API endpoint. |
|---|
| 786 | |
|---|
| 787 | :param int NUMCLIENTS: The number of client nodes to create. |
|---|
| 788 | |
|---|
| 789 | :return: A ``Deferred`` that fires when the nodes have connected to |
|---|
| 790 | each other. |
|---|
| 791 | """ |
|---|
| 792 | self.assertIn( |
|---|
| 793 | self.FORCE_FOOLSCAP_FOR_STORAGE, (True, False), |
|---|
| 794 | "You forgot to set FORCE_FOOLSCAP_FOR_STORAGE on {}".format(self.__class__) |
|---|
| 795 | ) |
|---|
| 796 | self.numclients = NUMCLIENTS |
|---|
| 797 | |
|---|
| 798 | self.introducer = yield self._create_introducer() |
|---|
| 799 | self.add_service(self.introducer) |
|---|
| 800 | self.introweb_url = self._get_introducer_web() |
|---|
| 801 | yield self._set_up_client_nodes(self.FORCE_FOOLSCAP_FOR_STORAGE) |
|---|
| 802 | native_server = next(iter(self.clients[0].storage_broker.get_known_servers())) |
|---|
| 803 | if self.FORCE_FOOLSCAP_FOR_STORAGE: |
|---|
| 804 | expected_storage_server_class = NativeStorageServer |
|---|
| 805 | else: |
|---|
| 806 | expected_storage_server_class = HTTPNativeStorageServer |
|---|
| 807 | self.assertIsInstance(native_server, expected_storage_server_class) |
|---|
| 808 | |
|---|
| 809 | @inlineCallbacks |
|---|
| 810 | def _set_up_client_nodes(self, force_foolscap): |
|---|
| 811 | q = self.introducer |
|---|
| 812 | self.introducer_furl = q.introducer_url |
|---|
| 813 | self.clients = [] |
|---|
| 814 | basedirs = [] |
|---|
| 815 | for i in range(self.numclients): |
|---|
| 816 | basedirs.append((yield self._set_up_client_node(i, force_foolscap))) |
|---|
| 817 | |
|---|
| 818 | # start clients[0], wait for it's tub to be ready (at which point it |
|---|
| 819 | # will have registered the helper furl). |
|---|
| 820 | c = yield client.create_client(basedirs[0]) |
|---|
| 821 | c.setServiceParent(self.sparent) |
|---|
| 822 | self.clients.append(c) |
|---|
| 823 | |
|---|
| 824 | with open(os.path.join(basedirs[0],"private","helper.furl"), "r") as f: |
|---|
| 825 | helper_furl = f.read() |
|---|
| 826 | |
|---|
| 827 | self.helper_furl = helper_furl |
|---|
| 828 | if self.numclients >= 2: |
|---|
| 829 | with open(os.path.join(basedirs[1], 'tahoe.cfg'), 'a+') as f: |
|---|
| 830 | f.write( |
|---|
| 831 | "[client]\n" |
|---|
| 832 | "helper.furl = {}\n".format(helper_furl) |
|---|
| 833 | ) |
|---|
| 834 | |
|---|
| 835 | # this starts the rest of the clients |
|---|
| 836 | for i in range(1, self.numclients): |
|---|
| 837 | c = yield client.create_client(basedirs[i]) |
|---|
| 838 | c.setServiceParent(self.sparent) |
|---|
| 839 | self.clients.append(c) |
|---|
| 840 | log.msg("STARTING") |
|---|
| 841 | yield self.wait_for_connections() |
|---|
| 842 | log.msg("CONNECTED") |
|---|
| 843 | # now find out where the web port was |
|---|
| 844 | self.webish_url = self.clients[0].getServiceNamed("webish").getURL() |
|---|
| 845 | if self.numclients >=2: |
|---|
| 846 | # and the helper-using webport |
|---|
| 847 | self.helper_webish_url = self.clients[1].getServiceNamed("webish").getURL() |
|---|
| 848 | |
|---|
| 849 | def _generate_config(self, which, basedir, force_foolscap=False): |
|---|
| 850 | config = {} |
|---|
| 851 | |
|---|
| 852 | allclients = set(range(self.numclients)) |
|---|
| 853 | except1 = allclients - {1} |
|---|
| 854 | feature_matrix = { |
|---|
| 855 | ("client", "nickname"): except1, |
|---|
| 856 | |
|---|
| 857 | # Auto-assigning addresses is extremely failure prone and not |
|---|
| 858 | # amenable to automated testing in _this_ manner. |
|---|
| 859 | ("node", "tub.port"): allclients, |
|---|
| 860 | ("node", "tub.location"): allclients, |
|---|
| 861 | |
|---|
| 862 | # client 0 runs a webserver and a helper |
|---|
| 863 | # client 1 runs a webserver but no helper |
|---|
| 864 | ("node", "web.port"): {0, 1}, |
|---|
| 865 | ("node", "timeout.keepalive"): {0}, |
|---|
| 866 | ("node", "timeout.disconnect"): {1}, |
|---|
| 867 | |
|---|
| 868 | ("helper", "enabled"): {0}, |
|---|
| 869 | } |
|---|
| 870 | |
|---|
| 871 | def setconf(config, which, section, feature, value): |
|---|
| 872 | if which in feature_matrix.get((section, feature), {which}): |
|---|
| 873 | config.setdefault(section, {})[feature] = value |
|---|
| 874 | |
|---|
| 875 | setnode = partial(setconf, config, which, "node") |
|---|
| 876 | sethelper = partial(setconf, config, which, "helper") |
|---|
| 877 | |
|---|
| 878 | setnode("nickname", u"client %d \N{BLACK SMILING FACE}" % (which,)) |
|---|
| 879 | setconf(config, which, "storage", "force_foolscap", str(force_foolscap)) |
|---|
| 880 | setconf(config, which, "client", "force_foolscap", str(force_foolscap)) |
|---|
| 881 | |
|---|
| 882 | tub_location_hint, tub_port_endpoint = self.port_assigner.assign(reactor) |
|---|
| 883 | setnode("tub.port", tub_port_endpoint) |
|---|
| 884 | setnode("tub.location", tub_location_hint) |
|---|
| 885 | |
|---|
| 886 | _, web_port_endpoint = self.port_assigner.assign(reactor) |
|---|
| 887 | setnode("web.port", web_port_endpoint) |
|---|
| 888 | setnode("timeout.keepalive", "600") |
|---|
| 889 | setnode("timeout.disconnect", "1800") |
|---|
| 890 | |
|---|
| 891 | sethelper("enabled", "True") |
|---|
| 892 | |
|---|
| 893 | iyaml = ("introducers:\n" |
|---|
| 894 | " petname2:\n" |
|---|
| 895 | " furl: %s\n") % self.introducer_furl |
|---|
| 896 | iyaml_fn = os.path.join(basedir, "private", "introducers.yaml") |
|---|
| 897 | fileutil.write(iyaml_fn, iyaml) |
|---|
| 898 | return _render_config(config) |
|---|
| 899 | |
|---|
| 900 | def _set_up_client_node(self, which, force_foolscap): |
|---|
| 901 | basedir = self.getdir("client%d" % (which,)) |
|---|
| 902 | fileutil.make_dirs(os.path.join(basedir, "private")) |
|---|
| 903 | if len(SYSTEM_TEST_CERTS) > (which + 1): |
|---|
| 904 | f = open(os.path.join(basedir, "private", "node.pem"), "w") |
|---|
| 905 | f.write(SYSTEM_TEST_CERTS[which + 1]) |
|---|
| 906 | f.close() |
|---|
| 907 | config = self._generate_config(which, basedir, force_foolscap) |
|---|
| 908 | fileutil.write(os.path.join(basedir, 'tahoe.cfg'), config) |
|---|
| 909 | return basedir |
|---|
| 910 | |
|---|
| 911 | def bounce_client(self, num): |
|---|
| 912 | c = self.clients[num] |
|---|
| 913 | d = c.disownServiceParent() |
|---|
| 914 | # I think windows requires a moment to let the connection really stop |
|---|
| 915 | # and the port number made available for re-use. TODO: examine the |
|---|
| 916 | # behavior, see if this is really the problem, see if we can do |
|---|
| 917 | # better than blindly waiting for a second. |
|---|
| 918 | d.addCallback(self.stall, 1.0) |
|---|
| 919 | |
|---|
| 920 | @defer.inlineCallbacks |
|---|
| 921 | def _stopped(res): |
|---|
| 922 | new_c = yield client.create_client(self.getdir("client%d" % num)) |
|---|
| 923 | self.clients[num] = new_c |
|---|
| 924 | new_c.setServiceParent(self.sparent) |
|---|
| 925 | d.addCallback(_stopped) |
|---|
| 926 | d.addCallback(lambda res: self.wait_for_connections()) |
|---|
| 927 | def _maybe_get_webport(res): |
|---|
| 928 | if num == 0: |
|---|
| 929 | # now find out where the web port was |
|---|
| 930 | self.webish_url = self.clients[0].getServiceNamed("webish").getURL() |
|---|
| 931 | d.addCallback(_maybe_get_webport) |
|---|
| 932 | return d |
|---|
| 933 | |
|---|
| 934 | @defer.inlineCallbacks |
|---|
| 935 | def add_extra_node(self, client_num, helper_furl=None, |
|---|
| 936 | add_to_sparent=False): |
|---|
| 937 | # usually this node is *not* parented to our self.sparent, so we can |
|---|
| 938 | # shut it down separately from the rest, to exercise the |
|---|
| 939 | # connection-lost code |
|---|
| 940 | basedir = FilePath(self.getdir("client%d" % client_num)) |
|---|
| 941 | basedir.makedirs() |
|---|
| 942 | config = ( |
|---|
| 943 | "[node]\n" |
|---|
| 944 | "tub.location = {}\n" |
|---|
| 945 | "tub.port = {}\n" |
|---|
| 946 | "[client]\n" |
|---|
| 947 | ).format(*self.port_assigner.assign(reactor)) |
|---|
| 948 | |
|---|
| 949 | if helper_furl: |
|---|
| 950 | config += "helper.furl = %s\n" % helper_furl |
|---|
| 951 | basedir.child("tahoe.cfg").setContent(config.encode("utf-8")) |
|---|
| 952 | private = basedir.child("private") |
|---|
| 953 | private.makedirs() |
|---|
| 954 | write_introducer( |
|---|
| 955 | basedir, |
|---|
| 956 | "default", |
|---|
| 957 | self.introducer_furl, |
|---|
| 958 | ) |
|---|
| 959 | |
|---|
| 960 | c = yield client.create_client(basedir.path) |
|---|
| 961 | self.clients.append(c) |
|---|
| 962 | self.numclients += 1 |
|---|
| 963 | if add_to_sparent: |
|---|
| 964 | c.setServiceParent(self.sparent) |
|---|
| 965 | else: |
|---|
| 966 | c.startService() |
|---|
| 967 | yield self.wait_for_connections() |
|---|
| 968 | defer.returnValue(c) |
|---|
| 969 | |
|---|
| 970 | def _check_connections(self): |
|---|
| 971 | for i, c in enumerate(self.clients): |
|---|
| 972 | if not c.connected_to_introducer(): |
|---|
| 973 | log.msg("%s not connected to introducer yet" % (i,)) |
|---|
| 974 | return False |
|---|
| 975 | sb = c.get_storage_broker() |
|---|
| 976 | connected_servers = sb.get_connected_servers() |
|---|
| 977 | connected_names = sorted(list( |
|---|
| 978 | connected.get_nickname() |
|---|
| 979 | for connected |
|---|
| 980 | in sb.get_known_servers() |
|---|
| 981 | if connected.is_connected() |
|---|
| 982 | )) |
|---|
| 983 | if len(connected_servers) != self.numclients: |
|---|
| 984 | wanted = sorted(list( |
|---|
| 985 | client.nickname |
|---|
| 986 | for client |
|---|
| 987 | in self.clients |
|---|
| 988 | )) |
|---|
| 989 | log.msg( |
|---|
| 990 | "client %s storage broker connected to %s, missing %s" % ( |
|---|
| 991 | i, |
|---|
| 992 | connected_names, |
|---|
| 993 | set(wanted) - set(connected_names), |
|---|
| 994 | ) |
|---|
| 995 | ) |
|---|
| 996 | return False |
|---|
| 997 | log.msg("client %s storage broker connected to %s, happy" % ( |
|---|
| 998 | i, connected_names, |
|---|
| 999 | )) |
|---|
| 1000 | up = c.getServiceNamed("uploader") |
|---|
| 1001 | if up._helper_furl and not up._helper: |
|---|
| 1002 | log.msg("Helper fURL but no helper") |
|---|
| 1003 | return False |
|---|
| 1004 | return True |
|---|
| 1005 | |
|---|
| 1006 | def wait_for_connections(self, ignored=None): |
|---|
| 1007 | return self.poll(self._check_connections, timeout=200) |
|---|