Skip to content

Commit bd2a85b

Browse files
authored
Merge pull request #2 from brokenCursor/logging
Added basic logging using x/slog
2 parents 7dbb3ac + ef66e6f commit bd2a85b

File tree

6 files changed

+175
-56
lines changed

6 files changed

+175
-56
lines changed

config/config.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package config
2+
3+
import (
4+
"fmt"
5+
"os"
6+
7+
"github.com/spf13/viper"
8+
)
9+
10+
var config *viper.Viper
11+
12+
func init() {
13+
// Get config path
14+
dir, err := os.UserConfigDir()
15+
if err != nil {
16+
panic("failed to get user config dir")
17+
}
18+
19+
// Setup configuration
20+
config = viper.New()
21+
config.SetConfigName("config")
22+
config.SetConfigType("yaml")
23+
24+
sep := string(os.PathSeparator)
25+
config.AddConfigPath(dir + sep + "modem-cli")
26+
27+
// -- Defaults -- //
28+
config.SetDefault("modem.model", "dummy")
29+
config.SetDefault("modem.host", "127.0.0.1")
30+
31+
config.SetDefault("logging.general", "error")
32+
config.SetDefault("logging.driver", "error")
33+
34+
config.SetDefault("driver.cmd_ttl", 10)
35+
// -- Defaults -- //
36+
37+
err = config.ReadInConfig()
38+
if err != nil { // Handle errors reading the config file
39+
panic(fmt.Errorf("fatal error config file: %w", err))
40+
}
41+
}
42+
43+
func Sub(name string) *viper.Viper {
44+
return config.Sub(name)
45+
}

drivers/8810ft.go

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,9 @@ type (
2929
}
3030
)
3131

32-
var httpClient *http.Client
33-
3432
func init() {
35-
httpClient = &http.Client{Timeout: time.Second * 30}
3633
registerDriver("ZTE 8810FT", newZTE8810FT)
34+
// dLogger.Debug("driver registered")
3735
}
3836

