Guest User

Untitled

a guest
Jan 17th, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.19 KB | None | 0 0
  1. /*
  2. Connect to massive ip:port addresses and find out what are not connectable.
  3.  
  4. Port variant of PingInfoView.
  5.  
  6. It only accepts input from a CSV file with following format:
  7. 10.12.15.121:8080,xxxxx,zzzzzz
  8. 10.12.15.4:8080,aaaaa,bbbbbb
  9. 10.12.15.35:8080,ddddd,eeeeee
  10. ...
  11. */
  12.  
  13. package main
  14.  
  15. import (
  16. "bufio"
  17. "encoding/csv"
  18. "fmt"
  19. "io"
  20. "log"
  21. "net"
  22. "os"
  23. "time"
  24. )
  25.  
  26.  
  27. type VipInfo struct {
  28. Addr string
  29. VipName string
  30. Lb string
  31. }
  32.  
  33.  
  34. func IsConnectable(addr string) bool {
  35. conn, err := net.DialTimeout("tcp", addr, 300*time.Millisecond)
  36. if err != nil {
  37. return false
  38. }
  39.  
  40. defer conn.Close()
  41.  
  42. return true
  43. }
  44.  
  45.  
  46. func GetUnconnectableVips(vips []VipInfo) []string {
  47. rv := []string{}
  48. sem := make(chan bool, 200)
  49. for i := 0; i < len(vips); i++ {
  50. sem <- true
  51. vip := vips[i]
  52. addr := vip.Addr
  53. vipName := vip.VipName
  54. lb := vip.Lb
  55. go func(addr string) {
  56. if ! IsConnectable(addr) {
  57. msg := fmt.Sprintf("%20s, %30s, %25s", addr, vipName, lb)
  58. rv = append(rv, msg)
  59. }
  60. <- sem
  61. }(addr)
  62. }
  63. for i := 0; i < cap(sem); i++ {
  64. sem <- true
  65. }
  66. return rv
  67. }
  68.  
  69.  
  70. func usage() {
  71. fmt.Fprintf(os.Stderr, "usage: %s csv_file\n", os.Args[0])
  72. fmt.Println("csv_file must be in format like '10.12.15.121:8080,xxxxx,zzzzzz'.")
  73. os.Exit(2)
  74. }
  75.  
  76.  
  77. func main(){
  78. if len(os.Args) != 2 {
  79. usage()
  80. }
  81.  
  82. csvFile, _ := os.Open(os.Args[1])
  83. reader := csv.NewReader(bufio.NewReader(csvFile))
  84. var vips []VipInfo
  85. for {
  86. line, err := reader.Read()
  87. if err == io.EOF {
  88. break
  89. } else if err != nil {
  90. log.Fatal(err)
  91. }
  92. vips = append(vips, VipInfo{
  93. Addr: line[0],
  94. VipName: line[1],
  95. Lb: line[2],
  96. })
  97. }
  98.  
  99. fmt.Println("running portping...")
  100.  
  101. unconnectableVips := GetUnconnectableVips(vips)
  102.  
  103. for i := 0; i < len(unconnectableVips); i++ {
  104. vipLb := unconnectableVips[i]
  105. fmt.Printf("%s, not able to connect\n", vipLb)
  106. }
  107.  
  108. fmt.Println("(all other VIPs are good)")
  109. }
Add Comment
Please, Sign In to add comment