stoobly-agent 1.5.4__py3-none-any.whl → 1.5.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- stoobly_agent/__init__.py +1 -1
- stoobly_agent/app/cli/ca_cert_cli.py +7 -6
- stoobly_agent/app/cli/helpers/certificate_authority.py +1 -1
- stoobly_agent/app/cli/scaffold/app.py +1 -1
- stoobly_agent/app/cli/scaffold/containerized_app.py +5 -0
- stoobly_agent/app/cli/scaffold/docker/builder.py +4 -4
- stoobly_agent/app/cli/scaffold/docker/constants.py +1 -1
- stoobly_agent/app/cli/scaffold/templates/app/.Makefile +11 -11
- stoobly_agent/app/cli/scaffold/templates/app/.docker-compose.base.yml +1 -6
- stoobly_agent/app/cli/scaffold/templates/app/entrypoint/mock/bin/.configure +2 -2
- stoobly_agent/app/cli/scaffold/templates/app/entrypoint/record/bin/.configure +2 -2
- stoobly_agent/app/cli/scaffold/templates/app/entrypoint/test/bin/.configure +2 -2
- stoobly_agent/app/cli/scaffold/templates/app/gateway/mock/.docker-compose.mock.yml +2 -2
- stoobly_agent/app/cli/scaffold/templates/app/gateway/record/.docker-compose.record.yml +2 -2
- stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/.docker-compose.base.yml +1 -1
- stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.down +2 -3
- stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.logs +1 -3
- stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.up +4 -7
- stoobly_agent/app/cli/scaffold/templates/workflow/record/bin/configure +2 -2
- stoobly_agent/app/cli/scaffold_cli.py +86 -50
- stoobly_agent/app/proxy/run.py +4 -0
- stoobly_agent/cli.py +2 -2
- stoobly_agent/config/data_dir.py +15 -47
- stoobly_agent/config/mitmproxy.py +0 -17
- stoobly_agent/test/app/cli/helpers/certificate_authority_test.py +1 -2
- stoobly_agent/test/app/models/schemas/.stoobly/db/VERSION +1 -1
- stoobly_agent/test/config/data_dir_test.py +1 -10
- stoobly_agent/test/mock_data/scaffold/docker-compose-local-service.yml +2 -2
- {stoobly_agent-1.5.4.dist-info → stoobly_agent-1.5.6.dist-info}/METADATA +1 -1
- {stoobly_agent-1.5.4.dist-info → stoobly_agent-1.5.6.dist-info}/RECORD +33 -33
- {stoobly_agent-1.5.4.dist-info → stoobly_agent-1.5.6.dist-info}/WHEEL +1 -1
- stoobly_agent/config/constants/mitmproxy.py +0 -4
- {stoobly_agent-1.5.4.dist-info → stoobly_agent-1.5.6.dist-info}/LICENSE +0 -0
- {stoobly_agent-1.5.4.dist-info → stoobly_agent-1.5.6.dist-info}/entry_points.txt +0 -0
stoobly_agent/__init__.py
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
COMMAND = 'stoobly-agent'
|
2
|
-
VERSION = '1.5.
|
2
|
+
VERSION = '1.5.6'
|
@@ -15,13 +15,13 @@ def ca_cert(ctx):
|
|
15
15
|
pass
|
16
16
|
|
17
17
|
@ca_cert.command()
|
18
|
-
@click.option('--ca-certs-dir-path', default=DataDir.instance().
|
18
|
+
@click.option('--ca-certs-dir-path', default=DataDir.instance().ca_certs_dir_path, help='Path to ca certs directory used to sign SSL certs.')
|
19
19
|
@click.option('--certs-dir-path', default=DataDir.instance().certs_dir_path, help='Output directory.')
|
20
20
|
@click.argument('hostname')
|
21
21
|
def mkcert(**kwargs):
|
22
|
-
|
22
|
+
ca_certs_dir_path = kwargs['ca_certs_dir_path']
|
23
23
|
|
24
|
-
installer = CertificateAuthority(
|
24
|
+
installer = CertificateAuthority(ca_certs_dir_path)
|
25
25
|
|
26
26
|
try:
|
27
27
|
installer.sign(kwargs['hostname'], kwargs['certs_dir_path'])
|
@@ -30,10 +30,11 @@ def mkcert(**kwargs):
|
|
30
30
|
sys.exit(1)
|
31
31
|
|
32
32
|
@ca_cert.command()
|
33
|
-
@click.option('--ca-certs-dir-path', default=DataDir.instance().
|
33
|
+
@click.option('--ca-certs-dir-path', default=DataDir.instance().ca_certs_dir_path, help='Path to ca certs directory.')
|
34
34
|
def install(**kwargs):
|
35
|
-
|
36
|
-
|
35
|
+
pdb.set_trace()
|
36
|
+
ca_certs_dir_path = kwargs['ca_certs_dir_path']
|
37
|
+
installer = CertificateAuthority(ca_certs_dir_path)
|
37
38
|
|
38
39
|
try:
|
39
40
|
installer.install()
|
@@ -21,7 +21,7 @@ MITMPROXY_CN = 'mitmproxy'
|
|
21
21
|
|
22
22
|
class CertificateAuthority():
|
23
23
|
|
24
|
-
def __init__(self, certs_dir = DataDir.instance().
|
24
|
+
def __init__(self, certs_dir = DataDir.instance().ca_certs_dir_path, cn = MITMPROXY_CN):
|
25
25
|
self.certs_dir = certs_dir
|
26
26
|
self.cn = cn
|
27
27
|
self.key_size = 2048
|
@@ -10,7 +10,7 @@ class App():
|
|
10
10
|
data_dir: DataDir = DataDir.instance(path)
|
11
11
|
|
12
12
|
self.__data_dir_path = data_dir.path
|
13
|
-
self.__ca_certs_dir_path = kwargs.get('ca_certs_dir_path') or data_dir.
|
13
|
+
self.__ca_certs_dir_path = kwargs.get('ca_certs_dir_path') or data_dir.ca_certs_dir_path
|
14
14
|
self.__certs_dir_path = kwargs.get('certs_dir_path') or data_dir.certs_dir_path
|
15
15
|
self.__context_dir_path = kwargs.get('context_dir_path') or data_dir.context_dir_path
|
16
16
|
self.__data_dir = data_dir
|
@@ -3,7 +3,7 @@ import pathlib
|
|
3
3
|
import pdb
|
4
4
|
import yaml
|
5
5
|
|
6
|
-
from .constants import APP_NETWORK,
|
6
|
+
from .constants import APP_NETWORK, APP_NETWORK_NAME, DOCKER_COMPOSE_CUSTOM
|
7
7
|
|
8
8
|
class Builder():
|
9
9
|
|
@@ -36,11 +36,11 @@ class Builder():
|
|
36
36
|
|
37
37
|
@property
|
38
38
|
def public_network(self):
|
39
|
-
return self.__networks.get(
|
39
|
+
return self.__networks.get(APP_NETWORK_NAME)
|
40
40
|
|
41
41
|
@property
|
42
42
|
def public_network_name(self):
|
43
|
-
return
|
43
|
+
return APP_NETWORK_NAME
|
44
44
|
|
45
45
|
@property
|
46
46
|
def networks(self):
|
@@ -91,7 +91,7 @@ class Builder():
|
|
91
91
|
return self
|
92
92
|
|
93
93
|
def with_public_network(self, network = APP_NETWORK):
|
94
|
-
self.__networks[
|
94
|
+
self.__networks[APP_NETWORK_NAME] = {
|
95
95
|
'external': True,
|
96
96
|
'name': network,
|
97
97
|
}
|
@@ -1,10 +1,10 @@
|
|
1
|
+
APP_NETWORK_NAME = 'app'
|
1
2
|
APP_NETWORK = '${APP_NETWORK}'
|
2
3
|
DOCKER_COMPOSE_BASE = '.docker-compose.base.yml'
|
3
4
|
DOCKER_COMPOSE_BASE_TEMPLATE = '.docker-compose.base.template.yml'
|
4
5
|
DOCKER_COMPOSE_CUSTOM = 'docker-compose.yml'
|
5
6
|
DOCKERFILE_CONTEXT = '.Dockerfile.context'
|
6
7
|
DOCKERFILE_SERVICE = 'Dockerfile.source'
|
7
|
-
GATEWAY_NETWORK = 'gateway'
|
8
8
|
|
9
9
|
# TODO: add scaffold container name templates here
|
10
10
|
|
@@ -16,22 +16,22 @@ CONTEXT_DIR_DEFAULT := $(realpath $(DIR)/../..)
|
|
16
16
|
|
17
17
|
# Configuration
|
18
18
|
app_dir=$$(realpath "$${STOOBLY_APP_DIR:-$(CONTEXT_DIR_DEFAULT)}")
|
19
|
-
ca_certs_dir=$$(realpath "$${STOOBLY_CA_CERTS_DIR
|
19
|
+
ca_certs_dir=$$(realpath "$${STOOBLY_CA_CERTS_DIR:-$(app_data_dir)/ca_certs}")
|
20
20
|
certs_dir=$$(realpath "$${STOOBLY_CERTS_DIR:-$(app_data_dir)/certs}")
|
21
21
|
context_dir=$$(realpath "$${STOOBLY_CONTEXT_DIR:-$(CONTEXT_DIR_DEFAULT)}")
|
22
|
+
workflow_service_options=$(shell echo $$STOOBLY_WORKFLOW_SERVICE_OPTIONS)
|
22
23
|
|
23
24
|
user_id_option=--user-id $(USER_ID)
|
24
25
|
stoobly_exec_options=--profile $(EXEC_WORKFLOW_NAME) -p $(EXEC_WORKFLOW_NAME)
|
25
|
-
|
26
|
-
|
27
|
-
workflow_up_options=--app-dir-path $(app_dir) --context-dir-path $(context_dir) --ca-certs-dir-path $(ca_certs_dir) --certs-dir-path $(certs_dir) --from-make $(user_id_option)
|
26
|
+
workflow_run_options=--script-path $(workflow_script) $(workflow_service_options)
|
27
|
+
workflow_up_options=--app-dir-path $(app_dir) --context-dir-path $(context_dir) --ca-certs-dir-path $(ca_certs_dir) --certs-dir-path $(certs_dir) $(user_id_option)
|
28
28
|
|
29
29
|
app_data_dir=$(app_dir)/.stoobly
|
30
30
|
app_namespace_dir=$(app_data_dir)/docker
|
31
31
|
app_tmp_dir=$(app_data_dir)/tmp
|
32
32
|
dockerfile_path=$(app_namespace_dir)/.Dockerfile.context
|
33
33
|
docker_compose_file_path=$(app_namespace_dir)/stoobly-ui/exec/.docker-compose.exec.yml
|
34
|
-
|
34
|
+
workflow_script=.stoobly/tmp/$(WORKFLOW).sh
|
35
35
|
|
36
36
|
# Commands
|
37
37
|
docker_command=docker
|
@@ -55,14 +55,14 @@ stoobly_exec_run=$(stoobly_exec_build) && $(stoobly_exec_run_env) $(exec_up)
|
|
55
55
|
stoobly_exec_run_env=$(source_env) && $(exec_env) CONTEXT_DIR="$(app_dir)"
|
56
56
|
|
57
57
|
# Workflow run
|
58
|
-
workflow_run=$(source_env) && bash "$(
|
58
|
+
workflow_run=$(source_env) && bash "$(app_dir)/$(workflow_script)"
|
59
59
|
|
60
60
|
ca-cert/install: stoobly/install
|
61
|
-
@if [
|
61
|
+
@if [ -z "$$(ls $(ca_certs_dir) 2> /dev/null)" ]; then \
|
62
62
|
read -p "Installing CA certificate is required for $(WORKFLOW)ing requests, continue? (y/N) " confirm && \
|
63
63
|
if [ "$$confirm" = "y" ] || [ "$$confirm" = "Y" ]; then \
|
64
64
|
echo "Running stoobly-agent ca-cert install..."; \
|
65
|
-
stoobly-agent ca-cert install; \
|
65
|
+
stoobly-agent ca-cert install --ca-certs-dir-path $(ca_certs_dir); \
|
66
66
|
else \
|
67
67
|
echo "You can install the CA certificate later by running: stoobly-agent ca-cert install"; \
|
68
68
|
fi \
|
@@ -153,7 +153,7 @@ tmpdir:
|
|
153
153
|
@mkdir -p $(app_tmp_dir)
|
154
154
|
workflow/down:
|
155
155
|
@export EXEC_COMMAND=bin/.down && \
|
156
|
-
export EXEC_OPTIONS="$(
|
156
|
+
export EXEC_OPTIONS="$(user_id_option) $(workflow_run_options) $(options)" && \
|
157
157
|
export EXEC_ARGS="$(WORKFLOW)" && \
|
158
158
|
$(stoobly_exec_run) && \
|
159
159
|
$(workflow_run)
|
@@ -173,7 +173,7 @@ workflow/hostname/install: command/install workflow/hostname
|
|
173
173
|
workflow/hostname/uninstall: command/uninstall workflow/hostname
|
174
174
|
workflow/logs:
|
175
175
|
@export EXEC_COMMAND=bin/.logs && \
|
176
|
-
export EXEC_OPTIONS="$(
|
176
|
+
export EXEC_OPTIONS="$(workflow_run_options) $(options)" && \
|
177
177
|
export EXEC_ARGS="$(WORKFLOW)" && \
|
178
178
|
$(stoobly_exec_run) && \
|
179
179
|
$(workflow_run)
|
@@ -190,7 +190,7 @@ workflow/test:
|
|
190
190
|
$(eval WORKFLOW=test)
|
191
191
|
workflow/up:
|
192
192
|
@export EXEC_COMMAND=bin/.up && \
|
193
|
-
export EXEC_OPTIONS="$(workflow_up_options) $(
|
193
|
+
export EXEC_OPTIONS="$(user_id_option) $(workflow_up_options) $(workflow_run_options) $(options)" && \
|
194
194
|
export EXEC_ARGS="$(WORKFLOW)" && \
|
195
195
|
$(stoobly_exec_run) && \
|
196
196
|
$(workflow_run)
|
@@ -6,9 +6,4 @@ services:
|
|
6
6
|
- ${CONTEXT_DIR}/.stoobly:/home/stoobly/.stoobly
|
7
7
|
- ${APP_DIR}/.stoobly/docker:/home/stoobly/.stoobly/docker
|
8
8
|
stoobly_base:
|
9
|
-
image: stoobly.${USER_ID}
|
10
|
-
ui_base:
|
11
|
-
extends:
|
12
|
-
service: context_base
|
13
|
-
volumes:
|
14
|
-
- ${CA_CERTS_DIR}:/home/stoobly/.mitmproxy
|
9
|
+
image: stoobly.${USER_ID}
|
@@ -1,9 +1,9 @@
|
|
1
1
|
#!/bin/bash
|
2
2
|
|
3
|
-
echo "Configuring intercept
|
3
|
+
echo "Configuring intercept..."
|
4
4
|
stoobly-agent intercept configure --mode mock --policy all
|
5
5
|
|
6
|
-
echo "Enabling intercept"
|
6
|
+
echo "Enabling intercept..."
|
7
7
|
stoobly-agent intercept enable
|
8
8
|
|
9
9
|
entrypoint=$(dirname -- "$0")/configure
|
@@ -1,9 +1,9 @@
|
|
1
1
|
#!/bin/bash
|
2
2
|
|
3
|
-
echo "Configuring intercept
|
3
|
+
echo "Configuring intercept..."
|
4
4
|
stoobly-agent intercept configure --mode record --policy all
|
5
5
|
|
6
|
-
echo "Disabling intercept"
|
6
|
+
echo "Disabling intercept..."
|
7
7
|
stoobly-agent intercept disable
|
8
8
|
|
9
9
|
entrypoint=$(dirname -- "$0")/configure
|
@@ -1,9 +1,9 @@
|
|
1
1
|
#!/bin/bash
|
2
2
|
|
3
|
-
echo "Configuring intercept
|
3
|
+
echo "Configuring intercept..."
|
4
4
|
stoobly-agent intercept configure --mode mock --policy all
|
5
5
|
|
6
|
-
echo "Enabling intercept"
|
6
|
+
echo "Enabling intercept..."
|
7
7
|
stoobly-agent intercept enable
|
8
8
|
|
9
9
|
entrypoint=$(dirname -- "$0")/configure
|
@@ -1,13 +1,12 @@
|
|
1
1
|
#!/bin/bash
|
2
2
|
|
3
3
|
extra_options=$EXEC_OPTIONS
|
4
|
-
workflow=$1
|
5
4
|
|
6
5
|
mkdir -p .stoobly/tmp
|
7
6
|
|
8
7
|
stoobly-agent scaffold workflow down \
|
9
8
|
--app-dir-path "$(pwd)" \
|
9
|
+
--containerized \
|
10
10
|
--dry-run \
|
11
11
|
--log-level error \
|
12
|
-
$extra_options
|
13
|
-
$workflow > .stoobly/tmp/run.sh
|
12
|
+
$extra_options $1 > /dev/null
|
@@ -1,15 +1,12 @@
|
|
1
1
|
#!/bin/bash
|
2
2
|
|
3
3
|
extra_options=$EXEC_OPTIONS
|
4
|
-
workflow=$1
|
5
|
-
|
6
|
-
mkdir -p .stoobly/tmp
|
7
|
-
|
8
|
-
stoobly-agent scaffold app mkcert
|
9
4
|
|
10
5
|
stoobly-agent scaffold workflow up \
|
11
6
|
--app-dir-path "$(pwd)" \
|
7
|
+
--containerized \
|
12
8
|
--dry-run \
|
13
9
|
--log-level warning \
|
14
|
-
|
15
|
-
|
10
|
+
--mkcert \
|
11
|
+
--without-base \
|
12
|
+
$extra_options $1 > /dev/null
|
@@ -13,7 +13,7 @@ if [ "$scheme" = 'http' -a "$port" != '80' ] || [ "$scheme" = 'https' -a "$port"
|
|
13
13
|
fi
|
14
14
|
|
15
15
|
# Firewall
|
16
|
-
echo "Configuring firewall rules"
|
16
|
+
echo "Configuring firewall rules..."
|
17
17
|
stoobly-agent config firewall set \
|
18
18
|
--action include \
|
19
19
|
--method GET --method POST --method OPTIONS --method PUT --method DELETE \
|
@@ -21,7 +21,7 @@ stoobly-agent config firewall set \
|
|
21
21
|
--pattern "$url/.*?"
|
22
22
|
|
23
23
|
# Rewrite
|
24
|
-
echo "Configuring rewrite rules"
|
24
|
+
echo "Configuring rewrite rules..."
|
25
25
|
stoobly-agent config rewrite set \
|
26
26
|
--method GET --method POST --method OPTIONS --method PUT --method DELETE \
|
27
27
|
--mode record \
|
@@ -1,9 +1,9 @@
|
|
1
1
|
import click
|
2
|
-
import errno
|
3
2
|
import os
|
4
3
|
import pdb
|
5
4
|
import sys
|
6
5
|
|
6
|
+
from io import TextIOWrapper
|
7
7
|
from typing import List
|
8
8
|
|
9
9
|
from stoobly_agent.app.cli.helpers.certificate_authority import CertificateAuthority
|
@@ -13,6 +13,7 @@ from stoobly_agent.app.cli.scaffold.app_create_command import AppCreateCommand
|
|
13
13
|
from stoobly_agent.app.cli.scaffold.constants import (
|
14
14
|
DOCKER_NAMESPACE, WORKFLOW_CONTAINER_PROXY, WORKFLOW_MOCK_TYPE, WORKFLOW_RECORD_TYPE, WORKFLOW_TEST_TYPE
|
15
15
|
)
|
16
|
+
from stoobly_agent.app.cli.scaffold.containerized_app import ContainerizedApp
|
16
17
|
from stoobly_agent.app.cli.scaffold.docker.service.set_gateway_ports import set_gateway_ports
|
17
18
|
from stoobly_agent.app.cli.scaffold.docker.workflow.decorators_factory import get_workflow_decorators
|
18
19
|
from stoobly_agent.app.cli.scaffold.hosts_file_manager import HostsFileManager
|
@@ -104,7 +105,7 @@ def create(**kwargs):
|
|
104
105
|
help="Scaffold app service certs"
|
105
106
|
)
|
106
107
|
@click.option('--app-dir-path', default=current_working_dir, help='Path to application directory.')
|
107
|
-
@click.option('--ca-certs-dir-path', default=data_dir.
|
108
|
+
@click.option('--ca-certs-dir-path', default=data_dir.ca_certs_dir_path, help='Path to ca certs directory used to sign SSL certs.')
|
108
109
|
@click.option('--certs-dir-path', help='Path to certs directory. Defaults to the certs dir of the context.')
|
109
110
|
@click.option('--context-dir-path', default=data_dir.context_dir_path, help='Path to Stoobly data directory.')
|
110
111
|
@click.option('--service', multiple=True, help='Select which services to run. Defaults to all.')
|
@@ -117,24 +118,7 @@ def mkcert(**kwargs):
|
|
117
118
|
app, service=kwargs['service'], without_core=True, workflow=kwargs['workflow']
|
118
119
|
)
|
119
120
|
|
120
|
-
|
121
|
-
service = Service(service_name, app)
|
122
|
-
__validate_service_dir(service.dir_path)
|
123
|
-
|
124
|
-
service_config = ServiceConfig(service.dir_path)
|
125
|
-
|
126
|
-
if service_config.scheme != 'https':
|
127
|
-
continue
|
128
|
-
|
129
|
-
hostname = service_config.hostname
|
130
|
-
|
131
|
-
if not hostname:
|
132
|
-
continue
|
133
|
-
|
134
|
-
ca = CertificateAuthority(app.ca_certs_dir_path)
|
135
|
-
if not ca.signed(hostname, app.certs_dir_path):
|
136
|
-
Logger.instance(LOG_ID).info(f"Creating cert for {hostname}")
|
137
|
-
ca.sign(hostname, app.certs_dir_path)
|
121
|
+
__services_mkcert(app, services)
|
138
122
|
|
139
123
|
@service.command(
|
140
124
|
help="Scaffold a service",
|
@@ -290,6 +274,7 @@ def copy(**kwargs):
|
|
290
274
|
@workflow.command()
|
291
275
|
@click.option('--app-dir-path', default=current_working_dir, help='Path to application directory.')
|
292
276
|
@click.option('--context-dir-path', default=data_dir.context_dir_path, help='Path to Stoobly data directory.')
|
277
|
+
@click.option('--containerized', is_flag=True, help='Set if run from within a container.')
|
293
278
|
@click.option('--dry-run', default=False, is_flag=True)
|
294
279
|
@click.option('--extra-entrypoint-compose-path', help='Path to extra entrypoint compose file.')
|
295
280
|
@click.option('--log-level', default=INFO, type=click.Choice([DEBUG, INFO, WARNING, ERROR]), help='''
|
@@ -298,6 +283,7 @@ def copy(**kwargs):
|
|
298
283
|
@click.option('--namespace', help='Workflow namespace.')
|
299
284
|
@click.option('--network', help='Workflow network name.')
|
300
285
|
@click.option('--rmi', is_flag=True, help='Remove images used by containers.')
|
286
|
+
@click.option('--script-path', help='Path to intermediate script path.')
|
301
287
|
@click.option('--service', multiple=True, help='Select which services to log. Defaults to all.')
|
302
288
|
@click.option('--user-id', default=os.getuid(), help='OS user ID of the owner of context dir path.')
|
303
289
|
@click.argument('workflow_name')
|
@@ -323,6 +309,8 @@ def down(**kwargs):
|
|
323
309
|
command.current_working_dir = current_working_dir
|
324
310
|
commands.append(command)
|
325
311
|
|
312
|
+
script = __build_script(**kwargs)
|
313
|
+
|
326
314
|
commands = sorted(commands, key=lambda command: command.service_config.priority)
|
327
315
|
for index, command in enumerate(commands):
|
328
316
|
__print_header(f"SERVICE {command.service_name}")
|
@@ -342,11 +330,8 @@ def down(**kwargs):
|
|
342
330
|
)
|
343
331
|
if not exec_command:
|
344
332
|
continue
|
345
|
-
|
346
|
-
|
347
|
-
exec_stream(exec_command)
|
348
|
-
else:
|
349
|
-
print(exec_command)
|
333
|
+
|
334
|
+
print(exec_command, file=script)
|
350
335
|
|
351
336
|
# After services are stopped, their network needs to be removed
|
352
337
|
if len(commands) > 0:
|
@@ -354,16 +339,16 @@ def down(**kwargs):
|
|
354
339
|
|
355
340
|
if kwargs['rmi']:
|
356
341
|
remove_image_command = command.remove_image(kwargs['user_id'])
|
357
|
-
|
358
|
-
exec_stream(remove_image_command)
|
359
|
-
else:
|
360
|
-
print(remove_image_command)
|
342
|
+
print(remove_image_command, file=script)
|
361
343
|
|
362
344
|
remove_network_command = command.remove_network()
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
345
|
+
print(remove_network_command, file=script)
|
346
|
+
|
347
|
+
__run_script(script, kwargs['dry_run'])
|
348
|
+
|
349
|
+
# Options are no longer valid
|
350
|
+
if kwargs['containerized'] and os.path.exists(data_dir.mitmproxy_options_json_path):
|
351
|
+
os.remove(data_dir.mitmproxy_options_json_path)
|
367
352
|
|
368
353
|
@workflow.command()
|
369
354
|
@click.option('--app-dir-path', default=current_working_dir, help='Path to application directory.')
|
@@ -376,6 +361,7 @@ def down(**kwargs):
|
|
376
361
|
Log levels can be "debug", "info", "warning", or "error"
|
377
362
|
''')
|
378
363
|
@click.option('--namespace', help='Workflow namespace.')
|
364
|
+
@click.option('--script-path', help='Path to intermediate script path.')
|
379
365
|
@click.option('--service', multiple=True, help='Select which services to log. Defaults to all.')
|
380
366
|
@click.argument('workflow_name')
|
381
367
|
def logs(**kwargs):
|
@@ -407,6 +393,8 @@ def logs(**kwargs):
|
|
407
393
|
command = WorkflowLogCommand(app, **config)
|
408
394
|
commands.append(command)
|
409
395
|
|
396
|
+
script = __build_script(**kwargs)
|
397
|
+
|
410
398
|
commands = sorted(commands, key=lambda command: command.service_config.priority)
|
411
399
|
for index, command in enumerate(commands):
|
412
400
|
__print_header(f"SERVICE {command.service_name}")
|
@@ -417,39 +405,41 @@ def logs(**kwargs):
|
|
417
405
|
)
|
418
406
|
|
419
407
|
for shell_command in shell_commands:
|
420
|
-
print(shell_command)
|
408
|
+
print(shell_command, file=script)
|
421
409
|
|
422
|
-
|
423
|
-
exec_stream(shell_command)
|
410
|
+
__run_script(script, kwargs['dry_run'])
|
424
411
|
|
425
412
|
@workflow.command()
|
426
413
|
@click.option('--app-dir-path', default=current_working_dir, help='Path to application directory.')
|
427
414
|
@click.option('--build', is_flag=True, help='Build images before starting containers.')
|
428
|
-
@click.option('--ca-certs-dir-path', default=data_dir.
|
415
|
+
@click.option('--ca-certs-dir-path', default=data_dir.ca_certs_dir_path, help='Path to ca certs directory used to sign SSL certs.')
|
429
416
|
@click.option('--certs-dir-path', help='Path to certs directory. Defaults to the certs dir of the context.')
|
417
|
+
@click.option('--containerized', is_flag=True, help='Set if run from within a container.')
|
430
418
|
@click.option('--context-dir-path', default=data_dir.context_dir_path, help='Path to Stoobly data directory.')
|
431
419
|
@click.option('--detached', is_flag=True, help='If set, will not run the highest priority service in the foreground.')
|
432
420
|
@click.option('--dry-run', default=False, is_flag=True, help='If set, prints commands.')
|
433
421
|
@click.option('--extra-entrypoint-compose-path', help='Path to extra entrypoint compose file.')
|
434
|
-
@click.option('--from-make', is_flag=True, help='Set if run from scaffolded Makefile.')
|
435
422
|
@click.option('--log-level', default=INFO, type=click.Choice([DEBUG, INFO, WARNING, ERROR]), help='''
|
436
423
|
Log levels can be "debug", "info", "warning", or "error"
|
437
424
|
''')
|
425
|
+
@click.option('--mkcert', is_flag=True, help='Set to generate SSL certs for HTTPS services.')
|
438
426
|
@click.option('--namespace', help='Workflow namespace.')
|
439
427
|
@click.option('--network', help='Workflow network name.')
|
440
428
|
@click.option('--pull', is_flag=True, help='Pull image before running.')
|
429
|
+
@click.option('--script-path', help='Path to intermediate script path.')
|
441
430
|
@click.option('--service', multiple=True, help='Select which services to run. Defaults to all.')
|
442
431
|
@click.option('--user-id', default=os.getuid(), help='OS user ID of the owner of context dir path.')
|
443
432
|
@click.option('--verbose', is_flag=True)
|
433
|
+
@click.option('--without-base', is_flag=True, help='Disable building Stoobly base image.')
|
444
434
|
@click.argument('workflow_name')
|
445
435
|
def up(**kwargs):
|
446
436
|
os.environ[env_vars.LOG_LEVEL] = kwargs['log_level']
|
447
437
|
|
448
|
-
|
438
|
+
containerized = kwargs['containerized']
|
449
439
|
|
450
440
|
# Because we are running a docker-compose command which depends on APP_DIR env var
|
451
|
-
# when we are running this command
|
452
|
-
app_dir_path = current_working_dir if
|
441
|
+
# when we are running this command within a container, the host's app_dir_path will likely differ
|
442
|
+
app_dir_path = current_working_dir if containerized else kwargs['app_dir_path']
|
453
443
|
app = App(app_dir_path, DOCKER_NAMESPACE, **kwargs)
|
454
444
|
__validate_app(app)
|
455
445
|
|
@@ -461,6 +451,10 @@ def up(**kwargs):
|
|
461
451
|
app, service=kwargs['service'], workflow=[kwargs['workflow_name']]
|
462
452
|
)
|
463
453
|
|
454
|
+
if kwargs['mkcert']:
|
455
|
+
_app = ContainerizedApp(app_dir_path, DOCKER_NAMESPACE) if containerized else app
|
456
|
+
__services_mkcert(_app, services)
|
457
|
+
|
464
458
|
# Gateway ports are dynamically set depending on the workflow run
|
465
459
|
workflow = Workflow(kwargs['workflow_name'], app)
|
466
460
|
set_gateway_ports(workflow.service_paths_from_services(services))
|
@@ -473,23 +467,24 @@ def up(**kwargs):
|
|
473
467
|
command.current_working_dir = current_working_dir
|
474
468
|
commands.append(command)
|
475
469
|
|
470
|
+
script = __build_script(**kwargs)
|
471
|
+
|
476
472
|
# Before services can be started, their image and network needs to be created
|
477
473
|
if len(commands) > 0:
|
478
474
|
command: WorkflowRunCommand = commands[0]
|
479
475
|
|
480
476
|
init_commands = []
|
481
|
-
if not
|
477
|
+
if not kwargs['without_base']:
|
482
478
|
create_image_command = command.create_image(user_id=kwargs['user_id'], verbose=kwargs['verbose'])
|
483
479
|
init_commands.append(create_image_command)
|
484
480
|
|
485
481
|
init_commands.append(command.create_network())
|
486
482
|
joined_command = ' && '.join(init_commands)
|
487
483
|
|
488
|
-
if not
|
484
|
+
if not containerized:
|
489
485
|
command.write_nameservers()
|
490
|
-
|
491
|
-
|
492
|
-
print(joined_command)
|
486
|
+
|
487
|
+
print(joined_command, file=script)
|
493
488
|
|
494
489
|
commands = sorted(commands, key=lambda command: command.service_config.priority)
|
495
490
|
for index, command in enumerate(commands):
|
@@ -515,10 +510,9 @@ def up(**kwargs):
|
|
515
510
|
if not exec_command:
|
516
511
|
continue
|
517
512
|
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
print(exec_command)
|
513
|
+
print(exec_command, file=script)
|
514
|
+
|
515
|
+
__run_script(script, kwargs['dry_run'])
|
522
516
|
|
523
517
|
@workflow.command(
|
524
518
|
help="Validate a scaffold workflow"
|
@@ -620,6 +614,18 @@ scaffold.add_command(service)
|
|
620
614
|
scaffold.add_command(workflow)
|
621
615
|
scaffold.add_command(hostname)
|
622
616
|
|
617
|
+
def __build_script(**kwargs):
|
618
|
+
script_path = kwargs['script_path']
|
619
|
+
if not script_path:
|
620
|
+
script_file_name = f"{kwargs['workflow_name']}.sh"
|
621
|
+
script_path = os.path.join(data_dir.tmp_dir_path, script_file_name)
|
622
|
+
|
623
|
+
# Truncate
|
624
|
+
with open(script_path, 'w'):
|
625
|
+
pass
|
626
|
+
|
627
|
+
return open(script_path, 'a')
|
628
|
+
|
623
629
|
def __elevate_sudo():
|
624
630
|
import subprocess
|
625
631
|
|
@@ -662,6 +668,16 @@ def __get_services(app: App, **kwargs):
|
|
662
668
|
def __print_header(text: str):
|
663
669
|
Logger.instance(LOG_ID).info(f"{bcolors.OKBLUE}{text}{bcolors.ENDC}")
|
664
670
|
|
671
|
+
def __run_script(script: TextIOWrapper, dry_run = False):
|
672
|
+
script.close()
|
673
|
+
|
674
|
+
with open(script.name, 'r') as fp:
|
675
|
+
for line in fp:
|
676
|
+
if not dry_run:
|
677
|
+
exec_stream(line.strip())
|
678
|
+
else:
|
679
|
+
print(line.strip())
|
680
|
+
|
665
681
|
def __scaffold_build(app, **kwargs):
|
666
682
|
command = ServiceCreateCommand(app, **kwargs)
|
667
683
|
|
@@ -672,6 +688,26 @@ def __scaffold_delete(app, **kwargs):
|
|
672
688
|
|
673
689
|
command.delete()
|
674
690
|
|
691
|
+
def __services_mkcert(app: App, services):
|
692
|
+
for service_name in services:
|
693
|
+
service = Service(service_name, app)
|
694
|
+
__validate_service_dir(service.dir_path)
|
695
|
+
|
696
|
+
service_config = ServiceConfig(service.dir_path)
|
697
|
+
|
698
|
+
if service_config.scheme != 'https':
|
699
|
+
continue
|
700
|
+
|
701
|
+
hostname = service_config.hostname
|
702
|
+
|
703
|
+
if not hostname:
|
704
|
+
continue
|
705
|
+
|
706
|
+
ca = CertificateAuthority(app.ca_certs_dir_path)
|
707
|
+
if not ca.signed(hostname, app.certs_dir_path):
|
708
|
+
Logger.instance(LOG_ID).info(f"Creating cert for {hostname}")
|
709
|
+
ca.sign(hostname, app.certs_dir_path)
|
710
|
+
|
675
711
|
def __validate_app(app: App):
|
676
712
|
if not app.valid:
|
677
713
|
print(f"Error: {app.dir_path} is not a valid scaffold app", file=sys.stderr)
|
stoobly_agent/app/proxy/run.py
CHANGED
@@ -101,6 +101,7 @@ def __filter_options(options):
|
|
101
101
|
Filter out non-mitmproxy options
|
102
102
|
'''
|
103
103
|
|
104
|
+
options['confdir'] = options['ca_certs_dir_path']
|
104
105
|
options['listen_host'] = options['proxy_host']
|
105
106
|
options['listen_port'] = options['proxy_port']
|
106
107
|
options['mode'] = options['proxy_mode']
|
@@ -108,6 +109,9 @@ def __filter_options(options):
|
|
108
109
|
if 'api_url' in options:
|
109
110
|
del options['api_url']
|
110
111
|
|
112
|
+
if 'ca_certs_dir_path' in options:
|
113
|
+
del options['ca_certs_dir_path']
|
114
|
+
|
111
115
|
if 'certs' in options and not options['certs']:
|
112
116
|
del options['certs']
|
113
117
|
|
stoobly_agent/cli.py
CHANGED
@@ -11,7 +11,7 @@ from stoobly_agent.app.cli.helpers.handle_mock_service import print_raw_response
|
|
11
11
|
from stoobly_agent.app.cli.helpers.validations import validate_project_key, validate_scenario_key
|
12
12
|
from stoobly_agent.app.proxy.constants import custom_response_codes
|
13
13
|
from stoobly_agent.app.proxy.replay.replay_request_service import replay as replay_request
|
14
|
-
from stoobly_agent.config.constants import env_vars,
|
14
|
+
from stoobly_agent.config.constants import env_vars, mode
|
15
15
|
from stoobly_agent.config.data_dir import DataDir
|
16
16
|
from stoobly_agent.lib.utils.conditional_decorator import ConditionalDecorator
|
17
17
|
|
@@ -79,6 +79,7 @@ def init(**kwargs):
|
|
79
79
|
help="Run proxy and/or UI",
|
80
80
|
)
|
81
81
|
@ConditionalDecorator(lambda f: click.option('--api-url', help='API URL.')(f), is_remote)
|
82
|
+
@click.option('--ca-certs-dir-path', default=DataDir.instance().ca_certs_dir_path, help='Path to ca certs directory used to sign SSL certs.')
|
82
83
|
@click.option('--certs', help='''
|
83
84
|
SSL certificates of the form "[domain=]path". The domain may include a wildcard, and is equal to "*" if not specified. The file at path is a certificate in PEM format. If a private key is included in the
|
84
85
|
PEM, it is used, else the default key in the conf dir is used. The PEM file should contain the full certificate chain, with the leaf certificate as the first entry. May be passed multiple times.
|
@@ -87,7 +88,6 @@ def init(**kwargs):
|
|
87
88
|
Passphrase for decrypting the private key provided in the --cert option. Note that passing cert_passphrase on the command line makes your passphrase visible in your system's process list. Specify it in
|
88
89
|
config.yaml to avoid this.
|
89
90
|
''')
|
90
|
-
@click.option('--confdir', default=mitmproxy.DEFAULT_CONF_DIR_PATH, help='Location of the default mitmproxy configuration files.')
|
91
91
|
@click.option('--connection-strategy', help=', '.join(CONNECTION_STRATEGIES), type=click.Choice(CONNECTION_STRATEGIES))
|
92
92
|
@click.option('--flow-detail', default='1', type=click.Choice(['0', '1', '2', '3', '4']), help='''
|
93
93
|
The display detail level for flows in mitmdump: 0 (quiet) to 4 (very verbose).
|
stoobly_agent/config/data_dir.py
CHANGED
@@ -24,17 +24,7 @@ class DataDir:
|
|
24
24
|
self.__data_dir_path = os.path.join(path, DATA_DIR_NAME)
|
25
25
|
else:
|
26
26
|
cwd = os.getcwd()
|
27
|
-
self.__data_dir_path =
|
28
|
-
|
29
|
-
# If the current working directory does not contain a .stoobly folder,
|
30
|
-
# then search in the parent directories until the home directory.
|
31
|
-
if not os.path.exists(self.__data_dir_path):
|
32
|
-
data_dir = self.find_data_dir(cwd)
|
33
|
-
|
34
|
-
if not data_dir:
|
35
|
-
self.__data_dir_path = os.path.join(os.path.expanduser('~'), DATA_DIR_NAME)
|
36
|
-
else:
|
37
|
-
self.__data_dir_path = data_dir
|
27
|
+
self.__data_dir_path = self.find_data_dir(cwd)
|
38
28
|
|
39
29
|
if not os.path.exists(self.__data_dir_path):
|
40
30
|
self.create(os.path.dirname(self.__data_dir_path))
|
@@ -115,29 +105,13 @@ class DataDir:
|
|
115
105
|
return os.path.join(self.tmp_dir_path, MITMPROXY_OPTIONS_FILE_NAME)
|
116
106
|
|
117
107
|
@property
|
118
|
-
def
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
options_json = self.mitmproxy_options_json_path
|
124
|
-
if os.path.exists(options_json):
|
125
|
-
try:
|
126
|
-
with open(options_json, 'r') as fp:
|
127
|
-
import json
|
128
|
-
contents = fp.read()
|
129
|
-
options = json.loads(contents)
|
130
|
-
_conf_dir = options.get('confdir')
|
131
|
-
|
132
|
-
if _conf_dir and os.path.exists(_conf_dir):
|
133
|
-
conf_dir = _conf_dir
|
134
|
-
except Exception:
|
135
|
-
pass
|
136
|
-
else:
|
137
|
-
if not os.path.exists(conf_dir):
|
138
|
-
os.makedirs(conf_dir)
|
108
|
+
def ca_certs_dir_path(self):
|
109
|
+
path = os.path.join(self.path, 'ca_certs')
|
110
|
+
|
111
|
+
if not os.path.exists(path):
|
112
|
+
os.makedirs(path)
|
139
113
|
|
140
|
-
return
|
114
|
+
return path
|
141
115
|
|
142
116
|
@property
|
143
117
|
def settings_file_path(self):
|
@@ -227,6 +201,7 @@ class DataDir:
|
|
227
201
|
with open(os.path.join(self.__data_dir_path, '.gitignore'), 'w') as fp:
|
228
202
|
fp.write(
|
229
203
|
"\n".join([
|
204
|
+
'ca_certs',
|
230
205
|
'certs',
|
231
206
|
'db',
|
232
207
|
'settings.yml',
|
@@ -236,28 +211,21 @@ class DataDir:
|
|
236
211
|
])
|
237
212
|
)
|
238
213
|
|
239
|
-
|
214
|
+
# If the current working directory does not contain a .stoobly folder,
|
215
|
+
# then search in the parent directories until the home directory.
|
240
216
|
def find_data_dir(self, start_path: str) -> str:
|
241
|
-
# Note: these paths won't work for Windows
|
242
217
|
root_dir = os.path.abspath(os.sep)
|
243
|
-
home_dir = os.path.expanduser("~")
|
244
|
-
root_reached = False
|
245
218
|
|
246
|
-
while
|
219
|
+
while True:
|
247
220
|
data_dir_path = os.path.join(start_path, DATA_DIR_NAME)
|
248
|
-
|
249
|
-
if os.path.exists(data_dir_path):
|
221
|
+
if os.path.exists(data_dir_path) and os.stat(data_dir_path).st_uid == os.getuid():
|
250
222
|
return data_dir_path
|
251
223
|
|
252
|
-
|
253
|
-
break
|
254
|
-
|
224
|
+
# Root reached
|
255
225
|
if start_path == root_dir:
|
256
|
-
|
257
|
-
start_path = home_dir
|
226
|
+
break
|
258
227
|
|
259
228
|
# Move up one directory
|
260
229
|
start_path = os.path.dirname(start_path)
|
261
230
|
|
262
|
-
return
|
263
|
-
|
231
|
+
return os.path.join(os.path.expanduser('~'), DATA_DIR_NAME)
|
@@ -1,12 +1,9 @@
|
|
1
1
|
import json
|
2
|
-
import os
|
3
2
|
import pdb
|
4
3
|
|
5
4
|
from stoobly_agent.config.data_dir import DataDir
|
6
5
|
|
7
6
|
class MitmproxyConfig():
|
8
|
-
MITMPROXY_DIR_NAME = '.mitmproxy'
|
9
|
-
|
10
7
|
__instance = None
|
11
8
|
__master = None
|
12
9
|
|
@@ -16,11 +13,6 @@ class MitmproxyConfig():
|
|
16
13
|
else:
|
17
14
|
self.__master = master
|
18
15
|
|
19
|
-
self.__mitmproxy_dir_path = DataDir.instance().mitmproxy_conf_dir_path
|
20
|
-
|
21
|
-
if not os.path.exists(self.__mitmproxy_dir_path):
|
22
|
-
os.mkdir(self.__mitmproxy_dir_path)
|
23
|
-
|
24
16
|
@classmethod
|
25
17
|
def instance(cls, master = None):
|
26
18
|
if cls.__instance is None:
|
@@ -28,15 +20,6 @@ class MitmproxyConfig():
|
|
28
20
|
|
29
21
|
return cls.__instance
|
30
22
|
|
31
|
-
@property
|
32
|
-
def ca_cert_pem_path(self):
|
33
|
-
path = os.path.join(self.__mitmproxy_dir_path, 'mitmproxy-ca-cert.pem')
|
34
|
-
|
35
|
-
if not os.path.exists(path):
|
36
|
-
return ''
|
37
|
-
|
38
|
-
return path
|
39
|
-
|
40
23
|
def with_master(self, master):
|
41
24
|
from mitmproxy.tools.dump import DumpMaster
|
42
25
|
self.__master: DumpMaster = master
|
@@ -3,7 +3,6 @@ import pytest
|
|
3
3
|
|
4
4
|
from stoobly_agent.test.test_helper import reset
|
5
5
|
|
6
|
-
from stoobly_agent.config.constants.mitmproxy import DEFAULT_CONF_DIR_PATH
|
7
6
|
from stoobly_agent.config.data_dir import DataDir
|
8
7
|
from stoobly_agent.app.cli.helpers.certificate_authority import CertificateAuthority
|
9
8
|
|
@@ -33,7 +32,7 @@ class TestCertificateAuthority():
|
|
33
32
|
return CertificateAuthority()
|
34
33
|
|
35
34
|
def test_defaults_to_mitmproxy_confdir(self, certificate_authority: CertificateAuthority):
|
36
|
-
assert certificate_authority.certs_dir ==
|
35
|
+
assert certificate_authority.certs_dir == DataDir.instance().ca_certs_dir_path
|
37
36
|
|
38
37
|
class TestSign():
|
39
38
|
|
@@ -1 +1 @@
|
|
1
|
-
1.5.
|
1
|
+
1.5.6
|
@@ -5,7 +5,6 @@ import pytest
|
|
5
5
|
|
6
6
|
from stoobly_agent.config.constants.env_vars import ENV
|
7
7
|
from stoobly_agent.config.constants.mode import NONE
|
8
|
-
from stoobly_agent.config.constants.mitmproxy import DEFAULT_CONF_DIR_PATH
|
9
8
|
from stoobly_agent.config.data_dir import DataDir, DATA_DIR_NAME
|
10
9
|
from stoobly_agent.test.test_helper import reset
|
11
10
|
|
@@ -83,12 +82,4 @@ class TestDataDir():
|
|
83
82
|
|
84
83
|
finally:
|
85
84
|
shutil.rmtree(temp_dir)
|
86
|
-
os.chdir(original_cwd)
|
87
|
-
|
88
|
-
class TestMitmproxyConfDirPath():
|
89
|
-
@pytest.fixture(autouse=True, scope='class')
|
90
|
-
def settings(self):
|
91
|
-
return reset()
|
92
|
-
|
93
|
-
def test_default_path(self):
|
94
|
-
assert DataDir.instance().mitmproxy_conf_dir_path == DEFAULT_CONF_DIR_PATH
|
85
|
+
os.chdir(original_cwd)
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# Define services here
|
2
2
|
|
3
3
|
networks:
|
4
|
-
|
4
|
+
app:
|
5
5
|
external: true
|
6
6
|
name: ${APP_NETWORK}
|
7
7
|
|
@@ -10,7 +10,7 @@ services:
|
|
10
10
|
image: kennethreitz/httpbin:latest
|
11
11
|
hostname: my-httpbin.com
|
12
12
|
networks:
|
13
|
-
-
|
13
|
+
- app
|
14
14
|
profiles: &id001
|
15
15
|
- record
|
16
16
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
stoobly_agent/__init__.py,sha256=
|
1
|
+
stoobly_agent/__init__.py,sha256=69eeJOFdZIj_u7CdBLLEJH5aoH4EApq0KmNGYpvoPMc,44
|
2
2
|
stoobly_agent/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
3
3
|
stoobly_agent/app/api/__init__.py,sha256=ctkB8KR-eXO0SFhj602huHiyvQ3PslFWd8fkcufgrAI,1000
|
4
4
|
stoobly_agent/app/api/application_http_request_handler.py,sha256=ZgCfmdr5um-OFAiuRHdBxFqPIeph9WqYkVg-oVQWw-E,5543
|
@@ -17,7 +17,7 @@ stoobly_agent/app/api/scenarios_controller.py,sha256=zJViyme9l36mlJDQONRu4N-A0kd
|
|
17
17
|
stoobly_agent/app/api/simple_http_request_handler.py,sha256=ZdJ4kKEcPDpck74dJu--M7zw76wQzpo_AQArZwN9Bes,4466
|
18
18
|
stoobly_agent/app/api/statuses_controller.py,sha256=gQsl28h-3mZ_bByEHpc4mRy3KFvUz5PeAgVB0cPx_Ao,1791
|
19
19
|
stoobly_agent/app/cli/__init__.py,sha256=uS4KJgMAhm0JVnEUC-ONW-Bq6A8I9v7Fk-_Ka7gXlrU,470
|
20
|
-
stoobly_agent/app/cli/ca_cert_cli.py,sha256=
|
20
|
+
stoobly_agent/app/cli/ca_cert_cli.py,sha256=Jx3faedvkUrLG986D5YmMD6u6IROKqhP9I1i6JBgeyU,1407
|
21
21
|
stoobly_agent/app/cli/config_cli.py,sha256=Ljr2Ir8P0dhGXALQQcq7fwthrcipPlvxS2G_0bNE6fY,15727
|
22
22
|
stoobly_agent/app/cli/decorators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
23
23
|
stoobly_agent/app/cli/decorators/config.py,sha256=AWrDGZm_gjCWFYlRwdla3iE6H7OSlM4FxkaXRNovBZA,2428
|
@@ -28,7 +28,7 @@ stoobly_agent/app/cli/feature_cli.py,sha256=d-MUTbK3gbZxZNJUjM43fioZyhPyzetQNKjI
|
|
28
28
|
stoobly_agent/app/cli/handlers/request_cli_handler.py,sha256=IPToK9OfiDda-mkq8HpiSSqK2m-UR15-8f8LVoLAHTA,6965
|
29
29
|
stoobly_agent/app/cli/handlers/scenario_cli_handler.py,sha256=1KSsfhR1mmPUCmhjzWTjf_L9NcQglLvVK3KURrPt92A,7425
|
30
30
|
stoobly_agent/app/cli/helpers/__init__.py,sha256=26ODsQi5NoJPwq4Ya7_lmtRalhhXOr_jfdZQWGLy6Gc,161
|
31
|
-
stoobly_agent/app/cli/helpers/certificate_authority.py,sha256=
|
31
|
+
stoobly_agent/app/cli/helpers/certificate_authority.py,sha256=gYFSf2b6LOR5AymX43h_f2Wsus8nCIoOug3XuH_60Vo,7368
|
32
32
|
stoobly_agent/app/cli/helpers/context.py,sha256=Jv97ueNnqea5UDm57VOUiQSHKWBeNlCcrq5-qW2tcwQ,1624
|
33
33
|
stoobly_agent/app/cli/helpers/endpoint_facade.py,sha256=_1TR9PcRnqpl9Q4njFHMM_Btqpr6cCf757FFcywa3oU,2318
|
34
34
|
stoobly_agent/app/cli/helpers/endpoints_apply_context.py,sha256=PvUzJLXNKl6wIQj2q8YZK1MAm1yqzDLLlpCYMoyWb9I,1831
|
@@ -67,17 +67,18 @@ stoobly_agent/app/cli/project_cli.py,sha256=EXjeLjbnq9PhfCjvyfZ0UnJ2tejeCS0SIAo3
|
|
67
67
|
stoobly_agent/app/cli/report_cli.py,sha256=ZxJw0Xkx7KFZJn9e45BSKRKon8AD0Msrwy1fbPfbv0c,2543
|
68
68
|
stoobly_agent/app/cli/request_cli.py,sha256=THNloW111l9MLE0oPg4y7hVXL1U7OXoz760g0A1CtJ0,7747
|
69
69
|
stoobly_agent/app/cli/scaffold/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
70
|
-
stoobly_agent/app/cli/scaffold/app.py,sha256=
|
70
|
+
stoobly_agent/app/cli/scaffold/app.py,sha256=bgNc_dWZtgkuDAkS9aHSCMxCrjX907Phlfb2bOasswI,3435
|
71
71
|
stoobly_agent/app/cli/scaffold/app_command.py,sha256=qtOdG08ehdRk1wujiTL7LCQXoJkGpwExepO2qYBXBNA,2027
|
72
72
|
stoobly_agent/app/cli/scaffold/app_config.py,sha256=Gs-BynV1vY7_PpTOenn2mqc7lBIu0vBx6as9vtEU1sk,818
|
73
73
|
stoobly_agent/app/cli/scaffold/app_create_command.py,sha256=sy4017eiir9MK0TEbTi1NyG9mhOGlenGGVnq0GsGUrQ,966
|
74
74
|
stoobly_agent/app/cli/scaffold/command.py,sha256=aoTsdkkBzyu7TkVSMdNQQGk0Gj874jNgFcjR14y3TuM,254
|
75
75
|
stoobly_agent/app/cli/scaffold/config.py,sha256=HZU5tkvr3dkPr4JMXZtrJlu2wxxO-134Em6jReFFcq0,688
|
76
76
|
stoobly_agent/app/cli/scaffold/constants.py,sha256=Vn7TLVmxbiLOb7_wFDE4mlwkcr4vs0ZEgMxhS1ANizA,2084
|
77
|
+
stoobly_agent/app/cli/scaffold/containerized_app.py,sha256=dAjn4RwcZV3aEL0POUmrbF_DC-r9h6s1zx7gT2t45v0,175
|
77
78
|
stoobly_agent/app/cli/scaffold/docker/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
78
79
|
stoobly_agent/app/cli/scaffold/docker/app_builder.py,sha256=7z5pk5JKlRDHx2USxY-WurttLyyUkIVYfl34_u1x9dE,501
|
79
|
-
stoobly_agent/app/cli/scaffold/docker/builder.py,sha256=
|
80
|
-
stoobly_agent/app/cli/scaffold/docker/constants.py,sha256=
|
80
|
+
stoobly_agent/app/cli/scaffold/docker/builder.py,sha256=BQzjpDZmkUrii3VDcRCBXQkocxRwdS1omJFy5AkzJzw,2856
|
81
|
+
stoobly_agent/app/cli/scaffold/docker/constants.py,sha256=xfFBSF-1GQKNnUPTlz08Nm9HZDspUnvPvjwaLViQwVw,419
|
81
82
|
stoobly_agent/app/cli/scaffold/docker/service/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
82
83
|
stoobly_agent/app/cli/scaffold/docker/service/build_decorator.py,sha256=ZU7z4bkvdS3OK5O4fJhlA9_PNwnFtZW6t7vNF7V5obQ,1003
|
83
84
|
stoobly_agent/app/cli/scaffold/docker/service/builder.py,sha256=a7jxzXEwHaNcnG281BrOtNlf5Nmc4Z97DQrm68xdCCU,3219
|
@@ -103,8 +104,8 @@ stoobly_agent/app/cli/scaffold/service_workflow.py,sha256=sQ_Edy_wGHKMXpD0DmhnOW
|
|
103
104
|
stoobly_agent/app/cli/scaffold/service_workflow_validate_command.py,sha256=iORyPZEQurgWVxrdMgkdD3VsCz3ar2D15dmyY3RoeKw,9904
|
104
105
|
stoobly_agent/app/cli/scaffold/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
105
106
|
stoobly_agent/app/cli/scaffold/templates/app/.Dockerfile.context,sha256=EVoSqGJH_H7Xw1Ktan5GH2SWaOXIr916NUpptr2hkiA,158
|
106
|
-
stoobly_agent/app/cli/scaffold/templates/app/.Makefile,sha256=
|
107
|
-
stoobly_agent/app/cli/scaffold/templates/app/.docker-compose.base.yml,sha256=
|
107
|
+
stoobly_agent/app/cli/scaffold/templates/app/.Makefile,sha256=iVlTpP0I8nbgO1EBhsomGrUFqIDdlhIEJEdD_aCeXRs,8083
|
108
|
+
stoobly_agent/app/cli/scaffold/templates/app/.docker-compose.base.yml,sha256=6tFqXh3ine8vaD0FCL5TMoY5NjKx2wLUR8XpW3tJtew,245
|
108
109
|
stoobly_agent/app/cli/scaffold/templates/app/Makefile,sha256=TEmPG7Bf0KZOnmfsgdzza3UdwcVMmM5Lj1YdLc4cgjA,79
|
109
110
|
stoobly_agent/app/cli/scaffold/templates/app/build/.config.yml,sha256=8Wt8ZZ5irvBYYS44xGrR_EWlZDuXH9kyWmquzsh7s8g,19
|
110
111
|
stoobly_agent/app/cli/scaffold/templates/app/build/.docker-compose.base.yml,sha256=H43dtzQkuwWeeB-XzwQNqdKqwS04Ph_Al8AVCOjxCkQ,420
|
@@ -126,42 +127,42 @@ stoobly_agent/app/cli/scaffold/templates/app/build/test/bin/init,sha256=O7czui9G
|
|
126
127
|
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/.config.yml,sha256=T9VQz6OwAQpKdIoFrnfKAxuX_to0c6EhuWRLKM34Sr4,22
|
127
128
|
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/.docker-compose.base.yml,sha256=IHLz4eJyZDfQdKd8HG218Zc3egtOCK1IR8vfkMNJ0Ug,491
|
128
129
|
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/mock/.docker-compose.mock.yml,sha256=-YbHd6BrAlBpT8PYg8kOsq0GyDeZ3g_q8IB0B0rGluU,551
|
129
|
-
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/mock/bin/.configure,sha256=
|
130
|
+
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/mock/bin/.configure,sha256=dZNsKDou-7IS4yj8hYPudjoUIa8YlUbuE8pBkSIVtyE,255
|
130
131
|
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/mock/bin/.init,sha256=5xJbfpwGOmRj5lwK5e0JNlVpNd3WFUkZ0GaCUK40aDk,97
|
131
132
|
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/mock/bin/configure,sha256=Nme7aSLA-IH1NXgmqRMPzOlKcUSRXqZd-kcuZa47IEk,11
|
132
133
|
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/mock/bin/init,sha256=O7czui9GFHbcoEC5I9MwkRyZvDGY42IwlyQwIWcgylY,12
|
133
134
|
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/mock/docker-compose.yml,sha256=Zh8h8yUqVXZMi_Y4aUPE48qw2DU-ONO4-rrSTh4E_Ts,591
|
134
135
|
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/record/.docker-compose.record.yml,sha256=aIcgjelss4V86lxS3-xN8j_2eR-0YkzhtN_b-g3Y0nE,555
|
135
|
-
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/record/bin/.configure,sha256=
|
136
|
+
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/record/bin/.configure,sha256=HKul_kbkob_EzSudYKRyQMk_YHE2jEBTarGHl3pCc18,259
|
136
137
|
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/record/bin/.init,sha256=5xJbfpwGOmRj5lwK5e0JNlVpNd3WFUkZ0GaCUK40aDk,97
|
137
138
|
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/record/bin/configure,sha256=Nme7aSLA-IH1NXgmqRMPzOlKcUSRXqZd-kcuZa47IEk,11
|
138
139
|
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/record/bin/init,sha256=O7czui9GFHbcoEC5I9MwkRyZvDGY42IwlyQwIWcgylY,12
|
139
140
|
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/record/docker-compose.yml,sha256=5n4bZBHI9MtwBF55ugu1RTdwMy7T6SsYGQ_3sulFUj8,595
|
140
141
|
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/test/.docker-compose.test.yml,sha256=9-qPnSisun4adnrDcZsJiyeMjhIlCHBJap_cmdzUPVg,552
|
141
|
-
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/test/bin/.configure,sha256=
|
142
|
+
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/test/bin/.configure,sha256=dZNsKDou-7IS4yj8hYPudjoUIa8YlUbuE8pBkSIVtyE,255
|
142
143
|
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/test/bin/.init,sha256=5xJbfpwGOmRj5lwK5e0JNlVpNd3WFUkZ0GaCUK40aDk,97
|
143
144
|
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/test/bin/configure,sha256=Nme7aSLA-IH1NXgmqRMPzOlKcUSRXqZd-kcuZa47IEk,11
|
144
145
|
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/test/bin/init,sha256=O7czui9GFHbcoEC5I9MwkRyZvDGY42IwlyQwIWcgylY,12
|
145
146
|
stoobly_agent/app/cli/scaffold/templates/app/entrypoint/test/docker-compose.yml,sha256=E4gGJwHfnZoFo9-0vM17-Qg5LPjx7vIPpcz2K7eiZg0,591
|
146
147
|
stoobly_agent/app/cli/scaffold/templates/app/gateway/.config.yml,sha256=XnLQZMzzMMIwVycjyPN5QXsmRztkTFAna1kIHYuDfJQ,19
|
147
148
|
stoobly_agent/app/cli/scaffold/templates/app/gateway/.docker-compose.base.template.yml,sha256=bgBvyDhyehS75D2ObEi7sl9DLGV6U3c9JhCAncsvjq8,251
|
148
|
-
stoobly_agent/app/cli/scaffold/templates/app/gateway/mock/.docker-compose.mock.yml,sha256=
|
149
|
-
stoobly_agent/app/cli/scaffold/templates/app/gateway/record/.docker-compose.record.yml,sha256=
|
149
|
+
stoobly_agent/app/cli/scaffold/templates/app/gateway/mock/.docker-compose.mock.yml,sha256=_nlhrpml5dm9AWqgDIaEPwrQiD1vAKVHSsY2mTIds2k,224
|
150
|
+
stoobly_agent/app/cli/scaffold/templates/app/gateway/record/.docker-compose.record.yml,sha256=FvPqOUs1k6Vc-rncnpgiRTZeEQlrizmcGkT8a4HdvUE,226
|
150
151
|
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/.config.yml,sha256=XnLQZMzzMMIwVycjyPN5QXsmRztkTFAna1kIHYuDfJQ,19
|
151
|
-
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/.docker-compose.base.yml,sha256=
|
152
|
+
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/.docker-compose.base.yml,sha256=bxrtZqf3YtaJCukzScslh5PgWC5q8xkGIP1wKJf33LA,111
|
152
153
|
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/.docker-compose.exec.yml,sha256=n-p_lIfsmpOJ78Zd0J2TdnV2M8hcn-K2TP9qOccbw1c,306
|
153
154
|
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.create,sha256=EZe84bLAKB-mrB9PGMx-amyMjp6x-ESUZKC8wxrWdLE,245
|
154
155
|
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.delete,sha256=RspRDQ7WT5jpN2o-6qXOlH-A2VpN4981pD4ZJljk9Rw,260
|
155
156
|
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.disable,sha256=xVf4Pk1RLvJm7Ff0rbGoWhYHPv0ME5e93fxS2yFqLnE,45
|
156
|
-
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.down,sha256=
|
157
|
+
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.down,sha256=WtEjm2hJ01-1GGxRmmcUqZq7VjEe5JfZZKvm8TNhNEs,219
|
157
158
|
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.enable,sha256=sfUSPG4uHdXX95BLgivXQYLbsLBP2DjJIiSTXRtvXuY,188
|
158
159
|
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.list,sha256=BdX3ARC-Piuwk0vFzBrcxEwtHjdFncpORzqP-hP4IwE,84
|
159
|
-
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.logs,sha256=
|
160
|
+
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.logs,sha256=4CJVEVLn9VTQN9LAjOJpijwd_DZ5IuIXL1aFCYkelxk,178
|
160
161
|
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.mkcert,sha256=vyHaXmvy-7oL2RD8rIxwT-fdJS5kXmB0yHK5fRMo_cM,46
|
161
162
|
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.reset,sha256=_pvbLk-ektsCHEh_egDtd6c0sVqCPunwUWggarfoli0,238
|
162
163
|
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.services,sha256=sAbaKzBxNDXimyUNinB_a2Kt47vUCa0Kd3Z1QAp2GrU,161
|
163
164
|
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.snapshot,sha256=Kav1QNhKG7f0DBzc4-9dmxZMmmVTxmPqakT_W4kVYKk,241
|
164
|
-
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.up,sha256=
|
165
|
+
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/exec/bin/.up,sha256=S88O31UgsabaMvSwkQJjLF9C7mrFkyEk9x6JDE6qSXI,228
|
165
166
|
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/mock/.docker-compose.mock.yml,sha256=FnCn64DjxyAiB2P_1JUwFmXslMR961nVZHkYiEXytlg,232
|
166
167
|
stoobly_agent/app/cli/scaffold/templates/app/stoobly-ui/record/.docker-compose.record.yml,sha256=t34FNYZboJSfrKnIB2oJ3UuE_mJaW77-hcbSn3sfWec,235
|
167
168
|
stoobly_agent/app/cli/scaffold/templates/constants.py,sha256=EXBiBB_gnSINGrIqfXMaJ2w0HEaICw4FxVjwIHPBqYw,1457
|
@@ -175,7 +176,7 @@ stoobly_agent/app/cli/scaffold/templates/workflow/mock/lifecycle_hooks.py,sha256
|
|
175
176
|
stoobly_agent/app/cli/scaffold/templates/workflow/mock/public/.gitignore,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
176
177
|
stoobly_agent/app/cli/scaffold/templates/workflow/record/bin/.configure,sha256=z135hJDmBWYOhZbjuzC8-C6a0VtQ9NPx5mfCpVZliEA,210
|
177
178
|
stoobly_agent/app/cli/scaffold/templates/workflow/record/bin/.init,sha256=GekadmBjLyAxgTJbCA_NKgUXRwKFs8iX4qtV5YlvUXk,329
|
178
|
-
stoobly_agent/app/cli/scaffold/templates/workflow/record/bin/configure,sha256=
|
179
|
+
stoobly_agent/app/cli/scaffold/templates/workflow/record/bin/configure,sha256=bkMZexceMEfoh5AqybtzpGPBrCGxl7Azn6QbR-qAuWM,750
|
179
180
|
stoobly_agent/app/cli/scaffold/templates/workflow/record/bin/init,sha256=YxWVVQMEdGarcMtBcE1Sj2kdLgUgwY9kXp3MjPsVcmg,46
|
180
181
|
stoobly_agent/app/cli/scaffold/templates/workflow/record/lifecycle_hooks.py,sha256=4vaVc_gnDTCLEqtcZybIk5dcmXrKmGuesF6gc3-_kX8,473
|
181
182
|
stoobly_agent/app/cli/scaffold/templates/workflow/test/bin/.configure,sha256=z135hJDmBWYOhZbjuzC8-C6a0VtQ9NPx5mfCpVZliEA,210
|
@@ -195,7 +196,7 @@ stoobly_agent/app/cli/scaffold/workflow_env.py,sha256=x8V5pJmIiklD3f2q2-qq-CORf4
|
|
195
196
|
stoobly_agent/app/cli/scaffold/workflow_log_command.py,sha256=Bke4lMOMxuDUFuAx9nlXHbKgYMO4KAg9ASHvjz4aVWc,1372
|
196
197
|
stoobly_agent/app/cli/scaffold/workflow_run_command.py,sha256=GXteRAgco7NCb0Ov1B2_xs1DMyLg8vdDsCvH7whrlcE,9854
|
197
198
|
stoobly_agent/app/cli/scaffold/workflow_validate_command.py,sha256=fhHciJXg_u32Wmh8us8LhgQj8D1SxkBADtuBBF4K0FM,4377
|
198
|
-
stoobly_agent/app/cli/scaffold_cli.py,sha256=
|
199
|
+
stoobly_agent/app/cli/scaffold_cli.py,sha256=_qpeTzctvqeQ7TxSbiizKYUp7zKTLXzTPmhSjIN2jdc,28163
|
199
200
|
stoobly_agent/app/cli/scenario_cli.py,sha256=3J1EiJOvunkfWrEkOsanw-XrKkOk78ij_GjBlE9p7CE,8229
|
200
201
|
stoobly_agent/app/cli/snapshot_cli.py,sha256=cpCjxFYBuVwLuq_b2lIUu-5zWqupRlrp4xWgDytirSM,10047
|
201
202
|
stoobly_agent/app/cli/trace_cli.py,sha256=K7E-vx3JUcqEDSWOdIOi_AieKNQz7dBfmRrVvKDkzFI,4605
|
@@ -346,7 +347,7 @@ stoobly_agent/app/proxy/replay/replay_request_service.py,sha256=UuTPPef6jchrJSjV
|
|
346
347
|
stoobly_agent/app/proxy/replay/replay_scenario_service.py,sha256=9jV-iO5EBg8geUblEtjjWRFIkom_Pqmo7P-lTc3S4Xw,2824
|
347
348
|
stoobly_agent/app/proxy/replay/rewrite_params_service.py,sha256=jEHlT6_OHq_VBa09Hd6QaRyErv7tZnziDvW7m3Q8CQg,2234
|
348
349
|
stoobly_agent/app/proxy/replay/trace_context.py,sha256=lKpnQWVCUTcMPE-SOi90za3U1yL0VeBlIgj_KP63VsE,10435
|
349
|
-
stoobly_agent/app/proxy/run.py,sha256=
|
350
|
+
stoobly_agent/app/proxy/run.py,sha256=SfzMsaY6Ugsg4XEkQeU25lTyiMC0GRDEiYR70GUUaN4,4145
|
350
351
|
stoobly_agent/app/proxy/settings.py,sha256=R0LkSa9HrkUXvCd-nur4syJePjbQZdlnAnOPpGnCx38,2172
|
351
352
|
stoobly_agent/app/proxy/simulate_intercept_service.py,sha256=R-L2dh2dfYFebttWXU0NwyxFI_jP6Ud36oKPC-T8HiI,1942
|
352
353
|
stoobly_agent/app/proxy/test/__init__.py,sha256=uW0Ab27oyH2odTeVRjcuUJF8A1FLbTT5sBMzhGZr1so,89
|
@@ -406,7 +407,7 @@ stoobly_agent/app/settings/types/remote_settings.py,sha256=4PvEGKULXM0zv29XTDzV7
|
|
406
407
|
stoobly_agent/app/settings/types/ui_settings.py,sha256=BqPy2F32AbODqzi2mp2kRk28QVUydQIwVmvftn46pco,84
|
407
408
|
stoobly_agent/app/settings/ui_settings.py,sha256=YDEUMPuJFh0SLHaGz6O-Gpz8nwsunNzeuc-TzO9OUbM,1170
|
408
409
|
stoobly_agent/app/settings/url_rule.py,sha256=Qx7YrIpVRSC-4LeNiCAfCtE50Jou4423hojMW-4qUYg,954
|
409
|
-
stoobly_agent/cli.py,sha256=
|
410
|
+
stoobly_agent/cli.py,sha256=sw8Ke5mCvzQ50X-zsb2Ld_zW4T6S58P0fN5GyKNOrcQ,10255
|
410
411
|
stoobly_agent/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
411
412
|
stoobly_agent/config/constants/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
412
413
|
stoobly_agent/config/constants/alias_resolve_strategy.py,sha256=_R1tVqFnyGxCraVS5-dhSskaDj_X8-NthsY7i_bEt9M,119
|
@@ -415,7 +416,6 @@ stoobly_agent/config/constants/env_vars.py,sha256=HAR_ZIdXXbpWQgCDaRR5RtpVyGXCsM
|
|
415
416
|
stoobly_agent/config/constants/headers.py,sha256=Hfv7R8_NPXAGaMiZPqywGZDnr0qcVUyfenPb4g465rE,169
|
416
417
|
stoobly_agent/config/constants/intercept_policy.py,sha256=5hIgOft8PQmCRdOHb5OEvEj10tU66DIQF3GYltlWyM8,25
|
417
418
|
stoobly_agent/config/constants/lifecycle_hooks.py,sha256=aobclZmcND_mUnFKkUgpxgwd5EU3pjgAvB-NFf2dCgE,846
|
418
|
-
stoobly_agent/config/constants/mitmproxy.py,sha256=AhaxRGMb7OC4DBqNvyBP0OVQSByCeA-itefzmMoIS14,116
|
419
419
|
stoobly_agent/config/constants/mock_policy.py,sha256=oS3eKL5Ezpnm_4zvztcLvvtKppxm7eKvOOBHYKyKpeU,133
|
420
420
|
stoobly_agent/config/constants/mode.py,sha256=J35vV1LPQRhD2ob6DaJ7mLGJrMhv-CVnC6IHWd7b_GM,160
|
421
421
|
stoobly_agent/config/constants/query_params.py,sha256=b-QQGKTqf-HePt0X4ltFksf5ETiIFPgBvh-kFrF7kUk,63
|
@@ -426,8 +426,8 @@ stoobly_agent/config/constants/statuses.py,sha256=dR88qHHnDR_5ppuKijwc0R24D_fWc6
|
|
426
426
|
stoobly_agent/config/constants/test_filter.py,sha256=rQ-eMZ8kpq49pqS1PQhaRx59dlRicd-Ag4sjgoXfpY8,109
|
427
427
|
stoobly_agent/config/constants/test_output_level.py,sha256=yrn8cs-lexrK0Ckpc_SX3NhsZPfVhNpmjzjSP62LCro,135
|
428
428
|
stoobly_agent/config/constants/test_strategy.py,sha256=d6-WgKqElB3q_csP-QYFkhR4XvlPGfGdCJ-SBEDEoL4,152
|
429
|
-
stoobly_agent/config/data_dir.py,sha256=
|
430
|
-
stoobly_agent/config/mitmproxy.py,sha256=
|
429
|
+
stoobly_agent/config/data_dir.py,sha256=r0ROg7rsKhhFW_VJBO-5vKUx6t1DYozbhgvSMVE07DA,6703
|
430
|
+
stoobly_agent/config/mitmproxy.py,sha256=8APQnpa8hnktA1T69w5bzWjfC2VpPTDpsFwOxiY9ppk,1472
|
431
431
|
stoobly_agent/config/schema.yml,sha256=aLSrTI7c6_K-fGOyoGFUdA2Prx9zQwpF3IC43LvXupo,1993
|
432
432
|
stoobly_agent/config/settings.yml.sample,sha256=muxP1bWrtknVaSgdseFaw23tuwduILNdQTVy7aB519M,404
|
433
433
|
stoobly_agent/config/source_dir.py,sha256=3oYwWmIrid0YsIf91AIUI2itAA3pdPA10eHaC-nmelQ,1146
|
@@ -651,7 +651,7 @@ stoobly_agent/test/app/cli/config/project/config_project_set_test.py,sha256=bV2O
|
|
651
651
|
stoobly_agent/test/app/cli/config/rewrite_test.py,sha256=Y1zSTJJK4Q8Ac8qqHbKt-kFraBIwJIpr29_7V81OTy0,5601
|
652
652
|
stoobly_agent/test/app/cli/config/scenario/config_scenario_set_test.py,sha256=1A5cYH3OdwtRwTmDETg0af9urHA4K6VVeA76zub2dnQ,2525
|
653
653
|
stoobly_agent/test/app/cli/endpoint/endpoint_cli_apply_test.py,sha256=cW5RDd-spyEknV1krFv37GHgWShPVOgvPyX2jgwnWZw,3886
|
654
|
-
stoobly_agent/test/app/cli/helpers/certificate_authority_test.py,sha256
|
654
|
+
stoobly_agent/test/app/cli/helpers/certificate_authority_test.py,sha256=-tWLLot9L6_0m5abYN4WMu3CNBpzkCWOJhzsGCf601E,2579
|
655
655
|
stoobly_agent/test/app/cli/helpers/openapi_endpoint_adapter_additional_props_test.py,sha256=t4Wggky_fexBrRqvK12Qgj71UKsM0gGqutOEfAdOqtk,1772
|
656
656
|
stoobly_agent/test/app/cli/helpers/openapi_endpoint_adapter_missing_info_test.py,sha256=qA6PJEtv1tS7Ksl6R7GjbIS_f9SxINPr8SrcXTuG-WU,3027
|
657
657
|
stoobly_agent/test/app/cli/helpers/openapi_endpoint_adapter_missing_oauth2_scopes_test.py,sha256=Gw_YtZR2EKy09jAJEGQ4phrAoHlzlqhbJ9bLH91UrRU,3143
|
@@ -696,7 +696,7 @@ stoobly_agent/test/app/models/factories/resource/local_db/helpers/log_test.py,sh
|
|
696
696
|
stoobly_agent/test/app/models/factories/resource/local_db/helpers/tiebreak_scenario_request_test.py,sha256=a1SFLyEyRRLuADvAw6ckQQKORFXvyK1lyrbkaLWx8oU,3399
|
697
697
|
stoobly_agent/test/app/models/factories/resource/local_db/request_adapter_test.py,sha256=Pzq1cBPnP9oSWG-p0c-VoymoHxgp483QmNwmV1b78RA,8453
|
698
698
|
stoobly_agent/test/app/models/factories/resource/local_db/response_adapter_test.py,sha256=9P95EKH5rZGOrmRkRIDlQZqtiLJHk9735og18Ffwpfw,2204
|
699
|
-
stoobly_agent/test/app/models/schemas/.stoobly/db/VERSION,sha256=
|
699
|
+
stoobly_agent/test/app/models/schemas/.stoobly/db/VERSION,sha256=WtHxF9tp4oUNGG9uaT9BVwB0t1KF7YkB7wiElV_Nk9k,5
|
700
700
|
stoobly_agent/test/app/models/schemas/.stoobly/db/stoobly_agent.sqlite3,sha256=ch8gNx6zIelLKQx65gwFx_LRNqUD3EC5xcHZ0ukIQiU,188416
|
701
701
|
stoobly_agent/test/app/models/schemas/.stoobly/settings.yml,sha256=vLwMjweKOdod6tSLtIlyBefPQuNXq9wio4kBaODKtAU,726
|
702
702
|
stoobly_agent/test/app/models/schemas/.stoobly/tmp/options.json,sha256=OTRzarwus48CTrItedXCrgQttJHSEZonEYc7R_knvYg,2212
|
@@ -719,7 +719,7 @@ stoobly_agent/test/cli/mock_scenario_lifecycle_hooks.py,sha256=e57A3FWHt1ZgaWKhb
|
|
719
719
|
stoobly_agent/test/cli/mock_scenario_test.py,sha256=tHT-p8Vm8APP2KOlyfZ-5z_AxZO9TS4sDgui3X2qkaE,2620
|
720
720
|
stoobly_agent/test/cli/mock_test.py,sha256=zYAFhHkR-1oafZzzL_4aPOWzM2nXWRHGt36yTAuG8Rw,5636
|
721
721
|
stoobly_agent/test/cli/record_test.py,sha256=CG7prrooTgkW8RYaiDRYD3LuuDIR8dz8jaP9RNRrF4o,15814
|
722
|
-
stoobly_agent/test/config/data_dir_test.py,sha256=
|
722
|
+
stoobly_agent/test/config/data_dir_test.py,sha256=K8_RspuAKWXU745WbXDxmB49MUxswGm2q-BU3UgCX6w,2338
|
723
723
|
stoobly_agent/test/mock_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
724
724
|
stoobly_agent/test/mock_data/endpoint_show_response.py,sha256=JFEkceHI6nH38zitCbFMozE1lODahxmvj70N5eM_sec,5901
|
725
725
|
stoobly_agent/test/mock_data/lifecycle_hooks.py,sha256=mLUSEMD-brQhLFKximX_kNmXjzrJTpGUwXnX4BPvx1E,1054
|
@@ -733,12 +733,12 @@ stoobly_agent/test/mock_data/petstore-swagger-io.yaml,sha256=FbOEaArZKl1dV7jEf1h
|
|
733
733
|
stoobly_agent/test/mock_data/petstore.yaml,sha256=CCdliJky04Az4FIOkFA883uunwFDHLr2Y8ohtozFi_Q,2714
|
734
734
|
stoobly_agent/test/mock_data/request_show_response.py,sha256=K_a0fP0QT58T8sX9PaM6hqtX1A1depZsqg_GsNPf--k,707
|
735
735
|
stoobly_agent/test/mock_data/scaffold/docker-compose-assets-service.yml,sha256=TJpkkkSjUlfz3t8Oxsz6Ery1JX7Ed79Fh6oiEuKI4i0,275
|
736
|
-
stoobly_agent/test/mock_data/scaffold/docker-compose-local-service.yml,sha256=
|
736
|
+
stoobly_agent/test/mock_data/scaffold/docker-compose-local-service.yml,sha256=_tCvHxpIKcKMWKrtTvJgqSfkzcaNvJN1w7Yb9OUOzLU,241
|
737
737
|
stoobly_agent/test/mock_data/scaffold/index.html,sha256=qJwuYajKZ4ihWZrJQ3BNObV5kf1VGnnm_vqlPJzdqLE,258
|
738
738
|
stoobly_agent/test/mock_data/uspto.yaml,sha256=6U5se7C3o-86J4m9xpOk9Npias399f5CbfWzR87WKwE,7835
|
739
739
|
stoobly_agent/test/test_helper.py,sha256=m_oAI7tmRYCNZdKfNqISWhMv3e44tjeYViQ3nTUfnos,1007
|
740
|
-
stoobly_agent-1.5.
|
741
|
-
stoobly_agent-1.5.
|
742
|
-
stoobly_agent-1.5.
|
743
|
-
stoobly_agent-1.5.
|
744
|
-
stoobly_agent-1.5.
|
740
|
+
stoobly_agent-1.5.6.dist-info/LICENSE,sha256=o93sj12cdoEOsTCjPaPFsw3Xq0SXs3pPcY-9reE2sEw,548
|
741
|
+
stoobly_agent-1.5.6.dist-info/METADATA,sha256=ai5e5H-gA0lrsFe4TNmSiBI_SaPqdNfvKo27G9v0C3s,3087
|
742
|
+
stoobly_agent-1.5.6.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
|
743
|
+
stoobly_agent-1.5.6.dist-info/entry_points.txt,sha256=aq5wix5oC8MDQtmyPGU0xaFrsjJg7WH28NmXh2sc3Z8,56
|
744
|
+
stoobly_agent-1.5.6.dist-info/RECORD,,
|
File without changes
|
File without changes
|