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]