Child pages
  • Получение GEO положения хоста по его хостнейму
Skip to end of metadata
Go to start of metadata

На вход подаётся csv файл выгрузки с определённым городом. Вданном случае город Ершов. Из хостнейма берётся транскрипция улицы и номер дома.

cvs

fsw-3-Internationalnaya-4854-0-ers,True,engels,activatormain,,Huawei.VRP,ers.fttb.huawei,1.........

Получение геокоординат через cvs файл выгрузки объектов МО

for i in $(sed 1d твой_csv_файл | awk -F\, '{print $1}' | awk -F\- '{printf "ershov+%s+%s\n",$3,$4}'); do echo -ne "${i} "; curl -s http://geocode-maps.yandex.ru/1.x/?geocode="${i}"\&results=1 | grep pos | awk -F\> '{print $2}' | awk -F\< '{print $1}'; done

результат

результат

ershov+yubileynaya+2 48.284366 51.352670

ershov+yubileynaya+3 48.283126 51.351668

ershov+yubileynaya+5 48.282767 51.352405

ershov+yubileynaya+4 48.283584 51.353384

ershov+yubileynaya+4 48.283584 51.353384

ershov+yubileynaya+4 48.283584 51.353384

ershov+yubileynaya+4 48.283584 51.353384

ershov+yubileynaya+6 48.283440 51.354183

Данную информацию можно использовать в дальнейшем для записи её на оборудование в поле sysLocate и автоматическое размещение обьекта на GEO карте в Inventory.

 

 

