{"id":253,"date":"2020-07-07T16:29:39","date_gmt":"2020-07-07T15:29:39","guid":{"rendered":"https:\/\/blog.thomarite.uk\/?p=253"},"modified":"2020-07-07T16:35:08","modified_gmt":"2020-07-07T15:35:08","slug":"netbox","status":"publish","type":"post","link":"https:\/\/blog.thomarite.uk\/index.php\/2020\/07\/07\/netbox\/","title":{"rendered":"Netbox"},"content":{"rendered":"\n<p>Another thing I wanted to play with is <a href=\"https:\/\/netbox.readthedocs.io\/en\/stable\/\">Netbox<\/a> and found a good article to <a href=\"https:\/\/www.packetflow.co.uk\/how-to-build-a-network-automation-stack-with-nornir-napalm-and-netbox\/\">follow<\/a>.  So credits to the authors.<\/p>\n\n\n\n<p>Using my current ceos lab from <a href=\"https:\/\/github.com\/thomarite\/ceos-testing\">https:\/\/github.com\/thomarite\/ceos-testing<\/a><\/p>\n\n\n\n<p>I followed Rick&#8217;s article to install netbox-docker and his own repo with the nornir examples using netbox. In this case nornir is going to use netbox as inventory. Normally I use local files.  I created a python venv for 3.7.3<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">mkdir netbox-example; cd netbox-example\npyenv local 3.7.3\npython -m virtualenv venv\nsource venv\/bin\/activate\ngit clone https:\/\/github.com\/netbox-community\/netbox-docker.git\ncd netbox-docker\nvim docker-compose.yml  --&gt; so it always expose 8080\n      nginx:\n      ...\n        ports:\n          - 8080:8080\ndocker-compose pull\ndocker-compose up<\/pre>\n\n\n\n<p>When installing the requirements for &#8220;<a href=\"https:\/\/github.com\/rickdonato\/nornir-napalm-netbox-demo\">nornir-napalm-netbox-demo<\/a>&#8221; I had to modify the version of some packages. So I removed the required version and I left pip to install the latest. I didnt use the makefile.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">git clone https:\/\/github.com\/rickdonato\/nornir-napalm-netbox-demo\ncd nornir-napalm-netbox-demo\npython -m pip install -r requirements.txt<\/pre>\n\n\n\n<p>I struggled quite a bit with the management IP in netbox and the meaning of &#8220;platform&#8221;<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Create&nbsp;<strong>Manufacturers<\/strong>&nbsp;under&nbsp;<strong>Device Types<\/strong>:  I created &#8220;Arista&#8221;<\/li><li>Create&nbsp;<strong>Device Types<\/strong>&nbsp;under&nbsp;<strong>Device Types<\/strong>: I created &#8220;ceos&#8221;<\/li><li>Create&nbsp;<strong>Platforms<\/strong>&nbsp;under&nbsp;<strong>Devices<\/strong>: This is <strong>VERY<\/strong> important as it has to be a supported <a href=\"https:\/\/napalm.readthedocs.io\/en\/latest\/support\/\">NAPALM platform<\/a>!!! So for Arista, I need &#8220;eos&#8221;.<\/li><li>Create&nbsp;<strong>Device Roles<\/strong>&nbsp;under&nbsp;<strong>Devices<\/strong>. I created &#8220;pe&#8221;<\/li><li>Create&nbsp;<strong>Devices<\/strong>&nbsp;under&nbsp;<strong>Devices<\/strong>.<\/li><li>Within each device: <strong>add a management interface<\/strong>. Here, I got confused as I was adding the interface in the inventory section. The inventory section is info to\/from the device using NAPALM. So you need to go to the bottom of the page, add the interface <\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"733\" src=\"https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-07-14-26-40-1024x733.png\" alt=\"\" class=\"wp-image-254\" srcset=\"https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-07-14-26-40-1024x733.png 1024w, https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-07-14-26-40-300x215.png 300w, https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-07-14-26-40-768x550.png 768w, https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-07-14-26-40-1536x1099.png 1536w, https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-07-14-26-40-1200x859.png 1200w, https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-07-14-26-40.png 1790w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>and then add an IP to that interface and mark it as primary.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"821\" height=\"1024\" src=\"https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-07-14-29-05-821x1024.png\" alt=\"\" class=\"wp-image-255\" srcset=\"https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-07-14-29-05-821x1024.png 821w, https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-07-14-29-05-240x300.png 240w, https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-07-14-29-05-768x958.png 768w, https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-07-14-29-05.png 872w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px\" \/><\/figure>\n\n\n\n<p>Keep in mind that initially, I was using &#8220;0.0.0.0&#8221; for each device as that&#8217;s the IP I have be using for all my scripts lately.<\/p>\n\n\n\n<p>Keep in mind (II) that we are using docker twice (from different commands&#8230;) one to get netbox and the other via docker(-topo) to get the Arista ceos containers&#8230;. and we have iptables rules under the hood created by both&#8230;<\/p>\n\n\n\n<p>But, let&#8217;s go step by step. Now we need to confirm that our nornir scrip can connect to netbox. So follow &#8220;Nornir-to-Netbox Configuration&#8221; section. This is my file. I updated the nb_url and nb_token. Notice the usage of &#8220;<em>transform_function<\/em>&#8220;.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">---\ncore:\nnum_workers: 20\ninventory:\nplugin: nornir.plugins.inventory.netbox.NBInventory\noptions:\nnb_url: 'http:\/\/0.0.0.0:8080'\nnb_token: '&lt;NETBOX_API_TOKEN&gt;'\nssl_verify: False\ntransform_function: \"helpers.adapt_user_password\"<\/pre>\n\n\n\n<p>You need to update &#8220;scripts\/secrets.py&#8221; with the devices you have in your inventory and the user\/pass:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">creds = {\n\"r1\": {\"username\": \"user\", \"password\": \"pas123\"},\n\"r2\": {\"username\": \"user\", \"password\": \"pas123\"},\n\"r3\": {\"username\": \"user\", \"password\": \"pas123\"},\n}<\/pre>\n\n\n\n<p>So now we can test if nornir can connect to netbox:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/netbox-example\/nornir-napalm-netbox-demo master$ python scripts\/helpers.py --inventory\n{'defaults': {'connection_options': {},\n'data': {},\n'hostname': None,\n'password': None,\n'platform': None,\n'port': None,\n'username': None},\n'groups': {},\n'hosts': {'r1': {'connection_options': {},\n'data': {'asset_tag': 'r1',\n'model': 'ceos',\n'role': 'pe',\n'serial': 'r1',\n'site': 'lab1',\n'vendor': 'Arista'},\n'groups': [],\n'hostname': '192.168.16.2',\n'password': 'pas123',\n'platform': 'eos',\n'port': None,\n'username': 'user'},\n'r2': {'connection_options': {},\n'data': {'asset_tag': 'r2',\n'model': 'ceos',\n'role': 'pe',\n'serial': 'r2',\n'site': 'lab1',\n'vendor': 'Arista'},\n'groups': [],\n'hostname': '192.168.16.3',\n'password': 'pas123',\n'platform': 'eos',\n'port': None,\n'username': 'user'},\n'r3': {'connection_options': {},\n'data': {'asset_tag': 'r3',\n'model': 'ceos',\n'role': 'pe',\n'serial': 'r3',\n'site': 'lab1',\n'vendor': 'Arista'},\n'groups': [],\n'hostname': '192.168.16.4',\n'password': 'pas123',\n'platform': 'eos',\n'port': None,\n'username': 'user'}}}<\/pre>\n\n\n\n<p>All good. Let&#8217;s see if we can get backups from the devices.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">netbox-example\/nornir-napalm-netbox-demo master$ python scripts\/backup_configs.py\nBackup Device configurations**\nr1 ** changed : True *\nvvvv Backup Device configurations ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\n---- napalm_get ** changed : False --------------------------------------------- INFO\n---- write_file ** changed : True ---------------------------------------------- INFO\n^^^^ END Backup Device configurations ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nr2 ** changed : True *\nvvvv Backup Device configurations ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\n---- napalm_get ** changed : False --------------------------------------------- INFO\n---- write_file ** changed : True ---------------------------------------------- INFO\n^^^^ END Backup Device configurations ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nr3 ** changed : True *\nvvvv Backup Device configurations ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\n---- napalm_get ** changed : False --------------------------------------------- INFO\n---- write_file ** changed : True ---------------------------------------------- INFO\n^^^^ END Backup Device configurations ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n(venv) \/netbox-example\/nornir-napalm-netbox-demo master$<\/pre>\n\n\n\n<p>Great all good.<\/p>\n\n\n\n<p>Now, let&#8217;s see netbox using NAPALM. If you  click on &#8220;Status&#8221; for any device, netbox will use NAPALM to get the facts from the device. If netbox is not configured properly with NAPALM, it will fail. This is a working scenario:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"423\" src=\"https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-07-15-51-38-1024x423.png\" alt=\"\" class=\"wp-image-256\" srcset=\"https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-07-15-51-38-1024x423.png 1024w, https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-07-15-51-38-300x124.png 300w, https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-07-15-51-38-768x318.png 768w, https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-07-15-51-38-1200x496.png 1200w, https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-07-15-51-38.png 1243w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/figure>\n\n\n\n<p>The tabs &#8220;LLDP neighbors&#8221; and &#8220;Configuration&#8221; relay too in NAPALM.<\/p>\n\n\n\n<p>So for configuring netbox with napalm you need to tell netbox the user\/pass that NAPALM needs:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">netbox-example$ vim netbox-docker\/env\/netbox.env\n...\nNAPALM_USERNAME=user\nNAPALM_PASSWORD=pas123\nNAPALM_TIMEOUT=10\n...<\/pre>\n\n\n\n<p>Very likely you will have to restart netbox:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/netbox-docker release$ docker-compose down\n\/netbox-docker release$ docker-compose up<\/pre>\n\n\n\n<p>As mentioned before, I had an issue when I was using &#8220;0.0.0.0&#8221; as IP. By default (as It seems I can&#8217;t think) I was using the exposed IP\/port from docker-topo to reach the ceos switches. I haven&#8217;t had an issue until using netbox.<\/p>\n\n\n\n<p>I am using docker for netbox and docker(-topo) for my arista cEOS switches. So the connectivity between netbox and ceos is via the IPs\/interfaces\/bridges created by docker. And remember\u2026 you have iptables under the hood. My first mistake was telling netbox to use 0.0.0.0 as it is the one I am using to testing from my scripts when connecting to ceos. Netbox needs to point to the IP assigned by docker :facepalm: 192.16.16.x in my case. Second one, the port, same thing docker exposes the port 443 as 900x for external connections and I use 900x in my scripts. From netbox point of view, it is still 443 :facepalm: And finally, I am calling docker twice for building my lab, one for netbox-docker and the other for ceos. You need to keep an eye on iptables changes when restarting netbox via docker-compose because you can be in the situation that netbox traffic is dropped in DOCKER-ISOLATION-STAGE-1 :facepalm: (need to try to write a docker-compose to build everything in one go)<\/p>\n\n\n\n<p>So when I was having errors from netbox that it was being rejected when connecting to ceos devices via NAPALM, I couldnt understand it. My scripts were fine using those details (0.0.0.0:900x)<\/p>\n\n\n\n<p>I ran tcpdump on one ceos on the &#8220;ethernet0&#8221; interface and NOTHING was hitting the interface from netbox on port 900x but my scripts could&#8230;..<\/p>\n\n\n\n<p>Somehow netbox wasnt able to reach ceos r1??? In my head, netbox and ceos devices were all in 0.0.0.0&#8230;.. so no routing, no firewalls, they are connected in the same network 0.0.0.0&#8230;..<\/p>\n\n\n\n<p>At the end I waked up and realised that the docker devices are using the IPs provided by docker so it is following normal routing&#8230; and firewalling by iptables. The same for ceos devices, they have IPs (different from 0.0.0.0)<\/p>\n\n\n\n<p>So I updated netbox with the correct management IPs for r1, r2 and r3 ceos.<\/p>\n\n\n\n<p>When I filtered by the real netbox IP in r1 tcpdump  ethernet0, I was seeing traffic on 900x!!! Good. Then I realised that it has to be 443. So I removed my hack to update the port to 900x.<\/p>\n\n\n\n<p>For a different reason I had to restart docker-topo (for ceos) and then docker netbox. And now, I coudnt see any traffic from netbox in r1&#8230;.. I &#8220;didn&#8217;t&#8221; change anything. So the routing didnt change, there was something else &#8220;cutting&#8221; the connection: iptables<\/p>\n\n\n\n<p>docker uses iptables very heavily. I realised that after restart docker-netbox, iptables changed&#8230;<\/p>\n\n\n\n<p>before restart:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># iptables -t filter -S DOCKER-ISOLATION-STAGE-1\nWarning: iptables-legacy tables present, use iptables-legacy to see them\n-N DOCKER-ISOLATION-STAGE-1\n-A DOCKER-ISOLATION-STAGE-1 -j ACCEPT\n-A DOCKER-ISOLATION-STAGE-1 -i br-94a8183a4fb1 ! -o br-94a8183a4fb1 -j DOCKER-ISOLATION-STAGE-2\n-A DOCKER-ISOLATION-STAGE-1 -i br-0d4ec9aba9bd ! -o br-0d4ec9aba9bd -j DOCKER-ISOLATION-STAGE-2\n-A DOCKER-ISOLATION-STAGE-1 -i br-609619313dc8 ! -o br-609619313dc8 -j DOCKER-ISOLATION-STAGE-2\n-A DOCKER-ISOLATION-STAGE-1 -i br-61d32350cb58 ! -o br-61d32350cb58 -j DOCKER-ISOLATION-STAGE-2\n-A DOCKER-ISOLATION-STAGE-1 -i br-384488acbc99 ! -o br-384488acbc99 -j DOCKER-ISOLATION-STAGE-2\n-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2\n-A DOCKER-ISOLATION-STAGE-1 -j RETURN<\/pre>\n\n\n\n<p>after restart:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># iptables -t filter -S DOCKER-ISOLATION-STAGE-1\nWarning: iptables-legacy tables present, use iptables-legacy to see them\n-N DOCKER-ISOLATION-STAGE-1\n-A DOCKER-ISOLATION-STAGE-1 -i br-381cdff63d2f ! -o br-381cdff63d2f -j DOCKER-ISOLATION-STAGE-2\n-A DOCKER-ISOLATION-STAGE-1 -j ACCEPT\n-A DOCKER-ISOLATION-STAGE-1 -i br-94a8183a4fb1 ! -o br-94a8183a4fb1 -j DOCKER-ISOLATION-STAGE-2\n-A DOCKER-ISOLATION-STAGE-1 -i br-0d4ec9aba9bd ! -o br-0d4ec9aba9bd -j DOCKER-ISOLATION-STAGE-2\n-A DOCKER-ISOLATION-STAGE-1 -i br-609619313dc8 ! -o br-609619313dc8 -j DOCKER-ISOLATION-STAGE-2\n-A DOCKER-ISOLATION-STAGE-1 -i br-61d32350cb58 ! -o br-61d32350cb58 -j DOCKER-ISOLATION-STAGE-2\n-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2\n-A DOCKER-ISOLATION-STAGE-1 -j RETURN<\/pre>\n\n\n\n<p>With the restart, docker created a new bridge interface for netbox (old: br-384488acbc99, new: br-381cdff63d2f) and it wasnt hitting anymore the &#8220;DOCKER-ISOLATION-STAGE-1 -j ACCEPT&#8221;<\/p>\n\n\n\n<p>So I had to make an iptables change:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># iptables -t filter -D DOCKER-ISOLATION-STAGE-1 -j ACCEPT\n# iptables -t filter -I DOCKER-ISOLATION-STAGE-1 -j ACCEPT\n# iptables -t filter -S DOCKER-ISOLATION-STAGE-1\nWarning: iptables-legacy tables present, use iptables-legacy to see them\n-N DOCKER-ISOLATION-STAGE-1\n-A DOCKER-ISOLATION-STAGE-1 -j ACCEPT\n-A DOCKER-ISOLATION-STAGE-1 -i br-381cdff63d2f ! -o br-381cdff63d2f -j DOCKER-ISOLATION-STAGE-2\n-A DOCKER-ISOLATION-STAGE-1 -i br-94a8183a4fb1 ! -o br-94a8183a4fb1 -j DOCKER-ISOLATION-STAGE-2\n-A DOCKER-ISOLATION-STAGE-1 -i br-0d4ec9aba9bd ! -o br-0d4ec9aba9bd -j DOCKER-ISOLATION-STAGE-2\n-A DOCKER-ISOLATION-STAGE-1 -i br-609619313dc8 ! -o br-609619313dc8 -j DOCKER-ISOLATION-STAGE-2\n-A DOCKER-ISOLATION-STAGE-1 -i br-61d32350cb58 ! -o br-61d32350cb58 -j DOCKER-ISOLATION-STAGE-2\n-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2\n-A DOCKER-ISOLATION-STAGE-1 -j RETURN\n#<\/pre>\n\n\n\n<p>And finally, netbox could use napalm to contact the ceos devices&#8230;. Calling docker twice is not a great idea&#8230;.<\/p>\n\n\n\n<p>BTW, this is my docker ps with netbox and ceos devices:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">(venv) \/netbox-example$ docker ps -a\nCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES\nc23be76ffd54 nginx:1.17-alpine \"nginx -c \/etc\/netbo\u2026\" 4 hours ago Up 4 hours 80\/tcp, 0.0.0.0:8080->8080\/tcp netbox-docker_nginx_1\n5a0b89f18578 netboxcommunity\/netbox:latest \"\/opt\/netbox\/docker-\u2026\" 4 hours ago Up 4 hours netbox-docker_netbox_1\n528948de329b netboxcommunity\/netbox:latest \"python3 \/opt\/netbox\u2026\" 4 hours ago Up 4 hours netbox-docker_netbox-worker_1\n29529302ba1c redis:5-alpine \"docker-entrypoint.s\u2026\" 4 hours ago Up 4 hours 6379\/tcp netbox-docker_redis_1\n5e975ec2aa70 redis:5-alpine \"docker-entrypoint.s\u2026\" 4 hours ago Up 4 hours 6379\/tcp netbox-docker_redis-cache_1\n6158672a4ae6 postgres:11-alpine \"docker-entrypoint.s\u2026\" 4 hours ago Up 4 hours 5432\/tcp netbox-docker_postgres_1\n34841aa098d4 ceos-lab:4.23.3M \"\/sbin\/init systemd.\u2026\" 5 hours ago Up 5 hours 0.0.0.0:2002->22\/tcp, 0.0.0.0:9002->443\/tcp 3node_r03\n4ca92c6a3b09 ceos-lab:4.23.3M \"\/sbin\/init systemd.\u2026\" 5 hours ago Up 5 hours 0.0.0.0:2001->22\/tcp, 0.0.0.0:9001->443\/tcp 3node_r02\n67e8b7ab84e0 ceos-lab:4.23.3M \"\/sbin\/init systemd.\u2026\" 5 hours ago Up 5 hours 0.0.0.0:2000->22\/tcp, 0.0.0.0:9000->443\/tcp 3node_r01<\/pre>\n\n\n\n<p>I was painful but I learned a couple of things about netbox, nornir and docker\/iptables!!!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Another thing I wanted to play with is Netbox and found a good article to follow. So credits to the authors. Using my current ceos lab from https:\/\/github.com\/thomarite\/ceos-testing I followed Rick&#8217;s article to install netbox-docker and his own repo with the nornir examples using netbox. In this case nornir is going to use netbox as &hellip; <a href=\"https:\/\/blog.thomarite.uk\/index.php\/2020\/07\/07\/netbox\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Netbox&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-253","post","type-post","status-publish","format-standard","hentry","category-networks"],"_links":{"self":[{"href":"https:\/\/blog.thomarite.uk\/index.php\/wp-json\/wp\/v2\/posts\/253","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.thomarite.uk\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.thomarite.uk\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.thomarite.uk\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.thomarite.uk\/index.php\/wp-json\/wp\/v2\/comments?post=253"}],"version-history":[{"count":3,"href":"https:\/\/blog.thomarite.uk\/index.php\/wp-json\/wp\/v2\/posts\/253\/revisions"}],"predecessor-version":[{"id":259,"href":"https:\/\/blog.thomarite.uk\/index.php\/wp-json\/wp\/v2\/posts\/253\/revisions\/259"}],"wp:attachment":[{"href":"https:\/\/blog.thomarite.uk\/index.php\/wp-json\/wp\/v2\/media?parent=253"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.thomarite.uk\/index.php\/wp-json\/wp\/v2\/categories?post=253"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.thomarite.uk\/index.php\/wp-json\/wp\/v2\/tags?post=253"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}