-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathmain.go
More file actions
165 lines (155 loc) · 4.94 KB
/
Copy pathmain.go
File metadata and controls
165 lines (155 loc) · 4.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
package main
import (
"flag"
"fmt"
"log"
"net"
"os"
"time"
"github.com/asmcos/requests"
"github.com/goinggo/mapstructure"
)
//dynv6的api地址
const Dynv6Url string = "https://dynv6.com/api/update"
var (
flagHelp bool //帮助
flagInter string //网卡
flagHostname string //域名
flagToken string //token
flagIpv4 bool
flagIpv6 bool
show_ipv4 bool
show_ipv6 bool
flagTimer int
)
func init() {
flag.BoolVar(&flagHelp, "h", false, "帮助")
flag.StringVar(&flagInter, "i", "eth0", "要获取ip的网卡")
flag.StringVar(&flagHostname, "hostname", "", "要更新的域名")
flag.StringVar(&flagToken, "token", "", "你的dynv6里的域名所绑定的token")
flag.BoolVar(&flagIpv4, "4", false, "更新ipv4地址")
flag.BoolVar(&flagIpv6, "6", false, "更新ipv6地址")
flag.BoolVar(&show_ipv4, "show_ipv4", false, "显示指定网卡的ipv4地址")
flag.BoolVar(&show_ipv6, "show_ipv6", false, "显示指定网卡的ipv6地址")
flag.IntVar(&flagTimer, "t", 300, "检查周期(秒),默认300秒")
flag.Usage = usage
}
func usage() {
fmt.Fprintf(os.Stderr, `ddnsfordynv6 version: 1.2
使用说明:ddnsfordynv6 [-i 网卡名] [-hostname 域名] [-token token] [-4] [-6] [-t]
选项:
-i 网卡名 ip所绑定的网卡
-show_ipv4 显示指定网卡的ipv4地址
-show_ipv6 显示指定网卡的ipv6地址
-hostname 域名 你的域名
-token token 你的token
-4 更新ipv4地址
-6 更新ipv6地址
-t 检查周期(秒),默认300秒
`)
}
// 获取给定网卡的ipv4地址和ipv6地址
func GetIP(interfaceName string) map[string]string {
inter, err := net.InterfaceByName(interfaceName)
if err != nil {
log.Fatalf("无法获取网卡信息,原因是:%v\n", err)
}
addrs, err := inter.Addrs()
if err != nil {
log.Fatalf("无法获取ip地址,原因是:%v\n", err)
}
ipaddr := make(map[string]string)
for _, addr := range addrs {
if ipnet, ok := addr.(*net.IPNet); ok && ipnet.IP.IsGlobalUnicast() && !ipnet.IP.IsLoopback() {
if ipnet.IP.To4() != nil {
//log.Printf("获取到网卡:%v ipv4地址:%v", inter.Name, ipnet.IP)
ipaddr["ipv4"] = ipnet.IP.String()
} else {
//log.Printf("获取到网卡:%v ipv6地址:%v", inter.Name, ipnet.IP)
ipaddr["ipv6"] = ipnet.IP.String()
}
}
}
return ipaddr
}
func res() {
ipaddr := GetIP(flagInter)
config := make(map[string]string)
config["hostname"] = flagHostname
config["token"] = flagToken
if flagIpv4 && !flagIpv6 {
config["ipv4"] = ipaddr["ipv4"]
} else if flagIpv6 && !flagIpv4 {
config["ipv6"] = ipaddr["ipv6"]
} else if flagIpv4 && flagIpv6 {
config["ipv4"] = ipaddr["ipv4"]
config["ipv6"] = ipaddr["ipv6"]
}
p := requests.Params{}
if err := mapstructure.Decode(config, &p); err != nil {
log.Fatalf("转换struct失败,原因:%v\n", err)
}
resp, err := requests.Get(Dynv6Url, p)
if err != nil {
log.Fatalf("向dynv6发送请求失败,原因:%v\n", resp.Text())
}
if resp.R.StatusCode != 200 {
if flagIpv4 && !flagIpv6 {
log.Fatalf("更新ipv4失败,dynv6返回%v\n", resp.Text())
} else if flagIpv6 && !flagIpv4 {
log.Fatalf("更新ipv6失败,dynv6返回%v\n", resp.Text())
} else if flagIpv4 && flagIpv6 {
log.Fatalf("更新ipv4和ipv6失败,dynv6返回%v\n", resp.Text())
}
} else if flagIpv4 && !flagIpv6 {
if config["ipv4"] != "" {
log.Printf("更新ipv4地址成功,当前ipv4地址为%v,dyn6返回%v\n", config["ipv4"], resp.Text())
} else {
log.Fatalf("更新ipv4地址失败,原因未取到ipv4地址\n")
}
} else if flagIpv6 && !flagIpv4 {
if config["ipv6"] != "" {
log.Printf("更新ipv6地址成功,当前ipv6地址为%v,dynv6返回%v\n", config["ipv6"], resp.Text())
} else {
log.Fatalf("更新ipv6地址失败,原因未取到ipv6地址\n")
}
} else if flagIpv4 && flagIpv6 {
if config["ipv4"] != "" && config["ipv6"] != "" {
log.Printf("更新ipv4地址和ipv6地址成功,dynv6返回%v\n", resp.Text())
} else {
log.Fatalf("更新ipv4地址或ipv6地址失败,原因是ipv4地址或ipv6地址未取到\n")
}
}
}
//定时发送请求
func cronRequest() {
res()
for range time.Tick(time.Second * time.Duration(flagTimer)) {
res()
}
}
func main() {
// 命令行参数
flag.Parse()
if flagHelp {
flag.Usage()
} else if flagHostname != "" && flagToken != "" && flagInter != "" {
cronRequest()
} else if show_ipv4 {
ipaddr := GetIP(flagInter)
if ipaddr["ipv4"] != "" {
fmt.Printf("获得网卡%v的ipv4地址为%v\n", flagInter, ipaddr["ipv4"])
} else {
fmt.Printf("获得网卡%v的ipv4地址失败\n", flagInter)
}
} else if show_ipv6 {
ipaddr := GetIP(flagInter)
if ipaddr["ipv6"] != "" {
fmt.Printf("获得网卡%v的ipv6地址为%v\n", flagInter, ipaddr["ipv6"])
} else {
fmt.Printf("获得网卡%v的ipv6地址失败\n", flagInter)
}
} else {
flag.Usage()
}
}