3937
func newZTE8810FT(host string) BaseModem {
@@ -77,6 +75,8 @@ func (m *zte8810ft) ConnectCell() error {
7775
u.RawQuery = query.Encode()
7876
request := m.getNewRequest("GET", u, http.Header{})
7977

78+
dLogger.With("driver", "8810FT").Debug("request", request.URL.String(), nil)
79+
8080
resp, err := httpClient.Do(request)
8181

8282
// Process errors
@@ -115,6 +115,8 @@ func (m *zte8810ft) DisconnectCell() error {
115115
u.RawQuery = query.Encode()
116116
request := m.getNewRequest("GET", u, http.Header{})
117117

118+
dLogger.With("driver", "8810FT").Debug("request", request.URL.String(), nil)
119+
118120
resp, err := httpClient.Do(request)
119121
// Process errors
120122
switch {
@@ -144,9 +146,6 @@ func (m *zte8810ft) DisconnectCell() error {
144146
}
145147

146148
func (m *zte8810ft) GetCellConnStatus() (*LinkStatus, error) {
147-
// Lines 251-258
148-
// /goform/goform_get_cmd_process?isTest=False&cmd=ppp_connected,multi_data=1&sms_received_flag_flag=0&sts_received_flag_flag=0&_=<curr_time>
149-
150149
// Build URL
151150
u := m.getBaseURL("/goform/goform_get_cmd_process")
152151
query := u.Query()
@@ -160,6 +159,8 @@ func (m *zte8810ft) GetCellConnStatus() (*LinkStatus, error) {
160159

161160
request := m.getNewRequest("GET", u, http.Header{})
162161

162+
dLogger.With("driver", "8810FT").Debug("request", request.URL.String(), nil)
163+
163164
resp, err := httpClient.Do(request)
164165

165166
// Process errors
@@ -185,13 +186,13 @@ func (m *zte8810ft) GetCellConnStatus() (*LinkStatus, error) {
185186
// Process the result
186187
switch result.Connected {
187188
case "ppp_connected":
188-
return &LinkStatus{Up: true}, nil
189+
return &LinkStatus{State: 3}, nil
189190
case "ppp_connecting":
190-
return &LinkStatus{Connecting: true}, nil
191+
return &LinkStatus{State: 2}, nil
191192
case "ppp_disconnecting":
192-
return &LinkStatus{Disconnecting: true}, nil
193+
return &LinkStatus{State: 1}, nil
193194
case "ppp_disconnected":
194-
return &LinkStatus{Down: true}, nil
195+
return &LinkStatus{State: 0}, nil
195196
default:
196197
// Unknown link status occurred
197198
return nil, ErrUnknown
@@ -238,10 +239,13 @@ func (m *zte8810ft) SendSMS(phone string, message string) error {
238239
"Content-Type": {"application/x-www-form-urlencoded", "charset=UTF-8"}})
239240

240241
// Some Go-level string manipulation
241-
stringReader := strings.NewReader(query.Encode())
242+
encoded := query.Encode()
243+
stringReader := strings.NewReader(encoded)
242244
stringReadCloser := io.NopCloser(stringReader)
243245
request.Body = stringReadCloser
244246

247+
dLogger.With("driver", "8810FT").Debug("url", request.URL.String(), "body", encoded, nil)
248+
245249
resp, err := httpClient.Do(request)
246250

247251
// Process errors

drivers/common.go

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
package drivers
22

3-
import "fmt"
3+
import (
4+
"fmt"
5+
"log/slog"
6+
"net/http"
7+
"time"
8+
9+
"github.com/brokenCursor/usb-modem-cli/config"
10+
"github.com/brokenCursor/usb-modem-cli/logging"
11+
)
412

513
// Modem interfaces
614

@@ -35,14 +43,27 @@ type (
3543

3644
// Link statuses
3745
LinkStatus struct {
38-
Up bool
39-
Down bool
40-
Connecting bool
41-
Disconnecting bool
46+
State int8
4247
}
4348
)
4449

45-
var drivers map[string]func(host string) BaseModem = map[string]func(host string) BaseModem{}
50+
var (
51+
drivers map[string]func(host string) BaseModem = map[string]func(host string) BaseModem{}
52+
httpClient *http.Client
53+
54+
logger *slog.Logger
55+
dLogger *slog.Logger
56+
)
57+
58+
func init() {
59+
logger = logging.GetGeneralLogger()
60+
// TODO: fix per-driver logging while keeping the dependency three sane-ish
61+
dLogger = logging.GetDriverLogger("common")
62+
63+
driverConfig := config.Sub("driver")
64+
// logger.Debug("ttl", driverConfig.GetDuration("cmd_ttl")*time.Second)
65+
httpClient = &http.Client{Timeout: driverConfig.GetDuration("cmd_ttl") * time.Second}
66+
}
4667

4768
func isRegistered(name string) bool {
4869
// Check if driver has already been registered
@@ -65,6 +86,7 @@ func GetModemDriver(model string, host string) (BaseModem, error) {
6586
return nil, ErrUnknownModel
6687
}
6788

89+
logger.Debug("driver instance created", "driver", model, "host", host)
6890
return drivers[model](host), nil
6991
}
7092

drivers/dummy.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,28 @@ package drivers
33
// DO NOT USE DIRECTLY
44
type (
55
dummy struct {
6-
ip string
6+
host string
77
}
88
)
99

1010
func init() {
1111
registerDriver("dummy", newDummy)
12+
dLogger.With("driver", "dummy").Debug("dummy driver registered")
1213
}
1314

14-
func newDummy(ip string) BaseModem {
15-
// fmt.Println("Dummy driver enabled!")
16-
return &dummy{ip: ip}
15+
func newDummy(host string) BaseModem {
16+
return &dummy{host: host}
1717
}
1818

1919
func (m *dummy) GetModel() string {
2020
return "Dummy"
2121
}
2222

2323
func (m *dummy) SetHost(ip string) error {
24-
m.ip = ip
24+
m.host = ip
2525
return nil
2626
}
2727

2828
func (m *dummy) GetHost() string {
29-
return m.ip
29+
return m.host
3030
}

logging/logging.go

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package logging
2+
3+
import (
4+
"fmt"
5+
"log/slog"
6+
"os"
7+
8+
"github.com/brokenCursor/usb-modem-cli/config"
9+
)
10+
11+
var (
12+
general *slog.Logger
13+
driver *slog.Logger
14+
)
15+
16+
func init() {
17+
logConfig := config.Sub("logging")
18+
// Setup levels
19+
generalLevel, err := strToLevel(logConfig.GetString("general"))
20+
if err != nil {
21+
slog.Error("logging.general: ", err.Error(), nil)
22+
}
23+
24+
// Setup levels
25+
driverLevel, err := strToLevel(logConfig.GetString("driver"))
26+
if err != nil {
27+
slog.Error("logging.driver: ", err.Error(), nil)
28+
}
29+
30+
// Setup loggers
31+
general = slog.New(slog.NewTextHandler(os.Stdout,
32+
&slog.HandlerOptions{
33+
Level: generalLevel,
34+
AddSource: false,
35+
}))
36+
37+
driver = slog.New(slog.NewTextHandler(os.Stdout,
38+
&slog.HandlerOptions{
39+
Level: driverLevel,
40+
AddSource: true,
41+
}))
42+
43+
general.Debug("logging setup done")
44+
}
45+
46+
func strToLevel(level string) (res slog.Level, err error) {
47+
switch level {
48+
case "debug":
49+
res = slog.LevelDebug
50+
case "info":
51+
res = slog.LevelInfo
52+
case "warn":
53+
res = slog.LevelWarn
54+
case "error":
55+
res = slog.LevelError
56+
default:
57+
return slog.LevelInfo, fmt.Errorf("no %s logging level", level)
58+
}
59+
60+
return res, nil
61+
}
62+
63+
func GetGeneralLogger() *slog.Logger {
64+
return general
65+
}
66+
67+
func GetDriverLogger(name string) *slog.Logger {
68+
return driver
69+
}

mcli.go

Lines changed: 12 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,27 @@
11
package main
22

33
import (
4-
"fmt"
4+
"log/slog"
55
"os"
66

77
"github.com/alexflint/go-arg"
8+
"github.com/brokenCursor/usb-modem-cli/config"
89
"github.com/brokenCursor/usb-modem-cli/drivers"
10+
"github.com/brokenCursor/usb-modem-cli/logging"
911
"github.com/go-playground/validator/v10"
1012
"github.com/i582/cfmt/cmd/cfmt"
11-
"github.com/spf13/viper"
1213
)
1314

1415
var (
1516
validate *validator.Validate
1617
args BaseArgs
17-
config *viper.Viper
18+
logger *slog.Logger
1819
)
1920

2021
func init() {
2122
// Create a single instance of validator
2223
validate = validator.New(validator.WithRequiredStructEnabled())
23-
24-
// Get config path
25-
dir, err := os.UserConfigDir()
26-
if err != nil {
27-
panic("failed to get user config dir")
28-
}
29-
30-
// Setup configuration
31-
config = viper.New()
32-
config.SetConfigName("config")
33-
config.SetConfigType("yaml")
34-
35-
sep := string(os.PathSeparator)
36-
config.AddConfigPath(dir + sep + "modem-cli")
37-
38-
config.SetDefault("modem.model", "dummy")
39-
config.SetDefault("modem.host", "127.0.0.1")
40-
41-
err = config.ReadInConfig()
42-
if err != nil { // Handle errors reading the config file
43-
panic(fmt.Errorf("fatal error config file: %w", err))
44-
}
24+
logger = logging.GetGeneralLogger()
4525
}
4626

4727
func main() {
@@ -65,11 +45,13 @@ func run() error {
6545
}
6646

6747
if args.DisableColor {
48+
logger.Debug("Colored output disabled")
6849
cfmt.DisableColors()
6950
}
7051

7152
// If IP has been overridden
7253
if len(args.Host) > 0 {
54+
logger.Debug("IP has been overridden")
7355
ip = args.Host
7456
}
7557

@@ -93,32 +75,29 @@ func run() error {
9375
switch args.Connection.Action {
9476
case "up":
9577
err := cell.ConnectCell()
96-
9778
if err != nil {
9879
return err
9980
}
10081
case "down":
10182
err := cell.DisconnectCell()
102-
10383
if err != nil {
10484
return err
10585
}
10686
case "status":
10787
status, err := cell.GetCellConnStatus()
108-
10988
if err != nil {
11089
return err
11190
}
11291

11392
// Process and output status
114-
switch {
115-
case status.Up:
93+
switch status.State {
94+
case 3:
11695
cfmt.Println("Status: {{up}}::green|bold")
117-
case status.Down:
96+
case 0:
11897
cfmt.Println("Status: {{down}}::red|bold")
119-
case status.Connecting:
98+
case 2:
12099
cfmt.Println("Status: {{connecting}}::yellow|bold")
121-
case status.Disconnecting:
100+
case 1:
122101
cfmt.Println("Status: {{disconnecting}}::#FA8100|bold")
123102
}
124103
}

0 commit comments

Comments
 (0)