{"id":26,"date":"2009-05-30T17:50:00","date_gmt":"2009-05-30T15:50:00","guid":{"rendered":"http:\/\/netexpertise\/en\/?p=26"},"modified":"2021-10-10T17:18:07","modified_gmt":"2021-10-10T15:18:07","slug":"daily-accounting","status":"publish","type":"post","link":"http:\/\/www.netexpertise.eu\/en\/networking\/freeradius\/daily-accounting.html","title":{"rendered":"Daily Accounting in Freeradius"},"content":{"rendered":"\n<p>We have seen a few posts on Freeradius <a href=\"http:\/\/lists.cistron.nl\/mailman\/listinfo\/freeradius-users\">user list<\/a> and other forums asking how to collect accounting periodically. The Radius protocol provides accounting but not in the way that many would like. Here&#8217;s a short list of things we would like to modify or improve:<\/p>\n\n\n\n<ul><li> <span style=\"font-size: inherit;\">Traffic is not collected at regular intervals<\/span><br>As a result, it is impossible to generate <a href=\"\/en\/networking\/freeradius\/usage-graphs.html\">daily graphs<\/a> with download\/upload. Traffic will be corrupted because it is again, impossible to compute traffic over a given period of time with accuracy<\/li><\/ul>\n\n\n\n<ul><li> <span style=\"font-size: inherit;\">The active session doesn&#8217;t appear because the database only contains null values after a start record has been inserted<\/span> <\/li><\/ul>\n\n\n\n<ul><li> <span style=\"font-size: inherit;\">Some records may be lost on the way (between routers and the Radius server). The Radius protocol runs on UDP, which doesn&#8217;t support acknowledgements.<\/span> <\/li><\/ul>\n\n\n\n<ul><li> <span style=\"font-size: inherit;\">Any usage over 4GB is reset to 0 if the session is not interrupted before then. The format of the field is a 32 bit unsigned value as defined in the RFC.<\/span> <\/li><\/ul>\n\n\n\n<p>A number of issues arise for those who want to extract this data and do something out of it. No restrictions can be applied for example. Nor collect values and export them to a billing software. Graphs display nul values if the user hasn&#8217;t disconnected for a while. Even though there are some ways to send updates from the Network Access Server (NAS), we weren&#8217;t happy with this as the stop record time remains 00-00-00 and a query might become complicated and time-consuming if previous stop-records were lost on the way. In the best scenario, traffic can be collected (including the active session), but it remains impossible to know your Freeradius daily accounting accurately for instance.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><br>Method<\/h2>\n\n\n\n<p>Some suggested to reset all connections at regular intervals but why should customers be disconnected to collect a fair amount of traffic? How could we justify this for an always-on connection? Some simple modifications can fix these small issues. Let&#8217;s check briefly what can be done:<br>Traffic is not collected at regular intervals. We could send updates from the router every so often which is a good step. But that&#8217;s not sufficient as the new data overwrites the previous amount of traffic. A fair way to proceed is to create a new stop and start record instead from this update. This would minimize the missing last record impact if the time period is small enough. Lost records wouldn&#8217;t be a problem either if we compare the new value against the last received.<br>Finally, we can work around the 4GB limit with Acct-Input-Gigawords and Acct-Input-Gigawords Radius extension attributes if your router supports it (Method we are going to use here). If your hardware doesn&#8217;t support it, a few modifications in the SQL code below would do. It&#8217;s been tested in a live environment with 3 Radius servers and over 5000 customers. Data is then transferred to a billing software.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><br>Before You Start<\/h2>\n\n\n\n<p>We have applied these changes on Fedora Core and Solaris with <a href=\"http:\/\/www.freeradius.org\">Freeradius<\/a> 1.1.3. The operating system shouldn&#8217;t really matter as most changes are made on SQL queries. You will need a running setup of Freeradius and <a href=\"\/en\/category\/database\/mysql\">Mysql<\/a>. You need a Mysql version that supports stored procedures. Make also sure your router (NAS) supports Radius accounting updates and Acct-Input-Gigawords attributes (usually the case for <a href=\"\/en\/category\/networking\/cisco\">Cisco<\/a>).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><br>Adding Support for Radius Extension Attributes<\/h2>\n\n\n\n<p>As mentionned in <a href=\"http:\/\/www.ietf.org\/rfc\/rfc2869.txt\">RFC2869<\/a>, additional attributes were created to answer certain needs through various useful functions. Acct-Input-Gigawords and Acct-Output-Gigawords attributes indicate how many times Acct-Input-Octets and Acct-Output-Octets counters were reset to 0 after reaching 2^32. They are present in Stop and Interim-Update records, which is just what we want.<br>You can activate this on a Cisco router by entering<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">aaa accounting gigawords<\/code><\/pre>\n\n\n\n<p>We don&#8217;t need to create extra columns in the Radius database; We&#8217;ll calculate the new amount of traffic on the fly. The benefits are it keeps the original structure of the database and accounting scripts you may have written don&#8217;t need to be modified. On the other hand, it saves a lot of extra space.<br>The second modification is done in the SQL query.<\/p>\n\n\n\n<p><i>Note<\/i> You will be asked to reload the router to apply the new settings. Do this at a convenient time.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><br>Configuring the NAS to send accounting update<\/h2>\n\n\n\n<p>There are 2 ways to achieve this. You either configure your router (NAS) to send regular accounting updates to the Radius server, either add an extra parameter in the customer&#8217;s details. We&#8217;d rather do it on the router as it takes precedence over the Radius parameter. We are using a Cisco router for which the command is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">aaa accounting update periodic 180<\/code><\/pre>\n\n\n\n<p>This sends an update every 3 hours which should be sufficient to get your Freeradius daily accounting. I should mention that this applies when the customer&#8217;s connection is established, meaning you need to reset appropriate interfaces if you don&#8217;t want to wait for the connections to reset.<\/p>\n\n\n\n<p><i>Caution<\/i> Using the <i>aaa accounting update periodic<\/i> command can cause heavy congestion when many users are logged in to the network.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><br>Defining New Queries for Update and Stop Records<\/h2>\n\n\n\n<p>The SQL code for update and stop queries needs to be replaced. We call stored procedures because there&#8217;s a bit of processssing to be done. Insert into Mysql Radius database these 2 procedures.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"sql\" class=\"language-sql\">DROP PROCEDURE IF EXISTS radius.acct_update;\ndelimiter \/\/\nCREATE PROCEDURE radius.acct_update(\n  IN S DATETIME,\n  IN Acct_Session_Time INT(12),\n  IN Acct_Input_Octets BIGINT(20),\n  IN Acct_Output_Octets BIGINT(20),\n  IN Acct_Terminate_Cause VARCHAR(32),\n  IN Acct_Session_Id varchar(64),\n  IN SQL_User_Name VARCHAR(64),\n  IN NAS_IP_Address VARCHAR(15),\n  IN Acct_Unique_Session_Id VARCHAR(32),\n  IN Realm VARCHAR(64),\n  IN NAS_Port VARCHAR(15),\n  IN NAS_Port_Type VARCHAR(32),\n  IN Acct_Authentic VARCHAR(32),\n  IN Called_Station_Id VARCHAR(50),\n  IN Calling_Station_Id VARCHAR(50),\n  IN Service_Type VARCHAR(32),\n  IN Framed_Protocol VARCHAR(32),\n  IN Framed_IP_Address VARCHAR(15)\n)\nBEGIN\n  DECLARE Prev_Acct_Input_Octets BIGINT(20);\n  DECLARE Prev_Acct_Output_Octets BIGINT(20);\n  DECLARE Prev_Acct_Session_Time INT(12);\n\n  <i># Collect traffic previous values<\/i>\n  SELECT SUM(AcctInputOctets), SUM(AcctOutputOctets), SUM(AcctSessionTime)\n    INTO Prev_Acct_Input_Octets, Prev_Acct_Output_Octets, Prev_Acct_Session_Time\n    FROM radacct\n    WHERE AcctSessionId = Acct_Session_Id\n    AND UserName = SQL_User_Name\n    AND NASIPAddress = NAS_IP_Address\n    AND ( AcctStopTime &gt; 0);\n\n  <i># Set values to 0 when no previous records<\/i>\n  IF (Prev_Acct_Session_Time IS NULL) THEN\n    SET Prev_Acct_Session_Time = 0;\n    SET Prev_Acct_Input_Octets = 0;\n    SET Prev_Acct_Output_Octets = 0;\n  END IF;\n\n  <i># Update record with new traffic<\/i>\n  UPDATE radacct SET AcctStopTime = S,\n    AcctSessionTime = (Acct_Session_Time - Prev_Acct_Session_Time),\n    AcctInputOctets = (Acct_Input_Octets - Prev_Acct_Input_Octets),\n    AcctOutputOctets = (Acct_Output_Octets - Prev_Acct_Output_Octets),\n    AcctTerminateCause = Acct_Terminate_Cause\n    WHERE AcctSessionId = Acct_Session_Id\n    AND UserName = SQL_User_Name\n    AND NASIPAddress = NAS_IP_Address\n    AND (AcctStopTime IS NULL OR AcctStopTime = 0);\n\n  <i># Create new record<\/i>\n  INSERT INTO radacct\n   (AcctSessionId, AcctUniqueId, UserName,\n    Realm, NASIPAddress, NASPortId, NASPortType,\n    AcctStartTime, AcctStopTime, AcctSessionTime,\n    AcctAuthentic, AcctInputOctets, AcctOutputOctets,\n    CalledStationId, CallingStationId, AcctTerminateCause,\n    ServiceType, FramedProtocol, FramedIPAddress,\n    AcctStartDelay, AcctStopDelay)\n  VALUES\n   (Acct_Session_Id, Acct_Unique_Session_Id, SQL_User_Name,\n    Realm, NAS_IP_Address, NAS_Port, NAS_Port_Type,\n    S, '0', '0',\n    Acct_Authentic, '0', '0',\n    Called_Station_Id, Calling_Station_Id, '',\n    Service_Type, Framed_Protocol, Framed_IP_Address,\n    '0', '0');\nEND;\n\/\/\ndelimiter ;<\/code><\/pre>\n\n\n\n<p><i>Note<\/i> You need to update the table names if they have been changed in sql.conf. We use the default value from the file and database structure &#8220;Radacct&#8221;.<br><br>We need to retrieve the traffic from previous updates because the router sends a counter and not the amount of traffic sent during that period of time. A stop record is then created with the traffic difference. The stop query needs to be modified as well:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"sql\" class=\"language-sql\">DROP PROCEDURE IF EXISTS radius.acct_stop;\ndelimiter \/\/\nCREATE PROCEDURE radius.acct_stop(\n  IN S DATETIME,\n  IN Acct_Session_Time INT(12),\n  IN Acct_Input_Octets BIGINT(20),\n  IN Acct_Output_Octets BIGINT(20),\n  IN Acct_Terminate_Cause VARCHAR(32),\n  IN Acct_Delay_Time INT(12),\n  IN Connect_Info VARCHAR(32),\n  IN Acct_Session_Id varchar(64),\n  IN SQL_User_Name VARCHAR(64),\n  IN NAS_IP_Address VARCHAR(15)\n)\nBEGIN\n  DECLARE Prev_Acct_Input_Octets BIGINT(20);\n  DECLARE Prev_Acct_Output_Octets BIGINT(20);\n  DECLARE Prev_Acct_Session_Time INT(12);\n\n  <i># Collect traffic previous values<\/i>\n  SELECT SUM(AcctInputOctets), SUM(AcctOutputOctets), SUM(AcctSessionTime)\n    INTO Prev_Acct_Input_Octets, Prev_Acct_Output_Octets, Prev_Acct_Session_Time\n    FROM radacct\n    WHERE AcctSessionId = Acct_Session_Id\n    AND UserName = SQL_User_Name\n    AND NASIPAddress = NAS_IP_Address\n    AND ( AcctStopTime &gt; 0);\n\n  <i># Set values to 0 when no previous records<\/i>\n  IF (Prev_Acct_Session_Time IS NULL) THEN\n    SET Prev_Acct_Session_Time = 0;\n    SET Prev_Acct_Input_Octets = 0;\n    SET Prev_Acct_Output_Octets = 0;\n  END IF;\n\n  <i># Update record with new traffic<\/i>\n  UPDATE radacct SET AcctStopTime = S,\n    AcctSessionTime = (Acct_Session_Time - Prev_Acct_Session_Time),\n    AcctInputOctets = (Acct_Input_Octets - Prev_Acct_Input_Octets),\n    AcctOutputOctets = (Acct_Output_Octets - Prev_Acct_Output_Octets),\n    AcctTerminateCause = Acct_Terminate_Cause,\n    AcctStopDelay = Acct_Delay_Time,\n    ConnectInfo_stop = Connect_Info\n    WHERE AcctSessionId = Acct_Session_Id\n    AND UserName = SQL_User_Name\n    AND NASIPAddress = NAS_IP_Address\n    AND (AcctStopTime IS NULL OR AcctStopTime=0);\nEND;\n\/\/\ndelimiter ;<\/code><\/pre>\n\n\n\n<p><br>This is the same as the original query except that it retrieves the previous traffic again. If you don&#8217;t use accounting updates, this will do the same as before.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><br>Updating sql.conf on Freeradius<\/h2>\n\n\n\n<p>The last bit is to replace the SQL code in sql.conf, to call the 2 procedures above.<br>Replace <i>accounting_update_query<\/i> with<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"sql\" class=\"language-sql\">accounting_update_query = \" \\\n CALL acct_update( \\\n          '%S', \\\n          '%{Acct-Session-Time}', \\\n          '%{%{Acct-Input-Gigawords}:-0}'  &lt;&lt; 32 | '%{%{Acct-Input-Octets}:-0}', \\\n          '%{%{Acct-Output-Gigawords}:-0}' &lt;&lt; 32 | '%{%{Acct-Output-Octets}:-0}', \\\n          'Acct-Update', \\\n          '%{Acct-Session-Id}', \\\n          '%{SQL-User-Name}', \\\n          '%{NAS-IP-Address}', \\\n          '%{Acct-Unique-Session-Id}', \\\n          '%{Realm}', \\\n          '%{NAS-Port}', \\\n          '%{NAS-Port-Type}', \\\n          '%{Acct-Authentic}', \\\n          '%{Called-Station-Id}', \\\n          '%{Calling-Station-Id}', \\\n          '%{Service-Type}', \\\n          '%{Framed-Protocol}', \\\n          '%{Framed-IP-Address}')\"<\/code><\/pre>\n\n\n\n<p>&nbsp;<br>and <i>accounting_stop_query<\/i> with<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"sql\" class=\"language-sql\">accounting_stop_query = \" \\\nCALL acct_stop( \\\n          '%S', \\\n          '%{Acct-Session-Time}', \\\n          '%{%{Acct-Input-Gigawords}:-0}' &lt;&lt; 32 | '%{%{Acct-Input-Octets}:-0}', \\\n          '%{%{Acct-Output-Gigawords}:-0}' &lt;&lt; 32 | '%{%{Acct-Output-Octets}:-0}', \\\n          '%{Acct-Terminate-Cause}', \\\n          '%{%{Acct-Delay-Time}:-0}', \\\n          '%{Connect-Info}', \\\n          '%{Acct-Session-Id}', \\\n          '%{SQL-User-Name}', \\\n          '%{NAS-IP-Address}')\"<\/code><\/pre>\n\n\n\n<p>Reboot the radius server to apply the new settings, and you will now get Freeradius daily accounting records splitting traffic from long sessions!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>We have seen a few posts on Freeradius user list and other forums asking how to collect accounting periodically. The Radius protocol provides accounting but not in the way that many would like. Here&#8217;s a short list of things we would like to modify or improve: Traffic is not collected at regular intervalsAs a result, [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[21,3],"tags":[12,388,5,384,385],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.8.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Netexpertise - Daily Accounting in Freeradius<\/title>\n<meta name=\"description\" content=\"Split long FreeRadius sessions and get a more accurate accounting reporting for usage on a day to day basis\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.netexpertise.eu\/en\/networking\/freeradius\/daily-accounting.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Netexpertise - Daily Accounting in Freeradius\" \/>\n<meta property=\"og:description\" content=\"Split long FreeRadius sessions and get a more accurate accounting reporting for usage on a day to day basis\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.netexpertise.eu\/en\/networking\/freeradius\/daily-accounting.html\" \/>\n<meta property=\"og:site_name\" content=\"Netexpertise\" \/>\n<meta property=\"article:published_time\" content=\"2009-05-30T15:50:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-10-10T15:18:07+00:00\" \/>\n<meta name=\"author\" content=\"dave\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@netexpertise\" \/>\n<meta name=\"twitter:site\" content=\"@netexpertise\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.netexpertise.eu\/en\/networking\/freeradius\/daily-accounting.html\",\"url\":\"https:\/\/www.netexpertise.eu\/en\/networking\/freeradius\/daily-accounting.html\",\"name\":\"Netexpertise - Daily Accounting in Freeradius\",\"isPartOf\":{\"@id\":\"https:\/\/www.netexpertise.eu\/en\/#website\"},\"datePublished\":\"2009-05-30T15:50:00+00:00\",\"dateModified\":\"2021-10-10T15:18:07+00:00\",\"author\":{\"@id\":\"https:\/\/www.netexpertise.eu\/en\/#\/schema\/person\/cb4cd666549d22e9070ec1cfc1a496fa\"},\"description\":\"Split long FreeRadius sessions and get a more accurate accounting reporting for usage on a day to day basis\",\"breadcrumb\":{\"@id\":\"https:\/\/www.netexpertise.eu\/en\/networking\/freeradius\/daily-accounting.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.netexpertise.eu\/en\/networking\/freeradius\/daily-accounting.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.netexpertise.eu\/en\/networking\/freeradius\/daily-accounting.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.netexpertise.eu\/en\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Daily Accounting in Freeradius\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.netexpertise.eu\/en\/#website\",\"url\":\"https:\/\/www.netexpertise.eu\/en\/\",\"name\":\"Netexpertise\",\"description\":\"Systems \/ Networks \/ DevOps\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.netexpertise.eu\/en\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.netexpertise.eu\/en\/#\/schema\/person\/cb4cd666549d22e9070ec1cfc1a496fa\",\"name\":\"dave\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.netexpertise.eu\/en\/#\/schema\/person\/image\/\",\"url\":\"http:\/\/1.gravatar.com\/avatar\/1129916e1f4955bd632f27f836f64e55?s=96&d=mm&r=g\",\"contentUrl\":\"http:\/\/1.gravatar.com\/avatar\/1129916e1f4955bd632f27f836f64e55?s=96&d=mm&r=g\",\"caption\":\"dave\"},\"sameAs\":[\"http:\/\/www.netexpertise.eu\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Netexpertise - Daily Accounting in Freeradius","description":"Split long FreeRadius sessions and get a more accurate accounting reporting for usage on a day to day basis","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.netexpertise.eu\/en\/networking\/freeradius\/daily-accounting.html","og_locale":"en_US","og_type":"article","og_title":"Netexpertise - Daily Accounting in Freeradius","og_description":"Split long FreeRadius sessions and get a more accurate accounting reporting for usage on a day to day basis","og_url":"https:\/\/www.netexpertise.eu\/en\/networking\/freeradius\/daily-accounting.html","og_site_name":"Netexpertise","article_published_time":"2009-05-30T15:50:00+00:00","article_modified_time":"2021-10-10T15:18:07+00:00","author":"dave","twitter_card":"summary_large_image","twitter_creator":"@netexpertise","twitter_site":"@netexpertise","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.netexpertise.eu\/en\/networking\/freeradius\/daily-accounting.html","url":"https:\/\/www.netexpertise.eu\/en\/networking\/freeradius\/daily-accounting.html","name":"Netexpertise - Daily Accounting in Freeradius","isPartOf":{"@id":"https:\/\/www.netexpertise.eu\/en\/#website"},"datePublished":"2009-05-30T15:50:00+00:00","dateModified":"2021-10-10T15:18:07+00:00","author":{"@id":"https:\/\/www.netexpertise.eu\/en\/#\/schema\/person\/cb4cd666549d22e9070ec1cfc1a496fa"},"description":"Split long FreeRadius sessions and get a more accurate accounting reporting for usage on a day to day basis","breadcrumb":{"@id":"https:\/\/www.netexpertise.eu\/en\/networking\/freeradius\/daily-accounting.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.netexpertise.eu\/en\/networking\/freeradius\/daily-accounting.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.netexpertise.eu\/en\/networking\/freeradius\/daily-accounting.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.netexpertise.eu\/en"},{"@type":"ListItem","position":2,"name":"Daily Accounting in Freeradius"}]},{"@type":"WebSite","@id":"https:\/\/www.netexpertise.eu\/en\/#website","url":"https:\/\/www.netexpertise.eu\/en\/","name":"Netexpertise","description":"Systems \/ Networks \/ DevOps","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.netexpertise.eu\/en\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.netexpertise.eu\/en\/#\/schema\/person\/cb4cd666549d22e9070ec1cfc1a496fa","name":"dave","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.netexpertise.eu\/en\/#\/schema\/person\/image\/","url":"http:\/\/1.gravatar.com\/avatar\/1129916e1f4955bd632f27f836f64e55?s=96&d=mm&r=g","contentUrl":"http:\/\/1.gravatar.com\/avatar\/1129916e1f4955bd632f27f836f64e55?s=96&d=mm&r=g","caption":"dave"},"sameAs":["http:\/\/www.netexpertise.eu"]}]}},"_links":{"self":[{"href":"http:\/\/www.netexpertise.eu\/en\/wp-json\/wp\/v2\/posts\/26"}],"collection":[{"href":"http:\/\/www.netexpertise.eu\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.netexpertise.eu\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.netexpertise.eu\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.netexpertise.eu\/en\/wp-json\/wp\/v2\/comments?post=26"}],"version-history":[{"count":0,"href":"http:\/\/www.netexpertise.eu\/en\/wp-json\/wp\/v2\/posts\/26\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.netexpertise.eu\/en\/wp-json\/wp\/v2\/media?parent=26"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.netexpertise.eu\/en\/wp-json\/wp\/v2\/categories?post=26"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.netexpertise.eu\/en\/wp-json\/wp\/v2\/tags?post=26"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}