environment.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. package session
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "io/ioutil"
  6. "sort"
  7. "strconv"
  8. "sync"
  9. "github.com/evilsocket/islazy/fs"
  10. )
  11. type EnvironmentChangedCallback func(newValue string)
  12. type Environment struct {
  13. sync.Mutex
  14. Data map[string]string `json:"data"`
  15. cbs map[string]EnvironmentChangedCallback
  16. }
  17. func NewEnvironment(envFile string) (*Environment, error) {
  18. env := &Environment{
  19. Data: make(map[string]string),
  20. cbs: make(map[string]EnvironmentChangedCallback),
  21. }
  22. if envFile != "" {
  23. envFile, _ := fs.Expand(envFile)
  24. if fs.Exists(envFile) {
  25. if err := env.Load(envFile); err != nil {
  26. return nil, err
  27. }
  28. }
  29. }
  30. return env, nil
  31. }
  32. func (env *Environment) Load(fileName string) error {
  33. env.Lock()
  34. defer env.Unlock()
  35. raw, err := ioutil.ReadFile(fileName)
  36. if err != nil {
  37. return err
  38. }
  39. if len(raw) > 0 {
  40. return json.Unmarshal(raw, &env.Data)
  41. }
  42. return nil
  43. }
  44. func (env *Environment) Save(fileName string) error {
  45. env.Lock()
  46. defer env.Unlock()
  47. raw, err := json.Marshal(env.Data)
  48. if err != nil {
  49. return err
  50. }
  51. return ioutil.WriteFile(fileName, raw, 0644)
  52. }
  53. func (env *Environment) Has(name string) bool {
  54. env.Lock()
  55. defer env.Unlock()
  56. _, found := env.Data[name]
  57. return found
  58. }
  59. func (env *Environment) addCb(name string, cb EnvironmentChangedCallback) {
  60. env.Lock()
  61. defer env.Unlock()
  62. env.cbs[name] = cb
  63. }
  64. func (env *Environment) WithCallback(name, value string, cb EnvironmentChangedCallback) string {
  65. env.addCb(name, cb)
  66. ret := env.Set(name, value)
  67. return ret
  68. }
  69. func (env *Environment) Set(name, value string) string {
  70. env.Lock()
  71. old := env.Data[name]
  72. env.Data[name] = value
  73. env.Unlock()
  74. if cb, hasCallback := env.cbs[name]; hasCallback {
  75. cb(value)
  76. }
  77. return old
  78. }
  79. func (env *Environment) GetUnlocked(name string) (bool, string) {
  80. if value, found := env.Data[name]; found {
  81. return true, value
  82. }
  83. return false, ""
  84. }
  85. func (env *Environment) Get(name string) (bool, string) {
  86. env.Lock()
  87. defer env.Unlock()
  88. return env.GetUnlocked(name)
  89. }
  90. func (env *Environment) GetInt(name string) (error, int) {
  91. if found, value := env.Get(name); found {
  92. if i, err := strconv.Atoi(value); err == nil {
  93. return nil, i
  94. } else {
  95. return err, 0
  96. }
  97. }
  98. return fmt.Errorf("Not found."), 0
  99. }
  100. func (env *Environment) Sorted() []string {
  101. env.Lock()
  102. defer env.Unlock()
  103. var keys []string
  104. for k := range env.Data {
  105. keys = append(keys, k)
  106. }
  107. sort.Strings(keys)
  108. return keys
  109. }