Advertisement
Guest User

netcheck.py - label untuk flowchart

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