file.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. package lib
  2. import (
  3. "encoding/csv"
  4. "encoding/json"
  5. "errors"
  6. "io/ioutil"
  7. "log"
  8. "os"
  9. "strconv"
  10. )
  11. type TaskList 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 //客户端状态
  22. Crypt string //是否加密
  23. }
  24. type HostList struct {
  25. Vkey string //服务端与客户端通信端口
  26. Host string //启动方式
  27. Target string //目标
  28. }
  29. func NewCsv(path string, bridge *Tunnel, runList map[string]interface{}) *Csv {
  30. c := new(Csv)
  31. c.Path = path
  32. c.Bridge = bridge
  33. c.RunList = runList
  34. return c
  35. }
  36. type Csv struct {
  37. Tasks []*TaskList
  38. Path string
  39. Bridge *Tunnel
  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(s.Path + "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. task.Crypt,
  66. }
  67. err := writer.Write(record)
  68. if err != nil {
  69. log.Fatalf(err.Error())
  70. }
  71. }
  72. writer.Flush()
  73. }
  74. func (s *Csv) LoadTaskFromCsv() {
  75. // 打开文件
  76. file, err := os.Open(s.Path + "tasks.csv")
  77. if err != nil {
  78. panic(err)
  79. }
  80. defer file.Close()
  81. // 获取csv的reader
  82. reader := csv.NewReader(file)
  83. // 设置FieldsPerRecord为-1
  84. reader.FieldsPerRecord = -1
  85. // 读取文件中所有行保存到slice中
  86. records, err := reader.ReadAll()
  87. if err != nil {
  88. panic(err)
  89. }
  90. var tasks []*TaskList
  91. // 将每一行数据保存到内存slice中
  92. for _, item := range records {
  93. tcpPort, _ := strconv.Atoi(item[0])
  94. Start, _ := strconv.Atoi(item[7])
  95. post := &TaskList{
  96. TcpPort: tcpPort,
  97. Mode: item[1],
  98. Target: item[2],
  99. VerifyKey: item[3],
  100. U: item[4],
  101. P: item[5],
  102. Compress: item[6],
  103. Start: Start,
  104. Crypt: item[8],
  105. }
  106. tasks = append(tasks, post)
  107. }
  108. s.Tasks = tasks
  109. }
  110. func (s *Csv) StoreHostToCsv() {
  111. // 创建文件
  112. csvFile, err := os.Create(s.Path + "hosts.csv")
  113. if err != nil {
  114. panic(err)
  115. }
  116. defer csvFile.Close()
  117. // 获取csv的Writer
  118. writer := csv.NewWriter(csvFile)
  119. // 将map中的Post转换成slice,因为csv的Write需要slice参数
  120. // 并写入csv文件
  121. for _, host := range s.Hosts {
  122. record := []string{
  123. host.Host,
  124. host.Target,
  125. host.Vkey,
  126. }
  127. err1 := writer.Write(record)
  128. if err1 != nil {
  129. panic(err1)
  130. }
  131. }
  132. // 确保所有内存数据刷到csv文件
  133. writer.Flush()
  134. }
  135. func (s *Csv) LoadHostFromCsv() {
  136. // 打开文件
  137. file, err := os.Open(s.Path + "hosts.csv")
  138. if err != nil {
  139. panic(err)
  140. }
  141. defer file.Close()
  142. // 获取csv的reader
  143. reader := csv.NewReader(file)
  144. // 设置FieldsPerRecord为-1
  145. reader.FieldsPerRecord = -1
  146. // 读取文件中所有行保存到slice中
  147. records, err := reader.ReadAll()
  148. if err != nil {
  149. panic(err)
  150. }
  151. var hosts []*HostList
  152. // 将每一行数据保存到内存slice中
  153. for _, item := range records {
  154. post := &HostList{
  155. Vkey: item[2],
  156. Host: item[0],
  157. Target: item[1],
  158. }
  159. hosts = append(hosts, post)
  160. }
  161. s.Hosts = hosts
  162. }
  163. func (s *Csv) GetTaskList(start, length int, typeVal string) ([]*TaskList, int) {
  164. list := make([]*TaskList, 0)
  165. var cnt int
  166. for _, v := range s.Tasks {
  167. if v.Mode != typeVal {
  168. continue
  169. }
  170. cnt++
  171. if start--; start < 0 {
  172. if length--; length > 0 {
  173. if _, ok := s.RunList[v.VerifyKey]; ok {
  174. v.IsRun = 1
  175. } else {
  176. v.IsRun = 0
  177. }
  178. if s, ok := s.Bridge.signalList[getverifyval(v.VerifyKey)]; ok {
  179. if s.Len() > 0 {
  180. v.ClientStatus = 1
  181. } else {
  182. v.ClientStatus = 0
  183. }
  184. } else {
  185. v.ClientStatus = 0
  186. }
  187. list = append(list, v)
  188. }
  189. }
  190. }
  191. return list, cnt
  192. }
  193. func (s *Csv) NewTask(t *TaskList) {
  194. s.Tasks = append(s.Tasks, t)
  195. s.StoreTasksToCsv()
  196. }
  197. func (s *Csv) UpdateTask(t *TaskList) error {
  198. for k, v := range s.Tasks {
  199. if v.VerifyKey == t.VerifyKey {
  200. s.Tasks = append(s.Tasks[:k], s.Tasks[k+1:]...)
  201. s.Tasks = append(s.Tasks, t)
  202. s.StoreTasksToCsv()
  203. return nil
  204. }
  205. }
  206. //TODO:待测试
  207. return errors.New("不存在")
  208. }
  209. func (s *Csv) AddRunList(vKey string, svr interface{}) {
  210. s.RunList[vKey] = svr
  211. }
  212. func (s *Csv) DelRunList(vKey string) {
  213. delete(s.RunList, vKey)
  214. }
  215. func (s *Csv) DelTask(vKey string) error {
  216. for k, v := range s.Tasks {
  217. if v.VerifyKey == vKey {
  218. s.Tasks = append(s.Tasks[:k], s.Tasks[k+1:]...)
  219. s.StoreTasksToCsv()
  220. return nil
  221. }
  222. }
  223. return errors.New("不存在")
  224. }
  225. func (s *Csv) GetTask(vKey string) (v *TaskList, err error) {
  226. for _, v = range s.Tasks {
  227. if v.VerifyKey == vKey {
  228. return
  229. }
  230. }
  231. err = errors.New("未找到")
  232. return
  233. }
  234. func (s *Csv) DelHost(host string) error {
  235. for k, v := range s.Hosts {
  236. if v.Host == host {
  237. s.Hosts = append(s.Hosts[:k], s.Hosts[k+1:]...)
  238. s.StoreHostToCsv()
  239. return nil
  240. }
  241. }
  242. return errors.New("不存在")
  243. }
  244. func (s *Csv) NewHost(t *HostList) {
  245. s.Hosts = append(s.Hosts, t)
  246. s.StoreHostToCsv()
  247. }
  248. func (s *Csv) GetHostList(start, length int, vKey string) ([]*HostList, int) {
  249. list := make([]*HostList, 0)
  250. var cnt int
  251. for _, v := range s.Hosts {
  252. if v.Vkey == vKey {
  253. cnt++
  254. if start--; start < 0 {
  255. if length--; length > 0 {
  256. list = append(list, v)
  257. }
  258. }
  259. }
  260. }
  261. return list, cnt
  262. }
  263. type Site struct {
  264. Host string
  265. Url string
  266. Port int
  267. }
  268. type Config struct {
  269. SiteList []Site
  270. Replace int
  271. }
  272. type JsonStruct struct {
  273. }
  274. func NewJsonStruct() *JsonStruct {
  275. return &JsonStruct{}
  276. }
  277. func (jst *JsonStruct) Load(filename string) (Config, error) {
  278. data, err := ioutil.ReadFile(filename)
  279. config := Config{}
  280. if err != nil {
  281. return config, errors.New("配置文件打开错误")
  282. }
  283. err = json.Unmarshal(data, &config)
  284. if err != nil {
  285. return config, errors.New("配置文件解析错误")
  286. }
  287. return config, nil
  288. }