Advertisement
Guest User

netcheck.py

a guest
Mar 12th, 2019
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.16 KB | None | 0 0
  1. import sys
  2. import os
  3. import subprocess
  4. if sys.version_info.major == 2:
  5.     from xmlrpclib import ServerProxy
  6. else:
  7.     from xmlrpc.client import ServerProxy
  8. import socket
  9. socket.setdefaulttimeout(10)
  10. import transaction
  11. import logging
  12. from sqlalchemy import engine_from_config
  13. from pyramid.paster import (
  14.     get_appsettings,
  15.     setup_logging,
  16.     bootstrap,
  17.     )
  18. from ..models import DBSession
  19. from ..models.services.conf import ConfService
  20. from ..models.network import (
  21.     NetConnection,
  22.     NetLog,
  23.     )
  24. #
  25. from ..models.conf import Conf
  26. #
  27.  
  28. CONNECTED = 0
  29. DISCONNECTED = -1
  30. REFUSE = -2
  31.  
  32. log = logging.getLogger(__name__)
  33.  
  34.  
  35. def telnet(row):
  36.     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    
  37.     log.debug('telnet {ip} {port}'.format(ip=row.ip, port=row.port))
  38.     code = sock.connect_ex((row.ip, row.port))
  39.     return code in (0, 106)
  40.  
  41.  
  42. def netstat(row):
  43.     log.debug('netcat -nap | grep {ip}:{port}'.format(ip=row.ip, port=row.port))
  44.     c1 = ['netstat', '-nap']
  45.     c2 = ['grep', '{ip}:{port}'.format(ip=row.ip, port=row.port)]
  46.     p1 = subprocess.Popen(c1, stdout=subprocess.PIPE)
  47.     p2 = subprocess.Popen(c2, stdin=p1.stdout, stdout=subprocess.PIPE)
  48.     s = p2.communicate()[0]
  49.     if isinstance(s, bytes):
  50.         s = s.decode('utf-8')
  51.     return s.find('ESTABLISHED') > -1
  52.  
  53.  
  54.  
  55. class NetCheck:
  56.     def __init__(self):
  57.         self.username = ConfService.get_val('netcheck', 'username')
  58.         self.password = ConfService.get_val('netcheck', 'password')
  59.         self.url = ConfService.get_val('netcheck', 'url', 'https://h2h.opensipkd.com/rpc')
  60.         self.rpc = ServerProxy(self.url)
  61.  
  62.     def run(self):        
  63.         first_hosts = get_first_hosts()
  64.         for name in first_hosts:
  65.             self.ping_all(name)
  66.  
  67.     def ping(self, row):
  68.         if row.port:
  69.             for f in (netstat, telnet):
  70.                 if f(row):
  71.                     self.set_last_state(row, CONNECTED)
  72.                     return True
  73.         log.debug('ping {}'.format(row.ip))
  74.         c1 = ['ping', '-c1', '-w', '2', row.ip]
  75.         c2 = ['grep', 'received']
  76.         c3 = ['cut', '-f4', '-d', ' ']
  77.         p1 = subprocess.Popen(c1, stdout=subprocess.PIPE)
  78.         p2 = subprocess.Popen(c2, stdin=p1.stdout, stdout=subprocess.PIPE)
  79.         p3 = subprocess.Popen(c3, stdin=p2.stdout, stdout=subprocess.PIPE)
  80.         result = p3.communicate()
  81.         s = result[0]
  82.         if isinstance(s, bytes):
  83.             s = s.decode('utf-8')
  84.         s = s.strip()
  85.         connected = s == '1'
  86.         if connected:
  87.             if row.port:
  88.                 self.set_last_state(row, REFUSE)
  89.             else:
  90.                 self.set_last_state(row, CONNECTED)
  91.         else:
  92.             self.set_last_state(row, DISCONNECTED)
  93.         return connected
  94.  
  95.     def ping_all(self, name):
  96.         q = DBSession.query(NetConnection).filter_by(name=name)
  97.         row = q.first()
  98.         if self.ping(row):
  99.             self.set_gateway_connected(row)
  100.             return True
  101.         if row.gateway:
  102.             return self.ping_all(row.gateway)
  103.  
  104.     def set_gateway_connected(self, row):
  105.         if not row.gateway:
  106.             return
  107.         q = DBSession.query(NetConnection).filter_by(name=row.gateway)
  108.         row = q.first()
  109.         row.status_id = CONNECTED
  110.         DBSession.add(row)
  111.         DBSession.flush()
  112.         self.send_last_state(row)
  113.         self.set_gateway_connected(row)
  114.  
  115.     def set_last_state(self, row, status_id):
  116.         if row.status_id == status_id:
  117.             return
  118.         hist = NetLog()
  119.         hist.name = row.name
  120.         hist.ip = row.ip
  121.         hist.port = row.port
  122.         hist.status_id = status_id
  123.         DBSession.add(hist)
  124.         DBSession.flush()
  125.         row.status_id = status_id
  126.         row.updated = hist.created
  127.         DBSession.add(row)
  128.         DBSession.flush()
  129.         self.send_last_state(row)
  130.  
  131.     def send_last_state(self, row):
  132.         if not self.username or not row.description:
  133.             return
  134.         p = {'username': self.username,
  135.              'password': self.password,
  136.              'description': row.description,
  137.              'ip': row.ip,
  138.              'status_id': row.status_id}
  139.         if row.port:
  140.             p['port'] = row.port
  141.         p_ = dict(p)
  142.         p_['password'] = '...'
  143.         log.debug('send {url} {p}'.format(url=self.url, p=p_))
  144.         resp = self.rpc.net_status(p)
  145.         log.debug('recv {r}'.format(r=resp))
  146.  
  147.  
  148. def get_first_hosts():
  149.     gateways = []
  150.     q = DBSession.query(NetConnection)
  151.     for row in q:
  152.         if row.gateway and row.gateway not in gateways:
  153.             gateways.append(row.gateway)
  154.     r = []
  155.     for row in q:
  156.         if row.name not in gateways:
  157.             r.append(row.name)
  158.     return r
  159.  
  160. #
  161. def distro():
  162.     cmd = ['lsb_release','-a']
  163.     c = subprocess.Popen(cmd, stdout=subprocess.PIPE)
  164.     s = c.communicate()
  165.     s = s[0]
  166.     if isinstance(s, bytes):
  167.         s = s.decode('utf-8')
  168.     lines = s.split('\n')
  169.     d = {}
  170.     for line in lines:
  171.         items = line.split('\t')
  172.         if items[0] == 'Distributor ID:':
  173.             d['id'] = items[1]
  174.         elif items[0] == 'Codename:':
  175.             d['codename'] = items[1]
  176.         elif items[0] == 'Release:':
  177.             d['versi'] = float(items[1])
  178.         elif items[0] == 'Description:':
  179.             d['keterangan'] = items[1]
  180.     return d
  181.  
  182. def insertDistro(DBSession, get, nama):
  183.     q = DBSession.query(Conf).filter_by(grup='distro', nama=nama)
  184.     c = q.first()
  185.     if not c:
  186.         c = Conf()
  187.         c.grup = 'distro'
  188.         c.nama = nama
  189.     c.nilai = get[nama]
  190.  
  191.     DBSession.add(c)
  192.     DBSession.flush()
  193. #
  194.  
  195. def main(argv=sys.argv):
  196.     config_uri = argv[1]
  197.     setup_logging(config_uri)
  198.     settings = get_appsettings(config_uri)
  199.     engine = engine_from_config(settings, 'sqlalchemy.')
  200.     DBSession.configure(bind=engine)
  201.     bootstrap(config_uri)
  202.     nc = NetCheck()
  203.     nc.run()
  204.     get = distro()
  205.     #
  206.     insertDistro(DBSession, get, 'id')
  207.     insertDistro(DBSession, get, 'versi')
  208.     insertDistro(DBSession, get,  'codename')    
  209.     insertDistro(DBSession, get, 'keterangan')
  210.     #
  211.     transaction.commit()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement