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;