DNS与NTP
NTP 本质是执行一个命令 :
ntpdate -u time.google.com
使用PI用户不可以
需要使用root用户
因为需要修改本地时间
使用go是执行这个CMD 在ROOT下面执行
/测试1
package main
import (
"log"
"os/exec"
)
func ntp_sync() {
cmd := exec.Command("ntpdate", "-u", "time.google.com")
stdout, err := cmd.Output()
if err != nil {
log.Printf("[NTP] Fail to sync time: %v\r\n", err)
return
}
log.Printf("[NTP] Sync time, %s\r\n", string(stdout))
}
func main() {
ntp_sync()
}
/测试2
package main
import (
"log"
"os/exec"
)
func ntp_sync() error {
ntp_server := []string{"time.nist.gov", "time.google.com", "time.cloudflare.com", "216.239.35.8", "162.159.200.1"}
var err error
var stdout []byte
for _, addr := range ntp_server {
cmd := exec.Command("ntpdate", "-u", addr)
stdout, err = cmd.Output()
if err != nil {
log.Printf("[NTP] Fail to sync time with %s: %v\r\n", addr, err)
} else {
log.Printf("[NTP] Sync time with %s, %s\r\n", addr, string(stdout))
return nil
}
}
return err
}
func main() {
ntp_sync()
}
ntpdate -u time.google.com
ntpdate -u 162.159.200.1
也即是上面2个CMD都可以
DNS
它是把ip string类翻译为数字类的
根据文章 就是这里的 /etc/resolv.conf
默认是127.0.0.1
修改为0.0.0.1 可以看到
A---无法ping出去了
B---NTP失败 string类的IP地址 只有数字类的可以 也就是
ntpdate -u time.google.com --失败
ntpdate -u 162.159.200.1 --成功
++++++++++++++++++
cmd := exec.Command("ntpdate", "-u", "time.google.com")
这种东西 真的太糟糕了
很难使用
比如ping 在Linux里面不会停止 在WIN10会停止
# ping -c 2 www.runoob.com
用这个就可以控制2个以后停止!!但是上面不好用!!!
参考 go语言 exec Command 执行长命令 - Keeper丶 - 博客园
统一用这个!!!!!
//cmd := exec.Command("ping", "www.baidu.com")//WIN10 cmd := exec.Command("/bin/sh", "-c", "ping -c 2 www.baidu.com")//PI
cmd := exec.Command("/bin/sh","sudo service dnsmasq restart")
代码:
package main
import (
"log"
"os/exec"
"time"
)
func dns_reset() {
cmd := exec.Command("/bin/sh","sudo service dnsmasq restart")
stdout, err := cmd.Output()
if err != nil {
log.Printf("[DNS] Fail to DNS: %v\r\n", err)
return
}
log.Printf("[DNS] success to DNS:, %s\r\n", string(stdout))
}
func run_ping() {
//cmd := exec.Command("ping", "www.baidu.com")//WIN10
cmd := exec.Command("/bin/sh", "-c", "ping -c 2 www.baidu.com")//PI
stdout, err := cmd.Output()
if err != nil {
log.Printf("[DNS] Fail to ping: %v\r\n", err)
dns_reset()
return
}
log.Printf("[DNS] success to ping:, %s\r\n", string(stdout))
}
func main() {
for {
run_ping()
time.Sleep(time.Minute*1)
}
}
++++继续 常见代码框架 一个是时间驱动的周期 一个是关闭结束
package main
//package dns
import (
"fmt"
"log"
"net"
"time"
)
func Test() {
iprecords, err := net.LookupIP("movella.com")
for _, ip := range iprecords {
fmt.Println(ip)
}
fmt.Println("------end------")
if err != nil {
log.Printf("Could not get IPs: %v\r\n", err)
}
}
func Daemon_Start(close chan struct{}) {
t := time.NewTicker(time.Second)
defer t.Stop()
for {
select {
case <-close:
log.Printf("DNS deamon stop\r\n")
return
case <-t.C:
Test()
}
}
}
func main() {
dns_daemon_close := make(chan struct{})
go Daemon_Start(dns_daemon_close)
defer func() { dns_daemon_close <- struct{}{} }() // close dns deamon
time.Sleep(time.Second*3)
}
上面代码的优化 因为最后暴力的延时 没有看到最后的lOG
package main
//package dns
import (
"fmt"
"log"
"net"
"sync"
"time"
)
func Test() {
iprecords, err := net.LookupIP("movella.com")
for _, ip := range iprecords {
fmt.Println(ip)
}
fmt.Println("------end------")
if err != nil {
log.Printf("Could not get IPs: %v\r\n", err)
}
}
var wg sync.WaitGroup //第一步 全局变量
func Daemon_Start(close chan struct{}) {
t := time.NewTicker(time.Second)
defer t.Stop()
for {
select {
case <-close:
log.Printf("\r\nDNS deamon stop\r\n")
return
case <-t.C:
Test()
wg.Done() //第三步 每次-1
}
}
}
func main() {
dns_daemon_close := make(chan struct{})
go Daemon_Start(dns_daemon_close)
//defer func() { dns_daemon_close <- struct{}{} }() // close dns deamon
//time.Sleep(time.Second*3)
wg.Add(4) //第二部 最开始是计数总数
wg.Wait()//第四步 等计数-1 -1 -1变为0
dns_daemon_close <- struct{}{}
time.Sleep(time.Second * 3)//为了看最后的log
}