Fork project

This commit is contained in:
2025-09-19 15:59:08 +08:00
commit 2f921b6209
52 changed files with 4012 additions and 0 deletions

View File

@ -0,0 +1,24 @@
<div class="tab-pane fade" id="router" role="tabpanel">
{% set value = get_config('whale:router_type') %}
{% set cur_type = get_config("whale:router_type", "frp") %}
<div class="form-group">
<label for="router-type">
Router type
<small class="form-text text-muted">
Select which router backend to use
</small>
</label>
<select id="router-type" class="form-control custom-select" onchange="window.updateConfigs">
{% for type in ["frp", "trp"] %}
<option value="{{ type }}" {{ "selected" if value == type }}>{{ type }}</option>
{% endfor %}
</select>
</div>
{% set template = "config/" + cur_type + ".router.config.html" %}
{% include template %}
<div class="submit-row float-right">
<button type="submit" tabindex="0" class="btn btn-md btn-primary btn-outlined">
Submit
</button>
</div>
</div>

View File

@ -0,0 +1,25 @@
<div class="tab-pane fade" id="challenges" role="tabpanel">
{% for config, val in {
"Subdomain Template": ("template_http_subdomain", "Controls how the subdomain of a container is generated"),
"Flag Template": ("template_chall_flag", "Controls how a flag is generated"),
}.items() %}
{% set value = get_config('whale:' + val[0]) %}
<div class="form-group">
<label for="{{ val[0].replace('_', '-') }}">
{{ config }}
<small class="form-text text-muted">
{{ val[1] }}
</small>
</label>
<input type="text" class="form-control"
id="{{ val[0].replace('_', '-') }}" name="{{ 'whale:' + val[0] }}"
{% if value != None %}value="{{ value }}"{% endif %}>
</div>
{% endfor %}
<div class="submit-row float-right">
<button type="submit" tabindex="0" class="btn btn-md btn-primary btn-outlined">
Submit
</button>
</div>
</div>

View File

@ -0,0 +1,122 @@
<div class="tab-pane fade show active" id="docker" role="tabpanel" aria-autocomplete="none">
<h5>Common</h5>
<small class="form-text text-muted">
Common configurations for both standalone and grouped containers
</small><br>
{% for config, val in {
"API URL": ("docker_api_url", "Docker API to connect to"),
"Credentials": ("docker_credentials", "docker.io username and password, separated by ':'. useful for private images"),
"Swarm Nodes": ("docker_swarm_nodes", "Will pick up one from it, You should set your node with label name=windows-* or name=linux-*. Separated by commas."),
}.items() %}
{% set value = get_config('whale:' + val[0]) %}
<div class="form-group">
<label for="{{ val[0].replace('_', '-') }}">
{{ config }}
<small class="form-text text-muted">{{ val[1] }}</small>
</label>
<input type="text" class="form-control"
id="{{ val[0].replace('_', '-') }}" name="{{ 'whale:' + val[0] }}"
{% if value != None %}value="{{ value }}"{% endif %}>
</div>
{% endfor %}
{% set use_ssl = get_config('whale:docker_use_ssl') %}
<div class="form-check">
<input type="checkbox" id="docker-use-ssl" name="whale:docker_use_ssl"
{% if use_ssl == True %}checked{% endif %}>
<label for="docker-use-ssl">Use SSL</label>
</div>
<div class="container" id="docker-ssl-config">
<div class="form-group">
<label for="docker-ssl-ca-cert">
SSL CA Certificate
<small class="form-text text-muted">
the location of the CA certificate file used in ssl connection
</small>
</label>
<input type="text" class="form-control"
id="docker-ssl-ca-cert" name="whale:docker_ssl_ca_cert"
value="{{ get_config('whale:docker_ssl_ca_cert') }}">
</div>
<div class="form-group">
<label for="docker-ssl-client-cert">
SSL Client Certificate
<small class="form-text text-muted">
the location of the client certificate file used in ssl connection
</small>
</label>
<input type="text" class="form-control"
id="docker-ssl-client-cert" name="whale:docker_ssl_client_cert"
value="{{ get_config('whale:docker_ssl_client_cert') }}">
</div>
<div class="form-group">
<label for="docker-ssl-client-key">
SSL Client Key
<small class="form-text text-muted">
the location of the client key file used in ssl connection
</small>
</label>
<input type="text" class="form-control"
id="docker-ssl-client-key" name="whale:docker_ssl_client_key"
value="{{ get_config('whale:docker_ssl_client_key') }}">
</div>
</div>
<script>
(function () {
let config = document.getElementById('docker-ssl-config');
let option = document.getElementById('docker-use-ssl');
config.hidden = !option.checked;
option.onclick = () => (config.hidden = !option.checked) || true;
}) ()
</script>
<hr>
<h5>Standalone Containers</h5>
<small class="form-text text-muted">
Typical challenges. Under most circumstances you only need to set these.
</small><br>
{% for config, val in {
"Auto Connect Network": ("docker_auto_connect_network", "The network connected for single-containers. It's usually the same network as the frpc is in."),
"Dns Setting": ("docker_dns", "Decide which dns will be used in container network."),
}.items() %}
{% set value = get_config('whale:' + val[0]) %}
<div class="form-group">
<label for="{{ val[0].replace('_', '-') }}">
{{ config }}
<small class="form-text text-muted">
{{ val[1] }}
</small>
</label>
<input type="text" class="form-control"
id="{{ val[0].replace('_', '-') }}" name="{{ 'whale:' + val[0] }}"
{% if value != None %}value="{{ value }}"{% endif %}>
</div>
{% endfor %}
<hr>
<h5>Grouped Containers</h5>
<small class="form-text text-muted">
Designed for multi-container challenges
</small><br>
{% for config, val in {
"Auto Connect Containers": ("docker_auto_connect_containers","Decide which container will be connected to multi-container-network automatically. Separated by commas."),
"Multi-Container Network Subnet": ("docker_subnet", "Subnet which will be used by auto created networks for multi-container challenges."),
"Multi-Container Network Subnet New Prefix": ("docker_subnet_new_prefix", "Prefix for auto created network.")
}.items() %}
{% set value = get_config('whale:' + val[0]) %}
<div class="form-group">
<label for="{{ val[0].replace('_', '-') }}">
{{ config }}
<small class="form-text text-muted">
{{ val[1] }}
</small>
</label>
<input type="text" class="form-control"
id="{{ val[0].replace('_', '-') }}" name="{{ 'whale:' + val[0] }}"
{% if value != None %}value="{{ value }}"{% endif %}>
</div>
{% endfor %}
<div class="submit-row float-right">
<button type="submit" tabindex="0" class="btn btn-md btn-primary btn-outlined">
Submit
</button>
</div>
</div>

