pkg/accesslog/collector/tls.go (66 lines of code) (raw):

// Licensed to Apache Software Foundation (ASF) under one or more contributor // license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright // ownership. Apache Software Foundation (ASF) licenses this file to you under // the Apache License, Version 2.0 (the "License"); you may // not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. package collector import ( "sync" "github.com/apache/skywalking-rover/pkg/accesslog/common" "github.com/apache/skywalking-rover/pkg/logger" "github.com/apache/skywalking-rover/pkg/module" "github.com/apache/skywalking-rover/pkg/tools/btf" "github.com/apache/skywalking-rover/pkg/tools/ssl" ) var tlsLog = logger.GetLogger("access_log", "collector", "tls") var tlsCollectInstance = NewTLSCollector() type TLSCollector struct { context *common.AccessLogContext monitoredProcesses map[int32]bool linker *btf.Linker mutex sync.Mutex } func NewTLSCollector() *TLSCollector { return &TLSCollector{ monitoredProcesses: make(map[int32]bool), linker: btf.NewLinker(), } } func (c *TLSCollector) Start(_ *module.Manager, context *common.AccessLogContext) error { c.context = context context.ConnectionMgr.AddProcessListener(c) return nil } func (c *TLSCollector) Stop() { if err := c.linker.Close(); err != nil { tlsLog.Warnf("close linker failure, error: %v", err) } c.monitoredProcesses = make(map[int32]bool) c.linker = btf.NewLinker() } func (c *TLSCollector) OnNewProcessMonitoring(pid int32) { go func() { c.addProcess(pid) }() } func (c *TLSCollector) addProcess(pid int32) { c.mutex.Lock() defer c.mutex.Unlock() if _, ok := c.monitoredProcesses[pid]; ok { return } c.monitoredProcesses[pid] = true register := ssl.NewSSLRegister(int(pid), c.linker) register.OpenSSL(c.context.BPF.OpensslSymaddrMap, c.context.BPF.OpensslWrite, c.context.BPF.OpensslWriteRet, c.context.BPF.OpensslRead, c.context.BPF.OpensslReadRet) register.Envoy(nil, c.context.BPF.OpensslWrite, c.context.BPF.OpensslWriteRet, c.context.BPF.OpensslRead, c.context.BPF.OpensslReadRet) register.GoTLS(c.context.BPF.GoTlsArgsSymaddrMap, c.context.BPF.GoTlsWrite, c.context.BPF.GoTlsWriteRet, c.context.BPF.GoTlsRead, c.context.BPF.GoTlsReadRet) register.Node(nil, c.context.BPF.NodeTlsSymaddrMap, c.context.BPF.OpensslWrite, c.context.BPF.OpensslWriteRet, c.context.BPF.OpensslRead, c.context.BPF.OpensslReadRet, c.context.BPF.NodeTlsRetSsl, c.context.BPF.NodeTlsWrap, c.context.BPF.NodeTlsWrapRet) if err := register.Execute(); err != nil { tlsLog.Errorf("register TLS failure, pid: %d, error: %v", pid, err) delete(c.monitoredProcesses, pid) } } func (c *TLSCollector) OnProcessRemoved(pid int32) { c.mutex.Lock() defer c.mutex.Unlock() delete(c.monitoredProcesses, pid) }