From 3becc3a08dd92ec23b08229401756c5bb5450a02 Mon Sep 17 00:00:00 2001 From: ehlxr Date: Fri, 22 Dec 2017 16:01:46 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AB=99=E7=82=B9=E6=9B=B4=E6=96=B0=EF=BC=9A20?= =?UTF-8?q?17-12-22=2016:01:46?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/ip.go | 52 +--------------- common/ip_test.go | 58 ++++++++++++++++++ common/runner.go | 71 ++++++++++++++++++++++ common/runner_test.go | 33 ++++++++++ common/tojson.go => utils/resume/resume.go | 37 +++++++---- 5 files changed, 187 insertions(+), 64 deletions(-) create mode 100644 common/ip_test.go create mode 100644 common/runner.go create mode 100644 common/runner_test.go rename common/tojson.go => utils/resume/resume.go (57%) diff --git a/common/ip.go b/common/ip.go index acd4082..5e84450 100644 --- a/common/ip.go +++ b/common/ip.go @@ -1,4 +1,4 @@ -package main +package common import ( "bytes" @@ -29,56 +29,6 @@ type IP struct { Isp string `json:"isp"` } -func main() { - - external_ip := get_external() - - external_ip = strings.Replace(external_ip, "\n", "", -1) - fmt.Println("公网ip是: ", external_ip) - - fmt.Println("------Dividing Line------") - - ip := net.ParseIP(external_ip) - if ip == nil { - fmt.Println("您输入的不是有效的IP地址,请重新输入!") - } else { - result := TabaoAPI(string(external_ip)) - if result != nil { - fmt.Println("国家:", result.Data.Country) - fmt.Println("地区:", result.Data.Area) - fmt.Println("城市:", result.Data.City) - fmt.Println("运营商:", result.Data.Isp) - } - } - - fmt.Println("------Dividing Line------GetIntranetIp") - - GetIntranetIp() - - fmt.Println("------Dividing Line------") - - ip_int := inet_aton(net.ParseIP(external_ip)) - fmt.Println("Convert IPv4 address to decimal number(base 10) :", ip_int) - - ip_result := inet_ntoa(ip_int) - fmt.Println("Convert decimal number(base 10) to IPv4 address:", ip_result) - - fmt.Println("------Dividing Line------") - - is_between := IpBetween(net.ParseIP("0.0.0.0"), net.ParseIP("255.255.255.255"), net.ParseIP(external_ip)) - fmt.Println("check result: ", is_between) - - fmt.Println("------Dividing Line------external_ip") - is_public_ip := IsPublicIP(net.ParseIP(external_ip)) - fmt.Println("It is public ip: ", is_public_ip) - - is_public_ip = IsPublicIP(net.ParseIP("169.254.85.131")) - fmt.Println("It is public ip: ", is_public_ip) - - fmt.Println("------Dividing Line------GetPulicIP") - fmt.Println(GetPulicIP()) -} - func get_external() string { resp, err := http.Get("http://myexternalip.com/raw") if err != nil { diff --git a/common/ip_test.go b/common/ip_test.go new file mode 100644 index 0000000..2f2c2f0 --- /dev/null +++ b/common/ip_test.go @@ -0,0 +1,58 @@ +package common + +import ( + "fmt" + "net" + "strings" + "testing" +) + +func TestIp(t *testing.T) { + + external_ip := get_external() + + external_ip = strings.Replace(external_ip, "\n", "", -1) + fmt.Println("公网ip是: ", external_ip) + + fmt.Println("------Dividing Line------") + + ip := net.ParseIP(external_ip) + if ip == nil { + fmt.Println("您输入的不是有效的IP地址,请重新输入!") + } else { + result := TabaoAPI(string(external_ip)) + if result != nil { + fmt.Println("国家:", result.Data.Country) + fmt.Println("地区:", result.Data.Area) + fmt.Println("城市:", result.Data.City) + fmt.Println("运营商:", result.Data.Isp) + } + } + + fmt.Println("------Dividing Line------GetIntranetIp") + + GetIntranetIp() + + fmt.Println("------Dividing Line------") + + ip_int := inet_aton(net.ParseIP(external_ip)) + fmt.Println("Convert IPv4 address to decimal number(base 10) :", ip_int) + + ip_result := inet_ntoa(ip_int) + fmt.Println("Convert decimal number(base 10) to IPv4 address:", ip_result) + + fmt.Println("------Dividing Line------") + + is_between := IpBetween(net.ParseIP("0.0.0.0"), net.ParseIP("255.255.255.255"), net.ParseIP(external_ip)) + fmt.Println("check result: ", is_between) + + fmt.Println("------Dividing Line------external_ip") + is_public_ip := IsPublicIP(net.ParseIP(external_ip)) + fmt.Println("It is public ip: ", is_public_ip) + + is_public_ip = IsPublicIP(net.ParseIP("169.254.85.131")) + fmt.Println("It is public ip: ", is_public_ip) + + fmt.Println("------Dividing Line------GetPulicIP") + fmt.Println(GetPulicIP()) +} diff --git a/common/runner.go b/common/runner.go new file mode 100644 index 0000000..28c4d08 --- /dev/null +++ b/common/runner.go @@ -0,0 +1,71 @@ +package common + +import ( + "errors" + "os" + "os/signal" + "time" +) + +var ErrTimeOut = errors.New("执行者执行超时") +var ErrInterrupt = errors.New("执行者被中断") + +//一个执行者,可以执行任何任务,但是这些任务是限制完成的, +//该执行者可以通过发送终止信号终止它 +type Runner struct { + tasks []func(int) //要执行的任务 + complete chan error //用于通知任务全部完成 + timeout <-chan time.Time //这些任务在多久内完成 + interrupt chan os.Signal //可以控制强制终止的信号 +} + +func New(tm time.Duration) *Runner { + return &Runner{ + complete: make(chan error), + timeout: time.After(tm), + interrupt: make(chan os.Signal, 1), + } +} + +//将需要执行的任务,添加到Runner里 +func (r *Runner) Add(tasks ...func(int)) { + r.tasks = append(r.tasks, tasks...) +} + +//执行任务,执行的过程中接收到中断信号时,返回中断错误 +//如果任务全部执行完,还没有接收到中断信号,则返回nil +func (r *Runner) run() error { + for id, task := range r.tasks { + if r.isInterrupt() { + return ErrInterrupt + } + task(id) + } + return nil +} + +//检查是否接收到了中断信号 +func (r *Runner) isInterrupt() bool { + select { + case <-r.interrupt: + signal.Stop(r.interrupt) + return true + default: + return false + } +} + +//开始执行所有任务,并且监视通道事件 +func (r *Runner) Start() error { + //希望接收哪些系统信号 + signal.Notify(r.interrupt, os.Interrupt) + go func() { + r.complete <- r.run() + }() + select { + case err := <-r.complete: + return err + case <-r.timeout: + return ErrTimeOut + } +} diff --git a/common/runner_test.go b/common/runner_test.go new file mode 100644 index 0000000..8a82b29 --- /dev/null +++ b/common/runner_test.go @@ -0,0 +1,33 @@ +package common + +import ( + "log" + "os" + "testing" + "time" +) + +func TestRunner(t *testing.T) { + + log.Println("...开始执行任务...") + timeout := 3 * time.Second + r := New(timeout) + r.Add(createTask(), createTask(), createTask()) + if err := r.Start(); err != nil { + switch err { + case ErrTimeOut: + log.Println(err) + os.Exit(1) + case ErrInterrupt: + log.Println(err) + os.Exit(2) + } + } + log.Println("...任务执行结束...") +} +func createTask() func(int) { + return func(id int) { + log.Printf("正在执行任务%d", id) + time.Sleep(time.Duration(id) * time.Second) + } +} diff --git a/common/tojson.go b/utils/resume/resume.go similarity index 57% rename from common/tojson.go rename to utils/resume/resume.go index 1cde39c..50eec7f 100644 --- a/common/tojson.go +++ b/utils/resume/resume.go @@ -13,7 +13,27 @@ func main() { dest := flag.String("dest", "/Users/ehlxr/ehlxr/blog/resume/data.json", "destination file path") flag.Parse() - f, err := os.Open(*source) + fmt.Printf("is these right? (n/no cancel)\n source file path: %s \n destination file path: %s\n", *source, *dest) + var in string + fmt.Scanln(&in) + if in == "no" || in == "n" { + fmt.Println("bye!") + os.Exit(0) + } + + m := make(map[string]interface{}) + m["show"] = "1" + m["content"] = string(readFile(*source)) + j, err := json.Marshal(m) + if err != nil { + panic(err) + } + writeFile(*dest, j) + fmt.Println("Done !") +} + +func readFile(path string) []byte { + f, err := os.Open(path) if err != nil { panic(err) } @@ -23,20 +43,11 @@ func main() { panic(err) } - m := make(map[string]interface{}) - m["show"] = "1" - m["content"] = string(fd) - j, err := json.Marshal(m) - if err != nil { - panic(err) - } - - fmt.Println(string(j)) - writeFile(*dest, j) + return fd } -func writeFile(fn string, b []byte) { - file, err := os.OpenFile(fn, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0777) +func writeFile(path string, b []byte) { + file, err := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0777) defer file.Close() if err != nil {