bak.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. import fs, { readFileSync } from "fs"
  2. import path from "path"
  3. import { XrayApi } from "./xray-api.js"
  4. // const subnets = [
  5. // "192.168.10",
  6. // "192.168.11",
  7. // "192.168.12",
  8. // "192.168.13",
  9. // "192.168.14"
  10. // ]
  11. const net = {
  12. 6: ["192.168.10"],
  13. 7: ["192.168.11", "192.168.12"],
  14. 8: ["192.168.13", "192.168.14"]
  15. }
  16. const subnets = Object.keys(net).flatMap(i => net[i])
  17. const files = ["US-IPWEB.json", "US-IPMOYU.json"]
  18. const map = {}
  19. subnets.forEach(subnet => {
  20. files.forEach(file => {
  21. const data = JSON.parse(
  22. fs.readFileSync(path.resolve("proxies", subnet, file)).toString()
  23. )
  24. let outbounds = []
  25. let routingRules = []
  26. data.forEach(([i, url, username, password]) => {
  27. const tag = `${subnet.replaceAll("192.168.", "")}-${file.replaceAll(
  28. ".json",
  29. ""
  30. )}-${i}`
  31. const [host, port] = url.split(":")
  32. outbounds.push({
  33. tag,
  34. protocol: "http",
  35. settings: {
  36. servers: [
  37. {
  38. address: host,
  39. port: parseInt(port),
  40. users: [
  41. {
  42. user: username,
  43. pass: password
  44. }
  45. ]
  46. }
  47. ]
  48. }
  49. })
  50. routingRules.push({
  51. type: "field",
  52. user: [tag],
  53. outboundTag: tag
  54. })
  55. })
  56. const name = `${subnet.replaceAll("192.168.", "")}-${file.replace(
  57. ".json",
  58. ""
  59. )}`
  60. map[name] = {
  61. outbounds,
  62. routingRules,
  63. subnet
  64. }
  65. })
  66. })
  67. fs.writeFileSync(path.resolve("dist", "map.json"), JSON.stringify(map, null, 2))
  68. const xray = JSON.parse(
  69. fs.readFileSync(path.resolve("config", "xray.json")).toString()
  70. )
  71. xray.outbounds = xray.outbounds.concat(
  72. Object.keys(map).flatMap(name => map[name].outbounds)
  73. )
  74. xray.routing.rules = xray.routing.rules.concat(
  75. Object.keys(map).flatMap(name => map[name].routingRules)
  76. )
  77. fs.writeFileSync(
  78. path.resolve("dist", "xray_edited.json"),
  79. JSON.stringify(xray, null, 2)
  80. )
  81. const accounts = [
  82. {
  83. url: "https://laboratory.mesgity.top:2053/KWO7yYJTJ3",
  84. username: "+jokCah2",
  85. password: "L9kZkc1j"
  86. }
  87. ]
  88. for (let account of accounts) {
  89. const xrayApi = new XrayApi(account.url, account.username, account.password)
  90. await xrayApi.login()
  91. await xrayApi.update(xray)
  92. const template = fs
  93. .readFileSync(path.resolve("config", "template.yaml"))
  94. .toString()
  95. for (let name of Object.keys(map)) {
  96. const ips = [...Array(200).keys()].map(
  97. i => `${map[name].subnet}.${i + 50}`
  98. )
  99. const res = await xrayApi.add(
  100. name,
  101. map[name].outbounds.map(outbound => outbound.tag)
  102. )
  103. const groups = []
  104. const rules = []
  105. let c = 0
  106. for (let i = 0; i < ips.length; i++) {
  107. const groupName = `${name}-GROUP-${parseInt(i / 2)}`
  108. if (i % 2 === 0) {
  109. groups.push(
  110. ` - name: ${groupName}
  111. type: url-test
  112. url: http://www.gstatic.com/generate_204
  113. interval: 150
  114. tolerance: 50
  115. proxies:
  116. - ${name}-${++c}
  117. - ${name}-${++c}`
  118. )
  119. }
  120. rules.push(` - SRC-IP-CIDR,${ips[i]}/32,${groupName}`)
  121. }
  122. const proxies = res.map(i => ` - ${i.config}`)
  123. map[name].config = {
  124. proxies,
  125. groups,
  126. rules
  127. }
  128. let config_file = template
  129. .replace("${proxy}", proxies.join("\n"))
  130. .replace("${group}", groups.join("\n"))
  131. .replace("${rule}", rules.join("\n"))
  132. fs.writeFileSync(path.resolve("dist", `${name}.yaml`), config_file)
  133. }
  134. }
  135. const configs = {}
  136. for (let key of Object.keys(net)) {
  137. Object.entries(map)
  138. .filter(([name, value]) => {
  139. return net[key]
  140. .map(i => i.replaceAll("192.168.", ""))
  141. .includes(name.split("-")[0])
  142. })
  143. .forEach(([name, value]) => {
  144. let n = key + "-" + name.split("-").splice(1).join("-")
  145. if (!configs[n]) {
  146. configs[n] = {
  147. proxies: [],
  148. groups: [],
  149. rules: []
  150. }
  151. }
  152. configs[n].proxies = configs[n].proxies.concat(value.config.proxies)
  153. configs[n].groups = configs[n].groups.concat(value.config.groups)
  154. configs[n].rules = configs[n].rules.concat(value.config.rules)
  155. })
  156. }
  157. for (let key of Object.keys(configs)) {
  158. const template = fs
  159. .readFileSync(path.resolve("config", "template.yaml"))
  160. .toString()
  161. let config_file = template
  162. .replace("${proxy}", configs[key].proxies.join("\n"))
  163. .replace("${group}", configs[key].groups.join("\n"))
  164. .replace("${rule}", configs[key].rules.join("\n"))
  165. fs.writeFileSync(path.resolve("dist", `${key}.yaml`), config_file)
  166. }