View File

@ -0,0 +1,50 @@
{% for config, val in {
"API URL": ("frp_api_url", "Frp API to connect to"),
"Http Domain Suffix": ("frp_http_domain_suffix", "Will be appended to the hash of a container"),
"External Http Port": ("frp_http_port", "Keep in sync with frps:vhost_http_port"),
"Direct IP Address":("frp_direct_ip_address","For direct redirect"),
"Direct Minimum Port": ("frp_direct_port_minimum", "For direct redirect (pwn challenges)"),
"Direct Maximum Port": ("frp_direct_port_maximum", "For direct redirect (pwn challenges)"),
}.items() %}
{% set value = get_config('whale:' + val[0]) %}
<div class="form-group">
<label for="{{ val[0].replace('_', '-') }}">
{{ config }}
<small class="form-text text-muted">
{{ val[1] }}
</small>
</label>
<input type="text" class="form-control" id="{{ val[0].replace('_', '-') }}" name="{{ 'whale:' + val[0] }}" {% if
value !=None %}value="{{ value }}" {% endif %}>
</div>
{% endfor %}
{% set frpc_template = get_config("whale:frp_config_template", "") %}
<div class="form-group">
<label for="frp-config-template">
Frpc config template
<small class="form-text text-muted">
Frp config template, only need common section!
</small>
</label>
<textarea class="form-control input-filled-valid" id="frp-config-template" rows="7"
name="whale:frp_config_template">{{ frpc_template }}</textarea>
</div>
{% if frpc_template %}
<div class="form-group">
<label for="frps-config-template">
Frps config template [generated]
<small class="form-text text-muted">
This configuration is generated with your settings above.
</small>
</label>
<textarea class="form-control input-filled-valid grey-text" id="frps-config-template" rows="6" disabled>
[common]
{% for i in frpc_template.split('\n') %}
{%- if 'token' in i -%}{{ i }}{%- endif -%}
{%- if 'server_port' in i -%}{{ i.replace('server_port', 'bind_port') }}{%- endif -%}
{% endfor %}
vhost_http_port = {{ get_config('whale:frp_http_port') }}
subdomain_host = {{ get_config('whale:frp_http_domain_suffix', '127.0.0.1.xip.io').lstrip('.') }}
</textarea>
</div>
{% endif %}

View File

@ -0,0 +1,26 @@
<div class="tab-pane fade" id="limits" role="tabpanel">
{% for config, val in {
"Max Container Count": ("docker_max_container_count", "The maximum number of countainers allowed on the server"),
"Max Renewal Times": ("docker_max_renew_count", "The maximum times a user is allowed to renew a container"),
"Docker Container Timeout": ("docker_timeout", "A container times out after [timeout] seconds."),
}.items() %}
{% set value = get_config('whale:' + val[0]) %}
<div class="form-group">
<label for="{{ val[0].replace('_', '-') }}">
{{ config }}
<small class="form-text text-muted">
{{ val[1] }}
</small>
</label>
<input type="text" class="form-control"
id="{{ val[0].replace('_', '-') }}" name="{{ 'whale:' + val[0] }}"
{% if value != None %}value="{{ value }}"{% endif %}>
</div>
{% endfor %}
<div class="submit-row float-right">
<button type="submit" tabindex="0" class="btn btn-md btn-primary btn-outlined">
Submit
</button>
</div>
</div>

View File

@ -0,0 +1,17 @@
{% for config, val in {
"API URL": ("trp_api_url", "trp API to connect to"),
"Domain Suffix": ("trp_domain_suffix", "Will be used to generated the access link of a challenge"),
"Listening Port": ("trp_listening_port", "Will be used to generated the access link of a challenge"),
}.items() %}
{% set value = get_config('whale:' + val[0]) %}
<div class="form-group">
<label for="{{ val[0].replace('_', '-') }}">
{{ config }}
<small class="form-text text-muted">
{{ val[1] }}
</small>
</label>
<input type="text" class="form-control" id="{{ val[0].replace('_', '-') }}" name="{{ 'whale:' + val[0] }}"
{% if value != None %}value="{{ value }}" {% endif %}>
</div>
{% endfor %}