file.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. package server
  2. import (
  3. "encoding/csv"
  4. "errors"
  5. "github.com/astaxie/beego"
  6. "github.com/cnlh/easyProxy/utils"
  7. "log"
  8. "os"
  9. "strconv"
  10. )
  11. type ServerConfig struct {
  12. TcpPort int //服务端与客户端通信端口
  13. Mode string //启动方式
  14. Target string //目标
  15. VerifyKey string //flag
  16. U string //socks5验证用户名
  17. P string //socks5验证密码
  18. Compress string //压缩方式
  19. Start int //是否开启
  20. IsRun int //是否在运行
  21. ClientStatus int //客s户端状态
  22. Crypt bool //是否加密
  23. Mux bool //是否加密
  24. CompressEncode int
  25. CompressDecode int
  26. }
  27. type HostList struct {
  28. Vkey string //服务端与客户端通信端口
  29. Host string //启动方式
  30. Target string //目标
  31. }
  32. func NewCsv(runList map[string]interface{}) *Csv {
  33. c := new(Csv)
  34. c.RunList = runList
  35. return c
  36. }
  37. type Csv struct {
  38. Tasks []*ServerConfig
  39. Path string
  40. RunList map[string]interface{}
  41. Hosts []*HostList //域名列表
  42. }
  43. func (s *Csv) Init() {
  44. s.LoadTaskFromCsv()
  45. s.LoadHostFromCsv()
  46. }
  47. func (s *Csv) StoreTasksToCsv() {
  48. // 创建文件
  49. csvFile, err := os.Create(beego.AppPath + "/conf/tasks.csv")
  50. if err != nil {
  51. log.Fatalf(err.Error())
  52. }
  53. defer csvFile.Close()
  54. writer := csv.NewWriter(csvFile)
  55. for _, task := range s.Tasks {
  56. record := []string{
  57. strconv.Itoa(task.TcpPort),
  58. task.Mode,
  59. task.Target,
  60. task.VerifyKey,
  61. task.U,
  62. task.P,
  63. task.Compress,
  64. strconv.Itoa(task.Start),
  65. utils.GetStrByBool(task.Crypt),
  66. utils.GetStrByBool(task.Mux),
  67. strconv.Itoa(task.CompressEncode),
  68. strconv.Itoa(task.CompressDecode),
  69. }
  70. err := writer.Write(record)
  71. if err != nil {
  72. log.Fatalf(err.Error())
  73. }
  74. }
  75. writer.Flush()
  76. }
  77. func (s *Csv) LoadTaskFromCsv() {
  78. // 打开文件
  79. file, err := os.Open(beego.AppPath + "/conf/tasks.csv")
  80. if err != nil {
  81. panic(err)
  82. }
  83. defer file.Close()
  84. // 获取csv的reader
  85. reader := csv.NewReader(file)
  86. // 设置FieldsPerRecord为-1
  87. reader.FieldsPerRecord = -1
  88. // 读取文件中所有行保存到slice中
  89. records, err := reader.ReadAll()
  90. if err != nil {
  91. panic(err)
  92. }
  93. var tasks []*ServerConfig
  94. // 将每一行数据保存到内存slice中
  95. for _, item := range records {
  96. tcpPort, _ := strconv.Atoi(item[0])
  97. Start, _ := strconv.Atoi(item[7])
  98. post := &ServerConfig{
  99. TcpPort: tcpPort,
  100. Mode: item[1],
  101. Target: item[2],
  102. VerifyKey: item[3],
  103. U: item[4],
  104. P: item[5],
  105. Compress: item[6],
  106. Start: Start,
  107. Crypt: utils.GetBoolByStr(item[8]),
  108. Mux: utils.GetBoolByStr(item[9]),
  109. CompressEncode: utils.GetIntNoerrByStr(item[10]),
  110. CompressDecode: utils.GetIntNoerrByStr(item[11]),
  111. }
  112. tasks = append(tasks, post)
  113. }
  114. s.Tasks = tasks
  115. }
  116. func (s *Csv) StoreHostToCsv() {
  117. // 创建文件
  118. csvFile, err := os.Create(beego.AppPath + "/conf/hosts.csv")
  119. if err != nil {
  120. panic(err)
  121. }
  122. defer csvFile.Close()
  123. // 获取csv的Writer
  124. writer := csv.NewWriter(csvFile)
  125. // 将map中的Post转换成slice,因为csv的Write需要slice参数
  126. // 并写入csv文件
  127. for _, host := range s.Hosts {
  128. record := []string{
  129. host.Host,
  130. host.Target,
  131. host.Vkey,
  132. }
  133. err1 := writer.Write(record)
  134. if err1 != nil {
  135. panic(err1)
  136. }
  137. }
  138. // 确保所有内存数据刷到csv文件
  139. writer.Flush()
  140. }
  141. func (s *Csv) LoadHostFromCsv() {
  142. // 打开文件
  143. file, err := os.Open(beego.AppPath + "/conf/hosts.csv")
  144. if err != nil {
  145. panic(err)
  146. }
  147. defer file.Close()
  148. // 获取csv的reader
  149. reader := csv.NewReader(file)
  150. // 设置FieldsPerRecord为-1
  151. reader.FieldsPerRecord = -1
  152. // 读取文件中所有行保存到slice中
  153. records, err := reader.ReadAll()
  154. if err != nil {
  155. panic(err)
  156. }
  157. var hosts []*HostList
  158. // 将每一行数据保存到内存slice中
  159. for _, item := range records {
  160. post := &HostList{
  161. Vkey: item[2],
  162. Host: item[0],
  163. Target: item[1],
  164. }
  165. hosts = append(hosts, post)
  166. }
  167. s.Hosts = hosts
  168. }
  169. func (s *Csv) NewTask(t *ServerConfig) {
  170. s.Tasks = append(s.Tasks, t)
  171. s.StoreTasksToCsv()
  172. }
  173. func (s *Csv) UpdateTask(t *ServerConfig) error {
  174. for k, v := range s.Tasks {
  175. if v.VerifyKey == t.VerifyKey {
  176. s.Tasks = append(s.Tasks[:k], s.Tasks[k+1:]...)
  177. s.Tasks = append(s.Tasks, t)
  178. s.StoreTasksToCsv()
  179. return nil
  180. }
  181. }
  182. return errors.New("不存在")
  183. }
  184. func (s *Csv) AddRunList(vKey string, svr interface{}) {
  185. s.RunList[vKey] = svr
  186. }
  187. func (s *Csv) DelRunList(vKey string) {
  188. delete(s.RunList, vKey)
  189. }
  190. func (s *Csv) DelTask(vKey string) error {
  191. for k, v := range s.Tasks {
  192. if v.VerifyKey == vKey {
  193. s.Tasks = append(s.Tasks[:k], s.Tasks[k+1:]...)
  194. s.StoreTasksToCsv()
  195. return nil
  196. }
  197. }
  198. return errors.New("不存在")
  199. }
  200. func (s *Csv) GetTask(vKey string) (v *ServerConfig, err error) {
  201. for _, v = range s.Tasks {
  202. if v.VerifyKey == vKey {
  203. return
  204. }
  205. }
  206. err = errors.New("未找到")
  207. return
  208. }
  209. func (s *Csv) DelHost(host string) error {
  210. for k, v := range s.Hosts {
  211. if v.Host == host {
  212. s.Hosts = append(s.Hosts[:k], s.Hosts[k+1:]...)
  213. s.StoreHostToCsv()
  214. return nil
  215. }
  216. }
  217. return errors.New("不存在")
  218. }
  219. func (s *Csv) NewHost(t *HostList) {
  220. s.Hosts = append(s.Hosts, t)
  221. s.StoreHostToCsv()
  222. }
  223. func (s *Csv) GetHostList(start, length int, vKey string) ([]*HostList, int) {
  224. list := make([]*HostList, 0)
  225. var cnt int
  226. for _, v := range s.Hosts {
  227. if v.Vkey == vKey {
  228. cnt++
  229. if start--; start < 0 {
  230. if length--; length > 0 {
  231. list = append(list, v)
  232. }
  233. }
  234. }
  235. }
  236. return list, cnt
  237. }