Compare commits

...

23 Commits

Author SHA1 Message Date
eson
e7dc3c73e3 Merge http://474420502.top/eson/ipcenter 2019-03-14 15:10:22 +08:00
huangsimin
dae7521e26 Merge branch 'develop' into 'master'
增加mitm 用allProxies 接口

See merge request mt-data/ipcenter!4
2019-03-14 15:05:12 +08:00
wangchaofeng
1f84d5ec79 Merge branch 'feature/addApiForMitm' into 'develop'
增加真机mitm用allProxies接口

See merge request mt-data/ipcenter!3
2019-03-14 14:47:46 +08:00
chiufung
5882bab2f3 增加真机mitm用allProxies接口 2019-03-14 14:46:44 +08:00
wangchaofeng
b52adf23f3 Merge branch 'master' into 'develop'
Master

See merge request mt-data/ipcenter!2
2019-03-14 14:31:15 +08:00
huangsimin
9b61c8bae3 Merge branch 'hotfix/addNewAddr' into 'master'
Hotfix/add new addr

See merge request mt-data/ipcenter!1
2019-02-28 10:07:05 +08:00
chiufung
de5ee33866 新增昆明,福州,武汉,郑州,宁波,无锡,南京,石家庄,合肥,南昌 2019-02-28 10:03:58 +08:00
chiufung
7733db1744 新增昆明,福州,武汉,郑州,宁波,无锡,南京,石家庄,合肥,南昌 2019-02-28 10:00:39 +08:00
huangsimin
aaa53b54e4 修改错误ready不可达到的问题 2018-12-29 10:08:36 +08:00
huangsimin
a00de486e4 修改返回可用ip bug 2018-12-28 11:16:50 +08:00
huangsimin
abbfb5fbd9 修改切换失败的处理, 延时间切换 2018-12-28 10:52:57 +08:00
huangsimin
627cca4dbf 改善切换的判断条件 2018-12-24 16:58:01 +08:00
67cf4bc888 添加定期清理过期Ready列表 2018-12-22 03:30:25 +08:00
4149ea8d0f fix: error request to delete ready ip. 2018-12-22 03:14:05 +08:00
c5bb70cf52 set serverkeepalives is false 2018-12-18 02:53:09 +08:00
1918bc3328 test2 2018-12-18 01:57:06 +08:00
e25b10d931 test requests 2018-12-18 01:53:36 +08:00
ad881c1338 解决句柄泄漏问题 2018-12-18 00:59:13 +08:00
d66bfc0ee9 test cmd 2018-12-18 00:42:59 +08:00
huangsimin
e498b1adc5 添加济南 2018-12-17 15:12:40 +08:00
huangsimin
6cd7c96230 test open too many files 2018-12-17 14:51:43 +08:00
huangsimin
3c32236374 modify: Waitor wait time 12s 2018-12-17 11:11:49 +08:00
huangsimin
0490f5124b fix: case1: GResponse is nil
change: actives.yaml restart to 65s
2018-12-17 11:07:30 +08:00
4 changed files with 142 additions and 25 deletions

View File

@ -17,7 +17,40 @@ switch:
192.168.6.100:8088:
group: ["10.10.10.86", "10.10.10.87"] # 海口
city: "4601"
192.168.6.100:8090:
group: ["10.10.10.90", "10.10.10.91"] # 济南
city: "3701"
192.168.6.100:8091:
group: ["10.10.10.92", "10.10.10.93"] # 三亚
city: "4602"
restart: 50
192.168.6.100:8092:
group: ["10.10.21.26", "10.10.21.27"] # 昆明
city: "5301"
192.168.6.100:8093:
group: ["10.10.21.28", "10.10.21.29"] # 福州
city: "3501"
192.168.6.100:8094:
group: ["10.10.21.10", "10.10.21.11"] # 武汉
city: "4201"
192.168.6.100:8095:
group: ["10.10.21.12", "10.10.21.14"] # 郑州
city: "4101"
192.168.6.100:8096:
group: ["10.10.21.13", "10.10.21.15"] # 宁波
city: "3302"
192.168.6.100:8097:
group: ["10.10.21.16", "10.10.21.17"] # 无锡
city: "3202"
192.168.6.100:8098:
group: ["10.10.21.18", "10.10.21.19"] # 南京
city: "3201"
192.168.6.100:8099:
group: ["10.10.21.20", "10.10.21.21"] # 石家庄
city: "1301"
192.168.6.100:8100:
group: ["10.10.21.22", "10.10.21.23"] # 合肥
city: "3401"
192.168.6.100:8101:
group: ["10.10.21.24", "10.10.21.25"] # 南昌
city: "3601"
restart: 65

