2023-12-22 14:34:59 +08:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"flag"
|
|
|
|
"fmt"
|
|
|
|
"io/ioutil"
|
|
|
|
"net"
|
|
|
|
"net/http"
|
|
|
|
"os"
|
|
|
|
"os/exec"
|
2023-12-28 10:35:13 +08:00
|
|
|
"path/filepath"
|
2023-12-22 14:34:59 +08:00
|
|
|
"runtime"
|
|
|
|
"strings"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"gopkg.in/ini.v1"
|
|
|
|
)
|
|
|
|
|
|
|
|
func getRequest(url string, client *http.Client) ([]byte, error) {
|
|
|
|
response, err := client.Get(url)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
defer response.Body.Close()
|
|
|
|
|
|
|
|
body, err := ioutil.ReadAll(response.Body)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return body, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func makeGETRequestAndProcessData(url string, client *http.Client, storeNo string, setURLTemplate string) {
|
|
|
|
responseData, err := getRequest(url, client)
|
|
|
|
if err != nil {
|
|
|
|
fmt.Printf("发送GET请求失败: %v\n", err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
fmt.Println(string(responseData))
|
|
|
|
|
|
|
|
slice := strings.Split(string(responseData), ",")
|
|
|
|
|
|
|
|
for _, publicIPURL := range slice {
|
|
|
|
fmt.Println(publicIPURL)
|
|
|
|
publicIPURL = "https://" + publicIPURL + "/"
|
|
|
|
publicIPResponse, err := getRequest(publicIPURL, client)
|
|
|
|
if err != nil {
|
|
|
|
fmt.Printf("发送GET请求失败: %v\n", err)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
parsedIP := net.ParseIP(string(publicIPResponse))
|
|
|
|
if parsedIP != nil {
|
|
|
|
fmt.Printf("%s 有效的IP地址\n", publicIPResponse)
|
|
|
|
|
|
|
|
setURL := fmt.Sprintf(setURLTemplate, publicIPResponse, storeNo)
|
|
|
|
fmt.Printf("%s\n", setURL)
|
|
|
|
publicIPSendResponse, err := getRequest(setURL, client)
|
|
|
|
if err != nil {
|
|
|
|
fmt.Printf("发送GET请求失败: %v\n", err)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
fmt.Printf("发送Get请求返回状态: %s\n", string(publicIPSendResponse))
|
|
|
|
// 成功时候跳出循环
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const (
|
|
|
|
DAEMON = "d"
|
|
|
|
FOREVER = "f"
|
|
|
|
)
|
|
|
|
|
|
|
|
func StripSlice(slice []string, element string) []string {
|
|
|
|
for i := 0; i < len(slice); {
|
|
|
|
if slice[i] == element && i != len(slice)-1 {
|
|
|
|
slice = append(slice[:i], slice[i+1:]...)
|
|
|
|
} else if slice[i] == element && i == len(slice)-1 {
|
|
|
|
slice = slice[:i]
|
|
|
|
} else {
|
|
|
|
i++
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return slice
|
|
|
|
}
|
|
|
|
|
|
|
|
func SubProcess(args []string) *exec.Cmd {
|
|
|
|
cmd := exec.Command(args[0], args[1:]...)
|
|
|
|
cmd.Stdin = os.Stdin
|
|
|
|
cmd.Stdout = os.Stdout
|
|
|
|
cmd.Stderr = os.Stderr
|
|
|
|
err := cmd.Start()
|
|
|
|
if err != nil {
|
|
|
|
fmt.Fprintf(os.Stderr, "[-] Error: %s\n", err)
|
|
|
|
}
|
|
|
|
return cmd
|
|
|
|
}
|
|
|
|
|
2023-12-28 10:35:13 +08:00
|
|
|
func get_ini() string {
|
|
|
|
exePath, err := os.Executable()
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("无法获取可执行文件路径:", err)
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
|
|
|
|
exeDir := filepath.Dir(exePath)
|
|
|
|
exeDir = filepath.Join(exeDir, "public_ip.ini")
|
|
|
|
fmt.Println(exeDir)
|
|
|
|
|
|
|
|
return exeDir
|
|
|
|
}
|
|
|
|
|
2023-12-22 14:34:59 +08:00
|
|
|
func main() {
|
|
|
|
|
|
|
|
var version = "1.0.0"
|
|
|
|
|
2023-12-28 10:35:13 +08:00
|
|
|
// 获取当前可执行文件的路径
|
|
|
|
INI_FILE := get_ini()
|
|
|
|
_, err := os.Stat(INI_FILE)
|
|
|
|
if os.IsNotExist(err) {
|
|
|
|
fmt.Println("配置文件不存在")
|
|
|
|
os.Exit(0)
|
|
|
|
}
|
|
|
|
|
2023-12-22 14:34:59 +08:00
|
|
|
// 读取配置文件
|
2023-12-28 10:35:13 +08:00
|
|
|
cfgs, err := ini.Load(INI_FILE)
|
2023-12-22 14:34:59 +08:00
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
Get_Find_Ip_Url := cfgs.Section("global").Key("Get_Find_Ip_Url").Value()
|
|
|
|
SedIpURL := cfgs.Section("global").Key("SedIpURL").Value()
|
|
|
|
StoreNo := cfgs.Section("global").Key("StoreNo").Value()
|
|
|
|
While_Time, _ := cfgs.Section("global").Key("While_Time").Int()
|
|
|
|
|
|
|
|
daemon := flag.Bool(DAEMON, false, "run in daemon")
|
|
|
|
forever := flag.Bool(FOREVER, false, "run in forever")
|
|
|
|
showVersion := flag.Bool("h", false, "打印应用程序信息")
|
|
|
|
showVersion_long := flag.Bool("help", false, "打印应用程序信息")
|
|
|
|
flag.Parse()
|
|
|
|
|
|
|
|
if *showVersion || *showVersion_long {
|
|
|
|
fmt.Println(" Public_Ip ")
|
|
|
|
fmt.Println(" Obtain the public network IP of the LAN terminal and send it to a specific interface")
|
|
|
|
fmt.Println("Version:", version)
|
|
|
|
fmt.Printf("Author:%s\n", "aixiao@aixiao.me")
|
|
|
|
fmt.Println("")
|
|
|
|
os.Exit(0)
|
|
|
|
} else {
|
|
|
|
fmt.Println("其他逻辑...")
|
|
|
|
}
|
|
|
|
|
|
|
|
if *daemon {
|
|
|
|
SubProcess(StripSlice(os.Args, "-"+DAEMON))
|
|
|
|
fmt.Printf("[*] Daemon running in PID: %d PPID: %d\n", os.Getpid(), os.Getppid())
|
|
|
|
os.Exit(0)
|
|
|
|
} else if *forever {
|
|
|
|
for {
|
|
|
|
cmd := SubProcess(StripSlice(os.Args, "-"+FOREVER))
|
|
|
|
fmt.Printf("[*] Forever running in PID: %d PPID: %d\n", os.Getpid(), os.Getppid())
|
|
|
|
time.Sleep(time.Second * 5)
|
|
|
|
cmd.Wait()
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
fmt.Printf("[*] Service running in PID: %d PPID: %d\n", os.Getpid(), os.Getppid())
|
|
|
|
}
|
|
|
|
|
|
|
|
// 把自己加入注册表,开机自启
|
|
|
|
if runtime.GOOS == "windows" {
|
|
|
|
regedit()
|
|
|
|
}
|
|
|
|
|
|
|
|
// 主函数
|
|
|
|
for {
|
|
|
|
client := &http.Client{
|
|
|
|
Timeout: 5 * time.Second,
|
|
|
|
}
|
|
|
|
|
|
|
|
makeGETRequestAndProcessData(Get_Find_Ip_Url, client, StoreNo, SedIpURL)
|
|
|
|
time.Sleep(time.Second * time.Duration(While_Time))
|
|
|
|
}
|
|
|
|
}
|