file.go 6.0 KB

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