diff --git a/internal/models/publicip.go b/internal/models/publicip.go new file mode 100644 index 00000000..998a412d --- /dev/null +++ b/internal/models/publicip.go @@ -0,0 +1,31 @@ +package models + +import "net" + +type PublicIP struct { + IP net.IP `json:"public_ip,omitempty"` + Region string `json:"region,omitempty"` + Country string `json:"country,omitempty"` + City string `json:"city,omitempty"` + Hostname string `json:"hostname,omitempty"` + Location string `json:"location,omitempty"` + Organization string `json:"organization,omitempty"` + PostalCode string `json:"postal_code,omitempty"` + Timezone string `json:"timezone,omitempty"` +} + +func (p *PublicIP) Copy() (publicIPCopy PublicIP) { + publicIPCopy = PublicIP{ + IP: make(net.IP, len(p.IP)), + Region: p.Region, + Country: p.Country, + City: p.City, + Hostname: p.Hostname, + Location: p.Location, + Organization: p.Organization, + PostalCode: p.PostalCode, + Timezone: p.Timezone, + } + copy(publicIPCopy.IP, p.IP) + return publicIPCopy +} diff --git a/internal/publicip/ipinfo/model.go b/internal/publicip/ipinfo/model.go index e32431d7..d8384786 100644 --- a/internal/publicip/ipinfo/model.go +++ b/internal/publicip/ipinfo/model.go @@ -1,6 +1,10 @@ package ipinfo -import "net" +import ( + "net" + + "github.com/qdm12/gluetun/internal/models" +) type Response struct { IP net.IP `json:"ip,omitempty"` @@ -14,9 +18,18 @@ type Response struct { Timezone string `json:"timezone,omitempty"` } -func (r Response) Copy() (copied Response) { - copied = r - copied.IP = make(net.IP, len(r.IP)) - copy(copied.IP, r.IP) - return copied +func (r *Response) ToPublicIPModel() (model models.PublicIP) { + model = models.PublicIP{ + IP: make(net.IP, len(r.IP)), + Region: r.Region, + Country: r.Country, + City: r.City, + Hostname: r.Hostname, + Location: r.Loc, + Organization: r.Org, + PostalCode: r.Postal, + Timezone: r.Timezone, + } + copy(model.IP, r.IP) + return model } diff --git a/internal/publicip/publicip.go b/internal/publicip/publicip.go index cbc70f10..da619bc1 100644 --- a/internal/publicip/publicip.go +++ b/internal/publicip/publicip.go @@ -1,11 +1,13 @@ package publicip -import "github.com/qdm12/gluetun/internal/publicip/ipinfo" +import ( + "github.com/qdm12/gluetun/internal/models" +) -func (l *Loop) GetData() (data ipinfo.Response) { +func (l *Loop) GetData() (data models.PublicIP) { return l.state.GetData() } -func (l *Loop) SetData(data ipinfo.Response) { +func (l *Loop) SetData(data models.PublicIP) { l.state.SetData(data) } diff --git a/internal/publicip/runner.go b/internal/publicip/runner.go index 73b5fbaa..d10a458b 100644 --- a/internal/publicip/runner.go +++ b/internal/publicip/runner.go @@ -5,7 +5,7 @@ import ( "os" "github.com/qdm12/gluetun/internal/constants" - "github.com/qdm12/gluetun/internal/publicip/ipinfo" + "github.com/qdm12/gluetun/internal/models" ) func (l *Loop) Run(ctx context.Context, done chan<- struct{}) { @@ -21,7 +21,7 @@ func (l *Loop) Run(ctx context.Context, done chan<- struct{}) { getCtx, getCancel := context.WithCancel(ctx) defer getCancel() - resultCh := make(chan ipinfo.Response) + resultCh := make(chan models.PublicIP) errorCh := make(chan error) go func() { result, err := l.fetcher.FetchInfo(getCtx, nil) @@ -31,7 +31,7 @@ func (l *Loop) Run(ctx context.Context, done chan<- struct{}) { } return } - resultCh <- result + resultCh <- result.ToPublicIPModel() }() if l.userTrigger { diff --git a/internal/publicip/state/publicip.go b/internal/publicip/state/publicip.go index 65f935d4..a077799d 100644 --- a/internal/publicip/state/publicip.go +++ b/internal/publicip/state/publicip.go @@ -1,16 +1,16 @@ package state import ( - "github.com/qdm12/gluetun/internal/publicip/ipinfo" + "github.com/qdm12/gluetun/internal/models" ) -func (s *State) GetData() (data ipinfo.Response) { +func (s *State) GetData() (data models.PublicIP) { s.ipDataMu.RLock() defer s.ipDataMu.RUnlock() return s.ipData.Copy() } -func (s *State) SetData(data ipinfo.Response) { +func (s *State) SetData(data models.PublicIP) { s.ipDataMu.Lock() defer s.ipDataMu.Unlock() s.ipData = data.Copy() diff --git a/internal/publicip/state/state.go b/internal/publicip/state/state.go index 005e172e..263f1fc1 100644 --- a/internal/publicip/state/state.go +++ b/internal/publicip/state/state.go @@ -6,7 +6,6 @@ import ( "github.com/qdm12/gluetun/internal/configuration/settings" "github.com/qdm12/gluetun/internal/models" - "github.com/qdm12/gluetun/internal/publicip/ipinfo" ) func New(statusApplier StatusApplier, @@ -25,7 +24,7 @@ type State struct { settings settings.PublicIP settingsMu sync.RWMutex - ipData ipinfo.Response + ipData models.PublicIP ipDataMu sync.RWMutex updateTicker chan<- struct{} diff --git a/internal/server/interfaces.go b/internal/server/interfaces.go index 30490d75..5c2cec3a 100644 --- a/internal/server/interfaces.go +++ b/internal/server/interfaces.go @@ -5,7 +5,6 @@ import ( "github.com/qdm12/gluetun/internal/configuration/settings" "github.com/qdm12/gluetun/internal/models" - "github.com/qdm12/gluetun/internal/publicip/ipinfo" ) type VPNLooper interface { @@ -26,5 +25,5 @@ type PortForwardedGetter interface { } type PublicIPLoop interface { - GetData() (data ipinfo.Response) + GetData() (data models.PublicIP) } diff --git a/internal/vpn/cleanup.go b/internal/vpn/cleanup.go index b6d3bcff..3b5ac484 100644 --- a/internal/vpn/cleanup.go +++ b/internal/vpn/cleanup.go @@ -4,7 +4,7 @@ import ( "context" "time" - "github.com/qdm12/gluetun/internal/publicip/ipinfo" + "github.com/qdm12/gluetun/internal/models" ) func (l *Loop) cleanup(ctx context.Context, pfEnabled bool) { @@ -15,7 +15,7 @@ func (l *Loop) cleanup(ctx context.Context, pfEnabled bool) { } } - l.publicip.SetData(ipinfo.Response{}) // clear public IP address data + l.publicip.SetData(models.PublicIP{}) // clear public IP address data if pfEnabled { const pfTimeout = 100 * time.Millisecond diff --git a/internal/vpn/interfaces.go b/internal/vpn/interfaces.go index f22f4d46..1aec2dd9 100644 --- a/internal/vpn/interfaces.go +++ b/internal/vpn/interfaces.go @@ -9,7 +9,6 @@ import ( "github.com/qdm12/gluetun/internal/netlink" "github.com/qdm12/gluetun/internal/portforward" "github.com/qdm12/gluetun/internal/provider" - "github.com/qdm12/gluetun/internal/publicip/ipinfo" ) type Firewall interface { @@ -66,5 +65,5 @@ type DNSLoop interface { type PublicIPLoop interface { ApplyStatus(ctx context.Context, status models.LoopStatus) ( outcome string, err error) - SetData(data ipinfo.Response) + SetData(data models.PublicIP) }