util.py
1 """Utility functions for Let"s Encrypt plugin tests.""" 2 import argparse 3 import copy 4 import contextlib 5 import os 6 import re 7 import shutil 8 import socket 9 import tarfile 10 11 from acme import jose 12 from acme import test_util 13 from letsencrypt import constants 14 15 from letsencrypt_compatibility_test import errors 16 17 18 _KEY_BASE = "rsa1024_key.pem" 19 KEY_PATH = test_util.vector_path(_KEY_BASE) 20 KEY = test_util.load_pyopenssl_private_key(_KEY_BASE) 21 JWK = jose.JWKRSA(key=test_util.load_rsa_private_key(_KEY_BASE)) 22 IP_REGEX = re.compile(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$") 23 24 25 def create_le_config(parent_dir): 26 """Sets up LE dirs in parent_dir and returns the config dict""" 27 config = copy.deepcopy(constants.CLI_DEFAULTS) 28 29 le_dir = os.path.join(parent_dir, "letsencrypt") 30 config["config_dir"] = os.path.join(le_dir, "config") 31 config["work_dir"] = os.path.join(le_dir, "work") 32 config["logs_dir"] = os.path.join(le_dir, "logs_dir") 33 os.makedirs(config["config_dir"]) 34 os.mkdir(config["work_dir"]) 35 os.mkdir(config["logs_dir"]) 36 37 return argparse.Namespace(**config) # pylint: disable=star-args 38 39 40 def extract_configs(configs, parent_dir): 41 """Extracts configs to a new dir under parent_dir and returns it""" 42 config_dir = os.path.join(parent_dir, "configs") 43 44 if os.path.isdir(configs): 45 shutil.copytree(configs, config_dir, symlinks=True) 46 elif tarfile.is_tarfile(configs): 47 with tarfile.open(configs, "r") as tar: 48 tar.extractall(config_dir) 49 else: 50 raise errors.Error("Unknown configurations file type") 51 52 return config_dir 53 54 55 def get_two_free_ports(): 56 """Returns two free ports to use for the tests""" 57 with contextlib.closing(socket.socket()) as sock1: 58 with contextlib.closing(socket.socket()) as sock2: 59 sock1.bind(("", 0)) 60 sock2.bind(("", 0)) 61 62 return sock1.getsockname()[1], sock2.getsockname()[1]