2020-12-30 22:01:08 +00:00
|
|
|
package shadowsocks
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"reflect"
|
|
|
|
|
"sync"
|
|
|
|
|
|
2022-01-06 06:40:23 -05:00
|
|
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
2020-12-30 22:01:08 +00:00
|
|
|
"github.com/qdm12/gluetun/internal/models"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type state struct {
|
|
|
|
|
status models.LoopStatus
|
2022-01-06 06:40:23 -05:00
|
|
|
settings settings.Shadowsocks
|
2020-12-30 22:01:08 +00:00
|
|
|
statusMu sync.RWMutex
|
|
|
|
|
settingsMu sync.RWMutex
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (s *state) setStatusWithLock(status models.LoopStatus) {
|
|
|
|
|
s.statusMu.Lock()
|
|
|
|
|
defer s.statusMu.Unlock()
|
|
|
|
|
s.status = status
|
|
|
|
|
}
|
|
|
|
|
|
2024-10-21 12:45:51 +02:00
|
|
|
// GetStatus returns the status of the loop for informative purposes.
|
|
|
|
|
// In no case it should be used programmatically to avoid any
|
|
|
|
|
// TOCTOU race conditions.
|
2022-06-11 01:34:30 +00:00
|
|
|
func (l *Loop) GetStatus() (status models.LoopStatus) {
|
2020-12-30 22:01:08 +00:00
|
|
|
l.state.statusMu.RLock()
|
|
|
|
|
defer l.state.statusMu.RUnlock()
|
|
|
|
|
return l.state.status
|
|
|
|
|
}
|
|
|
|
|
|
2022-06-11 01:34:30 +00:00
|
|
|
func (l *Loop) GetSettings() (settings settings.Shadowsocks) {
|
2020-12-30 22:01:08 +00:00
|
|
|
l.state.settingsMu.RLock()
|
|
|
|
|
defer l.state.settingsMu.RUnlock()
|
|
|
|
|
return l.state.settings
|
|
|
|
|
}
|
|
|
|
|
|
2024-10-21 12:45:51 +02:00
|
|
|
func (l *Loop) UpdateSettings(updateSettings settings.Shadowsocks) (outcome string) {
|
2020-12-30 22:01:08 +00:00
|
|
|
l.state.settingsMu.Lock()
|
2024-10-21 12:45:51 +02:00
|
|
|
previousSettings := l.state.settings.Copy()
|
|
|
|
|
l.state.settings.OverrideWith(updateSettings)
|
|
|
|
|
settingsUnchanged := reflect.DeepEqual(previousSettings, l.state.settings)
|
|
|
|
|
l.state.settingsMu.Unlock()
|
2020-12-30 22:01:08 +00:00
|
|
|
if settingsUnchanged {
|
|
|
|
|
return "settings left unchanged"
|
|
|
|
|
}
|
2024-10-21 12:45:51 +02:00
|
|
|
l.refresh <- struct{}{}
|
|
|
|
|
newStatus := <-l.changed
|
|
|
|
|
l.state.statusMu.Lock()
|
|
|
|
|
l.state.status = newStatus
|
|
|
|
|
l.state.statusMu.Unlock()
|
|
|
|
|
return "settings updated (service " + newStatus.String() + ")"
|
2020-12-30 22:01:08 +00:00
|
|
|
}
|