using System.Text.Json.Serialization;
using MoShiro.Measurement;
namespace MoShiro.Agent;
///
/// agent.json:节点本地配置,面板无法修改。其中 limits 是本地硬上限:期望任务集超出这些范围时,
/// 调和器拒绝执行并在 rejected[] 里给出原因。默认不使用 443,目标任务默认不开放。
///
public sealed class AgentConfig
{
[JsonPropertyName("fleet")]
public FleetSection Fleet { get; set; } = new();
[JsonPropertyName("listen")]
public ListenSection Listen { get; set; } = new();
[JsonPropertyName("limits")]
public LimitsSection Limits { get; set; } = new();
[JsonPropertyName("fleet_policy")]
public PolicySection Policy { get; set; } = new();
[JsonPropertyName("reporting")]
public ReportingSection Reporting { get; set; } = new();
/// 每天定时重启一次,例如 04:00+08:00(不写偏移按 UTC);不写就不重启。环境变量 MOSHIRO_RESTART_AT 优先。
[JsonPropertyName("restart_at")]
public string? RestartAt { get; set; }
}
public sealed class FleetSection
{
[JsonPropertyName("server")]
public string Server { get; set; } = "";
[JsonPropertyName("identity_dir")]
public string IdentityDir { get; set; } = "/etc/moshiro";
/// 节点自己要求有属主(passkey):没有就不运行。见 OwnerGuard。
[JsonPropertyName("require_owner")]
public bool RequireOwner { get; set; } = true;
}
public sealed class ListenSection
{
/// 是否接受拨号方的连接。关闭时节点只拨出:不开任何端口,在 Backend 的目录里也不是拨号目标(家宽和 NAT 后的节点用这个配置)。
[JsonPropertyName("enabled")]
public bool Enabled { get; set; } = true;
[JsonPropertyName("bind")]
public string Bind { get; set; } = "::";
/// 拨号方 控制通道(TLS,点对点会话)。
[JsonPropertyName("control_port")]
public int ControlPort { get; set; } = 7443;
[JsonPropertyName("quic_ports")]
public List QuicPorts { get; set; } = [7443];
[JsonPropertyName("tcp_ports")]
public List TcpPorts { get; set; } = [7444];
}
public sealed class LimitsSection
{
[JsonPropertyName("max_total_mbps")]
public double MaxTotalMbps { get; set; } = 1200;
[JsonPropertyName("max_total_pps")]
public long MaxTotalPps { get; set; } = 20_000;
/// 默认为空:不允许执行任何目标任务。
[JsonPropertyName("allowed_target_cidrs")]
public List AllowedTargetCidrs { get; set; } = [];
[JsonPropertyName("max_concurrent_tests")]
public int MaxConcurrentTests { get; set; } = 1;
}
public sealed class PolicySection
{
/// 在默认值的基础上进一步收窄:只响应这些产品方法。为空表示不收窄。
[JsonPropertyName("allow_methods")]
public List? AllowMethods { get; set; }
}
[JsonSerializable(typeof(AgentConfig))]
[JsonSerializable(typeof(DialCache))]
[JsonSerializable(typeof(OpenWrtHealth))]
public sealed partial class AgentConfigContext : System.Text.Json.Serialization.JsonSerializerContext;