Skip to content

Commit 9f3c81b

Browse files
committed
Developing driver system, fixing random iface bug
1 parent 70c08e5 commit 9f3c81b

File tree

11 files changed

+199
-131
lines changed

11 files changed

+199
-131
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,5 @@
2121
go.work
2222
go.work.sum
2323

24-
.VSCodeCounter
24+
.VSCodeCounter
25+
.vscode

config/config.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,10 @@ func init() {
2727
// -- Defaults -- //
2828
config.SetDefault("modem.model", "dummy")
2929
config.SetDefault("modem.host", "127.0.0.1")
30+
config.SetDefault("modem.cmd_ttl", 10)
3031

3132
config.SetDefault("logging.general", "error")
3233
config.SetDefault("logging.driver", "error")
33-
34-
config.SetDefault("driver.cmd_ttl", 10)
3534
// -- Defaults -- //
3635

3736
err = config.ReadInConfig()

config/errors.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package config
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
)
7+
8+
var ErrNoKey = errors.New("config key does not exist")
9+
var ErrNilValue = errors.New("config key has no or invalid value")
10+
var ErrInvalidValue = errors.New("value is invalid")
11+
12+
// -- //
13+
type ConfigError struct {
14+
Key string
15+
Value string
16+
Err error
17+
}
18+
19+
func (e ConfigError) Error() (err string) {
20+
switch {
21+
case e.Key != "" && e.Value != "":
22+
err = fmt.Sprintf("key=%s value=%s: %s", e.Key, e.Value, e.Err.Error())
23+
case e.Key != "":
24+
err = fmt.Sprintf("key=%s value=<nil>: %s", e.Key, e.Err.Error())
25+
}
26+
27+
return
28+
}

drivers/common/common.go renamed to drivers/driver_ctl.go

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
package common
1+
package drivers
22

33
import (
44
"fmt"
55
"log/slog"
66

7-
"github.com/brokenCursor/usb-modem-cli/config"
87
"github.com/brokenCursor/usb-modem-cli/logging"
98
"github.com/spf13/viper"
109
)
@@ -13,8 +12,6 @@ import (
1312

1413
type (
1514
BaseModem interface {
16-
SetHost(host string) error
17-
GetHost() string
1815
GetModel() string
1916
}
2017

@@ -47,49 +44,45 @@ type (
4744
)
4845

4946
var (
50-
drivers map[string]func(host string) BaseModem = map[string]func(host string) BaseModem{}
51-
driverConfig *viper.Viper
52-
logger *slog.Logger
47+
Drivers map[string]func(config *viper.Viper, logger *slog.Logger) (BaseModem, error) = map[string]func(config *viper.Viper, logger *slog.Logger) (BaseModem, error){}
48+
logger *slog.Logger
5349
)
5450

5551
func init() {
5652
logger = logging.GetGeneralLogger()
57-
driverConfig = config.Sub("driver")
5853
}
5954

6055
func IsRegistered(name string) bool {
6156
// Check if driver has already been registered
62-
_, ok := drivers[name]
57+
_, ok := Drivers[name]
6358
return ok
6459
}
6560

66-
func RegisterDriver(name string, generator func(ip string) BaseModem) (*viper.Viper, *slog.Logger) {
61+
func RegisterDriver(name string, generator func(config *viper.Viper, logger *slog.Logger) (BaseModem, error)) {
6762
// Check if driver has already been registered
6863
if IsRegistered(name) {
6964
panic(fmt.Sprintf("attempted to register %s twice", name))
7065
}
7166

7267
// Register the driver
73-
drivers[name] = generator
68+
Drivers[name] = generator
7469
logger.With("name", name).Debug("driver registered")
75-
76-
return driverConfig, logging.GetDriverLogger(name)
7770
}
7871

79-
func GetModemDriver(model string, host string) (BaseModem, error) {
72+
func GetModemDriver(model string, config *viper.Viper, logger *slog.Logger) (BaseModem, error) {
8073
if !IsRegistered(model) {
8174
return nil, ErrUnknownModel
8275
}
8376

84-
logger.Debug("driver instance created", "driver", model, "host", host)
85-
return drivers[model](host), nil
77+
logger.Debug("driver instance created", "driver", model)
78+
return Drivers[model](config, logger)
8679
}
8780

8881
func GetAvailableDrivers() *[]string {
89-
keys := make([]string, len(drivers))
82+
keys := make([]string, len(Drivers))
9083

9184
i := 0
92-
for k := range drivers {
85+
for k := range Drivers {
9386
keys[i] = k
9487
i++
9588
}

drivers/dummy.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package drivers
2+
3+
import (
4+
"log/slog"
5+
6+
"github.com/spf13/viper"
7+
)
8+
9+
// DO NOT USE DIRECTLY
10+
type (
11+
dummy struct {
12+
config *viper.Viper
13+
logger *slog.Logger
14+
}
15+
)
16+
17+
func init() {
18+
RegisterDriver("dummy", newDummy)
19+
}
20+
21+
func newDummy(config *viper.Viper, logger *slog.Logger) (BaseModem, error) {
22+
logger.With("driver", "dummy").Debug("dummy driver registered")
23+
return &dummy{config: config, logger: logger}, nil
24+
}
25+
26+
func (m *dummy) GetModel() string {
27+
return "Dummy"
28+
}

drivers/dummy/main.go

Lines changed: 0 additions & 40 deletions
This file was deleted.

drivers/common/errors.go renamed to drivers/errors.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package common
1+
package drivers
22

33
import (
44
"errors"
@@ -24,6 +24,7 @@ func (e ActionError) Error() string {
2424
return fmt.Sprintf("action error: %s failed with %e", e.Action, e.Err)
2525
}
2626

27+
// -- //
2728
type UnmarshalError struct {
2829
RawData *[]byte
2930
Err error

drivers/helpers.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package drivers
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"net"
7+
"net/http"
8+
)
9+
10+
// Returns this computer's address on the interface
11+
func GetInterfaceIPv4Addr(iface string) (addr net.IP, err error) {
12+
var (
13+
ief *net.Interface
14+
addrs []net.Addr
15+
ipv4Addr net.IP
16+
)
17+
18+
// Get interface by name
19+
if ief, err = net.InterfaceByName(iface); err != nil { // get interface
20+
return
21+
}
22+
23+
// Get all of the addresses on the interface
24+
if addrs, err = ief.Addrs(); err != nil {
25+
return
26+
}
27+
28+
// Find the first IPv4 address
29+
for _, addr := range addrs {
30+
if ipv4Addr = addr.(*net.IPNet).IP.To4(); ipv4Addr != nil {
31+
break
32+
}
33+
}
34+
35+
// If no IPv4 addresses were found on the interface
36+
if ipv4Addr == nil {
37+
return nil, fmt.Errorf("interface %s don't have an ipv4 address", iface)
38+
}
39+
40+
return ipv4Addr, nil
41+
}
42+
43+
func GetTransportForIPv4(ifaceIP net.IP) (*http.Transport, error) {
44+
addr, err := net.ResolveTCPAddr("tcp", ifaceIP.String()+":0")
45+
if err != nil {
46+
return nil, err
47+
}
48+
49+
dialer := &net.Dialer{LocalAddr: addr}
50+
51+
dialContext := func(ctx context.Context, network, addr string) (net.Conn, error) {
52+
conn, err := dialer.Dial(network, addr)
53+
return conn, err
54+
}
55+
56+
return &http.Transport{DialContext: dialContext}, nil
57+
}

0 commit comments

Comments
 (0)