Пример #1
0
    def _renewal_request(
        self,
        isd_as: ISD_AS,
        mode: str = "--force",
    ):
        as_dir = self._to_as_dir(isd_as)
        docker_dir = pathlib.Path("/share") / self._rel(as_dir)

        def read_file(filename: str) -> str:
            with open(as_dir / "crypto/as" / filename) as f:
                return f.read()

        chain_name = "ISD%s-AS%s.pem" % (isd_as.isd_str(),
                                         isd_as.as_file_fmt())
        old_chain = read_file(chain_name)
        old_key = read_file("cp-as.key")

        chain = docker_dir / "crypto/as" / chain_name
        args = [
            chain,
            docker_dir / "crypto/as/cp-as.key",
            mode,
            "--trc",
            docker_dir / "certs/ISD1-B1-S1.trc",
            "--sciond",
            self.execute("tester_%s" % isd_as.file_fmt(), "sh", "-c",
                         "echo $SCION_DAEMON").strip(),
            *self._local_flags(isd_as),
        ]

        logger.info("Requesting certificate chain renewal: %s" %
                    chain.relative_to(docker_dir))
        logger.info(
            self.execute("tester_%s" % isd_as.file_fmt(), "./bin/scion-pki",
                         "certificate", "renew", *args))

        logger.info("Verify renewed certificate chain")
        verify_out = self.execute("tester_%s" % isd_as.file_fmt(),
                                  "./bin/scion-pki", "certificate", "verify",
                                  chain, "--trc",
                                  "/share/gen/trcs/ISD1-B1-S1.trc")
        logger.info(str(verify_out).rstrip("\n"))

        renewed_chain = read_file(chain_name)
        renewed_key = read_file("cp-as.key")
        if renewed_chain == old_chain:
            raise Exception(
                "renewed chain does not differ from previous chain")
        if renewed_key == old_key:
            raise Exception("renewed key does not differ from previous key")
Пример #2
0
    def execute_tester(self, isd_as: ISD_AS, cmd: str, *args: str) -> str:
        """Executes a command in the designated "tester" container for the specified ISD-AS.

        Returns:
            The output of the command.
        """
        return self.dc.execute("tester_%s" % isd_as.file_fmt(), cmd, *args)
Пример #3
0
 def execute(self, isd_as: ISD_AS, cmd: str, *args: str) -> str:
     expanded = []
     for arg in args:
         if str(arg).startswith('gen/'):
             arg = '/share/' + arg
         expanded.append(arg)
     return docker('exec', 'tester_%s' % isd_as.file_fmt(), cmd, *expanded)
Пример #4
0
    def _check_key_cert(self, cs_configs: List[pathlib.Path]):
        not_ready = [*cs_configs]

        for _ in range(5):
            logger.info(
                "Checking if all control servers have reloaded the key and certificate..."
            )
            for cs_config in not_ready:
                conn = client.HTTPConnection(self._http_endpoint(cs_config))
                conn.request("GET", "/signer")
                resp = conn.getresponse()
                if resp.status != 200:
                    logger.info("Unexpected response: %d %s", resp.status,
                                resp.reason)
                    continue

                isd_as = ISD_AS(cs_config.stem[2:-2])
                as_dir = self._to_as_dir(isd_as)
                chain_name = "ISD%s-AS%s.pem" % (isd_as.isd_str(),
                                                 isd_as.as_file_fmt())

                pld = json.loads(resp.read().decode("utf-8"))
                if pld["subject_key_id"] != self._extract_skid(
                        as_dir / "crypto/as" / chain_name):
                    continue
                logger.info(
                    "Control server successfully loaded new key and certificate: %s"
                    % self._rel(cs_config))
                not_ready.remove(cs_config)
            if not not_ready:
                break
            time.sleep(3)
        else:
            logger.error(
                "Control servers without reloaded key and certificate: %s" %
                [cs_config.name for cs_config in not_ready])
            sys.exit(1)
Пример #5
0
 def _local_flags(self, isd_as: ISD_AS) -> List[str]:
     return [
         "--local",
         self.execute("tester_%s" % isd_as.file_fmt(), "sh", "-c",
                      "echo $SCION_LOCAL_ADDR").strip(),
     ]
Пример #6
0
 def _to_as_dir(self, isd_as: ISD_AS) -> pathlib.Path:
     return pathlib.Path("%s/gen/AS%s" %
                         (self.test_state.artifacts, isd_as.as_file_fmt()))
Пример #7
0
 def load(file: str = "gen/as_list.yml") -> "ASList":
     with open(file, "r") as content:
         data = yaml.load(content, yaml.Loader)
     cores = [ISD_AS(raw) for raw in data["Core"]]
     non_cores = [ISD_AS(raw) for raw in data["Non-core"]]
     return ASList(cores, non_cores)