1
0
Fork 0
telegraf/plugins/inputs/intel_baseband/sock_connector.go

103 lines
2.1 KiB
Go
Raw Permalink Normal View History

//go:build linux && amd64
package intel_baseband
import (
"errors"
"fmt"
"net"
"time"
)
const (
// Command code
clearLogCmdID = 0x4
deviceDataCmdID = 0x9
)
type socketConnector struct {
pathToSocket string
accessTimeout time.Duration
connection net.Conn
}
func (sc *socketConnector) dumpTelemetryToLog() error {
// clean the log to have only the latest metrics in the file
err := sc.sendCommandToSocket(clearLogCmdID)
if err != nil {
return fmt.Errorf("failed to send clear log command: %w", err)
}
// fill the file with the latest metrics
err = sc.sendCommandToSocket(deviceDataCmdID)
if err != nil {
return fmt.Errorf("failed to send device data command: %w", err)
}
return nil
}
func (sc *socketConnector) sendCommandToSocket(c byte) error {
err := sc.connect()
if err != nil {
return err
}
defer sc.close()
err = sc.writeCommandToSocket(c)
if err != nil {
return err
}
return nil
}
func (sc *socketConnector) writeCommandToSocket(c byte) error {
if sc.connection == nil {
return errors.New("connection had not been established before")
}
var err error
if sc.accessTimeout == 0 {
err = sc.connection.SetWriteDeadline(time.Time{})
} else {
err = sc.connection.SetWriteDeadline(time.Now().Add(sc.accessTimeout))
}
if err != nil {
return fmt.Errorf("failed to set timeout for request: %w", err)
}
_, err = sc.connection.Write([]byte{c, 0x00})
if err != nil {
return fmt.Errorf("failed to send request to socket: %w", err)
}
return nil
}
func (sc *socketConnector) connect() error {
connection, err := net.Dial("unix", sc.pathToSocket)
if err != nil {
return fmt.Errorf("failed to connect to the socket: %w", err)
}
sc.connection = connection
return nil
}
func (sc *socketConnector) close() error {
if sc.connection == nil {
return nil
}
err := sc.connection.Close()
sc.connection = nil
if err != nil {
return err
}
return nil
}
func newSocketConnector(pathToSocket string, accessTimeout time.Duration) *socketConnector {
return &socketConnector{
pathToSocket: pathToSocket,
accessTimeout: accessTimeout,
}
}