60
dip.go
View File

@ -34,8 +34,8 @@ func (worker *DIPWorker) ShowGroupInfo() string {
overtimeLabel = "<☠?>"
}
tm := time.Unix(dhost.ActiveTime, 0)
tm.Format("2006-01-02 15:04:05") //2018-07-11 15:10:19
content += dhost.Host + "(" + tm.Format("2006-01-02 15:04:05") + overtimeLabel + "),"
// tm.Format(time.RFC3339) //2018-07-11 15:10:19
content += dhost.Host + "(" + tm.Format(time.RFC3339) + overtimeLabel + "),"
}
content = strings.TrimRight(content, ",") + "]\n"
}
@ -43,6 +43,7 @@ func (worker *DIPWorker) ShowGroupInfo() string {
return content
}
// DIPGroup 动态ip组, 一个组指的是一条可动态切换的线
type DIPGroup struct {
Group map[string]*DHost // 原始参照
Waitor map[string]*DHost
@ -54,6 +55,7 @@ type DIPGroup struct {
Mutex *sync.Mutex
}
// NewDIPGroup 创建一个,动态ip组, 一个组指的是一条可动态切换的线
func NewDIPGroup() *DIPGroup {
group := DIPGroup{}
group.Group = make(map[string]*DHost)
@ -69,36 +71,59 @@ func (group *DIPGroup) Choose(addr string) {
for ip, dhost := range group.Ready {
// 设置转换的iptable
if group.Current == nil {
group.Current = dhost
group.Current.ActiveTime = now
SetAddrForward(group.IPTableNum, addr, ip)
log.Println(addr, " Current is nil")
} else {
restartAddr := "http://" + group.Current.Host + ":8800/pppoe/restart"
if resp, err := requests.NewSession().Get(restartAddr).Execute(); err != nil {
log.Println(err)
group.Current.ActiveTime += 12
defer resp.GResponse.Body.Close()
} else {
defer resp.GResponse.Body.Close()
group.Current = dhost
group.Current.ActiveTime = now
// log.Println("new set addr:", group.Current.Host, "restartAddr:", restartAddr, "resp", resp.Content())
SetAddrForward(group.IPTableNum, addr, ip)
i := 0
for ; i < 2; i++ {
imokURL := "http://" + dhost.Host + ":8800/pppoe/imok"
ses := requests.NewSession()
ses.SetConfig(requests.CRequestTimeout, 4)
if _, err := ses.Get(imokURL).Execute(); err != nil {
log.Println(err)
if i == 2 {
// 下个需要切换的DHost错误
group.Current.ActiveTime = now + 15
delete(group.Ready, ip)
return // 不执行下面的 切换操作 for ip, dhost := range group.Ready
}
} else { // 如果ping 通下个切换的主机就切换
for ii := 0; ii < 3; ii++ {
restartURL := "http://" + group.Current.Host + ":8800/pppoe/restart"
if _, err := ses.Get(restartURL).Execute(); err != nil {
log.Println(err)
} else {
break // 可以切换 ii := 0; ii < 3; ii++
}
}
break // for ; i < 3; i++ {
}
}
}
group.Current = dhost
group.Current.ActiveTime = now
SetAddrForward(group.IPTableNum, addr, ip)
group.Waitor[ip] = group.Ready[ip]
delete(group.Ready, ip)
break
return
}
}
// DHost 动态IP的一个vps
// Host vps的host属性 指定ip
// ActiveTime ActiveTime活跃时间
type DHost struct {
Host string
ActiveTime int64
}
// NewDHost 创建一个DHost host 为 ip
func NewDHost(host string) *DHost {
dh := DHost{}
dh.ActiveTime = time.Now().Unix()
@ -106,6 +131,7 @@ func NewDHost(host string) *DHost {
return &dh
}
// OverTime dhost对比时间是否超过limit的限制, 超时判断
func (dh *DHost) OverTime(now int64, limit int64) int64 {
if now-dh.ActiveTime >= limit {
return 1

View File

@ -44,6 +44,7 @@ func NewSwitch() *Switch {
http.HandleFunc("/ippool/switch/imactive", swi.imActive)
http.HandleFunc("/ippool/switch/update", swi.updateActives)
http.HandleFunc("/ippool/switch/actives", swi.switchActives)
http.HandleFunc("/ippool/switch/allproxies", swi.allProxies)
return &swi
}
@ -55,9 +56,15 @@ func (swi *Switch) Run(addr string, ipregion string) {
cmd := exec.Command("/bin/sh", "-c", "sudo iptables -t nat -N IPSWITCH")
cmd.Run()
if err := cmd.Process.Release(); err != nil {
panic(err)
}
cmd = exec.Command("/bin/sh", "-c", "sudo iptables -t nat -F IPSWITCH")
cmd.Run()
if err := cmd.Process.Release(); err != nil {
panic(err)
}
for range swi.Worker.ForLoop {
cmd := exec.Command("/bin/sh", "-c", "sudo iptables -t nat -A IPSWITCH -p icmp -s 1.1.1.1 -j DNAT --to 1.1.1.1:8885")
@ -65,10 +72,15 @@ func (swi *Switch) Run(addr string, ipregion string) {
if err != nil {
panic(err)
}
if err := cmd.Process.Release(); err != nil {
panic(err)
}
}
http.ListenAndServe(addr, nil)
server := &http.Server{Addr: addr, Handler: nil}
server.SetKeepAlivesEnabled(false)
server.ListenAndServe()
}
// timeToSwitch 计算是否到切换时间
@ -85,21 +97,38 @@ func (swi *Switch) timeToSwitch(now int64) {
}
}
func (swi *Switch) clearReady(now int64) {
for _, dipg := range swi.Worker.ForMatch {
var delIPList []string
for ip, dhost := range dipg.Ready {
if now >= dhost.ActiveTime+150 {
delIPList = append(delIPList, ip)
}
}
for _, ip := range delIPList {
delete(dipg.Ready, ip)
}
}
}
// checkInReady 签到的IP(vps的vpn节点IP))
func (swi *Switch) checkInReady(ip string, now int64) {
if dipg, ok := swi.Worker.ForMatch[ip]; ok {
dipg.Group[ip].ActiveTime = now
if dh, ok := dipg.Waitor[ip]; ok {
if dh.OverTime(now, 30) > 0 {
if dh.OverTime(now, 20) > 0 {
delete(dipg.Waitor, ip)
} else {
return
}
}
dipg.Group[ip].ActiveTime = now
if dipg.Current == nil {
dhost := NewDHost(ip)
dhost.ActiveTime = now
@ -135,6 +164,7 @@ func (swi *Switch) imActive(w http.ResponseWriter, req *http.Request) {
// 60秒show一次日志
if now >= swi.lastShow+60 {
swi.clearReady(now)
swi.lastShow = now
log.Println("\n" + swi.Worker.ShowGroupInfo())
}
@ -171,7 +201,6 @@ func (swi *Switch) switchActives(w http.ResponseWriter, req *http.Request) {
for addr, group := range swi.Worker.ForLoop {
addrmap := make(map[string]interface{})
content[addr] = addrmap
isappend := int64(0)
var hosts []string
@ -182,6 +211,7 @@ func (swi *Switch) switchActives(w http.ResponseWriter, req *http.Request) {
hosts = append(hosts, dhost.Host)
}
if isappend > 1 {
content[addr] = addrmap
addrmap["group"] = hosts
addrmap["city"] = group.City
}
@ -192,3 +222,32 @@ func (swi *Switch) switchActives(w http.ResponseWriter, req *http.Request) {
ErrorLog(err)
}
func (swi *Switch) allProxies(w http.ResponseWriter, req *http.Request) {
defer req.Body.Close()
swi.Worker.Mutex.Lock()
defer swi.Worker.Mutex.Unlock()
now := time.Now().Unix()
content := make(map[string]map[string]interface{})
for addr, group := range swi.Worker.ForLoop {
addrmap := make(map[string]interface{})
content[addr] = addrmap
isappend := int64(0)
var hosts []string
for _, dhost := range group.Group {
hosts = append(hosts, dhost.Host)
}
addrmap["group"] = hosts
addrmap["city"] = group.City
}
jdata, err := json.Marshal(content)
ErrorLog(err)
_, err = w.Write(jdata)
ErrorLog(err)
}

View File

@ -5,7 +5,6 @@ import (
)
func TestSwitchYaml(t *testing.T) {
t.Error()
swi := NewSwitch()
if swi == nil {