fix logger

This commit is contained in:
anlicheng 2026-02-04 00:07:06 +08:00
parent 57e360bee2
commit c63b20b568
10 changed files with 63 additions and 78 deletions

View File

@ -32,10 +32,9 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
//
let rsaCipher = try! CCRSACipher(keySize: 1024)
let aesChiper = CCAESChiper()
let logger = SDLLogger(level: .debug)
self.rootTask = Task {
self.contextActor = SDLContextActor(provider: self, config: config, rsaCipher: rsaCipher, aesCipher: aesChiper, logger: logger)
self.contextActor = SDLContextActor(provider: self, config: config, rsaCipher: rsaCipher, aesCipher: aesChiper)
await self.contextActor?.start()
completionHandler(nil)
}

View File

@ -54,7 +54,6 @@ actor SDLNATProberActor {
private let udpHole: SDLUDPHole
private let addressArray: [[SocketAddress]]
private let logger: SDLLogger
// MARK: - Completion
private var cookieId: UInt32 = 1
@ -63,10 +62,9 @@ actor SDLNATProberActor {
// MARK: - Init
init(udpHole: SDLUDPHole, addressArray: [[SocketAddress]], logger: SDLLogger) {
init(udpHole: SDLUDPHole, addressArray: [[SocketAddress]]) {
self.udpHole = udpHole
self.addressArray = addressArray
self.logger = logger
}
// MARK: - Public API
@ -104,7 +102,7 @@ actor SDLNATProberActor {
// 退nat
if session.replies[1] != nil {
let localAddress = self.udpHole.getLocalAddress()
if reply.socketAddress() == localAddress {
if await reply.socketAddress() == localAddress {
finish(cookie: session.cookieId, .noNat)
return
}
@ -113,7 +111,7 @@ actor SDLNATProberActor {
if let step1 = session.replies[1], let step2 = session.replies[2] {
// natAddress2 IPIPNAT;
// ip{dstIp, dstPort, srcIp, srcPort}, ip
if let addr1 = step1.socketAddress(), let addr2 = step2.socketAddress(), addr1 != addr2 {
if let addr1 = await step1.socketAddress(), let addr2 = await step2.socketAddress(), addr1 != addr2 {
finish(cookie: session.cookieId, .symmetric)
return
}

View File

@ -20,7 +20,6 @@ actor SDLPuncherActor {
private var pendingRequests: [UInt32:RegisterRequest] = [:]
// holer
private var logger: SDLLogger
private var querySocketAddress: SocketAddress
nonisolated private let(requestStream, requestContinuation) = AsyncStream.makeStream(of: RegisterRequest.self, bufferingPolicy: .unbounded)
@ -31,10 +30,9 @@ actor SDLPuncherActor {
let networkId: UInt32
}
init(udpHole: SDLUDPHole, querySocketAddress: SocketAddress, logger: SDLLogger) {
init(udpHole: SDLUDPHole, querySocketAddress: SocketAddress) {
self.udpHole = udpHole
self.querySocketAddress = querySocketAddress
self.logger = logger
}
nonisolated func submitRegisterRequest(request: RegisterRequest) {
@ -74,8 +72,8 @@ actor SDLPuncherActor {
func handlePeerInfo(peerInfo: SDLPeerInfo) async {
if let request = pendingRequests.removeValue(forKey: peerInfo.pktID) {
if let remoteAddress = peerInfo.v4Info.socketAddress() {
self.logger.log("[SDLContext] hole sock address: \(remoteAddress)", level: .debug)
if let remoteAddress = try? await peerInfo.v4Info.socketAddress() {
SDLLogger.shared.log("[SDLContext] hole sock address: \(remoteAddress)", level: .debug)
// register
var register = SDLRegister()
register.networkID = request.networkId
@ -84,7 +82,7 @@ actor SDLPuncherActor {
self.udpHole.send(type: .register, data: try! register.serializedData(), remoteAddress: remoteAddress)
} else {
self.logger.log("[SDLContext] hole sock address is invalid: \(peerInfo.v4Info)", level: .warning)
SDLLogger.shared.log("[SDLContext] hole sock address is invalid: \(peerInfo.v4Info)", level: .warning)
}
}
}

View File

@ -22,7 +22,6 @@ actor SDLAddressResolver {
func resolve(host: String, port: Int) async throws -> SocketAddress {
let key = "\(host):\(port)"
if let cached = cache[key] {
return cached
}
@ -30,8 +29,8 @@ actor SDLAddressResolver {
let address = try await pool.runIfActive {
try SocketAddress.makeAddressResolvingHost(host, port: port)
}
cache[key] = address
return address
}

View File

@ -57,20 +57,17 @@ actor SDLContextActor {
//
nonisolated private let flowTracer = SDLFlowTracer()
nonisolated private let logger: SDLLogger
//
private var loopChildWorkers: [Task<Void, Never>] = []
public init(provider: NEPacketTunnelProvider, config: SDLConfiguration, rsaCipher: RSACipher, aesCipher: AESCipher, logger: SDLLogger) {
self.logger = logger
public init(provider: NEPacketTunnelProvider, config: SDLConfiguration, rsaCipher: RSACipher, aesCipher: AESCipher) {
self.config = config
self.rsaCipher = rsaCipher
self.aesCipher = aesCipher
self.sessionManager = SessionManager()
self.arpServer = ArpServer(known_macs: [:])
self.providerAdapter = SDLTunnelProviderAdapter(provider: provider, logger: logger)
self.providerAdapter = SDLTunnelProviderAdapter(provider: provider)
}
public func start() {
@ -78,32 +75,32 @@ actor SDLContextActor {
self.loopChildWorkers.append(spawnLoop {
let noticeClient = try self.startNoticeClient()
self.logger.log("[SDLContext] noticeClient running!!!!")
SDLLogger.shared.log("[SDLContext] noticeClient running!!!!")
try await noticeClient.waitClose()
self.logger.log("[SDLContext] noticeClient closed!!!!")
SDLLogger.shared.log("[SDLContext] noticeClient closed!!!!")
})
self.loopChildWorkers.append(spawnLoop {
let dnsClient = try await self.startDnsClient()
self.logger.log("[SDLContext] dns running!!!!")
SDLLogger.shared.log("[SDLContext] dns running!!!!")
try await dnsClient.waitClose()
self.logger.log("[SDLContext] dns closed!!!!")
SDLLogger.shared.log("[SDLContext] dns closed!!!!")
})
self.loopChildWorkers.append(spawnLoop {
let udpHole = try await self.startUDPHole()
self.logger.log("[SDLContext] udp running!!!!")
SDLLogger.shared.log("[SDLContext] udp running!!!!")
try await udpHole.waitClose()
self.logger.log("[SDLContext] udp closed!!!!")
SDLLogger.shared.log("[SDLContext] udp closed!!!!")
})
}
private func startNoticeClient() throws -> SDLNoticeClient {
// noticeClient
let noticeClient = try SDLNoticeClient(noticePort: self.config.noticePort, logger: self.logger)
let noticeClient = try SDLNoticeClient(noticePort: self.config.noticePort, logger: SDLLogger.shared)
noticeClient.start()
self.logger.log("[SDLContext] noticeClient started")
SDLLogger.shared.log("[SDLContext] noticeClient started")
self.noticeClient = noticeClient
return noticeClient
@ -116,7 +113,7 @@ actor SDLContextActor {
// monitor
let monitor = SDLNetworkMonitor()
monitor.start()
self.logger.log("[SDLContext] monitor started")
SDLLogger.shared.log("[SDLContext] monitor started")
self.monitor = monitor
self.monitorWorker = Task.detached {
@ -125,9 +122,9 @@ actor SDLContextActor {
case .changed:
// nat
//self.natType = await self.getNatType()
self.logger.log("didNetworkPathChanged, nat type is:", level: .info)
SDLLogger.shared.log("didNetworkPathChanged, nat type is:", level: .info)
case .unreachable:
self.logger.log("didNetworkPathUnreachable", level: .warning)
SDLLogger.shared.log("didNetworkPathUnreachable", level: .warning)
}
}
}
@ -139,9 +136,9 @@ actor SDLContextActor {
// dns
let dnsSocketAddress = try SocketAddress.makeAddressResolvingHost(self.config.remoteDnsServer, port: 15353)
let dnsClient = try await SDLDNSClient(dnsServerAddress: dnsSocketAddress, logger: self.logger)
let dnsClient = try await SDLDNSClient(dnsServerAddress: dnsSocketAddress, logger: SDLLogger.shared)
try dnsClient.start()
self.logger.log("[SDLContext] dnsClient started")
SDLLogger.shared.log("[SDLContext] dnsClient started")
self.dnsClient = dnsClient
self.dnsWorker = Task.detached {
//
@ -162,9 +159,9 @@ actor SDLContextActor {
self.udpHoleWorkers = nil
// udp
let udpHole = try SDLUDPHole(logger: self.logger)
let udpHole = try SDLUDPHole(logger: SDLLogger.shared)
try udpHole.start()
self.logger.log("[SDLContext] udpHole started")
SDLLogger.shared.log("[SDLContext] udpHole started")
self.udpHole = udpHole
await udpHole.channelIsActived()
@ -180,12 +177,12 @@ actor SDLContextActor {
if Task.isCancelled {
break
}
self.logger.log("[SDLContext] will do stunRequest22")
SDLLogger.shared.log("[SDLContext] will do stunRequest22")
await self.sendStunRequest()
self.logger.log("[SDLContext] will do stunRequest44")
SDLLogger.shared.log("[SDLContext] will do stunRequest44")
}
self.logger.log("[SDLContext] will do stunRequest55")
SDLLogger.shared.log("[SDLContext] will do stunRequest55")
}
//
@ -257,14 +254,14 @@ actor SDLContextActor {
return
}
self.puncherActor = SDLPuncherActor(udpHole: udpHole, querySocketAddress: config.stunSocketAddress, logger: logger)
self.proberActor = SDLNATProberActor(udpHole: udpHole, addressArray: self.config.stunProbeSocketAddressArray, logger: self.logger)
self.puncherActor = SDLPuncherActor(udpHole: udpHole, querySocketAddress: config.stunSocketAddress)
self.proberActor = SDLNATProberActor(udpHole: udpHole, addressArray: self.config.stunProbeSocketAddressArray)
// nat
Task.detached {
if let natType = await self.proberActor?.probeNatType() {
await self.setNatType(natType: natType)
self.logger.log("[SDLContext] nat_type is: \(natType)")
SDLLogger.shared.log("[SDLContext] nat_type is: \(natType)")
}
}
@ -281,7 +278,7 @@ actor SDLContextActor {
registerSuper.accessToken = self.config.accessToken
if let registerSuperData = try? registerSuper.serializedData() {
self.logger.log("[SDLContext] will send register super")
SDLLogger.shared.log("[SDLContext] will send register super")
self.udpHole?.send(type: .registerSuper, data: registerSuperData, remoteAddress: self.config.stunSocketAddress)
}
}
@ -294,7 +291,7 @@ actor SDLContextActor {
stunRequest.mac = self.config.networkAddress.mac
stunRequest.natType = UInt32(self.natType.rawValue)
self.logger.log("[SDLContext] will send stun request")
SDLLogger.shared.log("[SDLContext] will send stun request")
if let stunData = try? stunRequest.serializedData() {
let remoteAddress = self.config.stunSocketAddress
@ -306,17 +303,17 @@ actor SDLContextActor {
// rsa
let aesKey = try! self.rsaCipher.decode(data: Data(registerSuperAck.aesKey))
self.logger.log("[SDLContext] get registerSuperAck, aes_key len: \(aesKey.count)", level: .info)
SDLLogger.shared.log("[SDLContext] get registerSuperAck, aes_key len: \(aesKey.count)", level: .info)
// tun
do {
let ipAddress = try await self.providerAdapter.setNetworkSettings(networkAddress: self.config.networkAddress, dnsServer: SDLDNSClient.Helper.dnsServer)
self.logger.log("[SDLContext] setNetworkSettings successed")
SDLLogger.shared.log("[SDLContext] setNetworkSettings successed")
self.noticeClient?.send(data: NoticeMessage.ipAdress(ip: ipAddress))
self.logger.log("[SDLContext] send ip successed")
SDLLogger.shared.log("[SDLContext] send ip successed")
self.startReader()
self.logger.log("[SDLContext] reader started")
SDLLogger.shared.log("[SDLContext] reader started")
} catch let err {
self.logger.log("[SDLContext] setTunnelNetworkSettings get error: \(err)", level: .error)
SDLLogger.shared.log("[SDLContext] setTunnelNetworkSettings get error: \(err)", level: .error)
exit(-1)
}
@ -338,7 +335,7 @@ actor SDLContextActor {
let alertNotice = NoticeMessage.alert(alert: errorMessage)
self.noticeClient?.send(data: alertNotice)
}
self.logger.log("[SDLContext] Get a SuperNak message exit", level: .warning)
SDLLogger.shared.log("[SDLContext] Get a SuperNak message exit", level: .warning)
}
@ -346,10 +343,10 @@ actor SDLContextActor {
switch event {
case .natChanged(let natChangedEvent):
let dstMac = natChangedEvent.mac
self.logger.log("[SDLContext] natChangedEvent, dstMac: \(dstMac)", level: .info)
SDLLogger.shared.log("[SDLContext] natChangedEvent, dstMac: \(dstMac)", level: .info)
sessionManager.removeSession(dstMac: dstMac)
case .sendRegister(let sendRegisterEvent):
self.logger.log("[SDLContext] sendRegisterEvent, ip: \(sendRegisterEvent)", level: .debug)
SDLLogger.shared.log("[SDLContext] sendRegisterEvent, ip: \(sendRegisterEvent)", level: .debug)
let address = SDLUtil.int32ToIp(sendRegisterEvent.natIp)
if let remoteAddress = try? SocketAddress.makeAddressResolvingHost(address, port: Int(sendRegisterEvent.natPort)) {
// register
@ -369,7 +366,7 @@ actor SDLContextActor {
private func handleRegister(remoteAddress: SocketAddress, register: SDLRegister) throws {
let networkAddr = config.networkAddress
self.logger.log("register packet: \(register), network_address: \(networkAddr)", level: .debug)
SDLLogger.shared.log("register packet: \(register), network_address: \(networkAddr)", level: .debug)
// tun,
if register.dstMac == networkAddr.mac && register.networkID == networkAddr.networkId {
@ -384,7 +381,7 @@ actor SDLContextActor {
let session = Session(dstMac: register.srcMac, natAddress: remoteAddress)
self.sessionManager.addSession(session: session)
} else {
self.logger.log("SDLContext didReadRegister get a invalid packet, because dst_ip not matched: \(register.dstMac)", level: .warning)
SDLLogger.shared.log("SDLContext didReadRegister get a invalid packet, because dst_ip not matched: \(register.dstMac)", level: .warning)
}
}
@ -395,7 +392,7 @@ actor SDLContextActor {
let session = Session(dstMac: registerAck.srcMac, natAddress: remoteAddress)
self.sessionManager.addSession(session: session)
} else {
self.logger.log("SDLContext didReadRegisterAck get a invalid packet, because dst_mac not matched: \(registerAck.dstMac)", level: .warning)
SDLLogger.shared.log("SDLContext didReadRegisterAck get a invalid packet, because dst_mac not matched: \(registerAck.dstMac)", level: .warning)
}
}
@ -426,18 +423,18 @@ actor SDLContextActor {
if arpPacket.targetIP == networkAddr.ip {
switch arpPacket.opcode {
case .request:
self.logger.log("[SDLContext] get arp request packet", level: .debug)
SDLLogger.shared.log("[SDLContext] get arp request packet", level: .debug)
let response = ARPPacket.arpResponse(for: arpPacket, mac: networkAddr.mac, ip: networkAddr.ip)
self.routeLayerPacket(dstMac: arpPacket.senderMAC, type: .arp, data: response.marshal())
case .response:
self.logger.log("[SDLContext] get arp response packet", level: .debug)
SDLLogger.shared.log("[SDLContext] get arp response packet", level: .debug)
self.arpServer.append(ip: arpPacket.senderIP, mac: arpPacket.senderMAC)
}
} else {
self.logger.log("[SDLContext] get invalid arp packet: \(arpPacket), target_ip: \(SDLUtil.int32ToIp(arpPacket.targetIP)), net ip: \(SDLUtil.int32ToIp(networkAddr.ip))", level: .debug)
SDLLogger.shared.log("[SDLContext] get invalid arp packet: \(arpPacket), target_ip: \(SDLUtil.int32ToIp(arpPacket.targetIP)), net ip: \(SDLUtil.int32ToIp(networkAddr.ip))", level: .debug)
}
} else {
self.logger.log("[SDLContext] get invalid arp packet", level: .debug)
SDLLogger.shared.log("[SDLContext] get invalid arp packet", level: .debug)
}
case .ipv4:
guard let ipPacket = IPPacket(layerPacket.data), ipPacket.header.destination == networkAddr.ip else {
@ -446,7 +443,7 @@ actor SDLContextActor {
let packet = NEPacket(data: ipPacket.data, protocolFamily: 2)
self.providerAdapter.writePackets(packets: [packet])
default:
self.logger.log("[SDLContext] get invalid packet", level: .debug)
SDLLogger.shared.log("[SDLContext] get invalid packet", level: .debug)
}
}
@ -491,7 +488,7 @@ actor SDLContextActor {
let networkAddr = self.config.networkAddress
if SDLDNSClient.Helper.isDnsRequestPacket(ipPacket: packet) {
let destIp = packet.header.destination_ip
self.logger.log("[DNSQuery] destIp: \(destIp), int: \(packet.header.destination.asIpAddress())", level: .debug)
SDLLogger.shared.log("[DNSQuery] destIp: \(destIp), int: \(packet.header.destination.asIpAddress())", level: .debug)
self.dnsClient?.forward(ipPacket: packet)
return
}
@ -509,7 +506,7 @@ actor SDLContextActor {
self.routeLayerPacket(dstMac: dstMac, type: .ipv4, data: packet.data)
}
else {
self.logger.log("[SDLContext] dstIp: \(dstIp.asIpAddress()) arp query not found, broadcast", level: .debug)
SDLLogger.shared.log("[SDLContext] dstIp: \(dstIp.asIpAddress()) arp query not found, broadcast", level: .debug)
// arp广
let arpReqeust = ARPPacket.arpRequest(senderIP: networkAddr.ip, senderMAC: networkAddr.mac, targetIP: dstIp)
self.routeLayerPacket(dstMac: ARPPacket.broadcastMac , type: .arp, data: arpReqeust.marshal())
@ -541,7 +538,7 @@ actor SDLContextActor {
else {
// session
if let session = self.sessionManager.getSession(toAddress: dstMac) {
self.logger.log("[SDLContext] send packet by session: \(session)", level: .debug)
SDLLogger.shared.log("[SDLContext] send packet by session: \(session)", level: .debug)
self.udpHole?.send(type: .data, data: data, remoteAddress: session.natAddress)
self.flowTracer.inc(num: data.count, type: .p2p)
}

View File

@ -28,10 +28,12 @@ public class SDLLogger: @unchecked Sendable {
}
}
static let shared = SDLLogger(level: .debug)
private let level: Level
private let log: Logger
public init(level: Level) {
private init(level: Level) {
self.level = level
self.log = Logger(subsystem: "com.jihe.punchnet", category: "punchnet")
}

View File

@ -77,18 +77,18 @@ enum SDLNAKErrorCode: UInt8 {
}
extension SDLV4Info {
func socketAddress() -> SocketAddress? {
func socketAddress() async throws -> SocketAddress {
let address = "\(v4[0]).\(v4[1]).\(v4[2]).\(v4[3])"
return try? SocketAddress.makeAddressResolvingHost(address, port: Int(port))
return try await SDLAddressResolver.shared.resolve(host: address, port: Int(port))
}
}
extension SDLStunProbeReply {
func socketAddress() -> SocketAddress? {
func socketAddress() async -> SocketAddress? {
let address = SDLUtil.int32ToIp(self.ip)
return try? SocketAddress.makeAddressResolvingHost(address, port: Int(port))
return try? await SDLAddressResolver.shared.resolve(host: address, port: Int(port))
}
}

View File

@ -46,21 +46,15 @@ final class SDLNoticeClient {
func start() {
let channel = self.channel
self.task = Task.detached {
self.logger.log("[SDLNoticeClient] task 11", level: .debug)
guard let remoteAddress = try? await SDLAddressResolver.shared.resolve(host: "127.0.0.1", port: self.noticePort) else {
self.logger.log("[SDLNoticeClient] task 22", level: .debug)
return
}
for await data in self.writeStream {
if Task.isCancelled {
self.logger.log("[SDLNoticeClient] task 33", level: .debug)
break
}
self.logger.log("[SDLNoticeClient] task 44", level: .debug)
self.logger.log("[SDLNoticeClient] send packet", level: .debug)
let buf = channel.allocator.buffer(bytes: data)
let envelope = AddressedEnvelope<ByteBuffer>(remoteAddress: remoteAddress, data: buf)
channel.eventLoop.execute {

View File

@ -28,10 +28,8 @@ final class SDLTunnelProviderAdapter {
}
let provider: NEPacketTunnelProvider
let logger: SDLLogger
public init(provider: NEPacketTunnelProvider, logger: SDLLogger) {
self.logger = logger
public init(provider: NEPacketTunnelProvider) {
self.provider = provider
}
@ -60,7 +58,7 @@ final class SDLTunnelProviderAdapter {
dnsSettings.matchDomains = [networkDomain]
dnsSettings.matchDomainsNoSearch = false
networkSettings.dnsSettings = dnsSettings
self.logger.log("[SDLTunnelProviderAdapter] Tun started at network ip: \(netAddress.ipAddress), mask: \(netAddress.maskAddress)", level: .info)
SDLLogger.shared.log("[SDLTunnelProviderAdapter] Tun started at network ip: \(netAddress.ipAddress), mask: \(netAddress.maskAddress)", level: .info)
let ipv4Settings = NEIPv4Settings(addresses: [netAddress.ipAddress], subnetMasks: [netAddress.maskAddress])
//

View File

@ -62,7 +62,7 @@ struct NetworkDisconnctedView: View {
maskLen: 24,
accessToken: "accessToken1234",
hostname: "mysql",
noticePort: 123456)
noticePort: 1234)
// token使token
try await VPNManager.shared.enableVpn(options: options!)
}