⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 matrix.py

📁 监控大型网络的软件。能够自动发现拓扑结构
💻 PY
字号:
# -*- coding: ISO8859-1 -*-# $Id: Matrix.py 3865 2007-02-01 08:14:21Z mortenv $## Copyright 2003, 2004 Norwegian University of Science and Technology## This file is part of Network Administration Visualized (NAV)## NAV is free software; you can redistribute it and/or modify# it under the terms of the GNU General Public License as published by# the Free Software Foundation; either version 2 of the License, or# (at your option) any later version.## NAV is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the# GNU General Public License for more details.## You should have received a copy of the GNU General Public License# along with NAV; if not, write to the Free Software# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA### Authors: Sigurd Gartmann <sigurd-nav@brogar.org>#"""Builds the prefix matrix.BUGS----The code looks awful, should be rewritten to use IPy for improved readability(and fewer bugs)"""import stringimport osimport reimport nav.pathimport ConfigParserfrom nav import dbfrom nav.web.templates.MatrixTemplate import MatrixTemplateconnection = db.getConnection('webfront','manage')database = connection.cursor()configfile = os.path.join(nav.path.sysconfdir,'report/matrix.conf')class Matrix:    def __init__(self, network=None):        if not network:            #temporary out of order            #must be fixed in database            #database.execute("select netaddr, nettype from prefix inner join vlan using (vlanid) where nettype='scope'")            #network = database.fetchone()[0]            network = "129.241.0.0/16"                    self.this_net = NetworkAddress(network)        self.unntak = {}        self.subnet = {}        self.big_net_rowspan = {}        self.numbers = (0,32,64,96,128,160,192,224)        self.bnet = self.this_net.bnet        self.start = self.this_net.startnet        self.end = self.this_net.endnet        self.network = network        self.configuration = Configuration(configfile)    def makeMatrix(self):        page = MatrixTemplate()        whole_net = self.this_net        unntak = self.unntak        subnet = self.subnet        big_net_rowspan = self.big_net_rowspan        sql = "select prefixid, netaddr, vlan, active_ip_cnt, max_ip_cnt, nettype, description, orgid from prefix left outer join vlan using (vlanid) left outer join prefix_active_ip_cnt using (prefixid) left outer join prefix_max_ip_cnt using (prefixid) where nettype <> 'scope' order by netaddr"        database.execute(sql)        prefices = database.fetchall()        lastnetaddr = "0"        for prefix in prefices:            if not prefix[1] == lastnetaddr:                lastnetaddr = prefix[1]                small_net = NetworkAddress(lastnetaddr)                tip = [ int(small_net.net_splitted[i]) & int(whole_net.mask_splitted[i]) for i in range(0,len(small_net.net_splitted))]                a = string.join([str(t) for t in tip],".")                #raise repr(a+whole_net.b)                            #check that actual netaddr is in the address scope                if a==whole_net.b and small_net.masklen >= whole_net.masklen:                    #raise repr(a+whole_net.b)                    tip[2] = int(small_net.net_splitted[2]) & int(small_net.mask_splitted[2])                    tip[3] = int(small_net.net_splitted[3]) & int(small_net.mask_splitted[3])                    if small_net.masklen > 27:                        unntak[tip[2]] = str(tip[2])                    else:                        if not subnet.has_key(tip[2]):                            subnet[tip[2]] = {}                        subnet[tip[2]][tip[3]] = Subnet(small_net, prefix[0], prefix[2], prefix[3], prefix[4], prefix[5], prefix[6], prefix[7])                        if small_net.masklen < 24:                            big_net_rowspan[tip[2]] = pow(2,24-small_net.masklen)                page.path = [("Home", "/"), ("Report", "/report/"), ("Prefix Matrix",False)]        page.start = self.start        page.end = self.end        page.unntak = self.unntak        page.colspan = {20: 8, 21: 8,  22: 8, 23: 8, 24: 8, 25: 4, 26: 2, 27: 1}        page.big_net_rowspan = self.big_net_rowspan        page.subnet = self.subnet        page.bnet = self.bnet        page.network = self.network        page.numbers = self.numbers        page.configuration = self.configuration        return page.respond()class Subnet:    def __init__(self,network,prefixid,vlan,machines,max,nettype,description,orgid):        self.bits = network.masklen        self.vlan = vlan        self.machines = 0        if machines:            self.machines = int(machines)        self.max = None        if max:            self.max = int(max)        self.ip = network.net        self.suffix = string.join(network.net_splitted[2:3],".")        self.prefixid = prefixid        self.nettype = nettype        if not description:            self.description = orgid        else:            self.description = description        self.percent = 0        if self.machines and self.max:            self.percent = self.machines*100/self.maxclass NetworkAddress:    def __init__(self,inet_quad):        splitted = inet_quad.split("/")        self.net = splitted[0]        if len(splitted) > 1:            self.masklen = int(splitted[1])        else:            self.masklen = 32        self.mask = self.bits_mask(self.masklen)        net_splitted = self.net.split(".")        mask_splitted = self.mask.split(".")                self.startnet = int(net_splitted[2])        self.endnet = 255 - int(mask_splitted[2])        self.b = string.join([str(int(net_splitted[i]) & int(mask_splitted[i])) for i in range (0, len(net_splitted))],".")        self.net_splitted = net_splitted        self.mask_splitted = mask_splitted                self.bnet = string.join(net_splitted[0:2], ".")    def bits_mask(self, number_of_bits):        if number_of_bits == 32:            return "255.255.255.255"        elif number_of_bits == 31:            return "255.255.255.254"        elif number_of_bits == 30:            return "255.255.255.252"        elif number_of_bits == 29:            return "255.255.255.248"        elif number_of_bits == 28:            return "255.255.255.240"        elif number_of_bits == 27:            return "255.255.255.224"        elif number_of_bits == 26:            return "255.255.255.192"        elif number_of_bits == 25:            return "255.255.255.128"        elif number_of_bits == 24:            return "255.255.255.0"        elif number_of_bits == 23:            return "255.255.254.0"        elif number_of_bits == 22:            return "255.255.252.0"        elif number_of_bits == 21:            return "255.255.248.0"        elif number_of_bits == 20:            return "255.255.240.0"        elif number_of_bits == 19:            return "255.255.224.0"        elif number_of_bits == 18:            return "255.255.192.0"        elif number_of_bits == 17:            return "255.255.128.0"        elif number_of_bits == 16:            return "255.255.0.0"        elif number_of_bits == 15:            return "255.254.0.0"        elif number_of_bits == 14:            return "255.252.0.0"        elif number_of_bits == 13:            return "255.248.0.0"        elif number_of_bits == 12:            return "255.240.0.0"        elif number_of_bits == 11:            return "255.224.0.0"        elif number_of_bits == 10:            return "255.192.0.0"        elif number_of_bits == 9:            return "255.128.0.0"        elif number_of_bits == 8:            return "255.0.0.0"        elif number_of_bits == 7:            return "254.0.0.0"        elif number_of_bits == 6:            return "252.0.0.0"        elif number_of_bits == 5:            return "248.0.0.0"        elif number_of_bits == 4:            return "240.0.0.0"        elif number_of_bits == 3:            return "224.0.0.0"        elif number_of_bits == 2:            return "196.0.0.0"        elif number_of_bits == 1:            return "128.0.0.0"        elif number_of_bits == 0:            return "0.0.0.0"        else:            raise ValueError(str(number_of_bits)+" is not an accepted value for mask")class Configuration:    def __init__(self,path):        config = file(path).readlines()        limits = {}        extras = {}        for line in config:            limitmatch = re.search("^\s*\>\=?\s*(\d+)\s*:\s*(\S+)",line)            if limitmatch:                limits[limitmatch.group(1)] = limitmatch.group(2)            else:                wordmatch = re.search("^\s*(\w+)\s*:\s*(\S+)",line)                if wordmatch:                    extras[wordmatch.group(1)] = wordmatch.group(2)        self.extras = extras        self.limits = limits

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -