fix loggers

This commit is contained in:
anlicheng 2026-04-10 18:23:12 +08:00
parent 68e163f0f6
commit 055dad7010
10 changed files with 88 additions and 104 deletions

View File

@ -20,7 +20,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
let shared = UserDefaults(suiteName: "group.com.jihe.punchnetmac") let shared = UserDefaults(suiteName: "group.com.jihe.punchnetmac")
let msg = shared?.string(forKey: "test_msg") let msg = shared?.string(forKey: "test_msg")
SDLLogger.shared.log("NE read message: \(msg ?? "failed")") SDLLogger.log("NE read message: \(msg ?? "failed")", for: .debug)
DarwinNotificationCenter.shared.post(.vpnStatusChanged) DarwinNotificationCenter.shared.post(.vpnStatusChanged)

View File

@ -112,25 +112,25 @@ actor SDLContextActor {
await self.startDnsLocalClient() await self.startDnsLocalClient()
await self.supervisor.addWorker(name: "quicClient") { await self.supervisor.addWorker(name: "quicClient") {
SDLLogger.shared.log("[SDLContext] try start quicClient") SDLLogger.log("[SDLContext] try start quicClient", for: .debug)
let quicClient = try await self.startQUICClient() let quicClient = try await self.startQUICClient()
SDLLogger.shared.log("[SDLContext] quicClient running!!!!") SDLLogger.log("[SDLContext] quicClient running!!!!")
await quicClient.waitClose() await quicClient.waitClose()
SDLLogger.shared.log("[SDLContext] quicClient closed!!!!") SDLLogger.log("[SDLContext] quicClient closed!!!!")
} }
await self.supervisor.addWorker(name: "noticeClient") { await self.supervisor.addWorker(name: "noticeClient") {
let noticeClient = try self.startNoticeClient() let noticeClient = try self.startNoticeClient()
SDLLogger.shared.log("[SDLContext] noticeClient running!!!!") SDLLogger.log("[SDLContext] noticeClient running!!!!")
try await noticeClient.waitClose() try await noticeClient.waitClose()
SDLLogger.shared.log("[SDLContext] noticeClient closed!!!!") SDLLogger.log("[SDLContext] noticeClient closed!!!!")
} }
await self.supervisor.addWorker(name: "udpHole") { await self.supervisor.addWorker(name: "udpHole") {
let udpHole = try await self.startUDPHole() let udpHole = try await self.startUDPHole()
SDLLogger.shared.log("[SDLContext] udp running!!!!") SDLLogger.log("[SDLContext] udp running!!!!")
try await udpHole.waitClose() try await udpHole.waitClose()
SDLLogger.shared.log("[SDLContext] udp closed!!!!") SDLLogger.log("[SDLContext] udp closed!!!!")
} }
} }
@ -156,13 +156,13 @@ actor SDLContextActor {
try await quicClient.waitReady() try await quicClient.waitReady()
// quic // quic
try await Task.sleep(for: .seconds(0.2)) try await Task.sleep(for: .seconds(0.2))
SDLLogger.shared.log("[SDLContext] start quic client: \(self.config.serverHost)") SDLLogger.log("[SDLContext] start quic client: \(self.config.serverHost)")
self.quicWorker = Task.detached { self.quicWorker = Task.detached {
for await message in quicClient.messageStream { for await message in quicClient.messageStream {
switch message { switch message {
case .welcome(let welcome): case .welcome(let welcome):
SDLLogger.shared.log("[SDLContext] quic welcome: \(welcome)") SDLLogger.log("[SDLContext] quic welcome: \(welcome)")
// //
await self.startRegisterLoop() await self.startRegisterLoop()
case .pong: case .pong:
@ -196,7 +196,7 @@ actor SDLContextActor {
let noticeClient = try SDLNoticeClient(noticePort: self.config.noticePort) let noticeClient = try SDLNoticeClient(noticePort: self.config.noticePort)
noticeClient.start() noticeClient.start()
SDLLogger.shared.log("[SDLContext] noticeClient started") SDLLogger.log("[SDLContext] noticeClient started")
self.noticeClient = noticeClient self.noticeClient = noticeClient
return noticeClient return noticeClient
@ -209,7 +209,7 @@ actor SDLContextActor {
// monitor // monitor
let monitor = SDLNetworkMonitor() let monitor = SDLNetworkMonitor()
monitor.start() monitor.start()
SDLLogger.shared.log("[SDLContext] monitor started") SDLLogger.log("[SDLContext] monitor started")
self.monitor = monitor self.monitor = monitor
self.monitorWorker = Task.detached { self.monitorWorker = Task.detached {
@ -218,9 +218,9 @@ actor SDLContextActor {
case .changed: case .changed:
// nat // nat
await self.probeNatType() await self.probeNatType()
SDLLogger.shared.log("didNetworkPathChanged, nat type is:", level: .info) SDLLogger.log("didNetworkPathChanged, nat type is:")
case .unreachable: case .unreachable:
SDLLogger.shared.log("didNetworkPathUnreachable", level: .warning) SDLLogger.log("didNetworkPathUnreachable")
} }
} }
} }
@ -231,9 +231,9 @@ actor SDLContextActor {
self.dnsWorker = nil self.dnsWorker = nil
// dns // dns
let dnsClient = DNSCloudClient(host: self.config.serverIp, port: 15353, logger: SDLLogger.shared) let dnsClient = DNSCloudClient(host: self.config.serverIp, port: 15353)
dnsClient.start() dnsClient.start()
SDLLogger.shared.log("[SDLContext] dnsClient started") SDLLogger.log("[SDLContext] dnsClient started")
self.dnsClient = dnsClient self.dnsClient = dnsClient
self.dnsWorker = Task.detached { self.dnsWorker = Task.detached {
// //
@ -254,7 +254,7 @@ actor SDLContextActor {
// dns // dns
let dnsLocalClient = DNSLocalClient() let dnsLocalClient = DNSLocalClient()
dnsLocalClient.start() dnsLocalClient.start()
SDLLogger.shared.log("[SDLContext] dnsClient started") SDLLogger.log("[SDLContext] dnsClient started")
self.dnsLocalClient = dnsLocalClient self.dnsLocalClient = dnsLocalClient
self.dnsLocalWorker = Task.detached { self.dnsLocalWorker = Task.detached {
// //
@ -277,7 +277,7 @@ actor SDLContextActor {
// udp // udp
let udpHole = try SDLUDPHole() let udpHole = try SDLUDPHole()
try udpHole.start() try udpHole.start()
SDLLogger.shared.log("[SDLContext] udpHole started") SDLLogger.log("[SDLContext] udpHole started")
// udp // udp
let localAddress = udpHole.getLocalAddress() let localAddress = udpHole.getLocalAddress()
@ -297,7 +297,7 @@ actor SDLContextActor {
await self.sendStunRequest() await self.sendStunRequest()
} }
SDLLogger.shared.log("[SDLContext] udp pingTask cancel") SDLLogger.log("[SDLContext] udp pingTask cancel")
} }
// //
@ -318,14 +318,14 @@ actor SDLContextActor {
do { do {
try await self.handleHoleData(data: data) try await self.handleHoleData(data: data)
} catch let err { } catch let err {
SDLLogger.shared.log("[SDLContext] handleHoleData get err: \(err)") SDLLogger.log("[SDLContext] handleHoleData get err: \(err)")
} }
case .stunReply(_): case .stunReply(_):
//SDLLogger.shared.log("[SDLContext] get a stunReply: \(stunReply)") //SDLLogger.shared.log("[SDLContext] get a stunReply: \(stunReply)")
() ()
} }
} }
SDLLogger.shared.log("[SDLContext] udp signalTask cancel") SDLLogger.log("[SDLContext] udp signalTask cancel")
} }
self.udpHole = udpHole self.udpHole = udpHole
@ -386,7 +386,7 @@ actor SDLContextActor {
await self.whenRegistedSuper() await self.whenRegistedSuper()
break break
} }
SDLLogger.shared.log("[SDLContext] register super failed, retry") SDLLogger.log("[SDLContext] register super failed, retry")
} }
self.registerTask = nil self.registerTask = nil
} }
@ -399,7 +399,7 @@ actor SDLContextActor {
self.updatePolicyTask = Task { self.updatePolicyTask = Task {
while !Task.isCancelled { while !Task.isCancelled {
try? await Task.sleep(for: .seconds(300)) try? await Task.sleep(for: .seconds(300))
SDLLogger.shared.log("[SDLContext] updatePolicyTask execute") SDLLogger.log("[SDLContext] updatePolicyTask execute")
await self.identifyStore.batUpdatePolicy(using: self.quicClient, dstIdentityID: self.config.identityId) await self.identifyStore.batUpdatePolicy(using: self.quicClient, dstIdentityID: self.config.identityId)
} }
} }
@ -427,7 +427,7 @@ actor SDLContextActor {
private func handleRegisterSuperAck(registerSuperAck: SDLRegisterSuperAck) async { private func handleRegisterSuperAck(registerSuperAck: SDLRegisterSuperAck) async {
// rsa // rsa
guard let key = try? self.rsaCipher.decode(data: Data(registerSuperAck.key)) else { guard let key = try? self.rsaCipher.decode(data: Data(registerSuperAck.key)) else {
SDLLogger.shared.log("[SDLContext] registerSuperAck invalid key", level: .error) SDLLogger.log("[SDLContext] registerSuperAck invalid key")
self.provider.cancelTunnelWithError(SDLError.invalidKey) self.provider.cancelTunnelWithError(SDLError.invalidKey)
return return
} }
@ -442,20 +442,20 @@ actor SDLContextActor {
case "chacha20": case "chacha20":
self.dataCipher = CCChaCha20Cipher(regionId: regionId, keyData: key) self.dataCipher = CCChaCha20Cipher(regionId: regionId, keyData: key)
default: default:
SDLLogger.shared.log("[SDLContext] registerSuperAck invalid algorithm \(algorithm)", level: .error) SDLLogger.log("[SDLContext] registerSuperAck invalid algorithm \(algorithm)")
self.provider.cancelTunnelWithError(SDLError.unsupportedAlgorithm(algorithm: algorithm)) self.provider.cancelTunnelWithError(SDLError.unsupportedAlgorithm(algorithm: algorithm))
return return
} }
SDLLogger.shared.log("[SDLContext] registerSuperAck, use algorithm \(algorithm), key len: \(key.count)", level: .info) SDLLogger.log("[SDLContext] registerSuperAck, use algorithm \(algorithm), key len: \(key.count)")
// tun // tun
do { do {
try await self.setNetworkSettings(config: self.config, dnsServer: DNSHelper.dnsServer) try await self.setNetworkSettings(config: self.config, dnsServer: DNSHelper.dnsServer)
SDLLogger.shared.log("[SDLContext] setNetworkSettings successed") SDLLogger.log("[SDLContext] setNetworkSettings successed")
self.state = .registered self.state = .registered
self.startReader() self.startReader()
} catch let err { } catch let err {
SDLLogger.shared.log("[SDLContext] setTunnelNetworkSettings get error: \(err)", level: .error) SDLLogger.log("[SDLContext] setTunnelNetworkSettings get error: \(err)")
self.provider.cancelTunnelWithError(err) self.provider.cancelTunnelWithError(err)
} }
} }
@ -478,7 +478,7 @@ actor SDLContextActor {
let alertNotice = NoticeMessage.alert(alert: errorMessage) let alertNotice = NoticeMessage.alert(alert: errorMessage)
self.noticeClient?.send(data: alertNotice) self.noticeClient?.send(data: alertNotice)
} }
SDLLogger.shared.log("[SDLContext] Get a SuperNak message exit", level: .warning) SDLLogger.log("[SDLContext] Get a SuperNak message exit")
} }
@ -486,10 +486,10 @@ actor SDLContextActor {
switch event.event { switch event.event {
case .natChanged(let natChangedEvent): case .natChanged(let natChangedEvent):
let dstMac = natChangedEvent.mac let dstMac = natChangedEvent.mac
SDLLogger.shared.log("[SDLContext] natChangedEvent, dstMac: \(dstMac)", level: .info) SDLLogger.log("[SDLContext] natChangedEvent, dstMac: \(dstMac)")
sessionManager.removeSession(dstMac: dstMac) sessionManager.removeSession(dstMac: dstMac)
case .sendRegister(let sendRegisterEvent): case .sendRegister(let sendRegisterEvent):
SDLLogger.shared.log("[SDLContext] sendRegisterEvent, ip: \(sendRegisterEvent)", level: .debug) SDLLogger.log("[SDLContext] sendRegisterEvent, ip: \(sendRegisterEvent)")
let address = SDLUtil.int32ToIp(sendRegisterEvent.natIp) let address = SDLUtil.int32ToIp(sendRegisterEvent.natIp)
if let remoteAddress = try? SocketAddress.makeAddressResolvingHost(address, port: Int(sendRegisterEvent.natPort)) { if let remoteAddress = try? SocketAddress.makeAddressResolvingHost(address, port: Int(sendRegisterEvent.natPort)) {
// register // register
@ -524,14 +524,14 @@ actor SDLContextActor {
registerSuper.accessToken = self.config.accessToken registerSuper.accessToken = self.config.accessToken
if let registerSuperData = try? registerSuper.serializedData() { if let registerSuperData = try? registerSuper.serializedData() {
SDLLogger.shared.log("[SDLContext] will send register super") SDLLogger.log("[SDLContext] will send register super")
self.quicClient?.send(type: .registerSuper, data: registerSuperData) self.quicClient?.send(type: .registerSuper, data: registerSuperData)
} }
} }
private func handleRegister(remoteAddress: SocketAddress, register: SDLRegister) throws { private func handleRegister(remoteAddress: SocketAddress, register: SDLRegister) throws {
let networkAddr = config.networkAddress let networkAddr = config.networkAddress
SDLLogger.shared.log("[SDLContext] register packet: \(register), network_address: \(networkAddr)", level: .debug) SDLLogger.log("[SDLContext] register packet: \(register), network_address: \(networkAddr)")
// tun, // tun,
if register.dstMac == networkAddr.mac && register.networkID == networkAddr.networkId { if register.dstMac == networkAddr.mac && register.networkID == networkAddr.networkId {
@ -546,7 +546,7 @@ actor SDLContextActor {
let session = Session(dstMac: register.srcMac, natAddress: remoteAddress) let session = Session(dstMac: register.srcMac, natAddress: remoteAddress)
self.sessionManager.addSession(session: session) self.sessionManager.addSession(session: session)
} else { } else {
SDLLogger.shared.log("[SDLContext] didReadRegister get a invalid packet, because dst_ip not matched: \(register.dstMac)", level: .warning) SDLLogger.log("[SDLContext] didReadRegister get a invalid packet, because dst_ip not matched: \(register.dstMac)")
} }
} }
@ -557,7 +557,7 @@ actor SDLContextActor {
let session = Session(dstMac: registerAck.srcMac, natAddress: remoteAddress) let session = Session(dstMac: registerAck.srcMac, natAddress: remoteAddress)
self.sessionManager.addSession(session: session) self.sessionManager.addSession(session: session)
} else { } else {
SDLLogger.shared.log("[SDLContext] didReadRegisterAck get a invalid packet, because dst_mac not matched: \(registerAck.dstMac)", level: .warning) SDLLogger.log("[SDLContext] didReadRegisterAck get a invalid packet, because dst_mac not matched: \(registerAck.dstMac)")
} }
} }
@ -584,18 +584,18 @@ actor SDLContextActor {
if arpPacket.targetIP == networkAddr.ip { if arpPacket.targetIP == networkAddr.ip {
switch arpPacket.opcode { switch arpPacket.opcode {
case .request: case .request:
SDLLogger.shared.log("[SDLContext] get arp request packet", level: .debug) SDLLogger.log("[SDLContext] get arp request packet")
let response = ARPPacket.arpResponse(for: arpPacket, mac: networkAddr.mac, ip: networkAddr.ip) let response = ARPPacket.arpResponse(for: arpPacket, mac: networkAddr.mac, ip: networkAddr.ip)
await self.routeLayerPacket(dstMac: arpPacket.senderMAC, type: .arp, data: response.marshal()) await self.routeLayerPacket(dstMac: arpPacket.senderMAC, type: .arp, data: response.marshal())
case .response: case .response:
SDLLogger.shared.log("[SDLContext] get arp response packet", level: .debug) SDLLogger.log("[SDLContext] get arp response packet")
await self.arpServer.append(ip: arpPacket.senderIP, mac: arpPacket.senderMAC) await self.arpServer.append(ip: arpPacket.senderIP, mac: arpPacket.senderMAC)
} }
} else { } else {
SDLLogger.shared.log("[SDLContext] get invalid arp packet: \(arpPacket), target_ip: \(SDLUtil.int32ToIp(arpPacket.targetIP)), net ip: \(SDLUtil.int32ToIp(networkAddr.ip))", level: .debug) SDLLogger.log("[SDLContext] get invalid arp packet: \(arpPacket), target_ip: \(SDLUtil.int32ToIp(arpPacket.targetIP)), net ip: \(SDLUtil.int32ToIp(networkAddr.ip))")
} }
} else { } else {
SDLLogger.shared.log("[SDLContext] get invalid arp packet", level: .debug) SDLLogger.log("[SDLContext] get invalid arp packet")
} }
case .ipv4: case .ipv4:
// ip // ip
@ -610,20 +610,20 @@ actor SDLContextActor {
if true || self.checkPolicy(ipPacket: ipPacket, ruleMap: ruleMap) { if true || self.checkPolicy(ipPacket: ipPacket, ruleMap: ruleMap) {
// debug // debug
if ipPacket.header.source == 168428037 { if ipPacket.header.source == 168428037 {
SDLLogger.sharedDebug.log("data: \(Array(ipPacket.data)), len: \(ipPacket.data.count)") SDLLogger.log("data: \(Array(ipPacket.data)), len: \(ipPacket.data.count)", for: .debug)
} }
let packet = NEPacket(data: ipPacket.data, protocolFamily: 2) let packet = NEPacket(data: ipPacket.data, protocolFamily: 2)
self.provider.packetFlow.writePacketObjects([packet]) self.provider.packetFlow.writePacketObjects([packet])
SDLLogger.shared.log("[SDLContext] identity: \(data.identityID), allow, data count: \(ipPacket.data.count)", level: .debug) SDLLogger.log("[SDLContext] identity: \(data.identityID), allow, data count: \(ipPacket.data.count)", for: .debug)
} }
else { else {
SDLLogger.shared.log("[SDLContext] not found identity: \(data.identityID) ruleMap", level: .debug) SDLLogger.log("[SDLContext] not found identity: \(data.identityID) ruleMap", for: .debug)
// //
await self.identifyStore.policyRequest(srcIdentityId: data.identityID, dstIdentityId: self.config.identityId, using: self.quicClient) await self.identifyStore.policyRequest(srcIdentityId: data.identityID, dstIdentityId: self.config.identityId, using: self.quicClient)
} }
default: default:
SDLLogger.shared.log("[SDLContext] get invalid packet", level: .debug) SDLLogger.log("[SDLContext] get invalid packet", for: .debug)
} }
} }
@ -710,14 +710,14 @@ actor SDLContextActor {
if let dnsMessage = dnsParser.parse(), let name = dnsMessage.questions.first?.name { if let dnsMessage = dnsParser.parse(), let name = dnsMessage.questions.first?.name {
// ip // ip
if name.contains(self.config.networkAddress.networkDomain) { if name.contains(self.config.networkAddress.networkDomain) {
SDLLogger.shared.log("[SDLContext] get cloud dns request: \(name)") SDLLogger.log("[SDLContext] get cloud dns request: \(name)")
self.dnsClient?.forward(ipPacketData: packet.data) self.dnsClient?.forward(ipPacketData: packet.data)
} }
// dnsudppayload // dnsudppayload
else { else {
// //
let dnsPayload = Data(packet.data[payloadOffset..<packet.data.count]) let dnsPayload = Data(packet.data[payloadOffset..<packet.data.count])
SDLLogger.shared.log("[SDLContext] get local dns request: \(name)") SDLLogger.log("[SDLContext] get local dns request: \(name)")
let tracker = DNSLocalClient.DNSTracker(transactionID: dnsMessage.transactionID, let tracker = DNSLocalClient.DNSTracker(transactionID: dnsMessage.transactionID,
clientIP: packet.header.source, clientIP: packet.header.source,
@ -740,11 +740,11 @@ actor SDLContextActor {
if SDLUtil.inSameNetwork(ip: dstIp, compareIp: networkAddr.ip, maskLen: networkAddr.maskLen) { if SDLUtil.inSameNetwork(ip: dstIp, compareIp: networkAddr.ip, maskLen: networkAddr.maskLen) {
// arpmac // arpmac
if let dstMac = await self.arpServer.query(ip: dstIp) { if let dstMac = await self.arpServer.query(ip: dstIp) {
SDLLogger.shared.log("[SDLContext] dstIp: \(dstIp.asIpAddress()), dst_mac is: \(SDLUtil.formatMacAddress(mac: dstMac))", level: .debug) SDLLogger.log("[SDLContext] dstIp: \(dstIp.asIpAddress()), dst_mac is: \(SDLUtil.formatMacAddress(mac: dstMac))")
await self.routeLayerPacket(dstMac: dstMac, type: .ipv4, data: packet.data) await self.routeLayerPacket(dstMac: dstMac, type: .ipv4, data: packet.data)
} }
else { else {
SDLLogger.shared.log("[SDLContext] dstIp: \(dstIp.asIpAddress()) arp query not found, broadcast", level: .debug) SDLLogger.log("[SDLContext] dstIp: \(dstIp.asIpAddress()) arp query not found, broadcast")
// // arp广 // // arp广
// let arpReqeust = ARPPacket.arpRequest(senderIP: networkAddr.ip, senderMAC: networkAddr.mac, targetIP: dstIp) // let arpReqeust = ARPPacket.arpRequest(senderIP: networkAddr.ip, senderMAC: networkAddr.mac, targetIP: dstIp)
// await self.routeLayerPacket(dstMac: ARPPacket.broadcastMac , type: .arp, data: arpReqeust.marshal()) // await self.routeLayerPacket(dstMac: ARPPacket.broadcastMac , type: .arp, data: arpReqeust.marshal())
@ -756,7 +756,7 @@ actor SDLContextActor {
// //
else if let exitNode = config.exitNode { else if let exitNode = config.exitNode {
let exitNodeIp: UInt32 = exitNode.exitNodeIp let exitNodeIp: UInt32 = exitNode.exitNodeIp
SDLLogger.shared.log("[SDLContext] dstIp: \(packet.header.destination.asIpAddress()), use exit_node: \(exitNodeIp.asIpAddress())", level: .debug) SDLLogger.log("[SDLContext] dstIp: \(packet.header.destination.asIpAddress()), use exit_node: \(exitNodeIp.asIpAddress())")
// arpmac // arpmac
if let dstMac = await self.arpServer.query(ip: exitNodeIp) { if let dstMac = await self.arpServer.query(ip: exitNodeIp) {
await self.routeLayerPacket(dstMac: dstMac, type: .ipv4, data: packet.data) await self.routeLayerPacket(dstMac: dstMac, type: .ipv4, data: packet.data)
@ -794,14 +794,14 @@ actor SDLContextActor {
else { else {
// session // session
if let session = self.sessionManager.getSession(toAddress: dstMac) { if let session = self.sessionManager.getSession(toAddress: dstMac) {
SDLLogger.shared.log("[SDLContext] send packet by session: \(session)", level: .debug) SDLLogger.log("[SDLContext] send packet by session: \(session)")
udpHole.send(type: .data, data: data, remoteAddress: session.natAddress) udpHole.send(type: .data, data: data, remoteAddress: session.natAddress)
self.flowTracer.inc(num: data.count, type: .p2p) self.flowTracer.inc(num: data.count, type: .p2p)
} }
else { else {
// super_node // super_node
udpHole.send(type: .data, data: data, remoteAddress: self.config.stunSocketAddress) udpHole.send(type: .data, data: data, remoteAddress: self.config.stunSocketAddress)
SDLLogger.shared.log("[SDLContext] send packet by super: \(self.config.stunSocketAddress)", level: .debug) SDLLogger.log("[SDLContext] send packet by super: \(self.config.stunSocketAddress)")
// //
self.flowTracer.inc(num: data.count, type: .forward) self.flowTracer.inc(num: data.count, type: .forward)
@ -860,7 +860,7 @@ actor SDLContextActor {
} }
// nat // nat
self.natType = await self.proberActor.probeNatType(using: udpHole) self.natType = await self.proberActor.probeNatType(using: udpHole)
SDLLogger.shared.log("[SDLContext] nat_type is: \(natType)") SDLLogger.log("[SDLContext] nat_type is: \(natType)")
} }
private func spawnLoop(_ body: @escaping () async throws -> Void) -> Task<Void, Never> { private func spawnLoop(_ body: @escaping () async throws -> Void) -> Task<Void, Never> {

View File

@ -62,7 +62,7 @@ actor SDLPuncherActor {
} }
if let remoteAddress = try? await peerInfo.v4Info.socketAddress() { if let remoteAddress = try? await peerInfo.v4Info.socketAddress() {
SDLLogger.shared.log("[SDLContext] hole sock address: \(remoteAddress)", level: .debug) SDLLogger.log("[SDLContext] hole sock address: \(remoteAddress)", for: .punchnet)
// register // register
var register = SDLRegister() var register = SDLRegister()
register.networkID = requestContext.request.networkId register.networkID = requestContext.request.networkId

View File

@ -61,7 +61,7 @@ final class SDLQUICClient {
func start() { func start() {
connection.stateUpdateHandler = { state in connection.stateUpdateHandler = { state in
SDLLogger.shared.log("[SDLQUICClient] new state: \(state)") SDLLogger.log("[SDLQUICClient] new state: \(state)", for: .debug)
switch state { switch state {
case .ready: case .ready:
self.readyCont.yield() self.readyCont.yield()
@ -118,7 +118,7 @@ final class SDLQUICClient {
self.send(type: .ping, data: Data()) self.send(type: .ping, data: Data())
} }
SDLLogger.shared.log("[SDLQUICClient] udp pingTask cancel") SDLLogger.log("[SDLQUICClient] udp pingTask cancel", for: .debug)
} }
} }
@ -131,7 +131,7 @@ final class SDLQUICClient {
connection.send(content: packet, completion: .contentProcessed { error in connection.send(content: packet, completion: .contentProcessed { error in
if let error { if let error {
SDLLogger.shared.log("[SDLQUICClient] send data get error: \(error)") SDLLogger.log("[SDLQUICClient] send data get error: \(error)", for: .debug)
} }
}) })
} }
@ -239,14 +239,14 @@ final class SDLQUICClient {
case .event: case .event:
guard let bytes = buffer.readBytes(length: buffer.readableBytes), guard let bytes = buffer.readBytes(length: buffer.readableBytes),
let event = try? SDLEvent(serializedBytes: bytes) else { let event = try? SDLEvent(serializedBytes: bytes) else {
SDLLogger.shared.log("SDLQUICClient decode Event Error") SDLLogger.log("SDLQUICClient decode Event Error", for: .debug)
return nil return nil
} }
return .event(event) return .event(event)
case .pong: case .pong:
return .pong return .pong
default: default:
SDLLogger.shared.log("SDLQUICClient decode miss type: \(type)") SDLLogger.log("SDLQUICClient decode miss type: \(type)", for: .debug)
return nil return nil
} }
@ -273,7 +273,7 @@ extension SDLQUICClient {
// --- Step 1: --- // --- Step 1: ---
var error: CFError? var error: CFError?
guard SecTrustEvaluateWithError(secTrust, &error) else { guard SecTrustEvaluateWithError(secTrust, &error) else {
SDLLogger.shared.log("❌ 系统证书验证失败: \(error?.localizedDescription ?? "未知错误")") SDLLogger.log("❌ 系统证书验证失败: \(error?.localizedDescription ?? "未知错误")", for: .debug)
return false return false
} }
@ -282,21 +282,21 @@ extension SDLQUICClient {
SecTrustSetPolicies(secTrust, policy) SecTrustSetPolicies(secTrust, policy)
guard SecTrustEvaluateWithError(secTrust, &error) else { guard SecTrustEvaluateWithError(secTrust, &error) else {
SDLLogger.shared.log("❌ 主机名校验失败: \(error?.localizedDescription ?? "未知错误")") SDLLogger.log("❌ 主机名校验失败: \(error?.localizedDescription ?? "未知错误")", for: .debug)
return false return false
} }
// --- Step 3: --- // --- Step 3: ---
guard let chain = SecTrustCopyCertificateChain(secTrust) as? [SecCertificate], guard let chain = SecTrustCopyCertificateChain(secTrust) as? [SecCertificate],
let leafCertificate = chain.first else { let leafCertificate = chain.first else {
SDLLogger.shared.log("❌ 无法获取证书链或叶子证书") SDLLogger.log("❌ 无法获取证书链或叶子证书", for: .debug)
return false return false
} }
// --- Step 4: --- // --- Step 4: ---
guard let publicKey = SecCertificateCopyKey(leafCertificate), guard let publicKey = SecCertificateCopyKey(leafCertificate),
let publicKeyData = SecKeyCopyExternalRepresentation(publicKey, nil) as Data? else { let publicKeyData = SecKeyCopyExternalRepresentation(publicKey, nil) as Data? else {
SDLLogger.shared.log("❌ 无法提取公钥") SDLLogger.log("❌ 无法提取公钥", for: .debug)
return false return false
} }
@ -305,10 +305,10 @@ extension SDLQUICClient {
let hashBase64 = Data(hash).base64EncodedString() let hashBase64 = Data(hash).base64EncodedString()
if pinnedPublicKeyHashes.contains(hashBase64) { if pinnedPublicKeyHashes.contains(hashBase64) {
SDLLogger.shared.log("✅ 公钥校验通过") SDLLogger.log("✅ 公钥校验通过", for: .debug)
return true return true
} else { } else {
SDLLogger.shared.log("⚠️ 公钥不匹配! 收到: \(hashBase64)") SDLLogger.log("⚠️ 公钥不匹配! 收到: \(hashBase64)", for: .debug)
return false return false
} }
} }

View File

@ -16,7 +16,7 @@ actor SDLSupervisor {
} catch is CancellationError { } catch is CancellationError {
break break
} catch let err { } catch let err {
SDLLogger.shared.log("[Supervisor] worker \(name) crashed: \(err.localizedDescription)") SDLLogger.log("[Supervisor] worker \(name) crashed: \(err.localizedDescription)", for: .punchnet)
try? await Task.sleep(for: retryDelay) try? await Task.sleep(for: retryDelay)
} }
} }

View File

@ -9,7 +9,6 @@ import Network
final class DNSCloudClient { final class DNSCloudClient {
private var connection: NWConnection? private var connection: NWConnection?
private let logger: SDLLogger
private let dnsServerAddress: NWEndpoint private let dnsServerAddress: NWEndpoint
// DNS // DNS
@ -21,8 +20,7 @@ final class DNSCloudClient {
/// - Parameter host: sn-server ( "8.8.8.8") /// - Parameter host: sn-server ( "8.8.8.8")
/// - Parameter port: ( 53) /// - Parameter port: ( 53)
init(host: String, port: UInt16, logger: SDLLogger) { init(host: String, port: UInt16 ) {
self.logger = logger
self.dnsServerAddress = .hostPort(host: NWEndpoint.Host(host), port: NWEndpoint.Port(integerLiteral: port)) self.dnsServerAddress = .hostPort(host: NWEndpoint.Host(host), port: NWEndpoint.Port(integerLiteral: port))
let (stream, continuation) = AsyncStream.makeStream(of: Data.self, bufferingPolicy: .unbounded) let (stream, continuation) = AsyncStream.makeStream(of: Data.self, bufferingPolicy: .unbounded)
@ -46,10 +44,10 @@ final class DNSCloudClient {
connection.stateUpdateHandler = { [weak self] state in connection.stateUpdateHandler = { [weak self] state in
switch state { switch state {
case .ready: case .ready:
self?.logger.log("[DNSClient] Connection ready", level: .debug) SDLLogger.log("[DNSClient] Connection ready", for: .debug)
self?.receiveLoop() // self?.receiveLoop() //
case .failed(let error): case .failed(let error):
self?.logger.log("[DNSClient] Connection failed: \(error)", level: .error) SDLLogger.log("[DNSClient] Connection failed: \(error)", for: .debug)
self?.stop() self?.stop()
case .cancelled: case .cancelled:
self?.packetContinuation.finish() self?.packetContinuation.finish()
@ -89,7 +87,7 @@ final class DNSCloudClient {
connection.send(content: ipPacketData, completion: .contentProcessed { [weak self] error in connection.send(content: ipPacketData, completion: .contentProcessed { [weak self] error in
if let error = error { if let error = error {
self?.logger.log("[DNSClient] Send error: \(error)", level: .error) SDLLogger.log("[DNSClient] Send error: \(error)", for: .debug)
} }
}) })
} }

View File

@ -44,7 +44,7 @@ final class DNSLocalClient {
case .ready: case .ready:
self?.receiveLoop(for: conn) self?.receiveLoop(for: conn)
case .failed(let error): case .failed(let error):
SDLLogger.shared.log("[DNSLocalClient] failed with error: \(error.localizedDescription)") SDLLogger.log("[DNSLocalClient] failed with error: \(error.localizedDescription)", for: .debug)
self?.stop() self?.stop()
case .cancelled: case .cancelled:
self?.packetContinuation.finish() self?.packetContinuation.finish()

View File

@ -9,44 +9,33 @@ import os
public class SDLLogger: @unchecked Sendable { public class SDLLogger: @unchecked Sendable {
public enum Subsystem: String { public enum Subsystem: String, CaseIterable {
case punchnet = "com.jihe.punchnet" case punchnet = "com.jihe.punchnet"
case debug = "com.jihe.punchnetdebug" case debug = "com.jihe.punchnet.debug"
case trace = "com.jihe.punchnet.trace"
} }
public enum Level: Int8, CustomStringConvertible { static var loggers: [String: SDLLogger] {
case debug = 0 var loggers: [String: SDLLogger] = [:]
case info = 1 for sub in Subsystem.allCases {
case warning = 2 loggers[sub.rawValue] = .init(subsystem: sub)
case error = 3
public var description: String {
switch self {
case .debug:
return "Debug"
case .info:
return "Info"
case .warning:
return "Warning"
case .error:
return "Error"
}
} }
return loggers
} }
static let shared = SDLLogger(level: .debug, subsystem: .punchnet)
static let sharedDebug = SDLLogger(level: .debug, subsystem: .debug)
private let level: Level
private let log: Logger private let log: Logger
private init(level: Level, subsystem: Subsystem) { private init(subsystem: Subsystem) {
self.level = level
self.log = Logger(subsystem: subsystem.rawValue, category: "punchnet") self.log = Logger(subsystem: subsystem.rawValue, category: "punchnet")
} }
public func log(_ message: String, level: Level = .debug) { public func _log(_ message: String) {
self.log.info("\(message, privacy: .public)") self.log.info("\(message, privacy: .public)")
} }
public static func log(_ message: String, for system: Subsystem = .punchnet) {
if let logger = loggers[system.rawValue] {
logger._log(message)
}
}
} }

View File

@ -38,7 +38,6 @@ final class SDLNoticeClient {
} }
self.channel = try bootstrap.bind(host: "0.0.0.0", port: 0).wait() self.channel = try bootstrap.bind(host: "0.0.0.0", port: 0).wait()
SDLLogger.shared.log("[SDLNoticeClient] started", level: .debug)
} }
func start() { func start() {

View File

@ -45,7 +45,6 @@ final class SDLUDPHole: ChannelInboundHandler {
} }
let channel = try bootstrap.bind(host: "0.0.0.0", port: 0).wait() let channel = try bootstrap.bind(host: "0.0.0.0", port: 0).wait()
SDLLogger.shared.log("[UDPHole] started", level: .debug)
self.channel = channel self.channel = channel
} }
@ -81,17 +80,17 @@ final class SDLUDPHole: ChannelInboundHandler {
let remoteAddress = envelope.remoteAddress let remoteAddress = envelope.remoteAddress
if let rawBytes = buffer.getBytes(at: buffer.readerIndex, length: buffer.readableBytes) { if let rawBytes = buffer.getBytes(at: buffer.readerIndex, length: buffer.readableBytes) {
SDLLogger.shared.log("[SDLUDPHole] get raw bytes: \(rawBytes.count), from: \(remoteAddress)") SDLLogger.log("[SDLUDPHole] get raw bytes: \(rawBytes.count), from: \(remoteAddress)", for: .punchnet)
} }
do { do {
if let message = try decode(buffer: &buffer) { if let message = try decode(buffer: &buffer) {
self.messageContinuation.yield((remoteAddress, message)) self.messageContinuation.yield((remoteAddress, message))
} else { } else {
SDLLogger.shared.log("[SDLUDPHole] decode message, get null", level: .warning) SDLLogger.log("[SDLUDPHole] decode message, get null", for: .punchnet)
} }
} catch let err { } catch let err {
SDLLogger.shared.log("[SDLUDPHole] decode message, get error: \(err)", level: .warning) SDLLogger.log("[SDLUDPHole] decode message, get error: \(err)", for: .punchnet)
} }
} }
@ -128,7 +127,6 @@ final class SDLUDPHole: ChannelInboundHandler {
private func decode(buffer: inout ByteBuffer) throws -> SDLHoleMessage? { private func decode(buffer: inout ByteBuffer) throws -> SDLHoleMessage? {
guard let type = buffer.readInteger(as: UInt8.self), guard let type = buffer.readInteger(as: UInt8.self),
let packetType = SDLPacketType(rawValue: type) else { let packetType = SDLPacketType(rawValue: type) else {
SDLLogger.shared.log("[SDLUDPHole] decode error 11")
return nil return nil
} }
@ -164,7 +162,7 @@ final class SDLUDPHole: ChannelInboundHandler {
} }
return .stunReply(stunReply) return .stunReply(stunReply)
default: default:
SDLLogger.shared.log("SDLUDPHole decode miss type: \(type)") SDLLogger.log("SDLUDPHole decode miss type: \(type)", for: .debug)
return nil return nil
} }