main.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package main
  2. import (
  3. "bytes"
  4. "fmt"
  5. "os"
  6. "strconv"
  7. "strings"
  8. "text/template"
  9. )
  10. // 定义接口结构
  11. type InterfaceConfig struct {
  12. Name string
  13. MAC string
  14. IP string
  15. Prefix string
  16. Mask string
  17. Gateway string
  18. }
  19. // 定义模板内容
  20. const netplanTemplate = `network:
  21. version: 2
  22. ethernets:
  23. {{- range . }}
  24. {{ .Name }}:
  25. match:
  26. macaddress: {{ .MAC }}
  27. dhcp4: no
  28. addresses:
  29. - {{ .IP }}/{{ .Prefix }}
  30. gateway4: {{ .Gateway }}
  31. nameservers:
  32. addresses:
  33. - 8.8.8.8
  34. - 8.8.4.4
  35. {{- end }}
  36. `
  37. // GenerateNetCardConfig 生成网卡配置
  38. func GenerateNetCardConfig(netCardConfig []InterfaceConfig) (string, error) {
  39. // 创建模板
  40. for k, config := range netCardConfig {
  41. Prefix, err := maskToCIDR(config.Mask)
  42. if err != nil {
  43. return "", err
  44. }
  45. netCardConfig[k].Prefix = strconv.Itoa(Prefix)
  46. }
  47. tmpl, err := template.New("netplan").Parse(netplanTemplate)
  48. if err != nil {
  49. fmt.Println("Error parsing template:", err)
  50. return "", err
  51. }
  52. // 使用 bytes.Buffer 来捕获模板的输出
  53. var output bytes.Buffer
  54. // 执行模板并将结果写入到 output
  55. err = tmpl.Execute(&output, netCardConfig)
  56. if err != nil {
  57. fmt.Println("Error executing template:", err)
  58. return "", err
  59. }
  60. // 将生成的字符串打印出来
  61. return output.String(), nil
  62. }
  63. // 将子网掩码转换为CIDR前缀
  64. func maskToCIDR(mask string) (int, error) {
  65. parts := strings.Split(mask, ".")
  66. cidr := 0
  67. for _, part := range parts {
  68. num, err := strconv.Atoi(part)
  69. if err != nil {
  70. return 0, err
  71. }
  72. bits := fmt.Sprintf("%08b", num)
  73. cidr += strings.Count(bits, "1")
  74. }
  75. return cidr, nil
  76. }
  77. func main() {
  78. // 定义接口配置
  79. netCardConfig := []InterfaceConfig{
  80. {
  81. Name: "ens33",
  82. MAC: "00:0c:29:0e:4f:8e",
  83. IP: "192.168.1.1",
  84. Mask: "255.255.255.0",
  85. Gateway: "192.168.1.1",
  86. },
  87. {
  88. Name: "ens37",
  89. MAC: "00:0c:29:0e:4f:90",
  90. IP: "192.168.2.1",
  91. Mask: "255.255.255.0",
  92. Gateway: "192.168.2.1",
  93. },
  94. }
  95. // 生成网卡配置
  96. config, err := GenerateNetCardConfig(netCardConfig)
  97. if err != nil {
  98. fmt.Println("生成网络配置文件失败:", err)
  99. return
  100. }
  101. create, err := os.Create("network-config")
  102. if err != nil {
  103. fmt.Println("创建配置文件失败:", err)
  104. return
  105. }
  106. defer create.Close()
  107. _, _ = create.WriteString(config)
  108. }