4 Comments

  1. Unknown User (gnu-linux)

    1. Штатные средства геокодирования в NOC https://bt.nocproject.org/browse/NOC-1436

     

          2. Геокодирование по почтовому адресу, в примерах адрес указан в custom поле SA MO postaddress.

    2.1 inventory_add_sa_object.py запускать через NOC shel. Геокодирование через сервис Яндекс онлайн.

    Если в castom поле SA MO postaddress указан адрес типа: "г. Москва, ул.Строителей, д.25, п.2" то скрипт в INV создаёт объект с именем города, в нём объект "PoP | Aggregation" с именем segment (микрорайон города), в объект "PoP | Access" с адресом вместо имени и географическими координатами дома, в нём создаст объект "Room" с названием подъезда, в нём создаст объект 'NoName | Rack | 19" 8U 800mm Shelf' (можно заменить на свой домовой ящик) и в первый свободный в нём юнит положит коммутатор. Все объекты создаются только если их нет в базе, то есть при работе скрипт дописывает в базу INV только новое оборудование.

    inventory_add_sa_object.py
    # -*- coding: utf-8 -*-
    ##----------------------------------------------------------------------
    ## inventory_add_sa_object
    ##----------------------------------------------------------------------
    ## Copyright (C) 2007-2014 The NOC Project
    ## See LICENSE for details
    ##----------------------------------------------------------------------
    
    # Python modules
    import re
    import requests
    # NOC modules
    from noc.sa.models import *
    from noc.inv.models import *
    from noc.inv.models.object import *
    from noc.lib.nosql import get_db
    
    rx_city = re.compile(
            r"^(г\.|пгт\.|пос\.|с\.)+(?P<city>(\S+ \S+ \S+|\S+ \S+|\S+))")
    rx_street = re.compile(
            r"^ ул\.+(?P<street>(\S+ \S+ \S+|\S+ \S+|\S+))")
    rx_house = re.compile(
            r"^ д\.+(?P<house>(\d+\S+|\d+))")
    
    rx_room = re.compile(
            r"^ п\.+(?P<room>(\d+\S+|\d+))")
    
    db = get_db()
    om = db.noc.objectmodels
    
    """
    
    Uninstall:
    
    ./noc shell
    
    from noc.sa.models import *
    from noc.inv.models import *
    from noc.inv.models.object import *
    from noc.lib.nosql import get_db
    db = get_db()
    om = db.noc.objectmodels
    Object.objects.filter(model = om.find_one({"name": 'NoName | Rack | 19" 8U 800mm Shelf'})["_id"]).delete()
    Object.objects.filter(model = om.find_one({"name": 'Room'})["_id"]).delete()
    Object.objects.filter(model = om.find_one({"name": 'PoP | Access'})["_id"]).delete()
    Object.objects.filter(model = om.find_one({"name": 'PoP | Aggregation'})["_id"]).delete()
    
    psql ...
    
    TRUNCATE TABLE gis_geodata;
    
    """
    
    K = 0
    k = 0
    
    for mo in tuple(ManagedObject.objects.filter(
        administrative_domain=1)):
        mo_id = mo.id
        name = mo.name
        segment = mo.segment
        postaddress = mo.postaddress.encode("UTF-8")
    #
    #    print ""
    #    print postaddress
    #
        postaddress = postaddress.split(',')
        match = rx_city.search(postaddress[0])
        if match:
            city = match.group("city")
            for i in db.noc.objects.find({"name": 'г.' + city}):
                city_id = i["_id"]
        else:
            continue
        try:
            match = rx_street.search(postaddress[1])
        except IndexError:
            continue
        if match:
            street = match.group("street")
        else:
            continue
        try:
            match = rx_house.search(postaddress[2])
        except IndexError:
            continue
        if match:
            house = match.group("house")
        else:
            continue
        try:
            match = rx_room.search(postaddress[3])
        except IndexError:
            continue
        if match:
            room = match.group("room")
        else:
            continue
    
    
        pop =  "ул.".decode('UTF-8') + (street).decode('UTF-8') + ", д.".decode('UTF-8') + (house).decode('UTF-8')
        room = "Подъезд №".decode('UTF-8') + room
        rack = "Ящик №1".decode('UTF-8')
    
        K += 1
        if city:
    
    #        try:
                print 'г.'.decode('UTF-8') + city.decode('UTF-8') + ' | ' + segment + ' | ' + pop + ' | ' + room + ' | ' + rack
    
                if not Object.objects.filter(name = segment):
                    url="http://geocode-maps.yandex.ru/1.x/?geocode=" + city + ",+" + street.replace(' ', '+') + ",+дом+" + house +"&format=json"
                    urlopen = requests.get(url)
                    obj = urlopen.json()
                    coord = obj["response"]["GeoObjectCollection"]["featureMember"][0]["GeoObject"]["Point"]["pos"].split(' ')
                    x = coord[0]
                    y = coord[1]
    
                    print 'г.'.decode('UTF-8') + city.decode('UTF-8') + ' | ' + segment + '   x=' +  str(x) + '   y=' +  str(y)
    
                    Object(
                        name = segment,
                        model = om.find_one({"name": "PoP | Aggregation"})["_id"],
                        container = ObjectId(city_id),
                        data = {"geopoint": {
                                "srid": "EPSG:4326",
                                "x": float(x),
                                "y": float(y),
                                },
                            "pop": {"level": 30}
                            }
                    ).save()
                for i in db.noc.objects.find({"container": ObjectId(city_id), "name": segment }):
                    segment_id = i["_id"]
    
                if not Object.objects.filter(container = ObjectId(segment_id), name = pop):
                    url="http://geocode-maps.yandex.ru/1.x/?geocode=" + city + ",+" + street.replace(' ', '+') + ",+дом+" + house +"&format=json"
                    urlopen = requests.get(url)
                    obj = urlopen.json()
                    coord = obj["response"]["GeoObjectCollection"]["featureMember"][0]["GeoObject"]["Point"]["pos"].split(' ')
                    x = coord[0]
                    y = coord[1]
    
                    print 'г.'.decode('UTF-8') + city.decode('UTF-8') + ' | ' + segment + ' | ' + pop  + '   x=' +  str(x) + '   y=' +  str(y)
    
                    Object(
                        name = pop,
                        model = om.find_one({"name": "PoP | Access"})["_id"],
                        container = ObjectId(segment_id),
                        data = {"geopoint": {
                                "srid": "EPSG:4326",
                                "x": float(x),
                                "y": float(y),
                                },
                            "pop": {"level": 15}
                            }
                    ).save()
                for i in db.noc.objects.find({"container": ObjectId(mcrn_id), "name": pop }):
                    pop_id = i["_id"]
    
                if not Object.objects.filter(container = ObjectId(pop_id), name = room):
                    Object(
                        name = room,
                        model = om.find_one({"name": "Room"})["_id"],
                        container = ObjectId(pop_id),
                        data = {}
                    ).save()
                    print 'Add ', room
                for i in db.noc.objects.find({"container": ObjectId(pop_id), "name": room}):
                    room_id = i["_id"]
    
                if not Object.objects.filter(container = ObjectId(room_id), name = rack):
                    Object(
                        name = rack,
                        model = om.find_one({"name": 'NoName | Rack | 19" 8U 800mm Shelf'})["_id"],
                        container = ObjectId(room_id),
                        data = {}
                    ).save()
                    print 'Add ', rack
                    print "\n\n"
                for i in db.noc.objects.find({"container": ObjectId(room_id), "name": rack}):
                    rack_id = i["_id"]
    
                # Уложить mo в Rack
    
                k += 1
    #            break
    #        except:
    #            break
    #            continue
    
    print K, k
    
    

     

     

    2.2 geocode_mp.py - ещё один старый вариант геокодирования офлайн при наличии карты города в формате mp (польский формат).

    Этот скрипт каждому объекту SA ставит в соотведствие точку на карте если в поле SA MO description указан адрес типа: "г.Москва, ул.Строителей, д.25".

    geocode_mp.py
    # -*- coding: utf-8 -*-
    ##----------------------------------------------------------------------
    ## geocode_mp
    ##----------------------------------------------------------------------
    ## Copyright (C) 2007-2012 The NOC Project
    ## See LICENSE for details
    ##----------------------------------------------------------------------
    
    # Python modules
    import re
    # NOC modules
    import set_staticvlan_env
    import set_env
    set_env.setup(use_django=True)
    from noc.lib.app.site import site
    site.autodiscover()
    from noc.sa.models import ManagedObject, ManagedObjectSelector
    from noc.lib.nosql import get_db
    
    from noc.gis.models import Overlay
    
    # Network config:
    execfile('/opt/noc/etc/noc-staticvlan.conf')
    
    # TODO country:
    #rx_countryidx = re.compile(
    #        r"^Region+(?P<countryidx>\d+)+=" + country + "$", re.MULTILINE)
    
    rx_city = re.compile(
            r"^(г\.|пгт\.|пос\.|с\.) +(?P<city>(\S+ \S+ \S+|\S+ \S+|\S+))")
    rx_street = re.compile(
            r"^ ул\. +(?P<street>(\S+ \S+ \S+|\S+ \S+|\S+))")
    rx_house = re.compile(
            r"^ д\. +(?P<house>(\d+\S+|\d+))")
    
    db = get_db()
    points = db.my.points
    
    #Overlay(name="Noc devices", overlay="points", is_active=True,
    #        gate_id="mypoints", permission_name="points",
    #        config={"collection": "my.points",
    #             "position": "pos", "text": "label"}
    #        ).save()
    
    map_mp = open(vector_map_mp, 'r')
    map_data = map_mp.read()
    map_mp.close()
    
    for mo in tuple(ManagedObject.objects.filter(
        administrative_domain=admin_domain)):
        mo_id = mo.id
        name = mo.name
        desc = mo.description.encode("UTF-8")
    #
        print ""
        print desc
    #
        desc = desc.split(',')
        match = rx_city.search(desc[0])
        if match:
            city = match.group("city")
            rx_cityidx = re.compile(
                r"^City+(?P<cityidx>\d+)+=" + city + "$", re.MULTILINE)
            match = rx_cityidx.search(map_data)
            if match:
                cityidx = match.group("cityidx")
            else:
                cityidx = None
    #
    #        print cityidx
    #
        else:
            continue
        try:
            match = rx_street.search(desc[1])
        except IndexError:
            continue
        if match:
            street = match.group("street")
        else:
            continue
        try:
            match = rx_house.search(desc[2])
        except IndexError:
            continue
        if match:
            house = match.group("house")
        else:
            continue
    
        if cityidx:
    #
            print city, street, house
    #
            rx_coordinate = re.compile(
                r"^HouseNumber=" + house + ".StreetDesc=(улица |проспект |проезд |)" + street + "( улица| проспект| проезд| ул\.| пр-т| пр-д|).CityIdx=" + cityidx + ".Data0=+(?P<coordinate>[\(\d+.\d+,\d+.\d+\)?,? ]*)$",
                re.DOTALL | re.MULTILINE | re.IGNORECASE)
        else:
    #
            print street, house
    #
            rx_coordinate = re.compile(
                r"^HouseNumber=" + house + ".StreetDesc=(улица |проспект |проезд |)" + street + "( улица| проспект| проезд| ул\.| пр-т| пр-д|).Data0=+(?P<coordinate>[\(\d+.\d+,\d+.\d+\)?,? ]*)$",
                re.DOTALL | re.MULTILINE | re.IGNORECASE)
    
        match = rx_coordinate.search(map_data)
        if match:
            coordinate = match.group("coordinate")
    #
    #        print coordinate
    #
            coordinate = coordinate.replace(' ', '')
            coordinate = coordinate.split(',')
            x = 0
            y = 0
            n = 0
            for i in coordinate:
                v = i.strip('(')
                v = v.strip(')')
                if n / 2 == float(n) / 2:
                    x = x + float(v)
                    n += 1
                else:
                    y = y + float(v)
                    n += 1
            x = 2 * x / n
            y = 2 * y / n
    #        points.insert({"pos": [y, x], "label": name})
    #
            print str(y), str(x), name
            print ""
    #
    
    """
    Not working:
    points.ensureIndex({"pos": "2d"})
    
    Fix:
    # mongo --shell
    > use noc
    > db.my.points.ensureIndex({"pos": "2d"})
    > quit()
    """
    quit()
  2. Unknown User (e_zombie)

    from noc.inv.models.object import Object
    from noc.inv.models.objectmodel import ObjectModel
    ObjectModel.objects.get(name="PoP | Access")
    point_model = ObjectModel.objects.get(name="PoP | Access")
    cont = Object.objects.get(name="saratov")
    x = 46.016669869422294
    y = 51.532775391719845
    data = {"geopoint": {"srid": "EPSG:4326", "x": float(x), "y": float(y), }, "pop": {"level": 30}  }
    p_cont=Object(name="MSK-AP0003", model=point_model, container=cont.id, data=data)
    p_cont.save()

     

    где cont = Object.objects.get(name="saratov") объект куда укладывается создаваемая точка.

     

  3. Unknown User (e_zombie)

    from noc.inv.models.object import Object
    from noc.inv.models.objectmodel import ObjectModel

    f = open('/opt/noc/object.txt', 'r')
    assinfire = []
    for line in f:
        ap = line.split()
        assinfire.append(ap)
    f.close()

    wifi = ManagedObjectProfile.objects.get(name='Ruckus_WiFi')
    for mo in tuple(ManagedObject.objects.filter(name__contains="MSK-AP",object_profile=wifi)):
        name1 = mo.name
        if not Object.objects.filter(name = name1):
            for ass in assinfire:
                if ass[0] == name1:
                    x = ass[1]
                    y = ass[2]
                    ObjectModel.objects.get(name="PoP | Access")
                    point_model = ObjectModel.objects.get(name="PoP | Access")
                    cont = Object.objects.get(name="Wi-Fi")
                    data = {"geopoint": {"srid": "EPSG:4326", "x": float(x), "y": float(y), }, "pop": {"level": 30}  }
                    p_cont=Object(name=name1, model=point_model, container=cont.id, data=data)
                    p_cont.save()

  4. Unknown User (sysfar)

    Набросаю небольшой мануал.

     

    Для того что бы у вас на карте в Inventory отобразились объекты:

    1) Выгрузить в inventory свои МО, для этого нужно корректно работающий get_inventory и настроенная модель для объекта. Я передавал в inventiry параметр sn, мне по нему легче было искать объекты.

    2) Сделать общий PoP контейнер. 

    Пример для г. Москва (общий контейнер PoP - Wi-Fi)  обязательно укажите srid и координаты с удобным для вас zoom.

    3) Далее, нужно создать PoP контейнеры для каждого объекта MO, я покажу на примере своей сети, будут вопросы, спрашивайте.

     

    from noc.inv.models.object import Object
    from noc.inv.models.objectmodel import ObjectModel
    
    f = open('/opt/noc/object.txt', 'r') #открываем файл в котором хранятся имена объектов(имена должны совпадать с именами в МО) и координаты x и y, можно через пробел.
    assinfire = []
    for line in f:
    	ap = line.split()
    	assinfire.append(ap)
    f.close()
    #формируем словарь
    
    wifi = ManagedObjectProfile.objects.get(name='Ruckus_WiFi')  #ищу все МО имеющие профайл Ruckus_WiFi
    for mo in tuple(ManagedObject.objects.filter(name__contains="MSK-AP",object_profile=wifi)): #отфильтровываю только те, которые содержат в имени MSK-AP
    	name1 = mo.name
    	#if not Object.objects.filter(name = name1): #проверяем наличие уже имеющегося контейнера в инвентори. Тут на самом деле затык, вроде бы не все так просто, надо править. 
    	for ass in assinfire: 
    		if ass[0] == name1: #ищем наш МО в словаре
    		x = ass[1] #координаты Х
    		y = ass[2] #координаты y
    		ObjectModel.objects.get(name="PoP | Access") #ищем модель PoP | Access
    		point_model = ObjectModel.objects.get(name="PoP | Access") 
    		cont = Object.objects.get(name="Wi-Fi") #ищем основной контейнер
    		data = {"geopoint": {"srid": "EPSG:4326", "x": float(x), "y": float(y), }, "pop": {"level": 30} } #формируем нужные переменные
    		p_cont=Object(name=name1, model=point_model, container=cont.id, data=data) #создаем контейнер
    		p_cont.save()
    		print p_cont

    После того как все удачно создастся, должно получится что-то типа такого. Пустые PoP контейнеры без объектов.

    Как запихнуть свои объекты в нужные контейнеры при условии того что у нас и контейнер и объект имеют одинаковое имя, но при этом разные модели.

    Контейнер имеет модель PoP | Access, Id можно глянуть в MongoDB или в shell или 

     

    from noc.inv.models.object import Object
    from noc.inv.models.objectmodel import ObjectModel
    from noc.sa.models.managedobject import ManagedObject
    from noc.sa.models.managedobjectprofile import ManagedObjectProfile
    
    
    wifi = ManagedObjectProfile.objects.get(name='Ruckus_WiFi')  #ищу все МО имеющие профайл Ruckus_WiFi
    for mo in tuple(ManagedObject.objects.filter(name__contains="MSK-AP",object_profile=wifi)): #отфильтровываю только те, которые содержат в имени MSK-AP
    	sn = mo.get_attr("Serial Number") забираем из атрибутов серийный номер МО
    	print sn 
    	name1 = mo.name 
    	popmodel = "5809b9cb0ef5724234cb0ed6" #id модели контейнеров PoP
    	cont = Object.objects.filter(name=name1, model=popmodel) #фильтруем контейнеры по имени МО и модели
    	if not cont or len(cont) > 1: #работа над ошибками, если такого контейнера нет, то продолжаем работу
    		continue
    	cont = cont[0] 
    	ap = Object.objects.filter(data__asset__serial = sn) #фильтурем сами объекты по серийному номера МО
    	if not ap or len(ap) > 1: #работа над ошибками, если такого объекта нет, то продолжаем работу
    		continue
    	ap = ap[0] 
    	ap.container = cont.id #подставляем объект id контейнера, в котором он должен лежать.
    	mo.container = cont.id #выгружаем в МО id контейнера, для того что бы объекты отобразились на тепловой карте
    	ap.save() 
    	print cont
    	print ap
     
     

    Должно в итоге получится вот так вот.

    С тепловой картой пока толком не разобрался, как будет больше информации, допишу.