{"id":466786,"date":"2025-07-11T15:00:45","date_gmt":"2025-07-11T15:00:45","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=466786"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=466786","title":{"rendered":"<span>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 Netbox \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u043d\u0430 Python<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442. \u042f \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0435. \u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0433\u043e\u0434 \u043d\u0430\u0437\u0430\u0434 \u043d\u0430\u0447\u0430\u043b \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 Netbox, \u0434\u043b\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0441\u0435\u0442\u0438. \u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u0441\u0442\u0430\u043b \u0432\u043e\u043f\u0440\u043e\u0441 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u044b \u0438 \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u043e\u0440\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0440\u0443\u043a\u0430\u043c\u0438, \u0438\u0445 \u043d\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e, \u044d\u0442\u043e \u044f\u0434\u0440\u043e \u0438 \u043e\u043f\u043e\u0440\u043d\u0430\u044f \u0441\u0435\u0442\u044c. \u0418 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0441\u0430\u0431 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432. \u0414\u0430\u043b\u0435\u0435 \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u043e\u0440\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u0430, \u0430 \u0438\u0445 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0442\u0435\u043d, \u0438 \u043f\u0430\u0440\u0430 \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u043c\u043e\u0434\u0435\u043b\u0435\u0439. \u0418 \u0432\u043e\u0442 \u0442\u0443\u0442 \u0443\u0436\u0435 \u0441\u0442\u0430\u043b\u043e \u0431\u043e\u043b\u044c\u043d\u043e \u043e\u0442 \u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u044b\u0441\u043b\u0438, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u0445 \u0440\u0443\u043a\u0430\u043c\u0438. <\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0431\u0443\u0434\u0435\u043c \u0447\u0435\u0440\u0435\u0437 API \u041d\u0435\u0442\u0431\u043e\u043a\u0441\u0430. \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u043c \u0437\u0430\u043c\u0443\u0434\u0440\u0451\u043d\u0430\u044f, \u043d\u043e \u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u0430\u044f. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u0430\u043a \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043f\u0430\u0447\u043a\u0443 \u0441\u0432\u0438\u0447\u0435\u0439, \u0430 \u043f\u043e\u0442\u043e\u043c \u0443\u0436\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0441\u043e\u0431\u0440\u0430\u043b \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e. \u0421\u043a\u0440\u0438\u043f\u0442\u043e\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0439 \u043e\u0441\u043d\u043e\u0432\u0435, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0447\u0435\u043c \u0447\u0435\u0440\u0435\u0437 web \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043e\u0434\u043d\u043e. <\/p>\n<p>\u0411\u0435\u0440\u0451\u043c json \u0444\u0430\u0439\u043b\u0438\u043a \u0441 \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u043e\u0440\u0430\u043c\u0438.<\/p>\n<pre><code class=\"json\">[  {  \"hostname\": \"TEST_SCRIPT1\",  \"interface\": \"vlan4090\",  \"ipaddress\": \"192.168.0.6\/24\",  \"mac_address\": \"33:10:FF:EE:11:22\",  \"model\": \"DGS-3120-24SC\",  \"siteslug\": \"site_test\",   \"swroleslug\": \"access-switch\"  },  {  \"hostname\": \"TEST_SCRIPT2\",  \"interface\": \"vlan4090\",  \"ipaddress\": \"192.168.0.66\/24\",  \"mac_address\": \"33:10:AA:BB:CC:DD\",  \"model\": \"MES2348B\",  \"siteslug\": \"site_test\",  \"swroleslug\": \"access-switch\"  }  ]<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0443 \u043d\u0430\u0441 \u0438\u043c\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, ip \u0430\u0434\u0440\u0435\u0441, \u043c\u0430\u043a \u0430\u0434\u0440\u0435\u0441, \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 \u043c\u0430\u043a\u0430 \u0438 ip. \u041c\u043e\u0434\u0435\u043b\u044c \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u043e\u0440\u0430, \u0441\u0430\u0439\u0442, \u0438 \u0440\u043e\u043b\u044c. \u041c\u043d\u0435 \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u0415\u0441\u043b\u0438 \u043a\u043e\u043c\u0443 \u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043c\u0430\u043b\u043e, \u0442\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430.<\/p>\n<p>\u041c\u043e\u0434\u0435\u043b\u044c \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u043e\u0440\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0443\u0436\u0435 \u0431\u044b\u0442\u044c \u0432 \u041d\u0435\u0442\u0431\u043e\u043a\u0441\u0435. \u0418 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0442\u0430\u043a \u0436\u0435 \u043a\u0430\u043a \u0438 \u0432 \u0441\u0430\u043c\u043e\u043c \u041d\u0435\u0442\u0431\u043e\u043a\u0441\u0435. <\/p>\n<p>\u0421\u0430\u0439\u0442 \u0438 \u0440\u043e\u043b\u044c \u0443\u043a\u0430\u0437\u0430\u043d\u044b slug. \u042d\u0442\u043e &#171;\u041f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0430&#187; \u0432 \u041d\u0435\u0442\u0431\u043e\u043a\u0441\u0435.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/458\/369\/757\/4583697578f9deaa1ea32f7825e60daa.png\" width=\"295\" height=\"153\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/458\/369\/757\/4583697578f9deaa1ea32f7825e60daa.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/458\/369\/757\/4583697578f9deaa1ea32f7825e60daa.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430 .env, \u0432 \u043d\u0451\u043c \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043b\u0443\u0447\u0448\u0435 \u043d\u0435 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432 \u0441\u0430\u043c\u043e\u043c \u043a\u043e\u0434\u0435. \u0418 \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0435\u0442\u0435\u0439, \u0443\u0434\u043e\u0431\u043d\u0435\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0444\u0430\u0439\u043b, \u0430 \u043d\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442.<\/p>\n<pre><code class=\"python\">API_KEY = \"Token\" URLNB = \"https:\/\/nb.youdomain.ru\" SWITCHES_FILE = 'add_nmap_192.168.0.0.json' IPSCAN = '192.168.0.0'<\/code><\/pre>\n<p>\u0422\u0443\u0442 \u043c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c API \u0442\u043e\u043a\u0435\u043d \u0434\u043b\u044f \u041d\u0435\u0442\u0431\u043e\u043a\u0441\u0430. URL \u041d\u0435\u0442\u0431\u043e\u043a\u0441\u0430, \u0438 json \u0444\u0430\u0439\u043b, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0443 \u043d\u0430\u0441 \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u043e\u0440\u044b. \u0418 IPSCAN, \u043e\u043d \u043d\u0443\u0436\u0435\u043d \u0431\u0443\u0434\u0435\u0442 \u0434\u0430\u043b\u044c\u0448\u0435, \u0430 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0438\u043c\u044f \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u0430 \u043b\u043e\u0433\u043e\u0432. <\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0441\u0430\u043c \u0441\u043a\u0440\u0438\u043f\u0442. <\/p>\n<p>\u041f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0438\u043c\u043f\u043e\u0440\u0442\u044b.<\/p>\n<pre><code class=\"python\">import os import json import requests import logging import logging.handlers  from dotenv import load_dotenv<\/code><\/pre>\n<p>\u0412\u0441\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u044f \u0431\u0443\u0434\u0443 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0431\u044b \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0431\u044b\u043b\u043e \u0432\u0438\u0434\u043d\u043e \u043d\u0430 \u043a\u0430\u043a\u043e\u043c \u0448\u0430\u0433\u0435 \u043e\u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430, \u0438\u043b\u0438 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0432\u0441\u0451 \u043f\u0440\u043e\u0448\u043b\u043e \u0445\u043e\u0440\u043e\u0448\u043e.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u044f \u043d\u0430\u043f\u0438\u0448\u0443 \u043a\u043b\u0430\u0441\u0441 \u0441 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438. \u041c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0438 \u0431\u0435\u0437 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043d\u043e \u0442\u0430\u043a \u043a\u043e\u0434 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439.<\/p>\n<p>\u041a\u0440\u0430\u0442\u043a\u043e \u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0447\u0435\u0440\u0435\u0437 API:<\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e (\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f: \u0438\u043c\u044f, \u043c\u043e\u0434\u0435\u043b\u044c, \u0441\u0430\u0439\u0442, \u0440\u043e\u043b\u044c);<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f (\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 vlan4090 \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435);<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c ip \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435;<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043c\u0430\u043a \u0430\u0434\u0440\u0435\u0441 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435;<\/p>\n<\/li>\n<li>\n<p>\u0414\u0435\u043b\u0430\u0435\u043c ip \u0430\u0434\u0440\u0435\u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c;<\/p>\n<\/li>\n<li>\n<p>\u0414\u0435\u043b\u0430\u0435\u043c \u043c\u0430\u043a \u0430\u0434\u0440\u0435\u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u0443\u043d\u043a\u0442\u044b 5 \u0438 6, \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435, \u044f \u0434\u0435\u043b\u0430\u044e \u0438\u0445 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430. \u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0443\u0434\u043e\u0431\u043d\u043e \u0432\u044b\u0434\u0451\u0440\u0433\u0438\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 API \u0438\u043c\u0435\u043d\u043d\u043e ip \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0430 \u043d\u0435 \u0432\u0441\u0435 \u043f\u043e\u0434\u0440\u044f\u0434. \u0412\u0435\u0434\u044c ip \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u043e\u0434\u0438\u043d \u0434\u0435\u0441\u044f\u0442\u043e\u043a.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">class NbPostDevice:     '''       \u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u043d\u0435\u0433\u043e \u0432\u0441\u0435     \u0434\u0430\u043d\u043d\u044b\u0435, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0443 \u043d\u0430\u0441 \u0432 \u0444\u0430\u0439\u043b\u0435     '''      def __init__(self, ipaddress, hostname, model, mac_address, interface, siteslug, swroleslug):         self.ipaddress = ipaddress         self.hostname = hostname         self.model = model         self.mac_address = mac_address         self.interface = interface         self.siteslug = siteslug         self.swroleslug = swroleslug       def postdevice(self):     '''     \u041c\u0435\u0442\u043e\u0434 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043d\u043e\u0432\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0432 Netbox     '''         POSTSW = f\"{URLNB}\/api\/dcim\/devices\/\"         '''          \u0421\u043b\u043e\u0432\u0430\u0440\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043c\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u043c\u043e\u0434\u0435\u043b\u044c, \u0441\u0430\u0439\u0442 \u0438 \u0440\u043e\u043b\u044c         \u0415\u0449\u0451 \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0431\u044b \u043f\u043e\u0442\u043e\u043c \u0431\u044b\u043b\u043e \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e          \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c. \u0415\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0431\u0440\u0430\u0442\u044c,          \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u043a\u0440\u0438\u043f\u0442\u0430         '''         sw_add = {             \"name\": self.hostname,             \"device_type\": {             \"model\": self.model             },             \"role\": {             \"slug\": self.swroleslug             },             \"site\": {             \"slug\": self.siteslug             },             \"description\": \"Added by script\"         }                 # \u0434\u0435\u043b\u0430\u0435\u043c POST \u0437\u0430\u043f\u0440\u043e\u0441, \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0432 Netbox \u043d\u0430\u0448 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 json         response = requests.post(POSTSW, headers=HEADERS, verify=False, json=sw_add)         # \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c id \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430         if response.status_code == 201:             out_dev = response.json()             dev_id = out_dev['id']              return response.status_code, dev_id          else:             return response.status_code, 0          def postint(self):     '''     \u041c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f     \u0417\u0434\u0435\u0441\u044c \u0432\u0441\u0451 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f,      \u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435     \u0412 \u0441\u043b\u043e\u0432\u0430\u0440\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0438\u043c\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438 \u0438\u043c\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430,     \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u044d\u0442\u043e vlan4090     '''         POSTINT = f\"{URLNB}\/api\/dcim\/interfaces\/\"          int_add = {             \"device\": {             \"name\": self.hostname             },             \"name\": self.interface,             \"type\": \"virtual\",             \"enabled\": True,         }          response = requests.post(POSTINT, headers=HEADERS, verify=False, json=int_add)         # \u0415\u0441\u043b\u0438 \u0432\u0441\u0451 \u0445\u043e\u0440\u043e\u0448\u043e, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c id \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430         if response.status_code == 201:             out_int = response.json()             int_id = out_int['id']              return response.status_code, int_id          else:             return response.status_code, 0       def postip(self, int_id):         '''         \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c ip \u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.         \u0412\u043e\u0442 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c id \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430,         \u043d\u0430 \u044d\u0442\u043e\u0442 id \u0438 \u0431\u0443\u0434\u0435\u043c \u0432\u0435\u0448\u0430\u0442\u044c ip \u0430\u0434\u0440\u0435\u0441         '''         POSTIP = f\"{URLNB}\/api\/ipam\/ip-addresses\/\"          ip_add = {             \"address\": self.ipaddress,             \"status\": \"active\",             \"assigned_object_type\": \"dcim.interface\",             \"assigned_object_id\": int(int_id)         }          response = requests.post(POSTIP, headers=HEADERS, verify=False, json=ip_add)          return response.status_code       def postmac(self, int_id):     '''     \u0412 \u044d\u0442\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043c\u0430\u043a \u0430\u0434\u0440\u0435\u0441 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435     '''         POSTMAC = f\"{URLNB}\/api\/dcim\/mac-addresses\/\"          mac_add = {             \"mac_address\": self.mac_address,             \"assigned_object_type\": \"dcim.interface\",             \"assigned_object_id\": int(int_id)         }          response = requests.post(POSTMAC, headers=HEADERS, verify=False, json=mac_add)          return response.status_code       def postmainip(self, dev_id):     '''     \u0417\u0434\u0435\u0441\u044c \u0434\u0435\u043b\u0430\u0435\u043c ip \u0430\u0434\u0440\u0435\u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u043d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0432\u0441\u0442\u0432\u0435.     \u041c\u0435\u0442\u043e\u0434 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439, \u043d\u043e ip \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u043d\u043e\u0433\u043e     \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435, \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 ip \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f     \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435, \u0447\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e, \u0430 \u0442\u0430\u043a \u0436\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u043b\u0435     \u0435\u0441\u043b\u0438 \u0432\u044b\u0434\u0451\u0440\u0433\u0438\u0432\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0447\u0435\u0440\u0435\u0437 API.      '''         POSTMAINIP = f\"{URLNB}\/api\/dcim\/devices\/{dev_id}\/\"          main_ip = {             \"primary_ip4\": {             \"address\": self.ipaddress             }         }          response = requests.patch(POSTMAINIP, headers=HEADERS, verify=False, json=main_ip)          return response.status_code      def postmainmac(self, int_id):     '''     \u0414\u0435\u043b\u0430\u0435\u043c \u043c\u0430\u043a \u0430\u0434\u0440\u0435\u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c, \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u0442\u0430 \u0436\u0435 \u0447\u0442\u043e \u0438 \u0441 ip.     \u041f\u0440\u043e\u0441\u0442\u043e \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u041d\u0435\u0442\u0431\u043e\u043a\u0441\u043e\u043c,      \u043f\u043e \u0441\u0443\u0442\u0438 \u043c\u0435\u0442\u043e\u0434 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439.     '''         POSTMAINMAC = f\"{URLNB}\/api\/dcim\/interfaces\/{int_id}\/\"          main_mac = {             \"primary_mac_address\": {             \"mac_address\": self.mac_address             }         }          response = requests.patch(POSTMAINMAC, headers=HEADERS, verify=False, json=main_mac)          return response.status_code<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043e\u0434.<\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043e\u0434 \u0441\u043a\u0440\u0438\u043f\u0442\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">''' \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u043c\u044b \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u043b\u0438 \u0432 .env ''' load_dotenv() TOKEN_API = os.getenv('API_KEY') HEADERS = {\"Authorization\": TOKEN_API} URLNB = os.getenv('URLNB') SITE_NAME = os.getenv('SITE_NAME') IPSCAN = os.getenv('IPSCAN') SWITCHES_FILE = os.getenv('SWITCHES_FILE') # \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 LOGDIR = \".\/\" LOGNAME = f\"log_switch_add_{IPSCAN}.log\"  logger = logging.getLogger('SWITCH_ADD') logger.setLevel(logging.DEBUG) logfile = logging.handlers.RotatingFileHandler(f'{LOGDIR}{LOGNAME}', mode='w')  logfile.setLevel(logging.DEBUG) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S') logfile.setFormatter(formatter) logger.addHandler(logfile)  ''' \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0444\u0430\u0439\u043b json \u0441 \u043d\u0430\u0448\u0438\u043c\u0438 \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u043e\u0440\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u043e\u0436\u0435 \u0431\u044b\u043b \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d \u0432 .\u0435nv ''' with open(SWITCHES_FILE, 'r') as f:     dt = f.read()     switches_from_file = json.loads(dt)      for sw in switches_from_file:         '''         \u041f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043e \u0441\u043b\u043e\u0432\u0430\u0440\u044f\u043c\u0438         \u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u043e \u0441\u0432\u0438\u0447\u0451\u043c          '''         swadd = NbPostDevice(**sw)          add_code, dev_id = swadd.postdevice()         ''' \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u0435\u0441\u043b\u0438 \u0432\u0441\u0451 \u041e\u043a, \u0442\u043e \u043f\u0438\u0448\u0435\u043c \u043b\u043e\u0433, \u0447\u0442\u043e \u0432\u0441\u0451 \u041e\u043a '''         if add_code == 201:             logger.info(f'\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e ({sw[\"hostname\"]} - {sw[\"ipaddress\"]}) - \u0431\u044b\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e')         else:             ''' \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430, \u0442\u043e \u043f\u0438\u0448\u0435\u043c \u043b\u043e\u0433 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442'''             logger.error(f'\u041e\u0448\u0438\u0431\u043a\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f ({sw[\"hostname\"]} - {sw[\"ipaddress\"]})')             break          add_int, int_id = swadd.postint()         ''' \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0435\u0441\u043b\u0438 \u0432\u0441\u0451 \u041e\u043a \u0442\u043e \u043f\u0438\u0448\u0435\u043c \u043b\u043e\u0433, \u0447\u0442\u043e \u0432\u0441\u0451 \u041e\u043a '''         if add_int == 201:             logger.info(f'\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f ({sw[\"hostname\"]} - {sw[\"ipaddress\"]}) - \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d')         else:             ''' \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430, \u0442\u043e \u043f\u0438\u0448\u0435\u043c \u043b\u043e\u0433 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 '''             logger.error(f'\u041e\u0448\u0438\u0431\u043a\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044f \u0434\u043b\u044f ({sw[\"hostname\"]} - {sw[\"ipaddress\"]})')             break          add_ip = swadd.postip(int_id)         ''' \u0421\u043e\u0437\u0434\u0430\u0451\u043c ip, \u0435\u0441\u043b\u0438 \u0432\u0441\u0451 \u041e\u043a \u0442\u043e \u043f\u0438\u0448\u0435\u043c \u043b\u043e\u0433, \u0447\u0442\u043e \u0432\u0441\u0451 \u041e\u043a '''         if add_ip == 201:             logger.info(f'IP \u0430\u0434\u0440\u0435\u0441\u0441 \u0434\u043b\u044f ({sw[\"hostname\"]} - {sw[\"ipaddress\"]}) - \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d')                  else:             ''' \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430, \u0442\u043e \u043f\u0438\u0448\u0435\u043c \u043b\u043e\u0433 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 '''             logger.error(f'\u041e\u0448\u0438\u0431\u043a\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f IP ({sw[\"hostname\"]} - {sw[\"ipaddress\"]})')             break          add_mac = swadd.postmac(int_id)         ''' \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043c\u0430\u043a, \u0435\u0441\u043b\u0438 \u0432\u0441\u0451 \u041e\u043a \u0442\u043e \u043f\u0438\u0448\u0435\u043c \u043b\u043e\u0433, \u0447\u0442\u043e \u0432\u0441\u0451 \u041e\u043a '''         if add_mac == 201:             logger.info(f'MAC \u0430\u0434\u0440\u0435\u0441\u0441 \u0434\u043b\u044f ({sw[\"hostname\"]} - {sw[\"mac_address\"]}) - \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d')         else:             ''' \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430, \u0442\u043e \u043f\u0438\u0448\u0435\u043c \u043b\u043e\u0433 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 '''             logger.error(f'\u041e\u0448\u0438\u0431\u043a\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f MAC ({sw[\"hostname\"]} - {sw[\"mac_address\"]})')             break          mainip = swadd.postmainip(dev_id)         ''' \u0414\u0435\u043b\u0430\u0435\u043c ip \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c, \u0435\u0441\u043b\u0438 \u0432\u0441\u0451 \u041e\u043a \u0442\u043e \u043f\u0438\u0448\u0435\u043c \u043b\u043e\u0433, \u0447\u0442\u043e \u0432\u0441\u0451 \u041e\u043a '''         if mainip == 200:             logger.info(f'\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 IP \u0430\u0434\u0440\u0435\u0441\u0441 \u0434\u043b\u044f ({sw[\"hostname\"]} - {sw[\"ipaddress\"]}) - \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d')         else:             ''' \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430, \u0442\u043e \u043f\u0438\u0448\u0435\u043c \u043b\u043e\u0433 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 '''             logger.error(f'\u041e\u0448\u0438\u0431\u043a\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e IP ({sw[\"hostname\"]} - {sw[\"ipaddress\"]})')             break          mainmac = swadd.postmainmac(int_id)         ''' \u0414\u0435\u043b\u0430\u0435\u043c \u043c\u0430\u043a \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c, \u0435\u0441\u043b\u0438 \u0432\u0441\u0451 \u041e\u043a \u0442\u043e \u043f\u0438\u0448\u0435\u043c \u043b\u043e\u0433, \u0447\u0442\u043e \u0432\u0441\u0451 \u041e\u043a '''         if mainmac == 200:             logger.info(f'\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 MAC \u0430\u0434\u0440\u0435\u0441\u0441 \u0434\u043b\u044f ({sw[\"hostname\"]} - {sw[\"mac_address\"]}) - \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d')         else:             ''' \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430, \u0442\u043e \u043f\u0438\u0448\u0435\u043c \u043b\u043e\u0433 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 '''             logger.error(f'\u041e\u0448\u0438\u0431\u043a\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e MAC ({sw[\"hostname\"]} - {sw[\"mac_address\"]})')             break <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0417\u0434\u0435\u0441\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435 \u043a\u0430\u0441\u0430\u0435\u043c\u043e \u0432\u0435\u0440\u0441\u0438\u0438 \u041d\u0435\u0442\u0431\u043e\u043a\u0441\u0430, \u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u0438 4.3.3, \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b\u043b\u0430 \u0443 \u043d\u0430\u0441 4.1.5, \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u0441 \u043c\u0430\u043a \u0430\u0434\u0440\u0435\u0441\u0430\u043c\u0438 \u043f\u043e \u0434\u0440\u0443\u0433\u043e\u043c\u0443, \u0432 \u0441\u0442\u0430\u0440\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043c\u0430\u043a \u0430\u0434\u0440\u0435\u0441 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c. \u0418 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u0430\u043a\u0438\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c:<\/p>\n<pre><code class=\"python\">def postint(self):         POSTINT = f\"{URLNB}\/api\/dcim\/interfaces\/\"          int_add = {             \"device\": {             \"name\": self.hostname             },             \"name\": self.interface,             \"type\": \"virtual\",             \"enabled\": True,             \"mac_address\": self.mac_address         }          response = requests.post(POSTINT, headers=HEADERS, verify=False, json=int_add) <\/code><\/pre>\n<p>\u0412 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0442\u0430\u043a\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a, \u043d\u043e \u043c\u0430\u043a \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043c\u0430\u043a \u0438 \u0431\u0438\u043d\u0434\u0438\u0442\u044c \u0435\u0433\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e. \u041d\u0435 \u0437\u043d\u0430\u044e \u0432 \u043a\u0430\u043a\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043d\u0443\u0436\u043d\u043e \u0442\u0435\u0441\u0442\u0438\u0442\u044c. \u0412 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044e \u043e\u0431\u0430 \u0441\u043a\u0440\u0438\u043f\u0442\u0430.<\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u0438 \u0438\u0434\u0451\u043c \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043b\u043e\u0433\u0438, \u043d\u0435 \u0437\u0440\u044f \u0436\u0435 \u043f\u043e\u043b \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u0438 \ud83d\ude42<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d99\/73a\/b0e\/d9973ab0e5ae7e83b31961d7085dcdf2.png\" width=\"899\" height=\"216\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/d99\/73a\/b0e\/d9973ab0e5ae7e83b31961d7085dcdf2.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d99\/73a\/b0e\/d9973ab0e5ae7e83b31961d7085dcdf2.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0412\u0441\u0451 \u0443\u0441\u043f\u0435\u0448\u043d\u043e, \u043e\u0448\u0438\u0431\u043e\u043a \u043d\u0435\u0442. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 &#8212; \u0440\u0430\u0431\u043e\u0442\u0430 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f. \u0421\u0434\u0435\u043b\u0430\u043b \u0442\u0430\u043a \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e, \u0447\u0442\u043e \u0431\u044b \u043d\u0435 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u043f\u043e\u0442\u043e\u043c \u0441\u043e\u0442\u043d\u044e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u043a\u0440\u0438\u0432\u043e \u0438\u043b\u0438 \u043d\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0438\u0434\u0451\u043c \u0432 \u041d\u0435\u0442\u0431\u043e\u043a\u0441.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bce\/256\/b23\/bce256b237f9ccc4547b4f436e53f293.png\" width=\"1185\" height=\"79\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/bce\/256\/b23\/bce256b237f9ccc4547b4f436e53f293.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bce\/256\/b23\/bce256b237f9ccc4547b4f436e53f293.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0412\u043e\u0442 \u043e\u043d\u0438, \u043d\u0430\u0448\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u043e\u0440\u044b.<\/p>\n<p>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043b\u044e\u0431\u043e\u0439 \u0438\u0437 \u043d\u0438\u0445.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cca\/cac\/fe0\/ccacacfe030e75023967f6193854e5f6.png\" width=\"1293\" height=\"382\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/cca\/cac\/fe0\/ccacacfe030e75023967f6193854e5f6.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cca\/cac\/fe0\/ccacacfe030e75023967f6193854e5f6.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/509\/8c6\/c61\/5098c6c61ff2e8431e0a634e9164dbed.png\" width=\"1142\" height=\"59\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/509\/8c6\/c61\/5098c6c61ff2e8431e0a634e9164dbed.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/509\/8c6\/c61\/5098c6c61ff2e8431e0a634e9164dbed.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0412\u0441\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438\u0441\u044c.<\/p>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0441\u044f \u043b\u0438 \u043c\u0430\u043a.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b0e\/3e0\/019\/b0e3e0019c261d42e202b172f55456aa.png\" width=\"484\" height=\"147\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/b0e\/3e0\/019\/b0e3e0019c261d42e202b172f55456aa.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b0e\/3e0\/019\/b0e3e0019c261d42e202b172f55456aa.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041c\u0430\u043a \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c.<\/p>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0447\u043a\u0443 \u0441\u0432\u0438\u0447\u0435\u0439.<\/p>\n<h2>\u0421\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441. \u0410 \u0433\u0434\u0435 \u0438\u0445 \u0432\u0437\u044f\u0442\u044c? \u041a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u043e\u0440\u044b. <\/p>\n<p>\u041a\u0430\u043a\u0438\u0435 \u0442\u043e \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u043e\u0440\u044b \u0435\u0441\u0442\u044c \u0432 \u0437\u0430\u0431\u0431\u0438\u043a\u0441\u0435, \u043a\u0430\u043a\u0438\u0435 \u0442\u043e \u0432 \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0435 excel, \u043a\u0430\u043a\u0438\u0435 \u0442\u043e \u0432 \u0433\u043e\u043b\u043e\u0432\u0435 \u0443 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432. \u041d\u043e \u043f\u043e\u043b\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u044b \u043d\u0435\u0442 \u043d\u0438\u0433\u0434\u0435. <\/p>\n<p>\u0422\u0443\u0442 \u0443\u0436\u0435 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u043d\u0435\u0442\u0443, \u0432\u0441\u0451 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0442\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u0438 \u0441\u0435\u0442\u0438, \u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u043e\u0434\u0438\u043d \u0434\u0435\u0441\u044f\u0442\u043e\u043a.<\/p>\n<p>\u042f \u043e\u043f\u0438\u0448\u0443 \u0441\u043f\u043e\u0441\u043e\u0431, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b \u043b\u0438\u0447\u043d\u043e \u044f. \u0414\u043b\u044f \u0441\u0432\u043e\u0435\u0439 \u0442\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u0438 \u043e\u043d \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043c\u043d\u0435 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u044b\u043c \u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0432\u043d\u044b\u043c.<\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0448\u043b\u044e\u0437 \u0443 \u043c\u0435\u043d\u044f \u044d\u0442\u043e \u0441\u0435\u0440\u0432\u0430\u043a \u0441 \u043b\u0438\u043d\u0443\u043a\u0441\u043e\u043c, \u0442\u043e \u044f \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0441\u044c \u0443\u0442\u0438\u043b\u0438\u0442\u043e\u0439 nmap. \u0412 \u0441\u0432\u044f\u0437\u043a\u0435 \u0441 \u043f\u0438\u0442\u043e\u043d\u043e\u043c \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435.<\/p>\n<p>Python \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0443\u0434\u0435\u0442 \u043a\u0440\u0430\u0441\u0438\u0432\u043e \u043e\u0444\u043e\u0440\u043c\u043b\u044f\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0432 \u0444\u0430\u0439\u043b\u0438\u043a json. \u041d\u043e \u0447\u0442\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0438\u0437 \u043d\u0435\u0433\u043e? \u042d\u0442\u043e \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0439 ip, \u0438 \u043c\u0430\u043a \u0430\u0434\u0440\u0435\u0441. \u0425\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u043e\u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0444\u044b. \u041c\u043d\u0435 \u043f\u043e\u0432\u0435\u0437\u043b\u043e, \u0443 \u043c\u0435\u043d\u044f \u043d\u0430 \u0441\u0432\u0438\u0447\u0430\u0445 \u0432\u0435\u0437\u0434\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d SNMP, \u0438 \u043f\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c OID\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u0441\u0432\u0438\u0447\u0430 \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e SNMP.<\/p>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u0432 \u043d\u0430\u0448 \u0444\u0430\u0439\u043b \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a .env \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438<\/p>\n<pre><code class=\"python\">SNMP_COM = 'test_community' INTERFACE = 'vlan4090' SITE_SLUG = 'test_site' CHECK_FILE = 'nmap_192.168.0.0.json' SWROLESLUG = 'access-switch'<\/code><\/pre>\n<p>\u0422\u0443\u0442 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f SNMP, \u043f\u0438\u0448\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0441\u0430\u0439\u0442, \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u0438 \u0440\u043e\u043b\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0447\u0442\u043e \u0431\u044b \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0449\u0435 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b.<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u0438\u043f\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0449\u0438\u0439 nmap \u0438 snmpwalk<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">import subprocess import re import json import os from dotenv import load_dotenv   class SwitchSnmpGet:     '''     \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e SNMP     \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c ip \u0438 snmp community      '''     def __init__(self, ipaddress, snmp_com):         self.ipaddress = ipaddress         self.snmp_com = snmp_com       def getsysdescr(self):         '''          \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438 \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u043e\u0440\u0430 \u043f\u043e SNMP         '''         sysdescroid = '1.3.6.1.2.1.1.1'         parse_snmp = 'STRING: (?P&lt;snmpout&gt;.+)'         sysdescr = 'unknown'          process = subprocess.Popen(['snmpwalk', '-c', self.snmp_com, '-v2c', self.ipaddress, sysdescroid], stdout=subprocess.PIPE)          while True:             output = process.stdout.readline()              if output == b'' and process.poll() is not None:                 break             if output:                 outsnmp = output.decode('utf-8')                 match = re.search(parse_snmp, outsnmp)                  if match:                     sysdescr = match.group('snmpout')          return sysdescr       def getsysname(self):         '''          \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 hostname \u0447\u0435\u0440\u0435\u0437 snmp          '''         sysnameoid = '1.3.6.1.2.1.1.5'         parse_snmp = 'STRING: (?P&lt;snmpout&gt;.+)'         sysname = 'unknown'          process = subprocess.Popen(['snmpwalk', '-c', self.snmp_com, '-v2c', self.ipaddress, sysnameoid], stdout=subprocess.PIPE)          while True:             output = process.stdout.readline()              if output == b'' and process.poll() is not None:                 break             if output:                 outsnmp = output.decode('utf-8')                 match = re.search(parse_snmp, outsnmp)                  if match:                     sysname = match.group('snmpout')          return sysname  '''  \u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0430 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f ip, \u043c\u0430\u043a\u0430 \u0438 \u0432\u0435\u043d\u0434\u043e\u0440\u0430 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0430 linux, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443 \u043c\u0435\u043d\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u043d\u0430 Debian ''' parseout = (r'for (?P&lt;ipaddress&gt;\\d+.\\d+.\\d+.\\d+)'             r'|MAC Address: (?P&lt;mac&gt;\\S+) \\((?P&lt;vendor&gt;.+)\\)')  # \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 load_dotenv() IPSCAN = os.getenv('IPSCAN') NETMASK = os.getenv('NETMASK') SNMP_COM = os.getenv('SNMP_COM') INTERFACE = os.getenv('INTERFACE') SITE_SLUG = os.getenv('SITE_SLUG') SWROLESLUG = os.getenv('SWROLESLUG')  NETWORK = IPSCAN + NETMASK ipaddress = ''  # \u041a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 'nmap -sP -n' \u0437\u0430\u043f\u0440\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0435\u0442\u0438, \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0438\u043d\u0433\u0438, \u0431\u0435\u0437 \u043f\u043e\u0440\u0442\u043e\u0432 cmd_for_scan = f'nmap -sP -n {NETWORK}' cmd = cmd_for_scan.split()  process = subprocess.Popen(cmd, stdout=subprocess.PIPE)  result_list = []  while True:     '''     \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043f\u0440\u0438 \u0443\u0434\u0430\u0447\u043d\u043e\u043c \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430     \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u043f\u043e SNMP \u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0441\u043b\u043e\u0432\u0430\u0440\u044c     \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u0441\u043f\u0438\u0441\u043e\u043a     '''     output = process.stdout.readline()     if output == b'' and process.poll() is not None:         break     if output:         outlist = output.strip().decode('utf-8')         match = re.search(parseout, outlist)         '''         \u0417\u0434\u0435\u0441\u044c \u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u043b \u043f\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u0435 \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432         \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 nmap \u043d\u0435 \u0441\u043c\u043e\u0433 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u0435\u043d\u0434\u043e\u0440\u0430 \u0438 \u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u043c\u0430\u043a         \u0443 \u043c\u0435\u043d\u044f \u044d\u0442\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0438\u0445 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0431\u0443\u0434\u0443 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e         '''         if match:             if match.lastgroup == 'ipaddress':                 ipaddress = match.group(match.lastgroup)             else:                 mac_address = match.group('mac').lower()                 vendor = match.group('vendor')                 get_model = SwitchSnmpGet(ipaddress, SNMP_COM)                  result_dict = {                     'ipaddress': ipaddress+NETMASK,                     'interface': INTERFACE,                     'mac_address': mac_address,                     'vendor': vendor,                     'model': get_model.getsysdescr(),                     'hostname': get_model.getsysname(),                     'siteslug': SITE_SLUG,                     'swroleslug': SWROLESLUG,                     }                 result_list.append(result_dict)  # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0432 \u0444\u0430\u0439\u043b json with open(f'nmap_{IPSCAN}.json', 'w') as f:     json.dump(result_list, f, sort_keys=True, indent=2)<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u043e\u0442 \u0440\u0443\u0442\u0430. <\/p>\n<p>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u0448 \u0444\u0430\u0439\u043b nmap_192.168.0.0.json. \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u0438\u043c\u044f \u043c\u044b \u043f\u0438\u0441\u0430\u043b\u0438 \u0432 .env.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/658\/0bc\/4a9\/6580bc4a9430ed246bbe2146832073fe.png\" width=\"431\" height=\"555\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/658\/0bc\/4a9\/6580bc4a9430ed246bbe2146832073fe.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/658\/0bc\/4a9\/6580bc4a9430ed246bbe2146832073fe.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041d\u0435 \u0432\u0441\u0451 \u043f\u0440\u043e\u0448\u043b\u043e \u0433\u043b\u0430\u0434\u043a\u043e. \u041d\u043e \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432\u0441\u0451 \u0436\u0435 \u0435\u0441\u0442\u044c. \u0421 \u044d\u0442\u0438\u043c \u0444\u0430\u0439\u043b\u043e\u043c \u0443\u0436\u0435 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0440\u0443\u043a\u0430\u043c\u0438. \u041d\u0435 \u0432\u0441\u0435 \u0441\u0432\u0438\u0447\u0438 \u0438\u043c\u0435\u044e\u0442 \u0445\u043e\u0441\u0442\u043d\u044d\u0439\u043c, \u0438\u043b\u0438 \u0438\u043c\u0435\u044e\u0442, \u043d\u043e \u043d\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439, \u0435\u0433\u043e \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u043c\u0443. \u041d\u0435 \u0432\u0441\u0435 \u0441\u0432\u0438\u0447\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u044c, \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0437\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0430\u043c\u043e\u043c\u0443, \u0437\u0434\u0435\u0441\u044c \u0438 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u043b\u0441\u044f \u043a\u043b\u044e\u0447 vendor, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435\u0442\u0443 \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435. \u041f\u043e \u043d\u0435\u043c\u0443 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0432\u0438\u0434\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044f \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u043a\u0430\u043a \u043d\u0430 \u043d\u0435\u0433\u043e \u0437\u0430\u0445\u043e\u0434\u0438\u0442\u044c (\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u044d\u0442\u043e UPS \u0430 \u043d\u0435 \u0441\u0432\u0438\u0447). \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 &#171;DGS-3120-24SC Gigabit Ethernet Switch&#187;, \u0435\u0433\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043c \u043a \u0432\u0438\u0434\u0443 \u043a\u0430\u043a \u0432 \u041d\u0435\u0442\u0431\u043e\u043a\u0441\u0435 &#171;DGS-3120-24SC&#187;. <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u0430\u0432\u043a\u0438 \u0444\u0430\u0439\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u043a\u0430\u043a \u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u043e\u0440\u044b \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0432 \u041d\u0435\u0442\u0431\u043e\u043a\u0441\u0435, \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0442\u0430\u043a\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438.<\/p>\n<p>\u041f\u0438\u0448\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u0432\u0438\u0447\u0438 \u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432 \u041d\u0435\u0442\u0431\u043e\u043a\u0441\u0435<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">import os import json import requests import logging import logging.handlers from dotenv import load_dotenv   class NbCheckDevice:     '''      \u041f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0432\u0441\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u0435\u0441\u044f \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u0435 \u043a\u043b\u044e\u0447\u0438     '''      def __init__(self, ipaddress, hostname, model, mac_address, interface, siteslug, swroleslug):         self.ipaddress = ipaddress         self.hostname = hostname         self.model = model         self.mac_address = mac_address         self.interface = interface         self.swroleslug = swroleslug         self.siteslug = siteslug       def getdevice(self):         '''         \u0414\u0435\u043b\u0430\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 \u041d\u0435\u0442\u0431\u043e\u043a \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0445\u043e\u0441\u0442\u0430         \u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0433\u043e \u0445\u043e\u0441\u0442\u0430 \u043d\u0435\u0442, \u0442\u043e \u0434\u0435\u043b\u0430\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u043e \u043c\u043e\u0434\u0435\u043b\u0438         '''         URLSW = f\"{URLNB}\/api\/dcim\/devices\/?name=\"                  response = requests.get(URLSW+self.hostname, headers=HEADERS, verify=False)         device_list = json.loads(json.dumps(response.json()))          if device_list['count'] &gt; 0:             swmodel = False              return device_list['count'], swmodel          else:             URLMODEL = f'{URLNB}\/api\/dcim\/device-types\/?model='             swmodel = False              response = requests.get(URLMODEL+self.model, headers=HEADERS, verify=False)             model_list = json.loads(json.dumps(response.json()))              if model_list['count'] &gt; 0:                 for ml in model_list['results']:                     swmodel = ml['model']                  return 0, swmodel              else:                 return 0, swmodel  # \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 load_dotenv()  TOKEN_API = os.getenv('API_KEY') HEADERS = {\"Authorization\": TOKEN_API} URLNB = os.getenv('URLNB') SWPOST = f'{URLNB}\/api\/dcim\/devices\/' CHECK_FILE = os.getenv('CHECK_FILE') IPSCAN = os.getenv('IPSCAN') # \u0417\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u0441 \u043b\u043e\u0433\u0430\u043c\u0438 LOGDIR = \".\/\" LOGNAME = f\"log_switch_check_{IPSCAN}.log\"  logger = logging.getLogger('SWITCH_CHECK') logger.setLevel(logging.DEBUG) logfile = logging.handlers.RotatingFileHandler(f'{LOGDIR}{LOGNAME}', mode='w')  logfile.setLevel(logging.DEBUG) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S') logfile.setFormatter(formatter) logger.addHandler(logfile)   with open(CHECK_FILE, 'r') as f:     '''     \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u043b \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0441\u043a\u0440\u0438\u043f\u0442     '''     dt = f.read()     switches_from_file = json.loads(dt)      # \u0414\u0430\u043d\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 \u0431\u0443\u0434\u0435\u043c \u043d\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u043b\u043e\u0432\u0430\u0440\u044f\u043c\u0438     unknown_devices = [] # \u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0435\u0441\u0442\u044c \u043a\u043b\u044e\u0447\u0438 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 unknown     exist_devices = [] # \u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0432 \u041d\u0435\u0442\u0431\u043e\u043a\u0441     none_model = [] # \u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u043c\u043e\u0434\u0435\u043b\u044c     add_devices = [] # \u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u041d\u0435\u0442\u0431\u043e\u043a\u0441      for l in switches_from_file:         ''' \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u043e\u0440 \u0432 \u041d\u0435\u0442\u0431\u043e\u043a\u0441\u0435 \u0438 \u043f\u0438\u0448\u0435\u043c \u043b\u043e\u0433\u0438 '''         _ = l.pop('vendor') # \u0423\u0431\u0438\u0440\u0430\u0435\u043c \u043a\u043b\u044e\u0447 vendor, \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043d \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u0435\u043d         if l['hostname'] == 'unknown' or l['model'] == 'unknown' == 'unknown':             logger.info(f'\u041a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u043e\u0440 ({l[\"ipaddress\"]}) \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0443\u043a\u0430\u043c\u0438')             unknown_devices.append(l)         else:             device = NbCheckDevice(**l)             device_count, swmodel = device.getdevice()             if device_count &gt; 0:                 logger.info(f'\u041a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u043e\u0440 ({l[\"ipaddress\"]}) \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0432 \u041d\u0435\u0442\u0411\u043e\u043a\u0441\u0435')                 exist_devices.append(l)             elif swmodel == False:                 logger.info(f'\u0414\u043b\u044f \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u043e\u0440\u0430 ({l[\"ipaddress\"]}) \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c')                 none_model.append(l)             else:                 logger.info(f'\u041a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u043e\u0440 ({l[\"ipaddress\"]}, {swmodel}) \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c')                 switch_model = {'model': swmodel}                 add_devices.append({**l, **switch_model})  # \u041f\u0438\u0448\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 \u0432 \u0444\u0430\u0439\u043b\u044b with open(f'unknown_{CHECK_FILE}', 'w') as f:     json.dump(unknown_devices, f, sort_keys=True, indent=2)  with open(f'exist_{CHECK_FILE}', 'w') as f:     json.dump(exist_devices, f, sort_keys=True, indent=2)  with open(f'none_model_{CHECK_FILE}', 'w') as f:     json.dump(none_model, f, sort_keys=True, indent=2)  with open(f'add_{CHECK_FILE}', 'w') as f:     json.dump(add_devices, f, sort_keys=True, indent=2)<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u043c \u043b\u043e\u0433\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u0430<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5be\/247\/ee4\/5be247ee43b1ef80d6915a97cdbaf7ae.png\" width=\"801\" height=\"144\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/5be\/247\/ee4\/5be247ee43b1ef80d6915a97cdbaf7ae.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5be\/247\/ee4\/5be247ee43b1ef80d6915a97cdbaf7ae.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0412\u0441\u0435 4 \u0444\u0430\u0439\u043b\u0438\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043b\u0438\u0441\u044c. <\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0444\u0430\u0439\u043b &#171;none_model_nmap_192.168.0.0.json&#187;.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7b3\/c5d\/aa4\/7b3c5daa4384a19486bbc7cc2507b010.png\" width=\"331\" height=\"196\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/7b3\/c5d\/aa4\/7b3c5daa4384a19486bbc7cc2507b010.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7b3\/c5d\/aa4\/7b3c5daa4384a19486bbc7cc2507b010.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041c\u043e\u0434\u0435\u043b\u0438 &#171;Layer 2 Management Switch&#187; \u043d\u0435\u0442 \u0432 \u041d\u0435\u0442\u0431\u043e\u043a\u0441\u0435, \u0447\u0442\u043e \u0438 \u043d\u0435 \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e. \u041d\u0430 \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u043e\u0440 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0439\u0442\u0438 \u0438 \u0441\u0430\u043c\u043e\u043c\u0443 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0447\u0442\u043e \u044d\u0442\u043e. \u041f\u043e\u0442\u043e\u043c \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0444\u0430\u0439\u043b \u0441 \u043a\u0440\u0438\u0432\u044b\u043c\u0438 \u0445\u043e\u0441\u0442\u043d\u044d\u0439\u043c\u0430\u043c\u0438. \u0412 \u0438\u0434\u0435\u0430\u043b\u0435 \u0444\u0430\u0439\u043b\u0430 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c 2 \u0438\u043b\u0438 1, \u044d\u0442\u043e \u0442\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0432 \u041d\u0435\u0442\u0431\u043e\u043a\u0441, \u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c. \u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043d\u0435\u0434\u043e\u0447\u0451\u0442\u043e\u0432 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 (nmap_192.168.0.0.json), \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0435\u0449\u0451 \u0440\u0430\u0437. <\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u043d\u0435\u0434\u043e\u0447\u0451\u0442\u044b \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u044b &#8212; \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0432 \u041d\u0435\u0442\u0431\u043e\u043a\u0441.<\/p>\n<p>\u041c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0432\u0441\u0451 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0437\u0430\u043c\u043e\u0440\u043e\u0447\u0435\u043d\u043e \u0438 \u0434\u043e\u043b\u0433\u043e, \u0438 \u043c\u043d\u043e\u0433\u043e \u0440\u0443\u0447\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b. \u041d\u043e \u043d\u0430 \u0432\u0441\u0451 \u0443 \u043c\u0435\u043d\u044f \u0443\u0448\u043b\u0430 \u043d\u0435\u0434\u0435\u043b\u044f. \u042d\u0442\u043e \u043f\u0440\u0438 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0441\u044f \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438. \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u201cAdded by script\u201d \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e \u043d\u0435\u043c\u0443 \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0431\u044b\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c. \u0423 \u043c\u0435\u043d\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c 464 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.\u00a0<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7f0\/5aa\/acb\/7f05aaacbab3bde23a2865ca6b857118.png\" width=\"273\" height=\"152\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/7f0\/5aa\/acb\/7f05aaacbab3bde23a2865ca6b857118.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7f0\/5aa\/acb\/7f05aaacbab3bde23a2865ca6b857118.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0414\u0443\u043c\u0430\u044e, 464 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u0442\u043e\u0438\u043b\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0434\u0435\u043d\u0451\u043a \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u043a\u043e\u0432\u044b\u0440\u044f\u0442\u044c json \u0444\u0430\u0439\u043b\u044b \u0438 \u043f\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u0438 \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u043e\u0440\u043e\u0432 \u0432 \u041d\u0435\u0442\u0431\u043e\u043a\u0441. \u0421\u0442\u0440\u0430\u0448\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0443\u0448\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u0445 \u0432\u0440\u0443\u0447\u043d\u0443\u044e.<\/p>\n<p>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0432 <a href=\"https:\/\/github.com\/drag0y\/Scripts_for_Netbox\" rel=\"noopener noreferrer nofollow\">github<\/a>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/926908\/\"> https:\/\/habr.com\/ru\/articles\/926908\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442. \u042f \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0435. \u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0433\u043e\u0434 \u043d\u0430\u0437\u0430\u0434 \u043d\u0430\u0447\u0430\u043b \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 Netbox, \u0434\u043b\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0441\u0435\u0442\u0438. \u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u0441\u0442\u0430\u043b \u0432\u043e\u043f\u0440\u043e\u0441 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u044b \u0438 \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u043e\u0440\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0440\u0443\u043a\u0430\u043c\u0438, \u0438\u0445 \u043d\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e, \u044d\u0442\u043e \u044f\u0434\u0440\u043e \u0438 \u043e\u043f\u043e\u0440\u043d\u0430\u044f \u0441\u0435\u0442\u044c. \u0418 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0441\u0430\u0431 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432. \u0414\u0430\u043b\u0435\u0435 \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u043e\u0440\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u0430, \u0430 \u0438\u0445 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0442\u0435\u043d, \u0438 \u043f\u0430\u0440\u0430 \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u043c\u043e\u0434\u0435\u043b\u0435\u0439. \u0418 \u0432\u043e\u0442 \u0442\u0443\u0442 \u0443\u0436\u0435 \u0441\u0442\u0430\u043b\u043e \u0431\u043e\u043b\u044c\u043d\u043e \u043e\u0442 \u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u044b\u0441\u043b\u0438, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u0445 \u0440\u0443\u043a\u0430\u043c\u0438. <\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0431\u0443\u0434\u0435\u043c \u0447\u0435\u0440\u0435\u0437 API \u041d\u0435\u0442\u0431\u043e\u043a\u0441\u0430. \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u043c \u0437\u0430\u043c\u0443\u0434\u0440\u0451\u043d\u0430\u044f, \u043d\u043e \u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u0430\u044f. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u0430\u043a \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043f\u0430\u0447\u043a\u0443 \u0441\u0432\u0438\u0447\u0435\u0439, \u0430 \u043f\u043e\u0442\u043e\u043c \u0443\u0436\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0441\u043e\u0431\u0440\u0430\u043b \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e. \u0421\u043a\u0440\u0438\u043f\u0442\u043e\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0439 \u043e\u0441\u043d\u043e\u0432\u0435, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0447\u0435\u043c \u0447\u0435\u0440\u0435\u0437 web \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043e\u0434\u043d\u043e. <\/p>\n<p>\u0411\u0435\u0440\u0451\u043c json \u0444\u0430\u0439\u043b\u0438\u043a \u0441 \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u043e\u0440\u0430\u043c\u0438.<\/p>\n<pre><code class=\"json\">[  {  \"hostname\": \"TEST_SCRIPT1\",  \"interface\": \"vlan4090\",  \"ipaddress\": \"192.168.0.6\/24\",  \"mac_address\": \"33:10:FF:EE:11:22\",  \"model\": \"DGS-3120-24SC\",  \"siteslug\": \"site_test\",   \"swroleslug\": \"access-switch\"  },  {  \"hostname\": \"TEST_SCRIPT2\",  \"interface\": \"vlan4090\",  \"ipaddress\": \"192.168.0.66\/24\",  \"mac_address\": \"33:10:AA:BB:CC:DD\",  \"model\": \"MES2348B\",  \"siteslug\": \"site_test\",  \"swroleslug\": \"access-switch\"  }  ]<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0443 \u043d\u0430\u0441 \u0438\u043c\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, ip \u0430\u0434\u0440\u0435\u0441, \u043c\u0430\u043a \u0430\u0434\u0440\u0435\u0441, \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 \u043c\u0430\u043a\u0430 \u0438 ip. \u041c\u043e\u0434\u0435\u043b\u044c \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u043e\u0440\u0430, \u0441\u0430\u0439\u0442, \u0438 \u0440\u043e\u043b\u044c. \u041c\u043d\u0435 \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u0415\u0441\u043b\u0438 \u043a\u043e\u043c\u0443 \u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043c\u0430\u043b\u043e, \u0442\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430.<\/p>\n<p>\u041c\u043e\u0434\u0435\u043b\u044c \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u043e\u0440\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0443\u0436\u0435 \u0431\u044b\u0442\u044c \u0432 \u041d\u0435\u0442\u0431\u043e\u043a\u0441\u0435. \u0418 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0442\u0430\u043a \u0436\u0435 \u043a\u0430\u043a \u0438 \u0432 \u0441\u0430\u043c\u043e\u043c \u041d\u0435\u0442\u0431\u043e\u043a\u0441\u0435. <\/p>\n<p>\u0421\u0430\u0439\u0442 \u0438 \u0440\u043e\u043b\u044c \u0443\u043a\u0430\u0437\u0430\u043d\u044b slug. \u042d\u0442\u043e &#171;\u041f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0430&#187; \u0432 \u041d\u0435\u0442\u0431\u043e\u043a\u0441\u0435.<\/p>\n<figure class=\"\"><\/figure>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430 .env, \u0432 \u043d\u0451\u043c \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043b\u0443\u0447\u0448\u0435 \u043d\u0435 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432 \u0441\u0430\u043c\u043e\u043c \u043a\u043e\u0434\u0435. \u0418 \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0435\u0442\u0435\u0439, \u0443\u0434\u043e\u0431\u043d\u0435\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0444\u0430\u0439\u043b, \u0430 \u043d\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442.<\/p>\n<pre><code class=\"python\">API_KEY = \"Token\" URLNB = \"https:\/\/nb.youdomain.ru\" SWITCHES_FILE = 'add_nmap_192.168.0.0.json' IPSCAN = '192.168.0.0'<\/code><\/pre>\n<p>\u0422\u0443\u0442 \u043c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c API \u0442\u043e\u043a\u0435\u043d \u0434\u043b\u044f \u041d\u0435\u0442\u0431\u043e\u043a\u0441\u0430. URL \u041d\u0435\u0442\u0431\u043e\u043a\u0441\u0430, \u0438 json \u0444\u0430\u0439\u043b, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0443 \u043d\u0430\u0441 \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u043e\u0440\u044b. \u0418 IPSCAN, \u043e\u043d \u043d\u0443\u0436\u0435\u043d \u0431\u0443\u0434\u0435\u0442 \u0434\u0430\u043b\u044c\u0448\u0435, \u0430 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0438\u043c\u044f \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u0430 \u043b\u043e\u0433\u043e\u0432. <\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0441\u0430\u043c \u0441\u043a\u0440\u0438\u043f\u0442. <\/p>\n<p>\u041f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0438\u043c\u043f\u043e\u0440\u0442\u044b.<\/p>\n<pre><code class=\"python\">import os import json import requests import logging import logging.handlers  from dotenv import load_dotenv<\/code><\/pre>\n<p>\u0412\u0441\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u044f \u0431\u0443\u0434\u0443 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0431\u044b \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0431\u044b\u043b\u043e \u0432\u0438\u0434\u043d\u043e \u043d\u0430 \u043a\u0430\u043a\u043e\u043c \u0448\u0430\u0433\u0435 \u043e\u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430, \u0438\u043b\u0438 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0432\u0441\u0451 \u043f\u0440\u043e\u0448\u043b\u043e \u0445\u043e\u0440\u043e\u0448\u043e.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u044f \u043d\u0430\u043f\u0438\u0448\u0443 \u043a\u043b\u0430\u0441\u0441 \u0441 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438. \u041c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0438 \u0431\u0435\u0437 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043d\u043e \u0442\u0430\u043a \u043a\u043e\u0434 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439.<\/p>\n<p>\u041a\u0440\u0430\u0442\u043a\u043e \u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0447\u0435\u0440\u0435\u0437 API:<\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e (\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f: \u0438\u043c\u044f, \u043c\u043e\u0434\u0435\u043b\u044c, \u0441\u0430\u0439\u0442, \u0440\u043e\u043b\u044c);<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f (\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 vlan4090 \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435);<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c ip \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435;<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043c\u0430\u043a \u0430\u0434\u0440\u0435\u0441 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435;<\/p>\n<\/li>\n<li>\n<p>\u0414\u0435\u043b\u0430\u0435\u043c ip \u0430\u0434\u0440\u0435\u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c;<\/p>\n<\/li>\n<li>\n<p>\u0414\u0435\u043b\u0430\u0435\u043c \u043c\u0430\u043a \u0430\u0434\u0440\u0435\u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u0443\u043d\u043a\u0442\u044b 5 \u0438 6, \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435, \u044f \u0434\u0435\u043b\u0430\u044e \u0438\u0445 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430. \u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0443\u0434\u043e\u0431\u043d\u043e \u0432\u044b\u0434\u0451\u0440\u0433\u0438\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 API \u0438\u043c\u0435\u043d\u043d\u043e ip \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0430 \u043d\u0435 \u0432\u0441\u0435 \u043f\u043e\u0434\u0440\u044f\u0434. \u0412\u0435\u0434\u044c ip \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u043e\u0434\u0438\u043d \u0434\u0435\u0441\u044f\u0442\u043e\u043a.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">class NbPostDevice:     '''       \u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u043d\u0435\u0433\u043e \u0432\u0441\u0435     \u0434\u0430\u043d\u043d\u044b\u0435, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0443 \u043d\u0430\u0441 \u0432 \u0444\u0430\u0439\u043b\u0435     '''      def __init__(self, ipaddress, hostname, model, mac_address, interface, siteslug, swroleslug):         self.ipaddress = ipaddress         self.hostname = hostname         self.model = model         self.mac_address = mac_address         self.interface = interface         self.siteslug = siteslug         self.swroleslug = swroleslug       def postdevice(self):     '''     \u041c\u0435\u0442\u043e\u0434 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043d\u043e\u0432\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0432 Netbox     '''         POSTSW = f\"{URLNB}\/api\/dcim\/devices\/\"         '''          \u0421\u043b\u043e\u0432\u0430\u0440\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043c\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u043c\u043e\u0434\u0435\u043b\u044c, \u0441\u0430\u0439\u0442 \u0438 \u0440\u043e\u043b\u044c         \u0415\u0449\u0451 \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0431\u044b \u043f\u043e\u0442\u043e\u043c \u0431\u044b\u043b\u043e \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e          \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c. \u0415\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0431\u0440\u0430\u0442\u044c,          \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u043a\u0440\u0438\u043f\u0442\u0430         '''         sw_add = {             \"name\": self.hostname,             \"device_type\": {             \"model\": self.model             },             \"role\": {             \"slug\": self.swroleslug             },             \"site\": {             \"slug\": self.siteslug             },             \"description\": \"Added by script\"         }                 # \u0434\u0435\u043b\u0430\u0435\u043c POST \u0437\u0430\u043f\u0440\u043e\u0441, \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0432 Netbox \u043d\u0430\u0448 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 json         response = requests.post(POSTSW, headers=HEADERS, verify=False, json=sw_add)         # \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c id \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430         if response.status_code == 201:             out_dev = response.json()             dev_id = out_dev['id']              return response.status_code, dev_id          else:             return response.status_code, 0          def postint(self):     '''     \u041c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f     \u0417\u0434\u0435\u0441\u044c \u0432\u0441\u0451 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f,      \u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435     \u0412 \u0441\u043b\u043e\u0432\u0430\u0440\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0438\u043c\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438 \u0438\u043c\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430,     \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u044d\u0442\u043e vlan4090     '''         POSTINT = f\"{URLNB}\/api\/dcim\/interfaces\/\"          int_add = {             \"device\": {             \"name\": self.hostname             },             \"name\": self.interface,             \"type\": \"virtual\",             \"enabled\": True,         }          response = requests.post(POSTINT, headers=HEADERS, verify=False, json=int_add)         # \u0415\u0441\u043b\u0438 \u0432\u0441\u0451 \u0445\u043e\u0440\u043e\u0448\u043e, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c id \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430         if response.status_code == 201:             out_int = response.json()             int_id = out_int['id']              return response.status_code, int_id          else:             return response.status_code, 0       def postip(self, int_id):         '''         \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c ip \u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.         \u0412\u043e\u0442 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c id \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430,         \u043d\u0430 \u044d\u0442\u043e\u0442 id \u0438 \u0431\u0443\u0434\u0435\u043c \u0432\u0435\u0448\u0430\u0442\u044c ip \u0430\u0434\u0440\u0435\u0441         '''         POSTIP = f\"{URLNB}\/api\/ipam\/ip-addresses\/\"          ip_add = {             \"address\": self.ipaddress,             \"status\": \"active\",             \"assigned_object_type\": \"dcim.interface\",             \"assigned_object_id\": int(int_id)         }          response = requests.post(POSTIP, headers=HEADERS, verify=False, json=ip_add)          return response.status_code       def postmac(self, int_id):     '''     \u0412 \u044d\u0442\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043c\u0430\u043a \u0430\u0434\u0440\u0435\u0441 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435     '''         POSTMAC = f\"{URLNB}\/api\/dcim\/mac-addresses\/\"          mac_add = {             \"mac_address\": self.mac_address,             \"assigned_object_type\": \"dcim.interface\",             \"assigned_object_id\": int(int_id)         }          response = requests.post(POSTMAC, headers=HEADERS, verify=False, json=mac_add)          return response.status_code       def postmainip(self, dev_id):     '''     \u0417\u0434\u0435\u0441\u044c \u0434\u0435\u043b\u0430\u0435\u043c ip \u0430\u0434\u0440\u0435\u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u043d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0432\u0441\u0442\u0432\u0435.     \u041c\u0435\u0442\u043e\u0434 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439, \u043d\u043e ip \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u043d\u043e\u0433\u043e     \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435, \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 ip \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f     \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435, \u0447\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e, \u0430 \u0442\u0430\u043a \u0436\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u043b\u0435     \u0435\u0441\u043b\u0438 \u0432\u044b\u0434\u0451\u0440\u0433\u0438\u0432\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0447\u0435\u0440\u0435\u0437 API.      '''         POSTMAINIP = f\"{URLNB}\/api\/dcim\/devices\/{dev_id}\/\"          main_ip = {             \"primary_ip4\": {             \"address\": self.ipaddress             }         }          response = requests.patch(POSTMAINIP, headers=HEADERS, verify=False, json=main_ip)          return response.status_code      def postmainmac(self, int_id):     '''     \u0414\u0435\u043b\u0430\u0435\u043c \u043c\u0430\u043a \u0430\u0434\u0440\u0435\u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c, \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u0442\u0430 \u0436\u0435 \u0447\u0442\u043e \u0438 \u0441 ip.     \u041f\u0440\u043e\u0441\u0442\u043e \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u041d\u0435\u0442\u0431\u043e\u043a\u0441\u043e\u043c,      \u043f\u043e \u0441\u0443\u0442\u0438 \u043c\u0435\u0442\u043e\u0434 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439.     '''         POSTMAINMAC = f\"{URLNB}\/api\/dcim\/interfaces\/{int_id}\/\"          main_mac = {             \"primary_mac_address\": {             \"mac_address\": self.mac_address             }         }          response = requests.patch(POSTMAINMAC, headers=HEADERS, verify=False, json=main_mac)          return response.status_code<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043e\u0434.<\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043e\u0434 \u0441\u043a\u0440\u0438\u043f\u0442\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">''' \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u043c\u044b \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u043b\u0438 \u0432 .env ''' load_dotenv() TOKEN_API = os.getenv('API_KEY') HEADERS = {\"Authorization\": TOKEN_API} URLNB = os.getenv('URLNB') SITE_NAME = os.getenv('SITE_NAME') IPSCAN = os.getenv('IPSCAN') SWITCHES_FILE = os.getenv('SWITCHES_FILE') # \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 LOGDIR = \".\/\" LOGNAME = f\"log_switch_add_{IPSCAN}.log\"  logger = logging.getLogger('SWITCH_ADD') logger.setLevel(logging.DEBUG) logfile = logging.handlers.RotatingFileHandler(f'{LOGDIR}{LOGNAME}', mode='w')  logfile.setLevel(logging.DEBUG) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S') logfile.setFormatter(formatter) logger.addHandler(logfile)  ''' \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0444\u0430\u0439\u043b json \u0441 \u043d\u0430\u0448\u0438\u043c\u0438 \u043a\u043e\u043c\u043c\u0443\u0442\u0430\u0442\u043e\u0440\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u043e\u0436\u0435 \u0431\u044b\u043b \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d \u0432 .\u0435nv ''' with open(SWITCHES_FILE, 'r') as f:     dt = f.read()     switches_from_file = json.loads(dt)      for sw in switches_from_file:         '''         \u041f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043e \u0441\u043b\u043e\u0432\u0430\u0440\u044f\u043c\u0438         \u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u043e \u0441\u0432\u0438\u0447\u0451\u043c          '''         swadd = NbPostDevice(**sw)          add_code, dev_id = swadd.postdevice()         ''' \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u0435\u0441\u043b\u0438 \u0432\u0441\u0451 \u041e\u043a, \u0442\u043e \u043f\u0438\u0448\u0435\u043c \u043b\u043e\u0433, \u0447\u0442\u043e \u0432\u0441\u0451 \u041e\u043a '''         if add_code == 201:             logger.info(f'\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e ({sw[\"hostname\"]} - {sw[\"ipaddress\"]}) - \u0431\u044b\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e')         else:             ''' \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430, \u0442\u043e \u043f\u0438\u0448\u0435\u043c \u043b\u043e\u0433 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442'''             logger.error(f'\u041e\u0448\u0438\u0431\u043a\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f ({sw[\"hostname\"]} - {sw[\"ipaddress\"]})')             break          add_int, int_id = swadd.postint()         ''' \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0435\u0441\u043b\u0438 \u0432\u0441\u0451 \u041e\u043a \u0442\u043e \u043f\u0438\u0448\u0435\u043c \u043b\u043e\u0433, \u0447\u0442\u043e \u0432\u0441\u0451 \u041e\u043a '''         if add_int == 201:             logger.info(f'\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f ({sw[\"hostname\"]} - {sw[\"ipaddress\"]}) - \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d')         else:             '''<\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-466786","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/466786","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=466786"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/466786\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=466786"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=466786"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=466786"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}