utils.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. package main
  2. import (
  3. "bufio"
  4. "io"
  5. "io/ioutil"
  6. "log"
  7. "os"
  8. "os/user"
  9. "path"
  10. "strings"
  11. )
  12. type HistoryFile struct {
  13. Dir string
  14. History *BashHistory
  15. FileHandle *os.File
  16. }
  17. type Tmpfile struct {
  18. Dir string
  19. FileHandle *os.File
  20. }
  21. type BashHistory struct {
  22. Old map[string]int
  23. Tmp []string
  24. }
  25. func (tempfile *Tmpfile) WriteFresh(historyfile *HistoryFile, makebackup bool) {
  26. defer os.RemoveAll(tempfile.Dir)
  27. defer tempfile.FileHandle.Close()
  28. if makebackup {
  29. historyfile.Makebackup()
  30. }
  31. if err := historyfile.FileHandle.Truncate(0); err != nil {
  32. log.Fatalf("h.trunc: %s\n", err)
  33. }
  34. if _, err := historyfile.FileHandle.Seek(0, 0); err != nil {
  35. log.Fatalf("writefresh h.Seek(): %s\n", err)
  36. }
  37. if _, err := tempfile.FileHandle.Seek(0, 0); err != nil {
  38. log.Fatalf("t.Seek(): %s\n", err)
  39. }
  40. if _, err := io.Copy(historyfile.FileHandle, tempfile.FileHandle); err != nil {
  41. log.Fatalf("tmp io.copy: %s\n", err)
  42. }
  43. }
  44. func (tempfile *Tmpfile) SaveTmp(h *BashHistory) (wrote int) {
  45. for key, val := range h.Old {
  46. h.Tmp[val] = key
  47. }
  48. wrote = 0
  49. for _, key := range h.Tmp {
  50. if len(key) > 0 {
  51. if _, err := tempfile.FileHandle.WriteString(key + "\n"); err != nil {
  52. log.Fatalf("Error writing line %d value %s : %s \n", wrote, key, err)
  53. }
  54. wrote++
  55. }
  56. }
  57. return wrote
  58. }
  59. func (historyfile *HistoryFile) Makebackup() {
  60. if _, err := historyfile.FileHandle.Seek(0, 0); err != nil {
  61. log.Fatalf("makebackup Seek(): %s\n", err)
  62. }
  63. backup, err := os.Create(historyfile.FileHandle.Name() + ".old")
  64. if err != nil {
  65. log.Fatalf("makebackup os.Create() .old: %s\n", err)
  66. }
  67. if _, err := io.Copy(backup, historyfile.FileHandle); err != nil {
  68. log.Fatalf("makebackup io.Copy(): %s\n", err)
  69. }
  70. backup.Close()
  71. }
  72. func (historyfile *HistoryFile) ReadHistory() {
  73. if historyfile.FileHandle == nil {
  74. historyfile.Open()
  75. }
  76. historyfile.History = new(BashHistory)
  77. historyfile.History.Old = make(map[string]int)
  78. scanner := bufio.NewScanner(historyfile.FileHandle)
  79. var nr = 0
  80. for scanner.Scan() {
  81. line := strings.TrimSpace(scanner.Text())
  82. historyfile.History.Old[line] = nr
  83. nr++
  84. }
  85. historyfile.History.Tmp = make([]string, nr)
  86. delete(historyfile.History.Old, "")
  87. }
  88. func (historyfile *HistoryFile) Open() {
  89. h, err := os.OpenFile(path.Join(historyfile.Dir, ".bash_history"), os.O_RDWR, 0600)
  90. if err != nil {
  91. log.Fatalf("historyfile Open(): %s\n", err)
  92. }
  93. historyfile.FileHandle = h
  94. }
  95. func NewBashHistoryFile() *HistoryFile {
  96. u, err := user.Current()
  97. if err != nil {
  98. log.Fatalf("NewBashHistoryFile() user.Current(): %s\n ", err)
  99. }
  100. historyfile := new(HistoryFile)
  101. historyfile.Dir = u.HomeDir
  102. return historyfile
  103. }
  104. func NewBashHistoryTmpFile() *Tmpfile {
  105. tmpdir, err := ioutil.TempDir(os.TempDir(), "hipa")
  106. if err != nil {
  107. log.Fatalf("NewBashHistoryTmpFile() TempDir(): %s\n ", err)
  108. }
  109. tmpfile, err := ioutil.TempFile(tmpdir, "hipa")
  110. if err != nil {
  111. log.Fatalf("NewBashHistoryTmpFile() TempDir(): %s\n ", err)
  112. }
  113. tempfile := new(Tmpfile)
  114. tempfile.Dir = tmpdir
  115. tempfile.FileHandle = tmpfile
  116. return tempfile
  117. }