test_tree.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. package main
  2. import (
  3. "fmt"
  4. "git.swzry.com/zry/go-hhc-cli/hhc_ast"
  5. "git.swzry.com/zry/go-hhc-cli/hhc_common"
  6. "net"
  7. "regexp"
  8. "strconv"
  9. "strings"
  10. )
  11. var FRGEXP *regexp.Regexp
  12. var ExecSB strings.Builder
  13. func CtxToCommand(ctx *hhc_ast.SDTWalkContext) string {
  14. sb := strings.Builder{}
  15. for _, v := range ctx.ASTNodes {
  16. sb.WriteString(v.GetTokenRaw() + " ")
  17. }
  18. return sb.String()
  19. }
  20. func FExec(ctx *hhc_ast.SDTWalkContext) hhc_common.SDTWalkError {
  21. fmt.Println("! Command Execute: ", CtxToCommand(ctx))
  22. ExecSB.WriteString(CtxToCommand(ctx) + "\r\n")
  23. return nil
  24. }
  25. func VLoopbackInf(t string) bool {
  26. i, e := strconv.Atoi(t)
  27. if e != nil {
  28. return false
  29. }
  30. if i < 0 || i > 7 {
  31. return false
  32. }
  33. return true
  34. }
  35. func VSubnetLen(t string) bool {
  36. i, e := strconv.Atoi(t)
  37. if e != nil {
  38. return false
  39. }
  40. if i < 1 || i > 31 {
  41. return false
  42. }
  43. return true
  44. }
  45. func VMTU(t string) bool {
  46. i, e := strconv.Atoi(t)
  47. if e != nil {
  48. return false
  49. }
  50. if i < 128 || i > 1500 {
  51. return false
  52. }
  53. return true
  54. }
  55. func VVlanInf(t string) bool {
  56. i, e := strconv.Atoi(t)
  57. if e != nil {
  58. return false
  59. }
  60. if i < 0 || i > 4095 {
  61. return false
  62. }
  63. return true
  64. }
  65. func VIPAddress(t string) bool {
  66. _, err := net.ResolveIPAddr("ip", t)
  67. return err == nil
  68. }
  69. func maketree() *hhc_ast.SyntaxDefinitionTreeRoot {
  70. var err error
  71. FRGEXP, err = regexp.Compile("INTEGER<([0-9]+)\\-([0-9]+)>")
  72. if err != nil {
  73. fmt.Println("Failed Compile Regexp:", err)
  74. return nil
  75. }
  76. treeroot := &hhc_ast.SyntaxDefinitionTreeRoot{}
  77. treeroot.AddCommand(
  78. (&hhc_ast.SDTNode_Command{
  79. Name: "ip",
  80. Description: "Specify IP configuration",
  81. }).AddSubCommand(
  82. (&hhc_ast.SDTNode_Command{
  83. Name: "address",
  84. Description: "Set the IP address of an interface",
  85. }).AddSubCommand((&hhc_ast.SDTNode_Command{
  86. Name: "dhcp-alloc",
  87. Description: "Obtain an IP address through DHCP",
  88. }).AddEnd(&hhc_ast.SDTNode_End{
  89. Exec: FExec,
  90. })).AddSubCommand((&hhc_ast.SDTNode_Command{
  91. Name: "unnumbered",
  92. Description: "Share an address with another interface",
  93. }).AddSubCommand((&hhc_ast.SDTNode_Command{
  94. Name: "interface",
  95. Description: "Specify the interface whose ip address was unnumbered",
  96. }).AddSubCommand((&hhc_ast.SDTNode_Command{
  97. Name: "loopback",
  98. Description: "LoopBack interface",
  99. }).AddValArgument((&hhc_ast.SDTNode_Argument{
  100. FormatDescription: "INTEGER<0-7>",
  101. Description: "LoopBack interface number",
  102. Validator: VLoopbackInf,
  103. }).AddEnd(&hhc_ast.SDTNode_End{
  104. Exec: FExec,
  105. }))).AddSubCommand((&hhc_ast.SDTNode_Command{
  106. Name: "vlan-interface",
  107. Description: "VLAN interface",
  108. }).AddValArgument((&hhc_ast.SDTNode_Argument{
  109. FormatDescription: "INTEGER<0-4095>",
  110. Description: "Vlan-interface interface number",
  111. Validator: VVlanInf,
  112. }).AddEnd(&hhc_ast.SDTNode_End{
  113. Exec: FExec,
  114. }))))).AddValArgument((&hhc_ast.SDTNode_Argument{
  115. FormatDescription: "X.X.X.X",
  116. Description: "IP address",
  117. Validator: VIPAddress,
  118. }).AddValArgument((&hhc_ast.SDTNode_Argument{
  119. FormatDescription: "INTEGER<1-31>",
  120. Description: "IP mask length",
  121. Validator: VSubnetLen,
  122. }).AddSubCommand((&hhc_ast.SDTNode_Command{
  123. Name: "sub",
  124. Description: "Indicate a subordinate address",
  125. }).AddEnd(&hhc_ast.SDTNode_End{
  126. Exec: FExec,
  127. })).AddEnd(&hhc_ast.SDTNode_End{
  128. Exec: FExec,
  129. })).AddValArgument((&hhc_ast.SDTNode_Argument{
  130. FormatDescription: "X.X.X.X",
  131. Description: "IP mask",
  132. Validator: VIPAddress,
  133. }).AddSubCommand((&hhc_ast.SDTNode_Command{
  134. Name: "sub",
  135. Description: "Indicate a subordinate address",
  136. }).AddEnd(&hhc_ast.SDTNode_End{
  137. Exec: FExec,
  138. })).AddEnd(&hhc_ast.SDTNode_End{
  139. Exec: FExec,
  140. })))).AddSubCommand((&hhc_ast.SDTNode_Command{
  141. Name: "mtu",
  142. Description: "Specify the MTU of the interface",
  143. }).AddValArgument((&hhc_ast.SDTNode_Argument{
  144. FormatDescription: "INTEGER<128-1500>",
  145. Description: "MTU in bytes",
  146. Validator: VMTU,
  147. }).AddEnd(&hhc_ast.SDTNode_End{
  148. Exec: FExec,
  149. })))).AddCommand((&hhc_ast.SDTNode_Command{
  150. Name: "ipv6",
  151. Description: "Specify IPv6 configuration",
  152. }).AddSubCommand((&hhc_ast.SDTNode_Command{
  153. Name: "dhcp",
  154. Description: "Configure DHCPv6",
  155. }).AddSubCommand((&hhc_ast.SDTNode_Command{
  156. Name: "select",
  157. Description: "Specify process mode of DHCPv6 packet",
  158. }).AddSubCommand((&hhc_ast.SDTNode_Command{
  159. Name: "relay",
  160. Description: "Relay mode",
  161. }).AddEnd(&hhc_ast.SDTNode_End{
  162. Exec: FExec,
  163. })).AddSubCommand((&hhc_ast.SDTNode_Command{
  164. Name: "server",
  165. Description: "Server mode",
  166. }).AddEnd(&hhc_ast.SDTNode_End{
  167. Exec: FExec,
  168. })))).AddSubCommand((&hhc_ast.SDTNode_Command{
  169. Name: "mtu",
  170. Description: "Specify the IPv6 MTU of the interface",
  171. }).AddValArgument((&hhc_ast.SDTNode_Argument{
  172. FormatDescription: "INTEGER<128-1500>",
  173. Description: "MTU in bytes",
  174. Validator: VMTU,
  175. }).AddEnd(&hhc_ast.SDTNode_End{
  176. Exec: FExec,
  177. }))))
  178. return treeroot
  179. }