110 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package crawler
 | |
| 
 | |
| import (
 | |
| 	"crypto/tls"
 | |
| 	"loafle.com/overflow/commons_go/matcher"
 | |
| 	"loafle.com/overflow/commons_go/matcher/packet"
 | |
| 	"net"
 | |
| 	"loafle.com/overflow/commons_go/model/scaninfo"
 | |
| )
 | |
| 
 | |
| type SocketHeahthCrawler struct {
 | |
| 	CrawlerImpl
 | |
| 	m matcher.Matcher
 | |
| }
 | |
| 
 | |
| func (s *SocketHeahthCrawler) SetMatcher(m matcher.Matcher) {
 | |
| 	s.m = m
 | |
| }
 | |
| 
 | |
| func (s *SocketHeahthCrawler) getConnection(params map[string]interface{}) (net.Conn, error) {
 | |
| 
 | |
| 	ip := params["ip"].(string)
 | |
| 	port := params["port"].(string)
 | |
| 	portType := params["portType"].(string)
 | |
| 	ssl := params["ssl"].(bool)
 | |
| 
 | |
| 	var addr string = ip
 | |
| 	addr += ":"
 | |
| 	addr += port
 | |
| 
 | |
| 	if ssl == false {
 | |
| 		conn, err := net.Dial(portType, addr)
 | |
| 		if err != nil {
 | |
| 			return nil, err
 | |
| 		}
 | |
| 		return conn, nil
 | |
| 	} else {
 | |
| 		conn, err := tls.Dial(
 | |
| 			portType,
 | |
| 			addr,
 | |
| 			&tls.Config{
 | |
| 				InsecureSkipVerify: true,
 | |
| 				ServerName:         ip,
 | |
| 				ClientAuth:         tls.RequestClientCert,
 | |
| 			},
 | |
| 		)
 | |
| 		if err != nil {
 | |
| 			return nil, err
 | |
| 		}
 | |
| 		return conn, nil
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (s *SocketHeahthCrawler) CheckHeahth(params map[string]interface{}) (bool, error) {
 | |
| 
 | |
| 	conn, err := s.getConnection(params)
 | |
| 	if err != nil {
 | |
| 		return false, err
 | |
| 	}
 | |
| 	defer conn.Close()
 | |
| 	
 | |
| 	info := scaninfo.NewScanInfoImpl(params["ip"].(string),params["port"].(string))
 | |
| 	
 | |
| 	if s.m.IsPrePacket() == true {
 | |
| 		bytes := make([]byte, 1024)
 | |
| 		n, _ := conn.Read(bytes)
 | |
| 		p := packet.NewPacket(bytes, n)
 | |
| 		if s.m.Match(0, p, info) == false {
 | |
| 			return false, nil
 | |
| 		} else {
 | |
| 
 | |
| 			for i := 0; i < s.m.PacketCount(); i++ {
 | |
| 				pack := s.m.Packet(i)
 | |
| 				conn.Write(pack.Buffer)
 | |
| 				bytes := make([]byte, 1024)
 | |
| 				n, _ := conn.Read(bytes)
 | |
| 
 | |
| 				if s.m.IsNoResponse(i+1) == true { // empty last response
 | |
| 					break
 | |
| 				}
 | |
| 
 | |
| 				p := packet.NewPacket(bytes, n)
 | |
| 				if s.m.Match(i+1, p, info) == false {
 | |
| 					return false, nil
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 	} else {
 | |
| 		for i := 0; i < s.m.PacketCount(); i++ {
 | |
| 			pack := s.m.Packet(i)
 | |
| 			conn.Write(pack.Buffer)
 | |
| 			bytes := make([]byte, 1024)
 | |
| 			n, _ := conn.Read(bytes)
 | |
| 
 | |
| 			if s.m.IsNoResponse(i) == true { // empty last response
 | |
| 				break
 | |
| 			}
 | |
| 
 | |
| 			p := packet.NewPacket(bytes, n)
 | |
| 			if s.m.Match(i, p, info) == false {
 | |
| 				return false, nil
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return true, nil
 | |
| }
 |