{"id":307,"date":"2014-07-14T14:35:13","date_gmt":"2014-07-14T10:35:13","guid":{"rendered":"http:\/\/www.bandidor.info\/wp\/?p=307"},"modified":"2017-03-02T17:15:58","modified_gmt":"2017-03-02T14:15:58","slug":"md-raid-and-zabbix","status":"publish","type":"post","link":"https:\/\/www.bandidor.info\/wp\/?p=307","title":{"rendered":"md raid and zabbix"},"content":{"rendered":"<h1>Subject<\/h1>\n<p>In this article I explain how to setup Software RAID monitoring with <em>zabbix<\/em>. The solution will use two ways &#8211; active monitoring (polling) of an array status and passive traps for array events, sent out by the <strong>mdadm<\/strong> daemon.<\/p>\n<h1>Symptoms<\/h1>\n<div>There were two challenges to deal with. First, even configured properly the e-mail notification produced by mdadm monitoring was not working effectively. E-mails were often overlooked of even landed in SPAM folder. One happy day one of the array disks failed, this went unnoticed and when the next disk crashed I was really in trouble.\u00a0Secondly, there are quite a few events, generated by the <strong>mdadm<\/strong> daemon in monitoring mode and I didn&#8217;t want to configure <em>zabbix<\/em> items and trigger manually every time<\/div>\n<h1>Plattform\/Tools<\/h1>\n<div>Nothing special here, software RAID on a debian machine with <code>Debian GNU\/Linux 7.5 (wheezy)<\/code>\u00a0and\u00a0<em>zabbix\u00a0<\/em>sever on ubuntu <code>Ubuntu 12.04.4 LTS<\/code>.\u00a0Z<em>abbix\u00a0<\/em>agent\u00a0v2.2.3,\u00a0<em>zabbix\u00a0<\/em>server &#8211;\u00a0v2.2.2.<\/div>\n<h1>Solution<\/h1>\n<h2>Discovery of md arrays<\/h2>\n<p>Create Perl script to support array discovery. I started with shell first, but then switched to my favourite Perl in particular to make sure the script sends properly formatted JSON back to zabbix. So you will need Perl JSON module installed. This looks to be a bit of heavy-weighted, \u00a0but you wouldn&#8217;t want to run discovery every second anyway.<\/p>\n<pre class=\"brush: bash; gutter: false; first-line: 1\"># cat \/usr\/lib\/zabbix\/externalscripts\/zabbix_mdraid.pl\r\n#!\/usr\/bin\/perl\r\nuse strict;\r\nuse warnings;\r\nuse Getopt::Std;\r\nuse JSON;\r\n\r\n# declare the perl command line flags\/options we want to allow\r\nmy %options=();\r\ngetopts(\"D\", \\%options);\r\nmy $arrays_found = undef;\r\nif ($options{D}) {\r\n        open(my $fh, '-|', 'cat \/proc\/mdstat') or die $!;\r\n        while (my $line = &lt;$fh&gt;) {\r\n                if ($line =~ \/^(md\\S*)\/) {\r\n                        if ($arrays_found) {\r\n                                push(@{$arrays_found-&gt;{'data'}},{'{#MD_DEVICE}' =&gt; ('\/dev\/' . $1)});\r\n                        } else {\r\n                                $arrays_found-&gt;{'data'}-&gt;[0] =  {'{#MD_DEVICE}' =&gt; ('\/dev\/' . $1)};\r\n                        }\r\n                }\r\n        }\r\n}\r\n\r\nprint encode_json($arrays_found) if ($arrays_found);<\/pre>\n<p>Add discovery script to zabbix agent configuration file as a UserParameter:<\/p>\n<pre class=\"brush: bash; gutter: false; first-line: 1\"># cat \/etc\/zabbix\/zabbix_agentd.d\/mdraid.conf\r\n...\r\nUserParameter=mdraid.discovery, sudo \/usr\/lib\/zabbix\/externalscripts\/zabbix_mdraid.pl -D\r\n...<\/pre>\n<p>Make sure you gave sudo permissions for the script:<\/p>\n<pre class=\"brush: bash; gutter: false; first-line: 1\"># cat \/etc\/sudoers.d\/zabbix\r\n...\r\nzabbix  ALL=NOPASSWD:   \/usr\/lib\/zabbix\/externalscripts\/zabbix_mdraid.pl\r\n...<\/pre>\n<p>And of course configure the discovery on zabbix server:<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/04\/ScreenShot066.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-316\" src=\"http:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/04\/ScreenShot066.png\" alt=\"ScreenShot066\" width=\"629\" height=\"480\" srcset=\"https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/04\/ScreenShot066.png 629w, https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/04\/ScreenShot066-300x228.png 300w, https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/04\/ScreenShot066-196x150.png 196w, https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/04\/ScreenShot066-150x114.png 150w\" sizes=\"auto, (max-width: 629px) 100vw, 629px\" \/><\/a><\/p>\n<div><\/div>\n<h2>Reporting array status<\/h2>\n<div>\n<p>We will extend the above script\u00a0<span style=\"font-family: 'courier new', courier;\">\/usr\/lib\/zabbix\/externalscripts\/zabbix_mdraid.pl<\/span>\u00a0to also support the check for the array status. It will be run with the command line options <code>-s \/dev\/mdX<\/code> to report the status. Now it will look as follows:<\/p>\n<\/div>\n<div><span style=\"font-family: 'courier new', courier;\"><span style=\"font-family: 'andale mono', times;\">\u00a0<\/span><\/span><\/div>\n<div>\n<pre class=\"brush: perl; gutter: false; first-line: 1\">#!\/usr\/bin\/perl\r\nuse strict;\r\nuse warnings;\r\nuse Getopt::Std;\r\nuse JSON;\r\n\r\n# declare the perl command line flags\/options we want to allow\r\nmy %options=();\r\ngetopts(\"Ds:\", \\%options);\r\n\r\nif ($options{D}) {\r\n\tmy $arrays_found = undef;\r\n\topen(my $fh, '-|', 'cat \/proc\/mdstat') or die $!;\r\n\twhile (my $line = &lt;$fh&gt;) {\r\n\t\tif ($line =~ \/^(md\\S*)\/) {\r\n\t\t\tif ($arrays_found) {\r\n\t\t\t\tpush(@{$arrays_found-&gt;{'data'}},{'{#MD_DEVICE}' =&gt; ('\/dev\/' . $1)});\r\n\t\t\t} else {\r\n\t\t\t\t$arrays_found-&gt;{'data'}-&gt;[0] =  {'{#MD_DEVICE}' =&gt; ('\/dev\/' . $1)};\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tprint encode_json($arrays_found) if ($arrays_found);\r\n} elsif ($options{s}) {\r\n\t#Will be checking status of a given array\r\n\topen(my $fh, '-|', 'mdadm --detail ' . $options{s}) or die $!;\r\n\twhile (my $line = &lt;$fh&gt; ) {\r\n\t\tif ($line =~ \/State\\s*:\\s*(\\S.*)$\/) {\r\n\t\t\tprint $1;\r\n\t\t\tlast;\r\n\t\t}\r\n\t}\r\n}<\/pre>\n<\/div>\n<p>We will add it to zabbix agent configuration file as a User Parameter:<\/p>\n<div>\n<pre class=\"brush: bash; gutter: false; first-line: 1\">...\r\nUserParameter=mdraid.status[*], sudo \/usr\/lib\/zabbix\/externalscripts\/zabbix_mdraid.pl -s '$1'\r\n...<\/pre>\n<\/div>\n<div><\/div>\n<p>And configure a zabbix item:<\/p>\n<div><a href=\"http:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/04\/ScreenShot068.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-328 aligncenter\" src=\"http:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/04\/ScreenShot068.png\" alt=\"ScreenShot068\" width=\"639\" height=\"441\" srcset=\"https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/04\/ScreenShot068.png 639w, https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/04\/ScreenShot068-300x207.png 300w, https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/04\/ScreenShot068-217x150.png 217w, https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/04\/ScreenShot068-150x103.png 150w\" sizes=\"auto, (max-width: 639px) 100vw, 639px\" \/><\/a><\/div>\n<div><\/div>\n<h2>Receiving alerts when array status changes<\/h2>\n<p>On my Debian\u00a0wheezy\u00a0there is a background process, which monitors the status of md arrays:<\/p>\n<div><\/div>\n<div>\n<pre class=\"brush: plain; highlight: [5]; title: ; notranslate\" title=\"\">\r\n~# ps -ef | grep md\r\nroot 23 2 0 Jun04 ? 00:00:00 &#x5B;ksmd]\r\nroot 253 2 0 Jun04 ? 00:00:00 &#x5B;md]\r\nroot 260 2 0 Jun04 ? 00:19:53 &#x5B;md0_raid1]\r\nroot 2998 1 0 Jun04 ? 00:00:00 \/sbin\/mdadm --monitor --pid-file \/run\/mdadm\/monitor.pid --daemonise --scan --syslog\r\nroot 10814 12784 0 19:27 pts\/1 00:00:00 grep md\r\n<\/pre>\n<\/div>\n<p>This process will use\u00a0<b>PROGRAM <\/b>directive from the<b>\u00a0mdadm.conf <\/b>file:<\/p>\n<div><\/div>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">~# cat \/etc\/mdadm\/mdadm.conf\r\n# mdadm.conf\r\n#\r\n# Please refer to mdadm.conf(5) for information about this file.\r\n#...\r\n\r\nPROGRAM \/usr\/lib\/zabbix\/externalscripts\/mdadm.pl\r\n...\r\n<\/pre>\n<div><\/div>\n<p><span style=\"color: #000000;\">The program specified by the above directive will be run when\u00a0<\/span><b>mdadm &#8211;monitor<\/b><span style=\"color: #000000;\">\u00a0detects potentially interesting events on any of the arrays that it is monitoring. This program gets run with two or three arguments, they being the Event, the md device, and possibly the related component device.<\/span><\/p>\n<p>The\u00a0mdadm.pl script will send these events to zabbix server in the format similar to <code>mdraid.status.TestMessage[\/dev\/md0]<\/code>.<\/p>\n<pre class=\"brush: perl; title: ; notranslate\" title=\"\"># cat \/usr\/lib\/zabbix\/externalscripts\/mdadm.pl\r\n#!\/usr\/bin\/perl\r\n$ZABBIX_SERVER='192.168.100.8';\r\n$MYHOSTNAME='openfiler';\r\n$SENDER=`which zabbix_sender`;\r\nchomp($SENDER);\r\n$KEY='mdraid.status';\r\n\r\nif (!$MYHOSTNAME || !$ZABBIX_SERVER || !$KEY || ! -x $SENDER) {\r\nexit;\r\n}\r\n\r\nif ($ARGV&#x5B;0] =~ \/(Rebuild)(\\d+)\/) {\r\n$ARGV&#x5B;0] = $1;\r\n$ARGV&#x5B;2] = $2;\r\n} elsif (!$ARGV&#x5B;2]) {\r\n$ARGV&#x5B;2] = 'x';\r\n}\r\n\r\nmy @result = `$SENDER -z '$ZABBIX_SERVER' -k $KEY.&quot;$ARGV&#x5B;0]&quot;&#x5B;&quot;$ARGV&#x5B;1]&quot;] -o &quot;$ARGV&#x5B;2]&quot; -s '$MYHOSTNAME'`;\r\n\r\n#print @result;\r\n\r\nexit 0;\r\n\r\n<\/pre>\n<div><\/div>\n<p>These events will be received by zabbix items of the type <em>Zabbix trapper<\/em>. This is described in the next section.<\/p>\n<h2>Configuring trappers in zabbix<\/h2>\n<p>To process mdadm events in a\u00a0form similar to \u00a0<code>mdraid.status.TestMessage[\/dev\/md0]<\/code>\u00a0we will create a number of zabbix items of the type\u00a0<em>Zabbix trapper<\/em>. An item has to be created for all possible mdadm events.<\/p>\n<p>Here is an example:<\/p>\n<p><a href=\"http:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/07\/ScreenShot074.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-346\" src=\"http:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/07\/ScreenShot074.png\" alt=\"ScreenShot074\" width=\"545\" height=\"480\" srcset=\"https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/07\/ScreenShot074.png 545w, https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/07\/ScreenShot074-300x264.png 300w, https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/07\/ScreenShot074-170x150.png 170w, https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/07\/ScreenShot074-150x132.png 150w\" sizes=\"auto, (max-width: 545px) 100vw, 545px\" \/><\/a><\/p>\n<p>When all needed items are created, we will see the following in the list of host items:<\/p>\n<p><a href=\"http:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/07\/ScreenShot083.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-356 size-full\" src=\"http:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/07\/ScreenShot083.png\" alt=\"\" width=\"622\" height=\"485\" srcset=\"https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/07\/ScreenShot083.png 622w, https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/07\/ScreenShot083-300x233.png 300w, https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/07\/ScreenShot083-192x150.png 192w, https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/07\/ScreenShot083-150x116.png 150w\" sizes=\"auto, (max-width: 622px) 100vw, 622px\" \/><\/a><\/p>\n<p>Event names, like <em>TestMessage<\/em>, <em>DegradedArray<\/em>, etc. are directly taken from the <strong>mdadm <\/strong>man page.<\/p>\n<p>Each trapper item will also have a corresponding trigger with the severity, which again follows the <strong>mdadm<\/strong> man page. Here is a list of triggers:<\/p>\n<p><a href=\"http:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/07\/ScreenShot082.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-354 size-full\" src=\"http:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/07\/ScreenShot082.png\" alt=\"\" width=\"928\" height=\"388\" srcset=\"https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/07\/ScreenShot082.png 928w, https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/07\/ScreenShot082-300x125.png 300w, https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/07\/ScreenShot082-250x104.png 250w, https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/07\/ScreenShot082-150x62.png 150w\" sizes=\"auto, (max-width: 928px) 100vw, 928px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<h2>Creating performance counters for RAID devices<\/h2>\n<p>This is more a part of discovery and is not specific to RAID devices, so we will create some item prototypes for every discovered RAID device. For simplicity we will use new item types available in <em>zabbix<\/em> since 2.0. These are <strong style=\"color: #333333;\">vfs.dev.read[&lt;device&gt;,&lt;type&gt;,&lt;mode&gt;] <\/strong>and<strong style=\"color: #333333;\">\u00a0<strong>vfs.dev.write[&lt;device&gt;,&lt;type&gt;,&lt;mode&gt;]<\/strong><\/strong>\u00a0.<\/p>\n<p>For example:<\/p>\n<p><a href=\"http:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/07\/ScreenShot077.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-351\" src=\"http:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/07\/ScreenShot077.png\" alt=\"ScreenShot077\" width=\"457\" height=\"480\" srcset=\"https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/07\/ScreenShot077.png 457w, https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/07\/ScreenShot077-285x300.png 285w, https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/07\/ScreenShot077-142x150.png 142w\" sizes=\"auto, (max-width: 457px) 100vw, 457px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<h2>Trigger for RAID state change<\/h2>\n<p>Just as a last piece in the puzzle, here is one additional trigger to control the array state. If will be using an item created previously, which in turn polls the <em>\/proc\/mdadm<\/em> file for the array state. On the assumption that normal array operation will have array state in <em>clean<\/em> or <em>active<\/em>, we will be using a regular expression in the trigger condition. By the way, if we put one of the disks to a failed state via <code>mdadm --fail \/dev\/md0 \/dev\/sdb1<\/code>, the array state will show as\u00a0<em>clean, degraded<\/em>.<\/p>\n<p><a href=\"http:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/07\/ScreenShot078.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-352\" src=\"http:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/07\/ScreenShot078.png\" alt=\"ScreenShot078\" width=\"640\" height=\"393\" srcset=\"https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/07\/ScreenShot078.png 640w, https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/07\/ScreenShot078-300x184.png 300w, https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/07\/ScreenShot078-244x150.png 244w, https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/07\/ScreenShot078-150x92.png 150w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/a><\/p>\n<p>Trigger expressions is as follows:\u00a0<code>mdraid.status[{#MD_DEVICE}].regexp(^clean$|^active$,#1)}=0<\/code>.<\/p>\n<h2>Transfer to production<\/h2>\n<ol>\n<li>Copy<span style=\"color: #000000;\">\u00a0<code>\/usr\/lib\/zabbix\/externalscripts\/zabbix_mdraid.pl<\/code>\u00a0to the RAID host. Make sure\u00a0 <strong>JSON.pm<\/strong> is installed.<\/span><\/li>\n<li>Copy <code>\/etc\/zabbix\/zabbix_agentd.conf<\/code>\u00a0to the RAID host. Restart zabbix agent.<\/li>\n<li>Add lines to\u00a0<code>\/etc\/sudoers.d\/zabbix<\/code><\/li>\n<li>Update<span style=\"color: #000000;\">\u00a0<\/span><span style=\"color: #008200;\"><span style=\"color: #000000;\">cat <code>\/etc\/mdadm\/mdadm.conf<\/code>\u00a0to set <strong>PROGRAM<\/strong><\/span><\/span><\/li>\n<li>Copy<code>\u00a0\/usr\/lib\/zabbix\/externalscripts\/mdadm.pl<\/code><span style=\"color: #000000;\">\u00a0to the RAID host, update zabbix server IP and the RAID server hostname.<\/span><\/li>\n<li>Import the template to zabbix server.<\/li>\n<\/ol>\n<h1>Discussion<\/h1>\n<div>Not much of it actually. Probably I&#8217;ll have to wait for another big crash to see if this monitoring solution works better than the original e-mail notification, provided by\u00a0<strong>mdamd<\/strong> out of the box. Couple of things I tried in my test environment and that worked: more than one array on the same host, different combinations of disk failures, etc.<\/div>\n<div>Another interesting area would be to add more items to gather statistic for discovered arrays, but I decided against that. One thing could be useful, namely\u00a0watching for\u00a0<strong>time spent doing I\/Os (ms)\u00a0<\/strong>from\u00a0\/proc\/diskstats, but this has to be done for physical disks IMHO and as zabbix is not yet providing this item type, I had to configure user defined items in\u00a0<em>zabbix <\/em>agent configuration file. But this is a subject for another article.<\/div>\n<h1>Caveats<\/h1>\n<div>None as of now. Just a humble suggestion to watch out for the right spelling of the macros (like {#MD_ARRAY}) in\u00a0<em>zabbix\u00a0<\/em>discovery rules and item prototypes, looking for mistakes will take long time.<\/div>\n<div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Subject In this article I explain how to setup Software RAID monitoring with zabbix. The solution will use two ways &#8211; active monitoring (polling) of an array status and passive traps for array events, sent out by the mdadm daemon. Symptoms There were two challenges to deal with. First, even configured properly the e-mail notification&#8230;<\/p>\n","protected":false},"author":1,"featured_media":394,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":true,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[4,26],"tags":[19,20,21,23,17],"class_list":["post-307","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ubuntu","category-zabbix","tag-mdraid","tag-raid","tag-software-raid","tag-ubuntu","tag-zabbix"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/www.bandidor.info\/wp\/wp-content\/uploads\/2014\/07\/DSC00727.jpg","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p2EszU-4X","_links":{"self":[{"href":"https:\/\/www.bandidor.info\/wp\/index.php?rest_route=\/wp\/v2\/posts\/307","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bandidor.info\/wp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.bandidor.info\/wp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.bandidor.info\/wp\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bandidor.info\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=307"}],"version-history":[{"count":56,"href":"https:\/\/www.bandidor.info\/wp\/index.php?rest_route=\/wp\/v2\/posts\/307\/revisions"}],"predecessor-version":[{"id":666,"href":"https:\/\/www.bandidor.info\/wp\/index.php?rest_route=\/wp\/v2\/posts\/307\/revisions\/666"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.bandidor.info\/wp\/index.php?rest_route=\/wp\/v2\/media\/394"}],"wp:attachment":[{"href":"https:\/\/www.bandidor.info\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=307"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.bandidor.info\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=307"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.bandidor.info\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=307"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}