<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>VyOS - Blog</title>
    <link>https://blog.vyos.io</link>
    <description>VyOS Platform Project news and updates 
All about development and project life in  our blog</description>
    <language>en</language>
    <pubDate>Tue, 19 Dec 2023 15:53:53 GMT</pubDate>
    <dc:date>2023-12-19T15:53:53Z</dc:date>
    <dc:language>en</dc:language>
    <item>
      <title>VyOS 1.3.5 security release</title>
      <link>https://blog.vyos.io/vyos-1.3.5-release</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-1.3.5-release" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/Vyos%201.3.5%20LTS.png" alt="1.3.5 LTS" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;Hello, Сommunity!&lt;/p&gt; 
&lt;p&gt;VyOS 1.3.5/Equuleus LTS release &lt;span&gt;is now officially available for download for customers and contributors. It includes fixes for two security vulnerabilities and a few bugs. One vulnerability is related to the HTTPS API, and the other is in the BGP daemon. Even though they require specific configurations and conditions to exploit, we encourage everyone to update. Images for on-premises deployment and for upgrade are already available, and cloud marketplace listing updates are in progress.&lt;br&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <content:encoded>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-1.3.5-release" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/Vyos%201.3.5%20LTS.png" alt="1.3.5 LTS" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;Hello, Сommunity!&lt;/p&gt; 
&lt;p&gt;VyOS 1.3.5/Equuleus LTS release &lt;span&gt;is now officially available for download for customers and contributors. It includes fixes for two security vulnerabilities and a few bugs. One vulnerability is related to the HTTPS API, and the other is in the BGP daemon. Even though they require specific configurations and conditions to exploit, we encourage everyone to update. Images for on-premises deployment and for upgrade are already available, and cloud marketplace listing updates are in progress.&lt;br&gt;&lt;/span&gt;&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2Fvyos-1.3.5-release&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>rolling release</category>
      <category>security</category>
      <category>api</category>
      <category>1.2</category>
      <category>1.3</category>
      <category>1.4</category>
      <pubDate>Fri, 15 Dec 2023 19:37:19 GMT</pubDate>
      <author>daniil@sentrium.io (Daniil Baturin)</author>
      <guid>https://blog.vyos.io/vyos-1.3.5-release</guid>
      <dc:date>2023-12-15T19:37:19Z</dc:date>
    </item>
    <item>
      <title>VyOS 1.2.9-S1 maintenance release</title>
      <link>https://blog.vyos.io/vyos-1.2.9-s1-maintenance-release</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-1.2.9-s1-maintenance-release" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/VyOS%201.2.9-S1.png" alt="VyOS 1.2.9-S1 maintenance release" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;Hello, community!&lt;/p&gt; 
&lt;p&gt;VyOS 1.2.9-S1 maintenance and security release is now available for download to everyone. We planned 1.2.9 to become the last 1.2.x release unless a remotely exploitable vulnerability was discovered. Thankfully, that hasn’t happened yet, but we found that Freexian extended LTS repositories had updates to the base packages that weren't in 1.2.9, including OpenSSL and sudo, so we decided to bring those updates to the community.&lt;/p&gt;</description>
      <content:encoded>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-1.2.9-s1-maintenance-release" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/VyOS%201.2.9-S1.png" alt="VyOS 1.2.9-S1 maintenance release" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;Hello, community!&lt;/p&gt; 
&lt;p&gt;VyOS 1.2.9-S1 maintenance and security release is now available for download to everyone. We planned 1.2.9 to become the last 1.2.x release unless a remotely exploitable vulnerability was discovered. Thankfully, that hasn’t happened yet, but we found that Freexian extended LTS repositories had updates to the base packages that weren't in 1.2.9, including OpenSSL and sudo, so we decided to bring those updates to the community.&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2Fvyos-1.2.9-s1-maintenance-release&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>release</category>
      <category>lts</category>
      <category>1.2</category>
      <pubDate>Wed, 22 Mar 2023 20:54:08 GMT</pubDate>
      <author>daniil@sentrium.io (Daniil Baturin)</author>
      <guid>https://blog.vyos.io/vyos-1.2.9-s1-maintenance-release</guid>
      <dc:date>2023-03-22T20:54:08Z</dc:date>
    </item>
    <item>
      <title>VyOS 1.2.9 maintenance release</title>
      <link>https://blog.vyos.io/vyos-1.2.9-maintenance-release</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-1.2.9-maintenance-release" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/VyOS%201.2.9%20Release.png" alt="1.2.9 crux release" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;Hello, Community!&lt;/p&gt; 
&lt;p&gt;VyOS 1.2.9, the last planned maintenance release of the Crux branch, is now available for subscribers to download. This marks the end of the GA phase for 1.2.x: we will only make any new releases if remotely-exploitable vulnerabilities are found in its code.&lt;/p&gt; 
&lt;p&gt;We encourage everyone to migrate to VyOS 1.3.x, and we are happy to help with it if needed.&lt;/p&gt;</description>
      <content:encoded>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-1.2.9-maintenance-release" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/VyOS%201.2.9%20Release.png" alt="1.2.9 crux release" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;Hello, Community!&lt;/p&gt; 
&lt;p&gt;VyOS 1.2.9, the last planned maintenance release of the Crux branch, is now available for subscribers to download. This marks the end of the GA phase for 1.2.x: we will only make any new releases if remotely-exploitable vulnerabilities are found in its code.&lt;/p&gt; 
&lt;p&gt;We encourage everyone to migrate to VyOS 1.3.x, and we are happy to help with it if needed.&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2Fvyos-1.2.9-maintenance-release&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>frr</category>
      <category>release</category>
      <category>1.2</category>
      <category>eol</category>
      <pubDate>Fri, 02 Dec 2022 05:00:00 GMT</pubDate>
      <author>daniil@sentrium.io (Daniil Baturin)</author>
      <guid>https://blog.vyos.io/vyos-1.2.9-maintenance-release</guid>
      <dc:date>2022-12-02T05:00:00Z</dc:date>
    </item>
    <item>
      <title>VyOS 1.3.0-epa3 release</title>
      <link>https://blog.vyos.io/vyos-1.3.0-epa3-release</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-1.3.0-epa3-release" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/VyOS%201.3-epa3.png" alt="vyos 1.3 epa3" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;Hello!&lt;/p&gt; 
&lt;p&gt;VyOS 1.3.0-epa3 release is available now. The generic ISO image is &lt;a href="https://vyos.net/get/snapshots/#vyos-1.3.0-epa3"&gt;available publicly&lt;/a&gt;, while subscribers can access additional flavors through the support portal. This release fixes a number of bugs found in earlier versions. If no serious bugs are found, it will also become the last "early production access" release and the next image will be the first official 1.3.0 LTS release.&lt;/p&gt;</description>
      <content:encoded>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-1.3.0-epa3-release" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/VyOS%201.3-epa3.png" alt="vyos 1.3 epa3" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;Hello!&lt;/p&gt; 
&lt;p&gt;VyOS 1.3.0-epa3 release is available now. The generic ISO image is &lt;a href="https://vyos.net/get/snapshots/#vyos-1.3.0-epa3"&gt;available publicly&lt;/a&gt;, while subscribers can access additional flavors through the support portal. This release fixes a number of bugs found in earlier versions. If no serious bugs are found, it will also become the last "early production access" release and the next image will be the first official 1.3.0 LTS release.&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2Fvyos-1.3.0-epa3-release&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>release candidate</category>
      <category>epa</category>
      <category>1.2</category>
      <category>1.3</category>
      <pubDate>Fri, 05 Nov 2021 21:26:08 GMT</pubDate>
      <author>daniil@sentrium.io (Daniil Baturin)</author>
      <guid>https://blog.vyos.io/vyos-1.3.0-epa3-release</guid>
      <dc:date>2021-11-05T21:26:08Z</dc:date>
    </item>
    <item>
      <title>VyOS Project July 2021 Update</title>
      <link>https://blog.vyos.io/vyos-project-july-2021-update</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-project-july-2021-update" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/VyOS%20Project%20July%20update.png" alt="July update picture" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;Hi again!&lt;/p&gt; 
&lt;p&gt;It's time for the progress update for the month of July. We are still on the road to the 1.3.0-epa1 release that will mark the transition of the 1.3/Equuleus branch from experimental to stable and will serve as a platform for ironing out the last bugs.&lt;/p&gt; 
&lt;p&gt;Past 1.3.0-epa1 there will not be any big CLI changes (only extensions), so we are making the last such changes now. The work on the future 1.4 branch hasn't stopped either. Interested in details?&lt;/p&gt; 
&lt;p&gt;Read on!&lt;/p&gt;</description>
      <content:encoded>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-project-july-2021-update" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/VyOS%20Project%20July%20update.png" alt="July update picture" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;Hi again!&lt;/p&gt; 
&lt;p&gt;It's time for the progress update for the month of July. We are still on the road to the 1.3.0-epa1 release that will mark the transition of the 1.3/Equuleus branch from experimental to stable and will serve as a platform for ironing out the last bugs.&lt;/p&gt; 
&lt;p&gt;Past 1.3.0-epa1 there will not be any big CLI changes (only extensions), so we are making the last such changes now. The work on the future 1.4 branch hasn't stopped either. Interested in details?&lt;/p&gt; 
&lt;p&gt;Read on!&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2Fvyos-project-july-2021-update&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>project updates</category>
      <category>1.2</category>
      <category>1.3</category>
      <category>1.4</category>
      <pubDate>Sun, 08 Aug 2021 16:55:57 GMT</pubDate>
      <author>e.altunbas@vyos.io (Erkin Batu Altunbas)</author>
      <guid>https://blog.vyos.io/vyos-project-july-2021-update</guid>
      <dc:date>2021-08-08T16:55:57Z</dc:date>
    </item>
    <item>
      <title>VyOS Project May/June 2021 Update</title>
      <link>https://blog.vyos.io/vyos-project-may-2021-update</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-project-may-2021-update" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/Vyos-Emails/img%20(2).png" alt="VyOS Project May/June 2021 Update" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;Hello everyone,&lt;/p&gt; 
&lt;p&gt;it's time for the progress update for the months of May and June.&lt;/p&gt; 
&lt;p&gt;We've been a bit too busy with working on the code that we forgot to post a progress update in June—time to fix it! In short: the 1.3 release is on track to become the new LTS in the late summer or early autumn, 1.2.x maintenance continues, and the 1.4 release is gaining new cool features that we can later backport to 1.3.&lt;/p&gt;</description>
      <content:encoded>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-project-may-2021-update" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/Vyos-Emails/img%20(2).png" alt="VyOS Project May/June 2021 Update" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;Hello everyone,&lt;/p&gt; 
&lt;p&gt;it's time for the progress update for the months of May and June.&lt;/p&gt; 
&lt;p&gt;We've been a bit too busy with working on the code that we forgot to post a progress update in June—time to fix it! In short: the 1.3 release is on track to become the new LTS in the late summer or early autumn, 1.2.x maintenance continues, and the 1.4 release is gaining new cool features that we can later backport to 1.3.&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2Fvyos-project-may-2021-update&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>development</category>
      <category>1.2</category>
      <category>update</category>
      <category>1.3</category>
      <category>1.4</category>
      <pubDate>Thu, 22 Jul 2021 15:48:10 GMT</pubDate>
      <author>e.altunbas@vyos.io (Erkin Batu Altunbas)</author>
      <guid>https://blog.vyos.io/vyos-project-may-2021-update</guid>
      <dc:date>2021-07-22T15:48:10Z</dc:date>
    </item>
    <item>
      <title>VyOS 1.2.8 and VyOS 1.3.0-rc5 are available</title>
      <link>https://blog.vyos.io/vyos-1.2.8-and-vyos-1.3.0-rc5-are-available</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-1.2.8-and-vyos-1.3.0-rc5-are-available" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/VyOS-release.png" alt="vyos2021" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;In this post, we announce not one, but two releases at once.&lt;/p&gt; 
&lt;p&gt;First, VyOS 1.2.8 LTS release is available to subscribers and everyone is welcome to build their own images.&lt;/p&gt; 
&lt;p&gt;Second, a VyOS 1.3.0-rc5 release candidate is also available for download for everyone, and we invite everyone to test it on lab VMs with your production configs.&lt;/p&gt;</description>
      <content:encoded>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-1.2.8-and-vyos-1.3.0-rc5-are-available" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/VyOS-release.png" alt="vyos2021" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;In this post, we announce not one, but two releases at once.&lt;/p&gt; 
&lt;p&gt;First, VyOS 1.2.8 LTS release is available to subscribers and everyone is welcome to build their own images.&lt;/p&gt; 
&lt;p&gt;Second, a VyOS 1.3.0-rc5 release candidate is also available for download for everyone, and we invite everyone to test it on lab VMs with your production configs.&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2Fvyos-1.2.8-and-vyos-1.3.0-rc5-are-available&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>release</category>
      <category>release candidate</category>
      <category>crux</category>
      <category>1.2</category>
      <pubDate>Tue, 06 Jul 2021 12:47:04 GMT</pubDate>
      <author>daniil@sentrium.io (Daniil Baturin)</author>
      <guid>https://blog.vyos.io/vyos-1.2.8-and-vyos-1.3.0-rc5-are-available</guid>
      <dc:date>2021-07-06T12:47:04Z</dc:date>
    </item>
    <item>
      <title>The future of VyOS, part 1: release schedule</title>
      <link>https://blog.vyos.io/the-future-of-vyos-part-1-release-schedule</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/the-future-of-vyos-part-1-release-schedule" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/our%20hands.png" alt="future-part-1" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;Hello Community!&lt;/p&gt; 
&lt;p&gt;The future of VyOS is bright!&lt;/p&gt; 
&lt;p&gt;And in this post series, we will talk about our plans for the VyOS Project. This first post focuses on the most immediately important part: the release schedule and support timeline of VyOS 1.2.x and 1.3.x.&lt;/p&gt;</description>
      <content:encoded>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/the-future-of-vyos-part-1-release-schedule" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/our%20hands.png" alt="future-part-1" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;Hello Community!&lt;/p&gt; 
&lt;p&gt;The future of VyOS is bright!&lt;/p&gt; 
&lt;p&gt;And in this post series, we will talk about our plans for the VyOS Project. This first post focuses on the most immediately important part: the release schedule and support timeline of VyOS 1.2.x and 1.3.x.&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2Fthe-future-of-vyos-part-1-release-schedule&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>news</category>
      <category>release</category>
      <category>1.2</category>
      <category>1.3</category>
      <category>vyos project</category>
      <category>1.4</category>
      <pubDate>Sun, 06 Jun 2021 21:27:55 GMT</pubDate>
      <author>daniil@sentrium.io (Daniil Baturin)</author>
      <guid>https://blog.vyos.io/the-future-of-vyos-part-1-release-schedule</guid>
      <dc:date>2021-06-06T21:27:55Z</dc:date>
    </item>
    <item>
      <title>VyOS 1.2.7-epa1 and 1.3.0-rc1 images are available</title>
      <link>https://blog.vyos.io/vyos-1.2.7-epa1-and-1.3.0-rc1-images-are-available</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-1.2.7-epa1-and-1.3.0-rc1-images-are-available" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/VyOS%201.2.7-epa1%20(1).png" alt="vyos updates" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;h3&gt;VyOS 1.2.7-epa1&lt;/h3&gt; 
&lt;p&gt;First, VyOS 1.2.7-epa1 is now available to subscribers, and everyone can build an equivalent image from our repositories. It's a rather big release, with multiple bug fixes and some backports from the 1.3/equuleus branch. We don’t expect any major issues with it, but we encourage everyone to test it on non-critical routers first. If no issues are found within a week or so, we will call if a 1.2.7 release.&lt;/p&gt;</description>
      <content:encoded>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-1.2.7-epa1-and-1.3.0-rc1-images-are-available" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/VyOS%201.2.7-epa1%20(1).png" alt="vyos updates" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;h3&gt;VyOS 1.2.7-epa1&lt;/h3&gt; 
&lt;p&gt;First, VyOS 1.2.7-epa1 is now available to subscribers, and everyone can build an equivalent image from our repositories. It's a rather big release, with multiple bug fixes and some backports from the 1.3/equuleus branch. We don’t expect any major issues with it, but we encourage everyone to test it on non-critical routers first. If no issues are found within a week or so, we will call if a 1.2.7 release.&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2Fvyos-1.2.7-epa1-and-1.3.0-rc1-images-are-available&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>release candidate</category>
      <category>vyos</category>
      <category>epa</category>
      <category>1.2</category>
      <category>1.3</category>
      <pubDate>Fri, 26 Feb 2021 11:56:06 GMT</pubDate>
      <author>daniil@sentrium.io (Daniil Baturin)</author>
      <guid>https://blog.vyos.io/vyos-1.2.7-epa1-and-1.3.0-rc1-images-are-available</guid>
      <dc:date>2021-02-26T11:56:06Z</dc:date>
    </item>
    <item>
      <title>Anonymous stats collection from VyOS routers: we need your opinions!</title>
      <link>https://blog.vyos.io/anonymous-stats-collection-from-vyos</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/anonymous-stats-collection-from-vyos" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/telemetry.png" alt="Anonymous stats collection from VyOS routers: we need your opinions!" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;The T-word. Telemetry. Everyone hates it, not least because the most widely known implementations are unambiguously evil. We hate collection and sale of personal information as much as you do, so before we dive deeper into the subject, let’s set it straight: we will never collect any personally identifiable information from VyOS devices without explicit consent, ever.&lt;/p&gt; 
&lt;p&gt;However, not collecting anything at all does limit our ability to correctly prioritize issues.&amp;nbsp; Now we are thinking of including anonymous stats collection into VyOS images (rolling and LTS alike) by default, and it needs a broad and serious discussion with the community. Our preliminary plan is to enable collection of basic usage stats by default, and provide CLI options to enable more detailed reporting. For that we need to know what people wouldn't hesitate to share by default, so we included a poll in this post.&lt;/p&gt;</description>
      <content:encoded>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/anonymous-stats-collection-from-vyos" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/telemetry.png" alt="Anonymous stats collection from VyOS routers: we need your opinions!" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;The T-word. Telemetry. Everyone hates it, not least because the most widely known implementations are unambiguously evil. We hate collection and sale of personal information as much as you do, so before we dive deeper into the subject, let’s set it straight: we will never collect any personally identifiable information from VyOS devices without explicit consent, ever.&lt;/p&gt; 
&lt;p&gt;However, not collecting anything at all does limit our ability to correctly prioritize issues.&amp;nbsp; Now we are thinking of including anonymous stats collection into VyOS images (rolling and LTS alike) by default, and it needs a broad and serious discussion with the community. Our preliminary plan is to enable collection of basic usage stats by default, and provide CLI options to enable more detailed reporting. For that we need to know what people wouldn't hesitate to share by default, so we included a poll in this post.&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2Fanonymous-stats-collection-from-vyos&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>poll</category>
      <category>vyos</category>
      <category>1.2</category>
      <category>1.3</category>
      <category>telemetry</category>
      <pubDate>Fri, 29 May 2020 16:30:15 GMT</pubDate>
      <author>daniil@sentrium.io (Daniil Baturin)</author>
      <guid>https://blog.vyos.io/anonymous-stats-collection-from-vyos</guid>
      <dc:date>2020-05-29T16:30:15Z</dc:date>
    </item>
    <item>
      <title>VyOS Project March 2020 Update</title>
      <link>https://blog.vyos.io/vyos-project-march-2020-update</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-project-march-2020-update" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/march2020.png" alt="VyOS Project March 2020 Update" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;As usual, we’ve been busy working on the 1.2.x LTS release and on the future 1.3.0 version. One important update is that VyOS 1.2.5-epa2 (early production access) image is now available to subscribers, and everyone can build it from the Crux branch. It includes latest stable release of the FreeRangeRouting protocol stack and multiple bug fixes. We are running that image on our own routers, and if no more serious issues are discovered, we’ll make the final 1.2.5 release and keep working on 1.2.6.&lt;/p&gt;</description>
      <content:encoded>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-project-march-2020-update" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/march2020.png" alt="VyOS Project March 2020 Update" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;As usual, we’ve been busy working on the 1.2.x LTS release and on the future 1.3.0 version. One important update is that VyOS 1.2.5-epa2 (early production access) image is now available to subscribers, and everyone can build it from the Crux branch. It includes latest stable release of the FreeRangeRouting protocol stack and multiple bug fixes. We are running that image on our own routers, and if no more serious issues are discovered, we’ll make the final 1.2.5 release and keep working on 1.2.6.&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2Fvyos-project-march-2020-update&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>vyos</category>
      <category>lts</category>
      <category>project updates</category>
      <category>1.2</category>
      <category>vrf</category>
      <pubDate>Mon, 23 Mar 2020 04:45:45 GMT</pubDate>
      <author>daniil@sentrium.io (Daniil Baturin)</author>
      <guid>https://blog.vyos.io/vyos-project-march-2020-update</guid>
      <dc:date>2020-03-23T04:45:45Z</dc:date>
    </item>
    <item>
      <title>VyOS Project 2020 February Update</title>
      <link>https://blog.vyos.io/vyos-project-2020-february-update</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-project-2020-february-update" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/vyos-2020-feb.png" alt="VyOS Project 2020 February Update" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;We skipped January update as we were busy,&amp;nbsp; but time flies fast so here it is.&lt;/p&gt; 
&lt;p&gt;February update, first in 2020 and with bunch updates!&amp;nbsp;&amp;nbsp;&lt;/p&gt;</description>
      <content:encoded>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-project-2020-february-update" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/vyos-2020-feb.png" alt="VyOS Project 2020 February Update" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;We skipped January update as we were busy,&amp;nbsp; but time flies fast so here it is.&lt;/p&gt; 
&lt;p&gt;February update, first in 2020 and with bunch updates!&amp;nbsp;&amp;nbsp;&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2Fvyos-project-2020-february-update&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>news</category>
      <category>project updates</category>
      <category>1.2</category>
      <pubDate>Thu, 20 Feb 2020 20:37:36 GMT</pubDate>
      <author>yuriy@sentrium.io (Yuriy Andamasov)</author>
      <guid>https://blog.vyos.io/vyos-project-2020-february-update</guid>
      <dc:date>2020-02-20T20:37:36Z</dc:date>
    </item>
    <item>
      <title>VyOS 1.2.4 release</title>
      <link>https://blog.vyos.io/vyos-1.2.4-release</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-1.2.4-release" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/%D0%A5%D0%BE.png" alt="Хо" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;Happy new year! I hope you all had a good rest while we preparing this release. It´s been a while from last 1.2.4 EPA but testing went pretty good. Thanks to all who reported issues and worked with us to solve them!&lt;/p&gt;</description>
      <content:encoded>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-1.2.4-release" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/%D0%A5%D0%BE.png" alt="Хо" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;Happy new year! I hope you all had a good rest while we preparing this release. It´s been a while from last 1.2.4 EPA but testing went pretty good. Thanks to all who reported issues and worked with us to solve them!&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2Fvyos-1.2.4-release&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>release</category>
      <category>vyos</category>
      <category>lts</category>
      <category>1.2</category>
      <pubDate>Wed, 01 Jan 2020 22:56:33 GMT</pubDate>
      <author>yuriy@sentrium.io (Yuriy Andamasov)</author>
      <guid>https://blog.vyos.io/vyos-1.2.4-release</guid>
      <dc:date>2020-01-01T22:56:33Z</dc:date>
    </item>
    <item>
      <title>VyOS project news in September</title>
      <link>https://blog.vyos.io/vyos-project-2019-september-update</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-project-2019-september-update" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/%D0%A5%D0%BE.png" alt="Хо" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <content:encoded>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-project-2019-september-update" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/%D0%A5%D0%BE.png" alt="Хо" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2Fvyos-project-2019-september-update&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>news</category>
      <category>release</category>
      <category>vyos</category>
      <category>project updates</category>
      <category>1.2</category>
      <pubDate>Mon, 23 Sep 2019 20:47:41 GMT</pubDate>
      <author>yuriy@sentrium.io (Yuriy Andamasov)</author>
      <guid>https://blog.vyos.io/vyos-project-2019-september-update</guid>
      <dc:date>2019-09-23T20:47:41Z</dc:date>
    </item>
    <item>
      <title>VyOS 1.2.3 release</title>
      <link>https://blog.vyos.io/vyos-1.2.3-release</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-1.2.3-release" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/%D0%A5%D0%BE.png" alt="Хо" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;VyOS 1.2.3-epa1 ("early production access") release images are available for download for customers and active contributors, and everyone is welcome to build it from the latest Crux branch and test it.&lt;/p&gt;</description>
      <content:encoded>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-1.2.3-release" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/%D0%A5%D0%BE.png" alt="Хо" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;VyOS 1.2.3-epa1 ("early production access") release images are available for download for customers and active contributors, and everyone is welcome to build it from the latest Crux branch and test it.&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2Fvyos-1.2.3-release&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>epa</category>
      <category>1.2</category>
      <pubDate>Thu, 05 Sep 2019 09:00:18 GMT</pubDate>
      <author>yuriy@sentrium.io (Yuriy Andamasov)</author>
      <guid>https://blog.vyos.io/vyos-1.2.3-release</guid>
      <dc:date>2019-09-05T09:00:18Z</dc:date>
    </item>
    <item>
      <title>VyOS Project 2019 August update</title>
      <link>https://blog.vyos.io/vyos-project-2019-august-update</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-project-2019-august-update" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/Project%20Bedroom.png" alt="Project Bedroom" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;With cloud support, a simplified installation process, and a potentially much faster VPN, we can proudly say we’ve had a busy month.&lt;/p&gt; 
&lt;p&gt;What can you expect from the updates and the VyOS 1.2.3 release?&lt;/p&gt; 
&lt;h2&gt;HTTP API configuration interface and future plans&lt;/h2&gt; 
&lt;p&gt;For a while, the HTTP API server could only be configured and started by hand. Now everyone who wants to try it out can setup it easily:&lt;/p&gt;</description>
      <content:encoded>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-project-2019-august-update" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/Project%20Bedroom.png" alt="Project Bedroom" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;With cloud support, a simplified installation process, and a potentially much faster VPN, we can proudly say we’ve had a busy month.&lt;/p&gt; 
&lt;p&gt;What can you expect from the updates and the VyOS 1.2.3 release?&lt;/p&gt; 
&lt;h2&gt;HTTP API configuration interface and future plans&lt;/h2&gt; 
&lt;p&gt;For a while, the HTTP API server could only be configured and started by hand. Now everyone who wants to try it out can setup it easily:&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2Fvyos-project-2019-august-update&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>changes</category>
      <category>crux</category>
      <category>hardware</category>
      <category>project updates</category>
      <category>1.2</category>
      <pubDate>Mon, 05 Aug 2019 19:06:46 GMT</pubDate>
      <author>daniil@sentrium.io (Daniil Baturin)</author>
      <guid>https://blog.vyos.io/vyos-project-2019-august-update</guid>
      <dc:date>2019-08-05T19:06:46Z</dc:date>
    </item>
    <item>
      <title>VyOS 1.2.2 maintenance release</title>
      <link>https://blog.vyos.io/vyos-1.2.2-maintenance-release</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-1.2.2-maintenance-release" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/%D0%A5%D0%BE.png" alt="Хо" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;VyOS 1.2.2 maintenance release is now available. Our customers and active contributors who have a subscription can download the images from the support portal, and everyone can also build it from the &lt;code&gt;crux&lt;/code&gt; branch of the &lt;a href="https://github.com/vyos/vyos-build/"&gt;vyos-build&lt;/a&gt; repository.&lt;/p&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt; 
&lt;p&gt;Cloud images are taking a bit longer to complete, but they also will be available in a couple of days.&amp;nbsp; Images for Amazon EC2 and Microsoft Azure are already available.&lt;/p&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt; 
&lt;p&gt;We are also introducing VyOS on the Packet Cloud with this release.&lt;/p&gt;</description>
      <content:encoded>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-1.2.2-maintenance-release" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/%D0%A5%D0%BE.png" alt="Хо" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;VyOS 1.2.2 maintenance release is now available. Our customers and active contributors who have a subscription can download the images from the support portal, and everyone can also build it from the &lt;code&gt;crux&lt;/code&gt; branch of the &lt;a href="https://github.com/vyos/vyos-build/"&gt;vyos-build&lt;/a&gt; repository.&lt;/p&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt; 
&lt;p&gt;Cloud images are taking a bit longer to complete, but they also will be available in a couple of days.&amp;nbsp; Images for Amazon EC2 and Microsoft Azure are already available.&lt;/p&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt; 
&lt;p&gt;We are also introducing VyOS on the Packet Cloud with this release.&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2Fvyos-1.2.2-maintenance-release&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>1.2</category>
      <pubDate>Mon, 15 Jul 2019 16:04:25 GMT</pubDate>
      <author>daniil@sentrium.io (Daniil Baturin)</author>
      <guid>https://blog.vyos.io/vyos-1.2.2-maintenance-release</guid>
      <dc:date>2019-07-15T16:04:25Z</dc:date>
    </item>
    <item>
      <title>CVE-2019-11477 (TCP SACK panic) and an Intel i40e driver issue</title>
      <link>https://blog.vyos.io/cve-2019-11477-tcp-sack-panic-and-an-intel-i40e-driver-issue</link>
      <description>&lt;p&gt;Recently discovered vulnerability in the Linux kernel's TCP selective acknowledgement processing code potentially allows a remote attacker to cause a kernel panic with a specially crafted packet sequence. You can read the details in &lt;a href="https://github.com/Netflix/security-bulletins/blob/master/advisories/third-party/2019-001.md"&gt;the announcement&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Recently discovered vulnerability in the Linux kernel's TCP selective acknowledgement processing code potentially allows a remote attacker to cause a kernel panic with a specially crafted packet sequence. You can read the details in &lt;a href="https://github.com/Netflix/security-bulletins/blob/master/advisories/third-party/2019-001.md"&gt;the announcement&lt;/a&gt;&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2Fcve-2019-11477-tcp-sack-panic-and-an-intel-i40e-driver-issue&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>security</category>
      <category>kernel</category>
      <category>1.2</category>
      <pubDate>Tue, 18 Jun 2019 20:18:24 GMT</pubDate>
      <author>daniil@sentrium.io (Daniil Baturin)</author>
      <guid>https://blog.vyos.io/cve-2019-11477-tcp-sack-panic-and-an-intel-i40e-driver-issue</guid>
      <dc:date>2019-06-18T20:18:24Z</dc:date>
    </item>
    <item>
      <title>VyOS 1.2.1 release</title>
      <link>https://blog.vyos.io/vyos-1.2.1-release</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-1.2.1-release" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/%D0%A5%D0%BE.png" alt="Хо" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;We have just released VyOS 1.2.1. The images are available to subscribers and public clouds images submitted, and if you build an image from the Crux branch now, it will be equivalent to those images.&lt;/p&gt; 
&lt;p&gt;A number of issues have been resolved, and a small feature was added.&lt;/p&gt;</description>
      <content:encoded>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-1.2.1-release" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/%D0%A5%D0%BE.png" alt="Хо" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;We have just released VyOS 1.2.1. The images are available to subscribers and public clouds images submitted, and if you build an image from the Crux branch now, it will be equivalent to those images.&lt;/p&gt; 
&lt;p&gt;A number of issues have been resolved, and a small feature was added.&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2Fvyos-1.2.1-release&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>release</category>
      <category>vyos</category>
      <category>1.2</category>
      <pubDate>Tue, 16 Apr 2019 04:03:23 GMT</pubDate>
      <author>yuriy@sentrium.io (Yuriy Andamasov)</author>
      <guid>https://blog.vyos.io/vyos-1.2.1-release</guid>
      <dc:date>2019-04-16T04:03:23Z</dc:date>
    </item>
    <item>
      <title>VyOS Project 2019 - March Update</title>
      <link>https://blog.vyos.io/vyos-project-2019-march-update</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-project-2019-march-update" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/vyos_by_oggo_ua-db0fgh4.png" alt="vyos_by_oggo_ua-db0fgh4" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;Hello, Gents!&lt;/p&gt; 
&lt;p&gt;It’s been a while from the last update so I thought it’s a good time to share some news.&lt;/p&gt; 
&lt;p&gt;The team is busy as always, so much done already and much more to be done yet, sometimes it looks like the quantity of the tasks is infinite (and it is). That of course not stopping us, we like challenges and it brings lot of fun too.&amp;nbsp; So here some more info below&lt;/p&gt; 
&lt;p&gt;&lt;br&gt;&lt;/p&gt;</description>
      <content:encoded>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-project-2019-march-update" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/vyos_by_oggo_ua-db0fgh4.png" alt="vyos_by_oggo_ua-db0fgh4" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;Hello, Gents!&lt;/p&gt; 
&lt;p&gt;It’s been a while from the last update so I thought it’s a good time to share some news.&lt;/p&gt; 
&lt;p&gt;The team is busy as always, so much done already and much more to be done yet, sometimes it looks like the quantity of the tasks is infinite (and it is). That of course not stopping us, we like challenges and it brings lot of fun too.&amp;nbsp; So here some more info below&lt;/p&gt; 
&lt;p&gt;&lt;br&gt;&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2Fvyos-project-2019-march-update&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>cloud</category>
      <category>release</category>
      <category>vmware</category>
      <category>ova</category>
      <category>hardware</category>
      <category>1.2</category>
      <pubDate>Mon, 18 Mar 2019 08:00:00 GMT</pubDate>
      <author>yuriy@sentrium.io (Yuriy Andamasov)</author>
      <guid>https://blog.vyos.io/vyos-project-2019-march-update</guid>
      <dc:date>2019-03-18T08:00:00Z</dc:date>
    </item>
    <item>
      <title>VyOS 1.2 (Crux) released</title>
      <link>https://blog.vyos.io/vyos-1.2-crux-released</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-1.2-crux-released" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/%D0%A5%D0%BE.png" alt="Хо" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;VyOS 1.2.0 LTS is here. We are now merging the final bug fixes and preparing the images and cloud listings. Once the images are ready, we’ll send the download links to all subscribers, expect this during next days.&lt;/p&gt;</description>
      <content:encoded>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-1.2-crux-released" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/%D0%A5%D0%BE.png" alt="Хо" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;VyOS 1.2.0 LTS is here. We are now merging the final bug fixes and preparing the images and cloud listings. Once the images are ready, we’ll send the download links to all subscribers, expect this during next days.&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2Fvyos-1.2-crux-released&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>release</category>
      <category>crux</category>
      <category>lts</category>
      <category>1.2</category>
      <pubDate>Mon, 28 Jan 2019 17:10:14 GMT</pubDate>
      <author>yuriy@sentrium.io (Yuriy Andamasov)</author>
      <guid>https://blog.vyos.io/vyos-1.2-crux-released</guid>
      <dc:date>2019-01-28T17:10:14Z</dc:date>
    </item>
    <item>
      <title>VyOS 1.2(Crux) EPA3 available to subscribers</title>
      <link>https://blog.vyos.io/vyos-1.2-epa3-available-to-subscribers</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-1.2-epa3-available-to-subscribers" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/%D0%A5%D0%BE.png" alt="Хо" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;The new VyOS 1.2.0-epa3 early is ready and available&amp;nbsp;to subscribers&lt;/p&gt;</description>
      <content:encoded>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-1.2-epa3-available-to-subscribers" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/%D0%A5%D0%BE.png" alt="Хо" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;The new VyOS 1.2.0-epa3 early is ready and available&amp;nbsp;to subscribers&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2Fvyos-1.2-epa3-available-to-subscribers&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>release</category>
      <category>release candidate</category>
      <category>access subscriptions</category>
      <category>epa</category>
      <category>1.2</category>
      <pubDate>Thu, 17 Jan 2019 07:00:00 GMT</pubDate>
      <author>yuriy@sentrium.io (Yuriy Andamasov)</author>
      <guid>https://blog.vyos.io/vyos-1.2-epa3-available-to-subscribers</guid>
      <dc:date>2019-01-17T07:00:00Z</dc:date>
    </item>
    <item>
      <title>VyOS 1.2(Crux)-EPA2 is here</title>
      <link>https://blog.vyos.io/vyos-1-2-crux-epa2-is-here</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-1-2-crux-epa2-is-here" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/%D0%A5%D0%BE.png" alt="Хо" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;VyOS 1.2.0-epa2 release is now available to subscribers and can be built from the crux branch.&lt;/p&gt;</description>
      <content:encoded>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/vyos-1-2-crux-epa2-is-here" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/%D0%A5%D0%BE.png" alt="Хо" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;VyOS 1.2.0-epa2 release is now available to subscribers and can be built from the crux branch.&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2Fvyos-1-2-crux-epa2-is-here&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>development</category>
      <category>epa</category>
      <category>1.2</category>
      <pubDate>Wed, 02 Jan 2019 07:00:00 GMT</pubDate>
      <author>yuriy@sentrium.io (Yuriy Andamasov)</author>
      <guid>https://blog.vyos.io/vyos-1-2-crux-epa2-is-here</guid>
      <dc:date>2019-01-02T07:00:00Z</dc:date>
    </item>
    <item>
      <title>1.2 LTS Access Subscriptions pre-order launch &amp; VyOS 1.1.x EOL</title>
      <link>https://blog.vyos.io/1.2-lts-access-subscriptions-pre-order-vyos-1.1.x-eol</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/1.2-lts-access-subscriptions-pre-order-vyos-1.1.x-eol" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/V8.png" alt="V8" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;Early Production Access for 1.2.0 LTS binaries is here. We are upgrading our production routers as well as routers of our existing customers and partners, these images also will be used for cloud marketplaces.&amp;nbsp;&lt;/p&gt; 
&lt;p&gt;We are now ready to announce pre-order for Access Subscriptions (find the discount code below) and EOL of VyOS 1.1.x&lt;/p&gt; 
&lt;p&gt;If you ever wanted support VyOS Project, now is a perfect time to do tha&lt;span style="font-size: 14px;"&gt;t.&lt;/span&gt;&lt;/p&gt;</description>
      <content:encoded>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://blog.vyos.io/1.2-lts-access-subscriptions-pre-order-vyos-1.1.x-eol" title="" class="hs-featured-image-link"&gt; &lt;img src="https://blog.vyos.io/hubfs/V8.png" alt="V8" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;Early Production Access for 1.2.0 LTS binaries is here. We are upgrading our production routers as well as routers of our existing customers and partners, these images also will be used for cloud marketplaces.&amp;nbsp;&lt;/p&gt; 
&lt;p&gt;We are now ready to announce pre-order for Access Subscriptions (find the discount code below) and EOL of VyOS 1.1.x&lt;/p&gt; 
&lt;p&gt;If you ever wanted support VyOS Project, now is a perfect time to do tha&lt;span style="font-size: 14px;"&gt;t.&lt;/span&gt;&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2F1.2-lts-access-subscriptions-pre-order-vyos-1.1.x-eol&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>commercial services</category>
      <category>sentrium</category>
      <category>access subscriptions</category>
      <category>commercial support</category>
      <category>1.2</category>
      <pubDate>Wed, 26 Dec 2018 06:44:34 GMT</pubDate>
      <author>yuriy@sentrium.io (Yuriy Andamasov)</author>
      <guid>https://blog.vyos.io/1.2-lts-access-subscriptions-pre-order-vyos-1.1.x-eol</guid>
      <dc:date>2018-12-26T06:44:34Z</dc:date>
    </item>
    <item>
      <title>VyOS 1.2.0-rc11 is available for download</title>
      <link>https://blog.vyos.io/vyos-1.2.0-rc11-is-available-for-download</link>
      <description>&lt;p&gt;VyOS 1.2.0-rc11 is available for download from &lt;a href="https://downloads.vyos.io/?dir=testing/1.2.0-rc11"&gt;https://downloads.vyos.io/?dir=testing/1.2.0-rc11&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;VyOS 1.2.0-rc11 is available for download from &lt;a href="https://downloads.vyos.io/?dir=testing/1.2.0-rc11"&gt;https://downloads.vyos.io/?dir=testing/1.2.0-rc11&lt;/a&gt;.&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2Fvyos-1.2.0-rc11-is-available-for-download&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>release candidate</category>
      <category>1.2</category>
      <pubDate>Mon, 17 Dec 2018 23:20:06 GMT</pubDate>
      <author>daniil@sentrium.io (Daniil Baturin)</author>
      <guid>https://blog.vyos.io/vyos-1.2.0-rc11-is-available-for-download</guid>
      <dc:date>2018-12-17T23:20:06Z</dc:date>
    </item>
    <item>
      <title>Last RC, Early Production Access, Educational and non-profit Access Subscriptions</title>
      <link>https://blog.vyos.io/last-rc-early-production-access-and-announcement-of-educational-and-non-profit-access-subscriptions</link>
      <description>&lt;p&gt;&lt;span style="font-family: georgia, palatino; color: #000000; font-size: 16px;"&gt;Hello Community!&lt;/span&gt;&lt;/p&gt; 
&lt;p&gt;&lt;span style="font-family: georgia, palatino; color: #000000; font-size: 16px;"&gt;We were busy as always doing coding and some more useful stuff, but it’s time for an update.&lt;/span&gt;&lt;/p&gt; 
&lt;span style="font-family: georgia, palatino; color: #000000; font-size: 16px;"&gt;&lt;/span&gt;</description>
      <content:encoded>&lt;p&gt;&lt;span style="font-family: georgia, palatino; color: #000000; font-size: 16px;"&gt;Hello Community!&lt;/span&gt;&lt;/p&gt; 
&lt;p&gt;&lt;span style="font-family: georgia, palatino; color: #000000; font-size: 16px;"&gt;We were busy as always doing coding and some more useful stuff, but it’s time for an update.&lt;/span&gt;&lt;/p&gt; 
&lt;span style="font-family: georgia, palatino; color: #000000; font-size: 16px;"&gt;&lt;/span&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2Flast-rc-early-production-access-and-announcement-of-educational-and-non-profit-access-subscriptions&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>commercial services</category>
      <category>release candidate</category>
      <category>1.2</category>
      <pubDate>Thu, 13 Dec 2018 13:05:24 GMT</pubDate>
      <author>yuriy@sentrium.io (Yuriy Andamasov)</author>
      <guid>https://blog.vyos.io/last-rc-early-production-access-and-announcement-of-educational-and-non-profit-access-subscriptions</guid>
      <dc:date>2018-12-13T13:05:24Z</dc:date>
    </item>
    <item>
      <title>VyOS development news in August and September</title>
      <link>https://blog.vyos.io/vyos-development-news-in-august-and-september</link>
      <description>&lt;div class="posthaven-post-body"&gt; 
 &lt;p&gt;Most importantly: all but one blockers for the 1.2.0 release candidate are now resolved. Quite obviously, for the release candidate, we want all features that worked in 1.1.8 to work fully.&lt;br&gt;&lt;/p&gt; 
 &lt;h2&gt;New release naming scheme&lt;br&gt;&lt;br&gt; &lt;/h2&gt; 
 &lt;p&gt;While we are at it, I'd like to announce a small cosmetic change. Until now, our release branches were named after chemical elements. This naming scheme is getting a bit too common though (OpenDayLight is a well known example, but there are more), we decided to change it to something else to avoid confusion and be a bit more original.&lt;/p&gt; 
 &lt;p&gt;The new branch theme is constellations sorted by area (in square degrees), from the smallest to the largest. The 1.2.0 release will be named Crux. Crux, also known as the Southern Cross, is a small but bright and iconic constellation that is depicted on flags of many countries of the southern hemisphere, such as Australia and New Zealand.&lt;/p&gt; 
 &lt;p&gt;The 1.3.0 release will be named Equuleus, which is the latin for little horse (no relation to My Little Pony).&lt;br&gt;&lt;/p&gt; 
 &lt;h2&gt;Migration to FRR from Quagga&lt;/h2&gt; 
 &lt;p&gt;We have resolved most of the migration problems and latest nightly builds already use FRR instead of our aged Quagga.&lt;/p&gt; 
 &lt;p&gt;It will open a path to implementing many new protocols and features, such as BFD, PIM-SM, and more. What kept us from migrating was lack of support for multiple routing tables, which we need for PBR. FRR added it recently, and by now the last known issue that blocked migration (routes from the default table unintentionally leaking into non-default tables) has been resolved, so we finally can migrate without losing any features.&lt;br&gt;&lt;/p&gt; 
 &lt;p&gt;While I do feel somewhat uneasy about licensing of certain daemons, that are included in the source tree but use a permissive open source license even though they are linked against GPL libraries, we do not believe there's a GPL violation in it as long as the license of the binary package is GPL. Not sharing a modified source code of those daemons with users of the binary package would be a GPL violation, but we keep all source code of every VyOS component public.&lt;/p&gt; 
 &lt;h2&gt;New BGP address-family syntax&lt;/h2&gt; 
 &lt;div&gt;
   This is still in the works, but it will make it to the nightly builds soon. 
 &lt;/div&gt; 
 &lt;div&gt; 
  &lt;br&gt; 
 &lt;/div&gt; 
 &lt;div&gt;
   Originally, VyOS used to have IPv6-specific BGP options under "address-family ipv6-unicast", but IPv4 options were directly under neighbor. The historical reason is that originally IPv6 BGP was not supported at all. This syntax was rather inconsistent, and made it hard to quickly see which options are address family specific. We used to stick with that inconsistent syntax just because it was always done that way. 
  &lt;br&gt; 
 &lt;/div&gt; 
 &lt;div&gt; 
  &lt;br&gt; 
 &lt;/div&gt; 
 &lt;div&gt;
   One behaviour change in FRR made us reconsider that. As you may know, in BGP, routing information exchange is completely orthogonal to the session transport: IPv4 routes can be exchanged over a TCP connection established between IPv4 addresses and vice versa. The default behaviour of most, if not all, BGP implementation is to enable both address families regardless of the session transport. 
 &lt;/div&gt; 
 &lt;div&gt; 
  &lt;br&gt; 
 &lt;/div&gt; 
 &lt;div&gt;
   That behaviour can be changed by an option, in VyOS, that's "set protocols bgp ... parameters default no-ipv4-unicast". The old behaviour of Quagga was to apply that only to sessions whose transport is IPv6, which is just as inconsistent. FRR takes that option literally and disabled IPv4 route advertisments for all peers if it's active, unless peers are explicitly activated for the IPv4 address family. 
 &lt;/div&gt; 
 &lt;div&gt; 
  &lt;br&gt; 
 &lt;/div&gt; 
 &lt;div&gt;
   Making VyOS play well with that development requires an option to do that, and "address-family ipv4-unicast" is an obvious candidate, but introducing a special case doesn't feel write. I think moving original options to that subtree is a cleaner solution. Yes, it does require reprogramming your fingers, but when we start adding support for more address families, the original syntax will only start looking even more like an atavism. 
 &lt;/div&gt; 
 &lt;div&gt; 
  &lt;br&gt; 
 &lt;/div&gt; 
 &lt;div&gt;
   This is what the new syntax will look like: 
 &lt;/div&gt; 
 &lt;pre&gt;dmbaturin@vyos# show protocols bgp&lt;br&gt;
 bgp 64444 {&lt;br&gt;
     address-family {&lt;br&gt;
         ipv4-unicast {&lt;br&gt;
             network 192.168.2.0/24 {&lt;br&gt;
             }&lt;br&gt;
         }&lt;br&gt;
     }&lt;br&gt;
     neighbor 10.91.19.1 {&lt;br&gt;
         address-family {&lt;br&gt;
             ipv4-unicast {&lt;br&gt;
                 allowas-in {&lt;br&gt;
                     number 3&lt;br&gt;
                 }&lt;br&gt;
                 as-override&lt;br&gt;
                 default-originate {&lt;br&gt;
                     route-map Foo&lt;br&gt;
                 }&lt;br&gt;
                 maximum-prefix 50&lt;br&gt;
                 route-map {&lt;br&gt;
                     export Bar&lt;br&gt;
                     import Baz&lt;br&gt;
                 }&lt;br&gt;
                 weight 10&lt;br&gt;
             }&lt;br&gt;
         }&lt;br&gt;
         ebgp-multihop 255&lt;br&gt;
         remote-as 64793&lt;br&gt;
     }&lt;br&gt;
}
&lt;/pre&gt; 
 &lt;h2&gt;Node renaming in migration scripts&lt;/h2&gt; 
 &lt;p&gt;Renaming nodes is a very common task in config syntax migration, but until now it could only be done very indirectly. The old XorpConfigParser simply could not separate names from values and renaming nodes was usually done by regex replace. In the new vyos.configtree you'd need to delete the old node and recreate it from scratch.&lt;/p&gt; 
 &lt;p&gt;Until now. Lately we introduced a function that does it one step. If you, for whatever reason, wanted to rename "service ssh" subtree to "service secure-shell", you could do it like this:&lt;/p&gt; 
 &lt;pre&gt;with open("/config/config.boot") as f:&lt;br&gt;
    config_text = f.read()&lt;br&gt;
config = vyos.configtree.ConfigTree(config.text)
&lt;p&gt;config.rename(["service", "ssh"], "secure-shell")&lt;/p&gt;
&lt;p&gt;print(config.to_string())
&lt;/p&gt;&lt;/pre&gt; 
 &lt;p&gt;One of the reason for introducing it is to make it easier to clean up the DHCP server syntax.&lt;/p&gt; 
 &lt;h2&gt;DHCP server rewrite&lt;/h2&gt; 
 &lt;p&gt;While we are waiting for the FRR fixes, we (Christian Poessinger and I mainly) decided to eliminate one more bit of the legacy code and give DHCP server scripts a rewrite. We also decided to clean up its syntax.&lt;/p&gt; 
 &lt;p&gt;One of the things that always annoyed me was nested nodes for address ranges: "subnet 192.0.2.0/24 start 192.0.2.100 stop 192.0.2.100". Now start and stop will be different nodes, so that they are easy to change independently: "subnet 192.0.2.0/24 range Foo start 192.0.2.100; ... stop 192.0.2.200".&lt;/p&gt; 
 &lt;p&gt;We will also rename the unwieldy "shared-network-name" to "pool". Operational mode commands always used the "pool" terminology, so it will also improve command consistency.&lt;/p&gt; 
 &lt;h2&gt;Wireguard support&lt;/h2&gt; 
 &lt;p&gt;Thanks to our contributor who goes by hagbard, VyOS now supports wireguard. The work on it is nearly complete, and will be covered in a separate post.&lt;br&gt;&lt;/p&gt; 
 &lt;h2&gt;TFTP server support&lt;/h2&gt; 
 &lt;p&gt;Thanks to Christian Poessinger, VyOS now has TFTP server. It was a frequently requested feature, and I think it makes sense for people who keep DHCP on the router and do not want to setup another machine for provisioning phones, think clients and so on.&lt;/p&gt; 
 &lt;p&gt;This is an example of TFTP server with all options set:&lt;/p&gt; 
 &lt;pre&gt;service {&lt;br&gt;
 tftp-server {&lt;br&gt;
     allow-upload&lt;br&gt;
     directory /config/tftp&lt;br&gt;
     listen-address 192.0.2.10&lt;br&gt;
     port 69&lt;br&gt;
 }&lt;br&gt;
}
&lt;/pre&gt; 
 &lt;h2&gt;DMVPN works again&lt;/h2&gt; 
 &lt;div&gt;
   Thanks to our contributor Runar Borge, we have identified the cause and fixed the issues that broke DMVPN after upgrading to the latest upstream StrongSWAN. It should now work as expected. 
 &lt;/div&gt; 
 &lt;div&gt; 
  &lt;br&gt; 
 &lt;/div&gt; 
 &lt;h2&gt;L2TP/IPsec works again&lt;br&gt;&lt;br&gt; &lt;/h2&gt; 
 &lt;div&gt;
   One of the blockers introduced by upgrade to StrongSWAN 5.6 was broken L2TP/IPsec. We've adjusted the config to use the new syntax and now it works again. 
  &lt;br&gt; 
 &lt;/div&gt; 
 &lt;h2&gt;More to come&lt;/h2&gt; 
 &lt;p&gt;We are actively working on getting the codebase ready for the release candidate. Stay tuned for new updates!&lt;br&gt;&lt;/p&gt; 
&lt;/div&gt;</description>
      <content:encoded>&lt;div class="posthaven-post-body"&gt; 
 &lt;p&gt;Most importantly: all but one blockers for the 1.2.0 release candidate are now resolved. Quite obviously, for the release candidate, we want all features that worked in 1.1.8 to work fully.&lt;br&gt;&lt;/p&gt; 
 &lt;h2&gt;New release naming scheme&lt;br&gt;&lt;br&gt; &lt;/h2&gt; 
 &lt;p&gt;While we are at it, I'd like to announce a small cosmetic change. Until now, our release branches were named after chemical elements. This naming scheme is getting a bit too common though (OpenDayLight is a well known example, but there are more), we decided to change it to something else to avoid confusion and be a bit more original.&lt;/p&gt; 
 &lt;p&gt;The new branch theme is constellations sorted by area (in square degrees), from the smallest to the largest. The 1.2.0 release will be named Crux. Crux, also known as the Southern Cross, is a small but bright and iconic constellation that is depicted on flags of many countries of the southern hemisphere, such as Australia and New Zealand.&lt;/p&gt; 
 &lt;p&gt;The 1.3.0 release will be named Equuleus, which is the latin for little horse (no relation to My Little Pony).&lt;br&gt;&lt;/p&gt; 
 &lt;h2&gt;Migration to FRR from Quagga&lt;/h2&gt; 
 &lt;p&gt;We have resolved most of the migration problems and latest nightly builds already use FRR instead of our aged Quagga.&lt;/p&gt; 
 &lt;p&gt;It will open a path to implementing many new protocols and features, such as BFD, PIM-SM, and more. What kept us from migrating was lack of support for multiple routing tables, which we need for PBR. FRR added it recently, and by now the last known issue that blocked migration (routes from the default table unintentionally leaking into non-default tables) has been resolved, so we finally can migrate without losing any features.&lt;br&gt;&lt;/p&gt; 
 &lt;p&gt;While I do feel somewhat uneasy about licensing of certain daemons, that are included in the source tree but use a permissive open source license even though they are linked against GPL libraries, we do not believe there's a GPL violation in it as long as the license of the binary package is GPL. Not sharing a modified source code of those daemons with users of the binary package would be a GPL violation, but we keep all source code of every VyOS component public.&lt;/p&gt; 
 &lt;h2&gt;New BGP address-family syntax&lt;/h2&gt; 
 &lt;div&gt;
   This is still in the works, but it will make it to the nightly builds soon. 
 &lt;/div&gt; 
 &lt;div&gt; 
  &lt;br&gt; 
 &lt;/div&gt; 
 &lt;div&gt;
   Originally, VyOS used to have IPv6-specific BGP options under "address-family ipv6-unicast", but IPv4 options were directly under neighbor. The historical reason is that originally IPv6 BGP was not supported at all. This syntax was rather inconsistent, and made it hard to quickly see which options are address family specific. We used to stick with that inconsistent syntax just because it was always done that way. 
  &lt;br&gt; 
 &lt;/div&gt; 
 &lt;div&gt; 
  &lt;br&gt; 
 &lt;/div&gt; 
 &lt;div&gt;
   One behaviour change in FRR made us reconsider that. As you may know, in BGP, routing information exchange is completely orthogonal to the session transport: IPv4 routes can be exchanged over a TCP connection established between IPv4 addresses and vice versa. The default behaviour of most, if not all, BGP implementation is to enable both address families regardless of the session transport. 
 &lt;/div&gt; 
 &lt;div&gt; 
  &lt;br&gt; 
 &lt;/div&gt; 
 &lt;div&gt;
   That behaviour can be changed by an option, in VyOS, that's "set protocols bgp ... parameters default no-ipv4-unicast". The old behaviour of Quagga was to apply that only to sessions whose transport is IPv6, which is just as inconsistent. FRR takes that option literally and disabled IPv4 route advertisments for all peers if it's active, unless peers are explicitly activated for the IPv4 address family. 
 &lt;/div&gt; 
 &lt;div&gt; 
  &lt;br&gt; 
 &lt;/div&gt; 
 &lt;div&gt;
   Making VyOS play well with that development requires an option to do that, and "address-family ipv4-unicast" is an obvious candidate, but introducing a special case doesn't feel write. I think moving original options to that subtree is a cleaner solution. Yes, it does require reprogramming your fingers, but when we start adding support for more address families, the original syntax will only start looking even more like an atavism. 
 &lt;/div&gt; 
 &lt;div&gt; 
  &lt;br&gt; 
 &lt;/div&gt; 
 &lt;div&gt;
   This is what the new syntax will look like: 
 &lt;/div&gt; 
 &lt;pre&gt;dmbaturin@vyos# show protocols bgp&lt;br&gt;
 bgp 64444 {&lt;br&gt;
     address-family {&lt;br&gt;
         ipv4-unicast {&lt;br&gt;
             network 192.168.2.0/24 {&lt;br&gt;
             }&lt;br&gt;
         }&lt;br&gt;
     }&lt;br&gt;
     neighbor 10.91.19.1 {&lt;br&gt;
         address-family {&lt;br&gt;
             ipv4-unicast {&lt;br&gt;
                 allowas-in {&lt;br&gt;
                     number 3&lt;br&gt;
                 }&lt;br&gt;
                 as-override&lt;br&gt;
                 default-originate {&lt;br&gt;
                     route-map Foo&lt;br&gt;
                 }&lt;br&gt;
                 maximum-prefix 50&lt;br&gt;
                 route-map {&lt;br&gt;
                     export Bar&lt;br&gt;
                     import Baz&lt;br&gt;
                 }&lt;br&gt;
                 weight 10&lt;br&gt;
             }&lt;br&gt;
         }&lt;br&gt;
         ebgp-multihop 255&lt;br&gt;
         remote-as 64793&lt;br&gt;
     }&lt;br&gt;
}
&lt;/pre&gt; 
 &lt;h2&gt;Node renaming in migration scripts&lt;/h2&gt; 
 &lt;p&gt;Renaming nodes is a very common task in config syntax migration, but until now it could only be done very indirectly. The old XorpConfigParser simply could not separate names from values and renaming nodes was usually done by regex replace. In the new vyos.configtree you'd need to delete the old node and recreate it from scratch.&lt;/p&gt; 
 &lt;p&gt;Until now. Lately we introduced a function that does it one step. If you, for whatever reason, wanted to rename "service ssh" subtree to "service secure-shell", you could do it like this:&lt;/p&gt; 
 &lt;pre&gt;with open("/config/config.boot") as f:&lt;br&gt;
    config_text = f.read()&lt;br&gt;
config = vyos.configtree.ConfigTree(config.text)
&lt;p&gt;config.rename(["service", "ssh"], "secure-shell")&lt;/p&gt;
&lt;p&gt;print(config.to_string())
&lt;/p&gt;&lt;/pre&gt; 
 &lt;p&gt;One of the reason for introducing it is to make it easier to clean up the DHCP server syntax.&lt;/p&gt; 
 &lt;h2&gt;DHCP server rewrite&lt;/h2&gt; 
 &lt;p&gt;While we are waiting for the FRR fixes, we (Christian Poessinger and I mainly) decided to eliminate one more bit of the legacy code and give DHCP server scripts a rewrite. We also decided to clean up its syntax.&lt;/p&gt; 
 &lt;p&gt;One of the things that always annoyed me was nested nodes for address ranges: "subnet 192.0.2.0/24 start 192.0.2.100 stop 192.0.2.100". Now start and stop will be different nodes, so that they are easy to change independently: "subnet 192.0.2.0/24 range Foo start 192.0.2.100; ... stop 192.0.2.200".&lt;/p&gt; 
 &lt;p&gt;We will also rename the unwieldy "shared-network-name" to "pool". Operational mode commands always used the "pool" terminology, so it will also improve command consistency.&lt;/p&gt; 
 &lt;h2&gt;Wireguard support&lt;/h2&gt; 
 &lt;p&gt;Thanks to our contributor who goes by hagbard, VyOS now supports wireguard. The work on it is nearly complete, and will be covered in a separate post.&lt;br&gt;&lt;/p&gt; 
 &lt;h2&gt;TFTP server support&lt;/h2&gt; 
 &lt;p&gt;Thanks to Christian Poessinger, VyOS now has TFTP server. It was a frequently requested feature, and I think it makes sense for people who keep DHCP on the router and do not want to setup another machine for provisioning phones, think clients and so on.&lt;/p&gt; 
 &lt;p&gt;This is an example of TFTP server with all options set:&lt;/p&gt; 
 &lt;pre&gt;service {&lt;br&gt;
 tftp-server {&lt;br&gt;
     allow-upload&lt;br&gt;
     directory /config/tftp&lt;br&gt;
     listen-address 192.0.2.10&lt;br&gt;
     port 69&lt;br&gt;
 }&lt;br&gt;
}
&lt;/pre&gt; 
 &lt;h2&gt;DMVPN works again&lt;/h2&gt; 
 &lt;div&gt;
   Thanks to our contributor Runar Borge, we have identified the cause and fixed the issues that broke DMVPN after upgrading to the latest upstream StrongSWAN. It should now work as expected. 
 &lt;/div&gt; 
 &lt;div&gt; 
  &lt;br&gt; 
 &lt;/div&gt; 
 &lt;h2&gt;L2TP/IPsec works again&lt;br&gt;&lt;br&gt; &lt;/h2&gt; 
 &lt;div&gt;
   One of the blockers introduced by upgrade to StrongSWAN 5.6 was broken L2TP/IPsec. We've adjusted the config to use the new syntax and now it works again. 
  &lt;br&gt; 
 &lt;/div&gt; 
 &lt;h2&gt;More to come&lt;/h2&gt; 
 &lt;p&gt;We are actively working on getting the codebase ready for the release candidate. Stay tuned for new updates!&lt;br&gt;&lt;/p&gt; 
&lt;/div&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2Fvyos-development-news-in-august-and-september&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>development</category>
      <category>Uncategorized</category>
      <category>1.2</category>
      <pubDate>Sun, 16 Sep 2018 18:39:00 GMT</pubDate>
      <author>daniil@sentrium.io (Daniil Baturin)</author>
      <guid>https://blog.vyos.io/vyos-development-news-in-august-and-september</guid>
      <dc:date>2018-09-16T18:39:00Z</dc:date>
    </item>
    <item>
      <title>Making first boot scripts just got easier (but building vyos-1x got a bit harder)</title>
      <link>https://blog.vyos.io/making-first-boot-scripts-just-got-easier-but-building-vyos-1x-got-a-bit-harder</link>
      <description>&lt;div class="posthaven-post-body"&gt; 
 &lt;p&gt;As you probably know already, we are working on integrating cloud-init into VyOS, which will allow us to support multiple cloud platforms, and get rid of the custom script for EC2. The hard part of this project is that just allowing cloud-init to do what it normally does in Debian would not produce desired results, we need to make it modify the config.&lt;/p&gt; 
 &lt;p&gt;This raises a question when this should occur and how it should be done. Since modifying running config with scripts has its difficulties in the current backend, and even if it didn't, it still could potentially clash with user's commits, we thought we may want to modify the config.boot file before it's loaded instead.&lt;/p&gt; 
 &lt;p&gt;One advantage is that once we have common functionality implemented, it can be reused not only in cloud-init, but also in the installer, and in custom first boot scripts if someone wants them.&lt;/p&gt; 
 &lt;p&gt;To test this concept, I've added a library names vyos.initialsetup that includes a collection of functions for common settings such as user passwords and keys, host name, default route, name servers, and interface addresses.&lt;/p&gt; 
 &lt;p&gt;Here's an example of a script you can run on your system for demonstration (adjust user name and do ssh-keygen if necessary):&lt;/p&gt; 
 &lt;pre&gt;#!/usr/bin/env python3
&lt;p&gt;import vyos.configtree as vct&lt;br&gt;
import vyos.initialsetup as vis&lt;/p&gt;
&lt;p&gt;with open('/opt/vyatta/etc/config.boot.default') as f:&lt;br&gt;
    config_string = f.read()&lt;/p&gt;
&lt;p&gt;with open('/home/dmbaturin/.ssh/id_rsa.pub') as f:&lt;br&gt;
    key_string = f.read()&lt;/p&gt;
&lt;p&gt;config = vct.ConfigTree(config_string)&lt;/p&gt;
&lt;p&gt;vis.set_user_password(config, 'vyos', 'qwerty')&lt;br&gt;
vis.set_user_ssh_key(config, 'vyos', key_string)&lt;/p&gt;
&lt;p&gt;# Default level is admin&lt;br&gt;
vis.create_user(config, 'dmbaturin', password=None, key=key_string)&lt;/p&gt;
&lt;p&gt;# Default type is ethernet&lt;br&gt;
vis.set_interface_address(config, 'eth0', '192.0.2.10/24')&lt;/p&gt;
&lt;p&gt;vis.set_default_gateway(config, '192.0.2.1')&lt;/p&gt;
&lt;p&gt;vis.set_name_servers(config, ['203.0.113.10', '203.0.113.20'])&lt;/p&gt;
&lt;p&gt;vis.set_host_name(config, 'vyos-test')&lt;/p&gt;
&lt;p&gt;print(str(config))
&lt;/p&gt;&lt;/pre&gt; 
 &lt;p&gt;The script will print a customized config based on the default config.&lt;/p&gt; 
 &lt;h2&gt;Building vyos-1x&lt;br&gt;&lt;br&gt; &lt;/h2&gt; 
 &lt;p&gt;This is the good thing. The bad, or rather somewhat inconvenient thing is that vyos-1x package build now depends on the libvyosconfig0 package that provides the library behind the vyos.configtree module, and it's essential for running unit tests for those modules.&lt;br&gt;&lt;/p&gt; 
 &lt;p&gt;You should add the "deb http://dev.packages.vyos.net/repositories/current/vyos/ current main" repository to the sources.list on your build machine and install &lt;b&gt;libvyosconfig0&lt;/b&gt; with APT, or simply take the file from the repo and install it by hand with dpkg.&lt;/p&gt; 
 &lt;p&gt;I hope the increased reliability we gain from those unit test outweighs the inconvenience of additional setup.&lt;br&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;br&gt;&lt;/p&gt; 
&lt;/div&gt;</description>
      <content:encoded>&lt;div class="posthaven-post-body"&gt; 
 &lt;p&gt;As you probably know already, we are working on integrating cloud-init into VyOS, which will allow us to support multiple cloud platforms, and get rid of the custom script for EC2. The hard part of this project is that just allowing cloud-init to do what it normally does in Debian would not produce desired results, we need to make it modify the config.&lt;/p&gt; 
 &lt;p&gt;This raises a question when this should occur and how it should be done. Since modifying running config with scripts has its difficulties in the current backend, and even if it didn't, it still could potentially clash with user's commits, we thought we may want to modify the config.boot file before it's loaded instead.&lt;/p&gt; 
 &lt;p&gt;One advantage is that once we have common functionality implemented, it can be reused not only in cloud-init, but also in the installer, and in custom first boot scripts if someone wants them.&lt;/p&gt; 
 &lt;p&gt;To test this concept, I've added a library names vyos.initialsetup that includes a collection of functions for common settings such as user passwords and keys, host name, default route, name servers, and interface addresses.&lt;/p&gt; 
 &lt;p&gt;Here's an example of a script you can run on your system for demonstration (adjust user name and do ssh-keygen if necessary):&lt;/p&gt; 
 &lt;pre&gt;#!/usr/bin/env python3
&lt;p&gt;import vyos.configtree as vct&lt;br&gt;
import vyos.initialsetup as vis&lt;/p&gt;
&lt;p&gt;with open('/opt/vyatta/etc/config.boot.default') as f:&lt;br&gt;
    config_string = f.read()&lt;/p&gt;
&lt;p&gt;with open('/home/dmbaturin/.ssh/id_rsa.pub') as f:&lt;br&gt;
    key_string = f.read()&lt;/p&gt;
&lt;p&gt;config = vct.ConfigTree(config_string)&lt;/p&gt;
&lt;p&gt;vis.set_user_password(config, 'vyos', 'qwerty')&lt;br&gt;
vis.set_user_ssh_key(config, 'vyos', key_string)&lt;/p&gt;
&lt;p&gt;# Default level is admin&lt;br&gt;
vis.create_user(config, 'dmbaturin', password=None, key=key_string)&lt;/p&gt;
&lt;p&gt;# Default type is ethernet&lt;br&gt;
vis.set_interface_address(config, 'eth0', '192.0.2.10/24')&lt;/p&gt;
&lt;p&gt;vis.set_default_gateway(config, '192.0.2.1')&lt;/p&gt;
&lt;p&gt;vis.set_name_servers(config, ['203.0.113.10', '203.0.113.20'])&lt;/p&gt;
&lt;p&gt;vis.set_host_name(config, 'vyos-test')&lt;/p&gt;
&lt;p&gt;print(str(config))
&lt;/p&gt;&lt;/pre&gt; 
 &lt;p&gt;The script will print a customized config based on the default config.&lt;/p&gt; 
 &lt;h2&gt;Building vyos-1x&lt;br&gt;&lt;br&gt; &lt;/h2&gt; 
 &lt;p&gt;This is the good thing. The bad, or rather somewhat inconvenient thing is that vyos-1x package build now depends on the libvyosconfig0 package that provides the library behind the vyos.configtree module, and it's essential for running unit tests for those modules.&lt;br&gt;&lt;/p&gt; 
 &lt;p&gt;You should add the "deb http://dev.packages.vyos.net/repositories/current/vyos/ current main" repository to the sources.list on your build machine and install &lt;b&gt;libvyosconfig0&lt;/b&gt; with APT, or simply take the file from the repo and install it by hand with dpkg.&lt;/p&gt; 
 &lt;p&gt;I hope the increased reliability we gain from those unit test outweighs the inconvenience of additional setup.&lt;br&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;br&gt;&lt;/p&gt; 
&lt;/div&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2Fmaking-first-boot-scripts-just-got-easier-but-building-vyos-1x-got-a-bit-harder&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>development</category>
      <category>Uncategorized</category>
      <category>1.2</category>
      <pubDate>Wed, 18 Jul 2018 10:22:25 GMT</pubDate>
      <author>daniil@sentrium.io (Daniil Baturin)</author>
      <guid>https://blog.vyos.io/making-first-boot-scripts-just-got-easier-but-building-vyos-1x-got-a-bit-harder</guid>
      <dc:date>2018-07-18T10:22:25Z</dc:date>
    </item>
    <item>
      <title>Building VyOS images with custom packages just got simpler</title>
      <link>https://blog.vyos.io/building-vyos-images-with-custom-packages-just-got-simpler</link>
      <description>&lt;div class="posthaven-post-body"&gt; 
 &lt;p&gt;While the new build scripts first introduced when we migrated the development branch to jessie made things much simpler for developers and for people who &lt;i&gt;just&lt;/i&gt; want to build the latest VyOS image from source, building an image even simply with a package available from Debian Jessie repos but not present in the VyOS package set by default was still quite an ordeal for a person not familiar with live-build and the structure of our build scripts.&lt;/p&gt; 
 &lt;p&gt;Well, until now. Yesterday I've added ./configure script options that should allow everyone to build a custom image without ever touching the plumbing of the build scripts.&lt;/p&gt; 
 &lt;p&gt;The simplest example, building an image with packages available in Debian Jessie:&lt;/p&gt; 
 &lt;pre&gt;./configure --custom-packages "bsdgames robotfindskitten"&lt;br&gt;
sudo make iso
&lt;/pre&gt; 
 &lt;p&gt;A more interesting example, adding a package from a third party repo signed with its own key. In this case, salt-minion:&lt;/p&gt; 
 &lt;pre&gt;wget https://repo.saltstack.com/apt/debian/8/amd64/2017.7/SALTSTACK-GPG-KEY.pub&lt;br&gt;
./configure --custom-apt-entry "deb http://repo.saltstack.com/apt/debian/8/amd64/2017.7 jessie main" --custom-packages "salt-minion" --custom-apt-key ./SALTSTACK-GPG-KEY.pub&lt;br&gt;
sudo make iso
&lt;/pre&gt; 
 &lt;p&gt;Of course it doesn't guarantee that your image will build or work, but at least it will get you to the debugging phase faster,&lt;br&gt;&lt;/p&gt; 
&lt;/div&gt;</description>
      <content:encoded>&lt;div class="posthaven-post-body"&gt; 
 &lt;p&gt;While the new build scripts first introduced when we migrated the development branch to jessie made things much simpler for developers and for people who &lt;i&gt;just&lt;/i&gt; want to build the latest VyOS image from source, building an image even simply with a package available from Debian Jessie repos but not present in the VyOS package set by default was still quite an ordeal for a person not familiar with live-build and the structure of our build scripts.&lt;/p&gt; 
 &lt;p&gt;Well, until now. Yesterday I've added ./configure script options that should allow everyone to build a custom image without ever touching the plumbing of the build scripts.&lt;/p&gt; 
 &lt;p&gt;The simplest example, building an image with packages available in Debian Jessie:&lt;/p&gt; 
 &lt;pre&gt;./configure --custom-packages "bsdgames robotfindskitten"&lt;br&gt;
sudo make iso
&lt;/pre&gt; 
 &lt;p&gt;A more interesting example, adding a package from a third party repo signed with its own key. In this case, salt-minion:&lt;/p&gt; 
 &lt;pre&gt;wget https://repo.saltstack.com/apt/debian/8/amd64/2017.7/SALTSTACK-GPG-KEY.pub&lt;br&gt;
./configure --custom-apt-entry "deb http://repo.saltstack.com/apt/debian/8/amd64/2017.7 jessie main" --custom-packages "salt-minion" --custom-apt-key ./SALTSTACK-GPG-KEY.pub&lt;br&gt;
sudo make iso
&lt;/pre&gt; 
 &lt;p&gt;Of course it doesn't guarantee that your image will build or work, but at least it will get you to the debugging phase faster,&lt;br&gt;&lt;/p&gt; 
&lt;/div&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2Fbuilding-vyos-images-with-custom-packages-just-got-simpler&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>development</category>
      <category>Uncategorized</category>
      <category>1.2</category>
      <pubDate>Wed, 27 Jun 2018 12:44:58 GMT</pubDate>
      <author>daniil@sentrium.io (Daniil Baturin)</author>
      <guid>https://blog.vyos.io/building-vyos-images-with-custom-packages-just-got-simpler</guid>
      <dc:date>2018-06-27T12:44:58Z</dc:date>
    </item>
    <item>
      <title>Writing migration scripts (and manipulating VyOS config files outside VyOS) just got easier</title>
      <link>https://blog.vyos.io/writing-migration-scripts-and-manipulating-vyos-config-files-outside-vyos-just-got-easier</link>
      <description>&lt;div class="posthaven-post-body"&gt; 
 &lt;h2&gt;Long story short&lt;/h2&gt; 
 &lt;p&gt;VyOS 1.2.0-rolling (starting with the next nightly build) includes a library for parsing and manipulating config files without loading them into the system config. It can be used for automatically converting configs from old versions in case an incompatible change was made, and for standalone utilities. Motivation and history are discussed below.&lt;br&gt;&lt;/p&gt; 
 &lt;p&gt;Here is an example of interacting with the new library:&lt;/p&gt; 
 &lt;pre&gt;&amp;gt;&amp;gt;&amp;gt; from vyos import configtree
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; c = configtree.ConfigTree("system { host-name vyos \n } interfaces { dummy dum0 { address 192.0.2.1/24 \n address 192.0.2.20/24 \n disable \n } }  /* version: 1.2.0 */")&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; print(c.to_string())&lt;br&gt;
system {&lt;br&gt;
    host-name vyos&lt;br&gt;
}&lt;br&gt;
interfaces {&lt;br&gt;
    dummy dum0 {&lt;br&gt;
        address 192.0.2.1/24&lt;br&gt;
        address 192.0.2.20/24&lt;br&gt;
        disable { }&lt;br&gt;
    }&lt;br&gt;
}&lt;/p&gt;
&lt;p&gt; /* version: 1.2.0 */&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; c.set(['interfaces', 'dummy', 'dum0', 'address'], value='293.0.113.3/32', replace=False)&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; c.delete_value(['interfaces', 'dummy', 'dum0', 'address'], '192.0.2.1/24')&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; c.delete(['interfaces', 'dummy', 'dum0', 'disable'])&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; c.is_tag(['interfaces', 'dummy'])&lt;br&gt;
True&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; c.exists(['interfaces', 'dummy', 'dum0', 'disable'])&lt;br&gt;
False&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; c.list_nodes(['interfaces', 'dummy'])&lt;br&gt;
['dum0']&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; print(c.to_string())&lt;br&gt;
system {&lt;br&gt;
    host-name vyos&lt;br&gt;
}&lt;br&gt;
interfaces {&lt;br&gt;
    dummy dum0 {&lt;br&gt;
        address 192.0.2.20/24&lt;br&gt;
        address 293.0.113.3/32&lt;br&gt;
    }&lt;br&gt;
}&lt;/p&gt;
&lt;p&gt; /* version: 1.2.0 */
&lt;/p&gt;&lt;/pre&gt; 
 &lt;p&gt;As you can see, it largely mimics the API you get for the running&lt;br&gt; config. The only notable differences are that the "set" method requires&lt;br&gt; that you specify the path and the value separately, and to have nodes&lt;br&gt; formatted as tag nodes (i.e. "ethernet eth0 { ..." as opposed to&lt;br&gt; "ethernet { eth0 { ..." you need to mark them as such with "set_tag",&lt;br&gt; unless they were originally formatted that way in the config you parsed.&lt;/p&gt; 
 &lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;br&gt; &lt;/p&gt; 
 &lt;h2&gt;Incompatible syntax changes and migration scripts&lt;br&gt;&lt;br&gt; &lt;/h2&gt; 
 &lt;p&gt;Have you ever noticed the mysterious line at the end of saved VyOS configs?&lt;/p&gt; 
 &lt;pre&gt;/* Warning: Do not remove the following line. */&lt;br&gt;
/* === vyatta-config-version: "cluster@1:config-management@1:conntrack-sync@1:conntrack@1:cron@1:dhcp-relay@1:dhcp-server@4:firewall@5:ipsec@4:nat@4:qos@1:quagga@2:system@6:vrrp@1:wanloadbalance@3:webgui@1:webproxy@1:zone-policy@1" === */&lt;br&gt;
/* Release version: VyOS 1.1.8 */
&lt;/pre&gt; 
 &lt;p&gt;What is it for? Think what happens if the old CLI syntax design is proven suboptimal, and the only way to seriously improve some feature requires an incompatible syntax change. One such change you may be aware of is the new vs. old NAT syntax, even if just because EdgeOS decided to keep it. The old syntax with a single "service nat" subtree where source NAT rules had to be over 5000, and yet you also had to specify rule type in addition to it, was unwieldy, and pretty much everyone agrees that the new one is better.&lt;br&gt;&lt;/p&gt; 
 &lt;p&gt;Despite the incompatible change, old configs from Vyatta Core 6.3 and older still load in modern VyOS versions just fine. There is a migration mechanism that looks at that version string at the end of the config, and runs appropriate scripts. For example, if you copy a config from some incredibly old version with "nat@1" in the version string, and do "load /config/config.boot.ancient", the system will look up scripts in /opt/vyatta/etc/config-migrate/migrate/nat/ and run scripts 1-to-2, 2-to-3, and 3-to-4, until the current version (though it's better to call it compatibility level) is reached.&lt;/p&gt; 
 &lt;p&gt;So far so good. Why so much legacy syntax remains in VyOS then? Take "system gateway-address" for example, the source of confusion as to where that default route comes from and the leading cause of unintended equal cost multipath setups. Why that stuff is still there?&lt;/p&gt; 
 &lt;p&gt;The mechanism for running the migration scripts is simple, but actually manipulating configs is not. While some scripts are nothing more than a single sed line (for example, the script that changes &lt;a href="https://github.com/vyos/vyatta-config-migrate/blob/current/migrate/system/6-to-7" title="Link: https://github.com/vyos/vyatta-config-migrate/blob/current/migrate/system/6-to-7"&gt;"smp_affinity" to "smp-affinity"&lt;/a&gt;), in most cases you need to go inside nodes. Basically, you need a set/delete/return_values/etc. API that you get for the running config, but without any validation and safeguards, since configs that need migration wouldn't validate by definition, otherwise no migration would be needed.&lt;/p&gt; 
 &lt;p&gt;The parser used by the load command, which is also run non-interactively on boot, is tightly coupled with validation and is hard to decouple from it. It is likely going to stay this way until the entire config backend is replaced. To get around it, people back at Vyatta wrote a library for sort of parsing config files into sort of in-memory datastructures. The only problem is that it's badly broken, fragile, and very annoying to use. This is the reason people have avoided writing migration scripts at all costs, including keeping the worst kinds of legacy syntax until it's absolutely unbearable.&lt;/p&gt; 
 &lt;h2&gt;The old parser&lt;br&gt;&lt;br&gt; &lt;/h2&gt; 
 &lt;p&gt;The library in question is called &lt;a href="https://github.com/vyos/vyatta-config-migrate/blob/current/scripts/XorpConfigParser.pm"&gt;XorpConfigParser&lt;/a&gt;. XORP was a routing protocol stack used by &lt;a href="https://archive.org/details/vyatta-3.0"&gt;early versions of Vyatta&lt;/a&gt;, and they also used its shell and config format for their own features unrelated to routing protocols. That made adding new features hard and the routing protocol stack itself suffered from serious performance problems, so it was replaced by Quagga and the new CLI was made based on bash, but the name stuck. And not only the name. The library still makes assumptions about the old format, where names and values were separated by colons. When the config format was changed along with the CLI, it was not capable of manipulating values of nodes anymore and returns say "address 192.0.2.1/24" as single string, so the NAT script, for example, makes extensive use of regex match and replace to rename the options. Without normal set and delete operations, manipulating the config becomes an exercise in juggling eggs in variable gravity.&lt;/p&gt; 
 &lt;p&gt;It has always been clear that it needs a replacement, but the problem of correctly parsing and manipulating configs is not a simple one. In addition to inherent complexity of a multi-way tree, the current VyOS syntax itself adds a whole bunch of problems. For example, leaf nodes (e.g. "address 192.0.2.1/24", or "reboot-on-panic true", or "disable") are terminated by newlines, while newlines are not significant anywhere else. Using the same /* */ syntax for node comments that are supposed to stay in the config, simply commented out nodes, and version metadata makes it even worse — the grammar is left-recursive and highly ambiguous. If you see a comment, you are not sure what follows — a node, and which kind of node, another comment, or end of file, and all cases need to be handled differently.&lt;/p&gt; 
 &lt;h2&gt;Putting Vyconf to use&lt;/h2&gt; 
 &lt;p&gt;A new config backend for VyOS, to be used in the&amp;nbsp; future VyOS 2.0, has been in development for a while, but remained separate from any of the current VyOS code.&lt;br&gt;&lt;/p&gt; 
 &lt;p&gt;While replacing the config backend, and the old config format along with it, still needs a lot of work and cannot be completed until all config and op mode scripts are rewritten in the &lt;a href="https://blog.vyos.net/vyos-2-dot-0-development-digest-number-5-doing-1-dot-2-x-and-2-dot-0-development-in-parallel" title="Link: http://blog.vyos.net/vyos-2-dot-0-development-digest-number-5-doing-1-dot-2-x-and-2-dot-0-development-in-parallel"&gt;new style&lt;/a&gt;, there is a lot of work already done in the new backend, Vyconf. It was designed from the start to be layered, and rely on in memory datastructures, so the code that is aware of user sessions and commits is based upon code that is only aware of the datastructures and node name and value validation, which in turn builds upon code that is only aware of datastructures. The problem of set/delete interface to multiway trees is already solved there, so why not reuse it?&lt;/p&gt; 
 &lt;p&gt;It needed support for the old config format input and output of course, and to make it accessible from Python scripts, the functionality needed to be made available through a shared library, but I managed to make a working version, which will make it to the next nightly build.&lt;/p&gt; 
 &lt;h2&gt;Technical details&lt;/h2&gt; 
 &lt;p&gt;The library is somewhat hacky now. The config formatter, for example, doesn't attempt to sort nodes, and likely cannot handle all possible cases of node nesting. The Python bindings are based on ctypes and dlopen(). The shared library it links with is unnecessarily large due to linking with all libraries that Vyconf needs. Building the library assumes per-user OPAM setup and has implicit dependency on Vyconf (and its build dependencies). To avoid the issue with ambiguity introduced by trailing comments, I opted for separating them with a simple finite state machine matcher before passing the actual config parts to the real parser.&lt;/p&gt; 
 &lt;p&gt;You can find the source code of the shared library in &lt;a href="https://github.com/vyos/libvyosconfig" title="Link: https://github.com/vyos/libvyosconfig"&gt;libvyosconfig&lt;/a&gt;, and the Python bindings in &lt;a href="https://github.com/vyos/vyos-1x/blob/current/python/vyos/configtree.py"&gt;vyos-1x&lt;/a&gt;.&lt;br&gt;&lt;/p&gt; 
 &lt;h2&gt;Conclusion&lt;/h2&gt; 
 &lt;p&gt;Just like any new feature, it needs testing. I'll be testing for missing cases and preparing and API reference, as small as it is, but everyone is invited to play with it in the next 1.2.0 nightly build and send their feedback.&lt;br&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;br&gt;&lt;/p&gt; 
&lt;/div&gt;</description>
      <content:encoded>&lt;div class="posthaven-post-body"&gt; 
 &lt;h2&gt;Long story short&lt;/h2&gt; 
 &lt;p&gt;VyOS 1.2.0-rolling (starting with the next nightly build) includes a library for parsing and manipulating config files without loading them into the system config. It can be used for automatically converting configs from old versions in case an incompatible change was made, and for standalone utilities. Motivation and history are discussed below.&lt;br&gt;&lt;/p&gt; 
 &lt;p&gt;Here is an example of interacting with the new library:&lt;/p&gt; 
 &lt;pre&gt;&amp;gt;&amp;gt;&amp;gt; from vyos import configtree
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; c = configtree.ConfigTree("system { host-name vyos \n } interfaces { dummy dum0 { address 192.0.2.1/24 \n address 192.0.2.20/24 \n disable \n } }  /* version: 1.2.0 */")&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; print(c.to_string())&lt;br&gt;
system {&lt;br&gt;
    host-name vyos&lt;br&gt;
}&lt;br&gt;
interfaces {&lt;br&gt;
    dummy dum0 {&lt;br&gt;
        address 192.0.2.1/24&lt;br&gt;
        address 192.0.2.20/24&lt;br&gt;
        disable { }&lt;br&gt;
    }&lt;br&gt;
}&lt;/p&gt;
&lt;p&gt; /* version: 1.2.0 */&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; c.set(['interfaces', 'dummy', 'dum0', 'address'], value='293.0.113.3/32', replace=False)&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; c.delete_value(['interfaces', 'dummy', 'dum0', 'address'], '192.0.2.1/24')&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; c.delete(['interfaces', 'dummy', 'dum0', 'disable'])&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; c.is_tag(['interfaces', 'dummy'])&lt;br&gt;
True&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; c.exists(['interfaces', 'dummy', 'dum0', 'disable'])&lt;br&gt;
False&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; c.list_nodes(['interfaces', 'dummy'])&lt;br&gt;
['dum0']&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;gt;&amp;gt; print(c.to_string())&lt;br&gt;
system {&lt;br&gt;
    host-name vyos&lt;br&gt;
}&lt;br&gt;
interfaces {&lt;br&gt;
    dummy dum0 {&lt;br&gt;
        address 192.0.2.20/24&lt;br&gt;
        address 293.0.113.3/32&lt;br&gt;
    }&lt;br&gt;
}&lt;/p&gt;
&lt;p&gt; /* version: 1.2.0 */
&lt;/p&gt;&lt;/pre&gt; 
 &lt;p&gt;As you can see, it largely mimics the API you get for the running&lt;br&gt; config. The only notable differences are that the "set" method requires&lt;br&gt; that you specify the path and the value separately, and to have nodes&lt;br&gt; formatted as tag nodes (i.e. "ethernet eth0 { ..." as opposed to&lt;br&gt; "ethernet { eth0 { ..." you need to mark them as such with "set_tag",&lt;br&gt; unless they were originally formatted that way in the config you parsed.&lt;/p&gt; 
 &lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;br&gt; &lt;/p&gt; 
 &lt;h2&gt;Incompatible syntax changes and migration scripts&lt;br&gt;&lt;br&gt; &lt;/h2&gt; 
 &lt;p&gt;Have you ever noticed the mysterious line at the end of saved VyOS configs?&lt;/p&gt; 
 &lt;pre&gt;/* Warning: Do not remove the following line. */&lt;br&gt;
/* === vyatta-config-version: "cluster@1:config-management@1:conntrack-sync@1:conntrack@1:cron@1:dhcp-relay@1:dhcp-server@4:firewall@5:ipsec@4:nat@4:qos@1:quagga@2:system@6:vrrp@1:wanloadbalance@3:webgui@1:webproxy@1:zone-policy@1" === */&lt;br&gt;
/* Release version: VyOS 1.1.8 */
&lt;/pre&gt; 
 &lt;p&gt;What is it for? Think what happens if the old CLI syntax design is proven suboptimal, and the only way to seriously improve some feature requires an incompatible syntax change. One such change you may be aware of is the new vs. old NAT syntax, even if just because EdgeOS decided to keep it. The old syntax with a single "service nat" subtree where source NAT rules had to be over 5000, and yet you also had to specify rule type in addition to it, was unwieldy, and pretty much everyone agrees that the new one is better.&lt;br&gt;&lt;/p&gt; 
 &lt;p&gt;Despite the incompatible change, old configs from Vyatta Core 6.3 and older still load in modern VyOS versions just fine. There is a migration mechanism that looks at that version string at the end of the config, and runs appropriate scripts. For example, if you copy a config from some incredibly old version with "nat@1" in the version string, and do "load /config/config.boot.ancient", the system will look up scripts in /opt/vyatta/etc/config-migrate/migrate/nat/ and run scripts 1-to-2, 2-to-3, and 3-to-4, until the current version (though it's better to call it compatibility level) is reached.&lt;/p&gt; 
 &lt;p&gt;So far so good. Why so much legacy syntax remains in VyOS then? Take "system gateway-address" for example, the source of confusion as to where that default route comes from and the leading cause of unintended equal cost multipath setups. Why that stuff is still there?&lt;/p&gt; 
 &lt;p&gt;The mechanism for running the migration scripts is simple, but actually manipulating configs is not. While some scripts are nothing more than a single sed line (for example, the script that changes &lt;a href="https://github.com/vyos/vyatta-config-migrate/blob/current/migrate/system/6-to-7" title="Link: https://github.com/vyos/vyatta-config-migrate/blob/current/migrate/system/6-to-7"&gt;"smp_affinity" to "smp-affinity"&lt;/a&gt;), in most cases you need to go inside nodes. Basically, you need a set/delete/return_values/etc. API that you get for the running config, but without any validation and safeguards, since configs that need migration wouldn't validate by definition, otherwise no migration would be needed.&lt;/p&gt; 
 &lt;p&gt;The parser used by the load command, which is also run non-interactively on boot, is tightly coupled with validation and is hard to decouple from it. It is likely going to stay this way until the entire config backend is replaced. To get around it, people back at Vyatta wrote a library for sort of parsing config files into sort of in-memory datastructures. The only problem is that it's badly broken, fragile, and very annoying to use. This is the reason people have avoided writing migration scripts at all costs, including keeping the worst kinds of legacy syntax until it's absolutely unbearable.&lt;/p&gt; 
 &lt;h2&gt;The old parser&lt;br&gt;&lt;br&gt; &lt;/h2&gt; 
 &lt;p&gt;The library in question is called &lt;a href="https://github.com/vyos/vyatta-config-migrate/blob/current/scripts/XorpConfigParser.pm"&gt;XorpConfigParser&lt;/a&gt;. XORP was a routing protocol stack used by &lt;a href="https://archive.org/details/vyatta-3.0"&gt;early versions of Vyatta&lt;/a&gt;, and they also used its shell and config format for their own features unrelated to routing protocols. That made adding new features hard and the routing protocol stack itself suffered from serious performance problems, so it was replaced by Quagga and the new CLI was made based on bash, but the name stuck. And not only the name. The library still makes assumptions about the old format, where names and values were separated by colons. When the config format was changed along with the CLI, it was not capable of manipulating values of nodes anymore and returns say "address 192.0.2.1/24" as single string, so the NAT script, for example, makes extensive use of regex match and replace to rename the options. Without normal set and delete operations, manipulating the config becomes an exercise in juggling eggs in variable gravity.&lt;/p&gt; 
 &lt;p&gt;It has always been clear that it needs a replacement, but the problem of correctly parsing and manipulating configs is not a simple one. In addition to inherent complexity of a multi-way tree, the current VyOS syntax itself adds a whole bunch of problems. For example, leaf nodes (e.g. "address 192.0.2.1/24", or "reboot-on-panic true", or "disable") are terminated by newlines, while newlines are not significant anywhere else. Using the same /* */ syntax for node comments that are supposed to stay in the config, simply commented out nodes, and version metadata makes it even worse — the grammar is left-recursive and highly ambiguous. If you see a comment, you are not sure what follows — a node, and which kind of node, another comment, or end of file, and all cases need to be handled differently.&lt;/p&gt; 
 &lt;h2&gt;Putting Vyconf to use&lt;/h2&gt; 
 &lt;p&gt;A new config backend for VyOS, to be used in the&amp;nbsp; future VyOS 2.0, has been in development for a while, but remained separate from any of the current VyOS code.&lt;br&gt;&lt;/p&gt; 
 &lt;p&gt;While replacing the config backend, and the old config format along with it, still needs a lot of work and cannot be completed until all config and op mode scripts are rewritten in the &lt;a href="https://blog.vyos.net/vyos-2-dot-0-development-digest-number-5-doing-1-dot-2-x-and-2-dot-0-development-in-parallel" title="Link: http://blog.vyos.net/vyos-2-dot-0-development-digest-number-5-doing-1-dot-2-x-and-2-dot-0-development-in-parallel"&gt;new style&lt;/a&gt;, there is a lot of work already done in the new backend, Vyconf. It was designed from the start to be layered, and rely on in memory datastructures, so the code that is aware of user sessions and commits is based upon code that is only aware of the datastructures and node name and value validation, which in turn builds upon code that is only aware of datastructures. The problem of set/delete interface to multiway trees is already solved there, so why not reuse it?&lt;/p&gt; 
 &lt;p&gt;It needed support for the old config format input and output of course, and to make it accessible from Python scripts, the functionality needed to be made available through a shared library, but I managed to make a working version, which will make it to the next nightly build.&lt;/p&gt; 
 &lt;h2&gt;Technical details&lt;/h2&gt; 
 &lt;p&gt;The library is somewhat hacky now. The config formatter, for example, doesn't attempt to sort nodes, and likely cannot handle all possible cases of node nesting. The Python bindings are based on ctypes and dlopen(). The shared library it links with is unnecessarily large due to linking with all libraries that Vyconf needs. Building the library assumes per-user OPAM setup and has implicit dependency on Vyconf (and its build dependencies). To avoid the issue with ambiguity introduced by trailing comments, I opted for separating them with a simple finite state machine matcher before passing the actual config parts to the real parser.&lt;/p&gt; 
 &lt;p&gt;You can find the source code of the shared library in &lt;a href="https://github.com/vyos/libvyosconfig" title="Link: https://github.com/vyos/libvyosconfig"&gt;libvyosconfig&lt;/a&gt;, and the Python bindings in &lt;a href="https://github.com/vyos/vyos-1x/blob/current/python/vyos/configtree.py"&gt;vyos-1x&lt;/a&gt;.&lt;br&gt;&lt;/p&gt; 
 &lt;h2&gt;Conclusion&lt;/h2&gt; 
 &lt;p&gt;Just like any new feature, it needs testing. I'll be testing for missing cases and preparing and API reference, as small as it is, but everyone is invited to play with it in the next 1.2.0 nightly build and send their feedback.&lt;br&gt;&lt;/p&gt; 
 &lt;p&gt;&lt;br&gt;&lt;/p&gt; 
&lt;/div&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2Fwriting-migration-scripts-and-manipulating-vyos-config-files-outside-vyos-just-got-easier&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>development</category>
      <category>migration scripts</category>
      <category>Uncategorized</category>
      <category>1.2</category>
      <pubDate>Mon, 28 May 2018 11:42:30 GMT</pubDate>
      <author>daniil@sentrium.io (Daniil Baturin)</author>
      <guid>https://blog.vyos.io/writing-migration-scripts-and-manipulating-vyos-config-files-outside-vyos-just-got-easier</guid>
      <dc:date>2018-05-28T11:42:30Z</dc:date>
    </item>
    <item>
      <title>VyOS 1.2.0 status update</title>
      <link>https://blog.vyos.io/vyos-1-dot-2-0-status-update</link>
      <description>&lt;div class="posthaven-post-body"&gt; 
 &lt;p&gt;While VyOS 1.2.0 nightly builds have been fairly usable for a while already, there are still some things to be done because we can make a named release candidate from it. These are the things that have been done lately:&lt;/p&gt; 
 &lt;h2&gt;EC2 AMI scripts retargeting and clean up&lt;/h2&gt; 
 &lt;p&gt;The original AMI build scripts had been virtually unchanged since their original implementation in 2014, and by this time they've had ansible warnings at every other step, which prompted us to question everything they do, and we did. This resulted in a big spring cleanup of those scripts, and now they are way shorter, faster, and robust.&lt;/p&gt; 
 &lt;p&gt;Other than the fact that they now work with VyOS 1.2.0 properly, one of the biggest improvements from the user point of view is that it's now easy to build an AMI with a custom config file simply by editing the file at &lt;a href="https://github.com/vyos/build-ami/blob/master/playbooks/templates/config.boot.default.ec2" title="Link: https://github.com/vyos/build-ami/blob/master/playbooks/templates/config.boot.default.ec2"&gt;playbooks/templates/config.boot.default.ec2&lt;/a&gt;&lt;/p&gt; 
 &lt;p&gt;The primary motivation for it was to replace cumbersome in-place editing of the config.boot.default from the image with a single template, but in the end it's a win-win solution for both developers and users.&lt;/p&gt; 
 &lt;p&gt;The original scripts were also notorious for their long execution time and fragility. What's worse is that when they failed (and it's usually "when" rather than "if"), they would leave behind a lot of gargabe they couldn't automatically clean up, since they used to create a temporary VPC complete with an internet gateway, subnet, and route table, all just for a single build instance. They also used a t2.medium instance that was clearly oversized for the task and could be expensive to leave running if clean up failed.&lt;/p&gt; 
 &lt;p&gt;Now they create the build instance in the first available subnet of the default VPC, so even if they fail, you only need to delete a t2.micro instance, a key pair, and a security group.&lt;/p&gt; 
 &lt;p&gt;It is no longer possible to build VyOS 1.1.x images with those scripts from the baseline code, but I've created a tag named 1.1.x from the last commit where it was possible, so you can do it if you want to — without these recent improvements of course.&lt;/p&gt; 
 &lt;h2&gt;Package upgrades and new drivers&lt;/h2&gt; 
 &lt;p&gt;We've upgraded StrongSWAN to 5.6.2, which hopefully will fix a few longstanding issues. Some enthusiastic testers are already testing it, but everyone is invited to test it as well.&lt;/p&gt; 
 &lt;p&gt;SR-IOV is now basically a requirement for high performance virtualized networking, and it needs appropriate drivers. Recent nightly builds include a newer version of Intel's ixgbe and Mellanox OFED drivers, so the support for recent 10gig cards and SR-IOV in particular has improved.&lt;/p&gt; 
 &lt;h2&gt;A step towards using the master branch again&lt;/h2&gt; 
 &lt;p&gt;The "current" git branch we use throughout the project where everyone else uses "master" was never intended to be a permanent setup: it always was a workaround for the master branch in packages inherited from Vyatta Core being messed up beyond any repair. It will take quite some time to get rid of the "current" branch completely and we'll only be able to do it when we finally consolidate all the code under vyos-1x, but we've made jenkins builds correctly put the packages built from the "master" branch in our development repository, so we'll be able to do it for packages that do not include any legacy code at least.&lt;br&gt;&lt;/p&gt; 
 &lt;h2&gt;IPv6 VRRP status&lt;br&gt;&lt;br&gt; &lt;/h2&gt; 
 &lt;p&gt;This is the most interesting part. IPv6 VRRP is perhaps a single most awaited feature. Originally it was blocked by lack of support for it in keepalived. Now keepalived supports it, but integrating it will need some backwards-incompatible changes.&lt;/p&gt; 
 &lt;p&gt;Originally, keepalived allowed mixing IPv4 and IPv6 in the same group, but it no longer allows it (curiously, the protocol standard &lt;i&gt;does &lt;/i&gt;allow IPv4 advertisments over IPv6 transport, but I can see why they may want to keep these separate). This means to take advantage of the improvements it made, we also have to disallow it, thus breaking the configs of people who attempted to use it. We've been thinking about keeping the old syntax while generating different configs from it, or automated migration, but it's not clear if automated migration is really feasible.&lt;/p&gt; 
 &lt;p&gt;An incompatible syntax change is definitely needed because, for example, if we want to support setting hello source address or unicast VRRP peer address for both IPv4 and IPv6, we obviously need separate options.&lt;/p&gt; 
 &lt;p&gt;Soon IPv6 addresses in IPv4 VRRP groups will be disallowed and syntax for IPv6-only VRRP groups will be added alongside the old vrrp-group syntax. If you have ideas for the new syntax, the possible automated migration, or generally how to make the transition smooth, please comment on the relevant &lt;a href="https://phabricator.vyos.net/T616"&gt;task&lt;/a&gt;.&lt;br&gt;&lt;/p&gt; 
 &lt;h2&gt;PowerDNS recursor instead of dnsmasq&lt;/h2&gt; 
 &lt;p&gt;The old dnsmasq (which I, frankly, always viewed as something of a spork, with its limited DHCP server functionality built into what's mainly a caching DNS resolver), has been replaced with PowerDNS recursor, a much cleaner implementation.&lt;br&gt;&lt;/p&gt; 
&lt;/div&gt;</description>
      <content:encoded>&lt;div class="posthaven-post-body"&gt; 
 &lt;p&gt;While VyOS 1.2.0 nightly builds have been fairly usable for a while already, there are still some things to be done because we can make a named release candidate from it. These are the things that have been done lately:&lt;/p&gt; 
 &lt;h2&gt;EC2 AMI scripts retargeting and clean up&lt;/h2&gt; 
 &lt;p&gt;The original AMI build scripts had been virtually unchanged since their original implementation in 2014, and by this time they've had ansible warnings at every other step, which prompted us to question everything they do, and we did. This resulted in a big spring cleanup of those scripts, and now they are way shorter, faster, and robust.&lt;/p&gt; 
 &lt;p&gt;Other than the fact that they now work with VyOS 1.2.0 properly, one of the biggest improvements from the user point of view is that it's now easy to build an AMI with a custom config file simply by editing the file at &lt;a href="https://github.com/vyos/build-ami/blob/master/playbooks/templates/config.boot.default.ec2" title="Link: https://github.com/vyos/build-ami/blob/master/playbooks/templates/config.boot.default.ec2"&gt;playbooks/templates/config.boot.default.ec2&lt;/a&gt;&lt;/p&gt; 
 &lt;p&gt;The primary motivation for it was to replace cumbersome in-place editing of the config.boot.default from the image with a single template, but in the end it's a win-win solution for both developers and users.&lt;/p&gt; 
 &lt;p&gt;The original scripts were also notorious for their long execution time and fragility. What's worse is that when they failed (and it's usually "when" rather than "if"), they would leave behind a lot of gargabe they couldn't automatically clean up, since they used to create a temporary VPC complete with an internet gateway, subnet, and route table, all just for a single build instance. They also used a t2.medium instance that was clearly oversized for the task and could be expensive to leave running if clean up failed.&lt;/p&gt; 
 &lt;p&gt;Now they create the build instance in the first available subnet of the default VPC, so even if they fail, you only need to delete a t2.micro instance, a key pair, and a security group.&lt;/p&gt; 
 &lt;p&gt;It is no longer possible to build VyOS 1.1.x images with those scripts from the baseline code, but I've created a tag named 1.1.x from the last commit where it was possible, so you can do it if you want to — without these recent improvements of course.&lt;/p&gt; 
 &lt;h2&gt;Package upgrades and new drivers&lt;/h2&gt; 
 &lt;p&gt;We've upgraded StrongSWAN to 5.6.2, which hopefully will fix a few longstanding issues. Some enthusiastic testers are already testing it, but everyone is invited to test it as well.&lt;/p&gt; 
 &lt;p&gt;SR-IOV is now basically a requirement for high performance virtualized networking, and it needs appropriate drivers. Recent nightly builds include a newer version of Intel's ixgbe and Mellanox OFED drivers, so the support for recent 10gig cards and SR-IOV in particular has improved.&lt;/p&gt; 
 &lt;h2&gt;A step towards using the master branch again&lt;/h2&gt; 
 &lt;p&gt;The "current" git branch we use throughout the project where everyone else uses "master" was never intended to be a permanent setup: it always was a workaround for the master branch in packages inherited from Vyatta Core being messed up beyond any repair. It will take quite some time to get rid of the "current" branch completely and we'll only be able to do it when we finally consolidate all the code under vyos-1x, but we've made jenkins builds correctly put the packages built from the "master" branch in our development repository, so we'll be able to do it for packages that do not include any legacy code at least.&lt;br&gt;&lt;/p&gt; 
 &lt;h2&gt;IPv6 VRRP status&lt;br&gt;&lt;br&gt; &lt;/h2&gt; 
 &lt;p&gt;This is the most interesting part. IPv6 VRRP is perhaps a single most awaited feature. Originally it was blocked by lack of support for it in keepalived. Now keepalived supports it, but integrating it will need some backwards-incompatible changes.&lt;/p&gt; 
 &lt;p&gt;Originally, keepalived allowed mixing IPv4 and IPv6 in the same group, but it no longer allows it (curiously, the protocol standard &lt;i&gt;does &lt;/i&gt;allow IPv4 advertisments over IPv6 transport, but I can see why they may want to keep these separate). This means to take advantage of the improvements it made, we also have to disallow it, thus breaking the configs of people who attempted to use it. We've been thinking about keeping the old syntax while generating different configs from it, or automated migration, but it's not clear if automated migration is really feasible.&lt;/p&gt; 
 &lt;p&gt;An incompatible syntax change is definitely needed because, for example, if we want to support setting hello source address or unicast VRRP peer address for both IPv4 and IPv6, we obviously need separate options.&lt;/p&gt; 
 &lt;p&gt;Soon IPv6 addresses in IPv4 VRRP groups will be disallowed and syntax for IPv6-only VRRP groups will be added alongside the old vrrp-group syntax. If you have ideas for the new syntax, the possible automated migration, or generally how to make the transition smooth, please comment on the relevant &lt;a href="https://phabricator.vyos.net/T616"&gt;task&lt;/a&gt;.&lt;br&gt;&lt;/p&gt; 
 &lt;h2&gt;PowerDNS recursor instead of dnsmasq&lt;/h2&gt; 
 &lt;p&gt;The old dnsmasq (which I, frankly, always viewed as something of a spork, with its limited DHCP server functionality built into what's mainly a caching DNS resolver), has been replaced with PowerDNS recursor, a much cleaner implementation.&lt;br&gt;&lt;/p&gt; 
&lt;/div&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2Fvyos-1-dot-2-0-status-update&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>development</category>
      <category>Uncategorized</category>
      <category>1.2</category>
      <pubDate>Fri, 11 May 2018 08:33:05 GMT</pubDate>
      <author>daniil@sentrium.io (Daniil Baturin)</author>
      <guid>https://blog.vyos.io/vyos-1-dot-2-0-status-update</guid>
      <dc:date>2018-05-11T08:33:05Z</dc:date>
    </item>
    <item>
      <title>VyOS 1.2.0 repository re-structuring</title>
      <link>https://blog.vyos.io/vyos-1-dot-2-0-repository-re-structuring</link>
      <description>&lt;div class="posthaven-post-body"&gt; 
 &lt;p&gt;In preparation for the new 1.2.0 (jessie-based) beta release, we are re-populating the package repositories. The old repositories are now archived, you still can find then in the /legacy/repos directory on dev.packages.vyos.net&lt;/p&gt; 
 &lt;p&gt;The purpose of this is two-fold. First, the old repo got quite messy, and Debian people (rightfully!) keep reminding us about it, but it would be difficult to do a gradual cleanup. Second, since the CI server has moved, and so did the build hosts, we need to test how well the new procedures are working. And, additionally, it should tell us if we are prepared to restore VyOS from its source should anything happen to the packages.vyos.net server or its contents.&lt;/p&gt; 
 &lt;p&gt;For perhaps a couple of days, there will be no new nightly builds, and you will not be able to build ISOs yourself, unless you change the repo path in ./configure options by hand. Stay tuned.&lt;br&gt;&lt;/p&gt; 
&lt;/div&gt;</description>
      <content:encoded>&lt;div class="posthaven-post-body"&gt; 
 &lt;p&gt;In preparation for the new 1.2.0 (jessie-based) beta release, we are re-populating the package repositories. The old repositories are now archived, you still can find then in the /legacy/repos directory on dev.packages.vyos.net&lt;/p&gt; 
 &lt;p&gt;The purpose of this is two-fold. First, the old repo got quite messy, and Debian people (rightfully!) keep reminding us about it, but it would be difficult to do a gradual cleanup. Second, since the CI server has moved, and so did the build hosts, we need to test how well the new procedures are working. And, additionally, it should tell us if we are prepared to restore VyOS from its source should anything happen to the packages.vyos.net server or its contents.&lt;/p&gt; 
 &lt;p&gt;For perhaps a couple of days, there will be no new nightly builds, and you will not be able to build ISOs yourself, unless you change the repo path in ./configure options by hand. Stay tuned.&lt;br&gt;&lt;/p&gt; 
&lt;/div&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2Fvyos-1-dot-2-0-repository-re-structuring&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>development</category>
      <category>maintenance</category>
      <category>Uncategorized</category>
      <category>1.2</category>
      <pubDate>Sun, 05 Feb 2017 18:10:58 GMT</pubDate>
      <author>daniil@sentrium.io (Daniil Baturin)</author>
      <guid>https://blog.vyos.io/vyos-1-dot-2-0-repository-re-structuring</guid>
      <dc:date>2017-02-05T18:10:58Z</dc:date>
    </item>
    <item>
      <title>VyOS 2.0 development digest #7: Python coding guidelines for config scripts in 1.2.0, and config parser for VyConf</title>
      <link>https://blog.vyos.io/vyos-2-dot-0-development-digest-number-7-python-coding-guidelines-for-config-scripts-in-1-dot-2-0-and-config-parser-for-vyconf</link>
      <description>&lt;div class="posthaven-post-body"&gt; 
 &lt;h2&gt;Python coding guidelines for 1.2.0&lt;br&gt;&lt;br&gt; &lt;/h2&gt; 
 &lt;p&gt;In some previous post I was talking about the Python wrapper for the config reading library. However, simply switching to a language that is not Perl will not automatically make that code easy to move to 2.0 when the backend is ready, neither it will automatically improve the design and architecture. It will also improve the code in general, and help keeping it readable and maintainable.&lt;br&gt;&lt;/p&gt; 
 &lt;p&gt;You can find the document here: &lt;a href="http://wiki.vyos.net/wiki/Python_config_script_policy" title="Link: http://wiki.vyos.net/wiki/Python_config_script_policy"&gt;http://wiki.vyos.net/wiki/Python_config_script_policy&lt;/a&gt;&amp;nbsp;&lt;/p&gt; 
 &lt;p&gt;In short:&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt;Logic for config validation, generating configs, and changing system settings/restarting services must be completely separated&lt;/li&gt; 
  &lt;li&gt;For any configs that allow nesting (dhcpd.conf, ipsec.conf etc.) template processor must be used (as opposed to string concatenation)&lt;/li&gt; 
  &lt;li&gt;Functions should not randomly output anything to stdout/stderr&lt;/li&gt; 
  &lt;li&gt;Code must be unit-testable&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;h2&gt;Config parser for VyConf/VyOS 2.0&lt;/h2&gt; 
 &lt;p&gt;Today I pushed initial implementation of the new config lexer and parser. It already supports nodes and node comments, but doesn't support node metadata (that will be used to mark inactive and ephemeral nodes).&lt;/p&gt; 
 &lt;p&gt;You can read the code (&lt;a href="https://github.com/vyos/vyconf/blob/master/src/curly_lexer.mll"&gt;https://github.com/vyos/vyconf/blob/master/src/curly_lexer.mll&lt;/a&gt; and &lt;a href="https://github.com/vyos/vyconf/blob/master/src/curly_parser.mly"&gt;https://github.com/vyos/vyconf/blob/master/src/curly_parser.mly&lt;/a&gt;) and play with it by loading the .cma's into REPL. Next step is to add config renderer. Once the protobuf schema is ready we can wrap it all into a daemon and finally have something to really play with, rather than just run the unit tests.&lt;/p&gt; 
 &lt;p&gt;Informally, here's what I changed in the config syntax.&lt;br&gt;&lt;/p&gt; 
 &lt;h3&gt;Old config&lt;br&gt; &lt;/h3&gt; 
 &lt;pre&gt;interfaces {&lt;br&gt;
  /* WAN interface */&lt;br&gt;
  ethernet eth0 {&lt;br&gt;
    address 192.0.2.1/24&lt;br&gt;
    address 192.0.2.2/24&lt;br&gt;
    duplex auto&lt;br&gt;
  }&lt;br&gt;
}
&lt;/pre&gt; 
 &lt;h4&gt;New config &lt;/h4&gt; 
 &lt;pre&gt;interfaces {&lt;br&gt;
  ethernet {&lt;br&gt;
    /* WAN interface */&lt;br&gt;
    eth0 {&lt;br&gt;
      address [&lt;br&gt;
        192.0.2.1/24;&lt;br&gt;
        192.0.2.2/24;&lt;br&gt;
      ];&lt;br&gt;
      duplex auto;&lt;br&gt;
      // This kind of comment is ignored by the parser&lt;br&gt;
    }&lt;br&gt;
  }&lt;br&gt;
}
&lt;/pre&gt; 
 &lt;p&gt;As you can see, the changes are:&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt;Leaf nodes are now terminated by semicolons rather than newlines.&lt;/li&gt; 
  &lt;li&gt;There is syntax for comments that are ignored by the parser&lt;br&gt; &lt;/li&gt; 
  &lt;li&gt;Multi nodes have the array of values in square brackets.&lt;/li&gt; 
  &lt;li&gt;Tag nodes do not receive any special formatting.&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;p&gt;I suppose the last change may be controversial, because it can lead to somewhat odd-looking constructs like:&lt;/p&gt; 
 &lt;pre&gt;interfaces {&lt;br&gt;
  ethernet {&lt;br&gt;
    eth0 {&lt;br&gt;
      vif {&lt;br&gt;
        21 {&lt;br&gt;
          address 192.0.2.1/24&lt;br&gt;
        }&lt;br&gt;
      }&lt;br&gt;
    }&lt;br&gt;
  }&lt;br&gt;
}
&lt;/pre&gt; 
 &lt;p&gt;If you are really going to miss the old approach to tag nodes (that is "ethernet eth0 {" as opposed to "ethernet { eth0 { ...", let me know and I guess I can come up with something. The main difficulty is that, while this never occurs in configs VyOS config save produces, different tag nodes, e.g. "interfaces ethernet" and "interfaces tunnel" can be intermingled, so for parsing we have to track which ones were already created, and this will make the parser code a lot longer. &lt;br&gt;&lt;/p&gt; 
 &lt;p&gt;I'm pretty convinced that "address 192.0.2.1/24; address 192.0.2.2/24" is simply visual clutter and JunOS-like square bracket syntax will make it cleaner. It also solves the aforementioned problem with interleaved nodes tracking for leaf nodes.&lt;/p&gt; 
 &lt;p&gt;Let me know what you think about the syntax. &lt;br&gt;&lt;/p&gt; 
&lt;/div&gt;</description>
      <content:encoded>&lt;div class="posthaven-post-body"&gt; 
 &lt;h2&gt;Python coding guidelines for 1.2.0&lt;br&gt;&lt;br&gt; &lt;/h2&gt; 
 &lt;p&gt;In some previous post I was talking about the Python wrapper for the config reading library. However, simply switching to a language that is not Perl will not automatically make that code easy to move to 2.0 when the backend is ready, neither it will automatically improve the design and architecture. It will also improve the code in general, and help keeping it readable and maintainable.&lt;br&gt;&lt;/p&gt; 
 &lt;p&gt;You can find the document here: &lt;a href="http://wiki.vyos.net/wiki/Python_config_script_policy" title="Link: http://wiki.vyos.net/wiki/Python_config_script_policy"&gt;http://wiki.vyos.net/wiki/Python_config_script_policy&lt;/a&gt;&amp;nbsp;&lt;/p&gt; 
 &lt;p&gt;In short:&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt;Logic for config validation, generating configs, and changing system settings/restarting services must be completely separated&lt;/li&gt; 
  &lt;li&gt;For any configs that allow nesting (dhcpd.conf, ipsec.conf etc.) template processor must be used (as opposed to string concatenation)&lt;/li&gt; 
  &lt;li&gt;Functions should not randomly output anything to stdout/stderr&lt;/li&gt; 
  &lt;li&gt;Code must be unit-testable&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;h2&gt;Config parser for VyConf/VyOS 2.0&lt;/h2&gt; 
 &lt;p&gt;Today I pushed initial implementation of the new config lexer and parser. It already supports nodes and node comments, but doesn't support node metadata (that will be used to mark inactive and ephemeral nodes).&lt;/p&gt; 
 &lt;p&gt;You can read the code (&lt;a href="https://github.com/vyos/vyconf/blob/master/src/curly_lexer.mll"&gt;https://github.com/vyos/vyconf/blob/master/src/curly_lexer.mll&lt;/a&gt; and &lt;a href="https://github.com/vyos/vyconf/blob/master/src/curly_parser.mly"&gt;https://github.com/vyos/vyconf/blob/master/src/curly_parser.mly&lt;/a&gt;) and play with it by loading the .cma's into REPL. Next step is to add config renderer. Once the protobuf schema is ready we can wrap it all into a daemon and finally have something to really play with, rather than just run the unit tests.&lt;/p&gt; 
 &lt;p&gt;Informally, here's what I changed in the config syntax.&lt;br&gt;&lt;/p&gt; 
 &lt;h3&gt;Old config&lt;br&gt; &lt;/h3&gt; 
 &lt;pre&gt;interfaces {&lt;br&gt;
  /* WAN interface */&lt;br&gt;
  ethernet eth0 {&lt;br&gt;
    address 192.0.2.1/24&lt;br&gt;
    address 192.0.2.2/24&lt;br&gt;
    duplex auto&lt;br&gt;
  }&lt;br&gt;
}
&lt;/pre&gt; 
 &lt;h4&gt;New config &lt;/h4&gt; 
 &lt;pre&gt;interfaces {&lt;br&gt;
  ethernet {&lt;br&gt;
    /* WAN interface */&lt;br&gt;
    eth0 {&lt;br&gt;
      address [&lt;br&gt;
        192.0.2.1/24;&lt;br&gt;
        192.0.2.2/24;&lt;br&gt;
      ];&lt;br&gt;
      duplex auto;&lt;br&gt;
      // This kind of comment is ignored by the parser&lt;br&gt;
    }&lt;br&gt;
  }&lt;br&gt;
}
&lt;/pre&gt; 
 &lt;p&gt;As you can see, the changes are:&lt;/p&gt; 
 &lt;ul&gt; 
  &lt;li&gt;Leaf nodes are now terminated by semicolons rather than newlines.&lt;/li&gt; 
  &lt;li&gt;There is syntax for comments that are ignored by the parser&lt;br&gt; &lt;/li&gt; 
  &lt;li&gt;Multi nodes have the array of values in square brackets.&lt;/li&gt; 
  &lt;li&gt;Tag nodes do not receive any special formatting.&lt;/li&gt; 
 &lt;/ul&gt; 
 &lt;p&gt;I suppose the last change may be controversial, because it can lead to somewhat odd-looking constructs like:&lt;/p&gt; 
 &lt;pre&gt;interfaces {&lt;br&gt;
  ethernet {&lt;br&gt;
    eth0 {&lt;br&gt;
      vif {&lt;br&gt;
        21 {&lt;br&gt;
          address 192.0.2.1/24&lt;br&gt;
        }&lt;br&gt;
      }&lt;br&gt;
    }&lt;br&gt;
  }&lt;br&gt;
}
&lt;/pre&gt; 
 &lt;p&gt;If you are really going to miss the old approach to tag nodes (that is "ethernet eth0 {" as opposed to "ethernet { eth0 { ...", let me know and I guess I can come up with something. The main difficulty is that, while this never occurs in configs VyOS config save produces, different tag nodes, e.g. "interfaces ethernet" and "interfaces tunnel" can be intermingled, so for parsing we have to track which ones were already created, and this will make the parser code a lot longer. &lt;br&gt;&lt;/p&gt; 
 &lt;p&gt;I'm pretty convinced that "address 192.0.2.1/24; address 192.0.2.2/24" is simply visual clutter and JunOS-like square bracket syntax will make it cleaner. It also solves the aforementioned problem with interleaved nodes tracking for leaf nodes.&lt;/p&gt; 
 &lt;p&gt;Let me know what you think about the syntax. &lt;br&gt;&lt;/p&gt; 
&lt;/div&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2Fvyos-2-dot-0-development-digest-number-7-python-coding-guidelines-for-config-scripts-in-1-dot-2-0-and-config-parser-for-vyconf&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>development</category>
      <category>Uncategorized</category>
      <category>vyconf</category>
      <category>vyos 2.0</category>
      <category>1.2</category>
      <pubDate>Wed, 04 Jan 2017 19:27:32 GMT</pubDate>
      <author>daniil@sentrium.io (Daniil Baturin)</author>
      <guid>https://blog.vyos.io/vyos-2-dot-0-development-digest-number-7-python-coding-guidelines-for-config-scripts-in-1-dot-2-0-and-config-parser-for-vyconf</guid>
      <dc:date>2017-01-04T19:27:32Z</dc:date>
    </item>
    <item>
      <title>VyOS 2.0 development digest #5: doing 1.2.x and 2.0 development in parallel</title>
      <link>https://blog.vyos.io/vyos-2-dot-0-development-digest-number-5-doing-1-dot-2-x-and-2-dot-0-development-in-parallel</link>
      <description>&lt;div class="posthaven-post-body"&gt; 
 &lt;p&gt;There was a rather heated discussion about the 1.2.0 situation on the channel, and valid points were definitely expressed: while 2.0 is being written, 1.2.0 can't benefit from any of that work, and it's sad. We do need a working VyOS in any case, and we can't just stop doing anything about it and only work on 2.0. My original plan was to put 1.2.0 in maintenance mode once it's stabilized, but it would mean no updates at all for anyone, other than bugfixes. To make things worse, some things do need if not rewrite, but at least very deep refactoring bordering on rewrite just to make them work again, due to deep changes in the configs of e.g. StrongSWAN.&lt;/p&gt; 
 &lt;p&gt;There are three main issues with reusing the old code,&amp;nbsp; as I already said: it's written in Perl, it mixes config reading and checking with logic, and it can't be tested outside VyOS. The fourth issue is that the logic for generating, writing, and applying configs is not separated in most scripts either so they don't fit the 2.0 model of more transactional commits. The question is if we can do anything about those issues to enable rewriting bits of 1.2.0 in a way that will allow reusing that code in 2.0 when the config backend and base system are ready, and what exactly should we do.&lt;/p&gt; 
 &lt;p&gt;My conclusion so far is that we probably can, with some dirty hacks and extra care. Read on.&lt;br&gt;&lt;/p&gt; 
 &lt;h2&gt;The language&lt;/h2&gt; 
 &lt;p&gt;I guess by now everyone agrees that Perl is a bad idea. There are few people who know it these days, and there is no justification for knowing it. The language is a minefield that lacks proper error reporting mechanism or means to convey the semantics.&lt;/p&gt; 
 &lt;p&gt;If you are new to it, look at this examples:&lt;/p&gt; 
 &lt;p&gt;All "error reporting" enabled, let's try to divide a string by an integer. &lt;/p&gt; 
 &lt;pre&gt;$ perl -e 'use strict; use warnings; print "foobar" / 42'&lt;br&gt;
Argument "foobar" isn't numeric in division (/) at -e line 1.&lt;br&gt;
0
&lt;/pre&gt; 
 &lt;p&gt;A warning indeed... Didn't prevent program from producing a value though: garbage in, garbage out. And, my long time favorite: analogous issues bit me in real code a number of times!&lt;/p&gt; 
 &lt;pre&gt;$ perl -e 'print reverse "dog"'&lt;br&gt;
dog
&lt;/pre&gt; 
 &lt;p&gt;Even if you know that it has to do with "list context", good luck finding information about default context of this or that function in the docs. In short, if the language of VyOS 1.x wasn't Perl, a lot of bugs would be outright impossible.&lt;/p&gt; 
 &lt;p&gt;Python looks like a good candidate for config scripts: it's strongly typed, the type and object system is fairly expressive, there are nice unit test libraries and template processors and other things, and it's reasonably fast. What I don't like about it and dynamically typed languages in general is that it needs a damn good test coverage because the set of errors it can detect at compile time is limited and a lot of errors make it to runtime, but there are always compromises.&lt;br&gt;&lt;/p&gt; 
 &lt;p&gt;But, we need bindings. VyConf will use sockets and protobuf messages for its API which makes writing bindings for pretty much any language trivial, but in 1.x.x it's more complicated. The C++/Perl library from VyOS backend is not really easy to follow, and not trivial to produce bindings for. However, we have cli-shell-api, which is already used in config scripts written in shell, and behaves as it should. It also produces fairly machine-friendly output, even though its error reporting is rudimantary (then again, error reporting of the C++ and Perl library isn't all that nice either). So, for a proof of concept, I decided to make a thin wrapper around cli-shell-api: later it can be rewritten as a real C++ binding if this approach shows its limitations. It will need some C++ library logic extraction and cleanup to replicate the behaviour (why the C++ library itself links against Perl interpreter library? Did you know it also links to specific version of the apt-pkg library that was never meant for end users and made no promise of API stability, for its version comparison function that it uses for soring names of nodes like eth0? That's another story though).&lt;/p&gt; 
 &lt;p&gt;Anyway, I need to add the Python library to the vyatta-cfg package which I'll do soon, for the time being you can put the file to your VyOS (it works in 1.1.7 with python2.6) and play with it.&lt;/p&gt; 
 &lt;p&gt;&lt;i&gt;﻿Upd: since then, the Python library is a part of VyOS 1.2.0+ images and is in the default PYTHONPATH. Check out scripts in https://github.com/vyos/vyos-1x&lt;/i&gt;&lt;br&gt;&lt;/p&gt; 
 &lt;p&gt;Right now it exposes just a handful of functions: exists(), return_value(), return_values(), and list_nodes(). It also has is_leaf/is_tag/is_multi functions that it uses internally to produce somewhat better error reporting, though they are unnecessary in config scripts, since you already know that about nodes from templates. Those four functions are enough to write a config script for something like squid, dnsmasq, openvpn, or anything else that can reload its config on its own. It's programs that need fancy update logic that really need exists_orig or return_effective_value. Incidentally, a lot of components that need that rewrite to repair or could seriously benefit from serious overhaul are like that: for example. iptables is handled by manipulating individual rules right now even though iptables-restore is atomic, likewise openvpn is now managed by passing it the config in command line options while it's perfectly capable of reloading its config and this would make tunnel restarts a lot less disruptive, and strongswan, the holder of the least maintainable config script, is indeed capable of live reload too.&lt;br&gt;&lt;/p&gt; 
 &lt;p&gt;Which brings us to the next part...&lt;/p&gt; 
 &lt;h2&gt;The conventions&lt;/h2&gt; 
 &lt;p&gt;To avoid having to do two rewrites of the same code instead of just one, we need to make sure that at least substantial part of the code from VyOS 1.2.x can be reused in 2.0. For this we need to setup a set of conventions. I suggest the following, and let's discuss it.&lt;br&gt;&lt;/p&gt; 
 &lt;h3&gt;Language version&lt;/h3&gt; 
 &lt;p&gt;Python 3 SHALL be used.&lt;/p&gt; 
 &lt;p&gt;Rationale: well, how much longer can we all keep 2.x alive if 3.0 is just a cleaner and nicer implementation?&lt;/p&gt; 
 &lt;h3&gt;Coding standard&lt;/h3&gt; 
 &lt;p&gt;No single function shall SHOULD be longer than 100 lines.&lt;/p&gt; 
 &lt;p&gt;Rationale: &lt;a href="https://github.com/vyos/vyatta-cfg-vpn/blob/current/scripts/vpn-config.pl#L449-L1136" title="Link: https://github.com/vyos/vyatta-cfg-vpn/blob/current/scripts/vpn-config.pl#L449-L1136"&gt;https://github.com/vyos/vyatta-cfg-vpn/blob/current/scripts/vpn-config.pl#L449-L1134&lt;/a&gt; ;)&lt;br&gt;&lt;/p&gt; 
 &lt;h3&gt;Logic separation and testability&lt;/h3&gt; 
 &lt;p&gt;This is the most important part. To be able to reuse anything, we need to separate assumptions about the environment from the core logic. To be able to test it in isolation and make sure most of the bugs are caught on developer workstations rather than test routers, we need to avoid dependendies on the global state whenever possible. Also, to fit the transactional commit model of VyOS 2.0 later, we need to keep consistency checking, generating configs, and restarting services separated.&lt;/p&gt; 
 &lt;p&gt;For this, I suggest that we config scripts follow this blueprint:&lt;/p&gt; 
 &lt;p&gt;&lt;br&gt;&lt;/p&gt; 
 &lt;pre&gt;def get_config():&lt;br&gt;
    foo = vyos.config.return_value("foo bar")&lt;br&gt;
    bar = vyos.config.return_value("baz quux")&lt;br&gt;
    return {"foo": foo, "bar": bar} # Could be an object depending on size and complexity...
&lt;p&gt;def verify(config):&lt;br&gt;
    result do_some_checks(config)&lt;br&gt;
    if checks_succees(result):&lt;br&gt;
        return None&lt;br&gt;
    else:&lt;br&gt;
        raise ScaryException("Some error")&lt;/p&gt;
&lt;p&gt;def generate(config):&lt;br&gt;
    write_config_files(config)&lt;/p&gt;
&lt;p&gt;def apply(config):&lt;br&gt;
    restart_some_services(config)&lt;/p&gt;
&lt;p&gt;if __name__ == '__main__':&lt;br&gt;
    try:&lt;br&gt;
       c = get_config()&lt;br&gt;
       verify(c)&lt;br&gt;
       generate(c)&lt;br&gt;
       apply(c)&lt;br&gt;
    except ScaryException:&lt;br&gt;
        exit_gracefully()&lt;/p&gt;&lt;/pre&gt; 
 &lt;p&gt;This way the function that process the config can be tested outside of VyOS by creating the same stucture as get_config() would create by hand (or from file) and passing it as an argument. Likewise, in 2.0 we can call its verify(), update(), and apply() functions separately.&lt;/p&gt; 
 &lt;p&gt;Let me know what you think.&lt;br&gt;&lt;/p&gt; 
&lt;/div&gt;</description>
      <content:encoded>&lt;div class="posthaven-post-body"&gt; 
 &lt;p&gt;There was a rather heated discussion about the 1.2.0 situation on the channel, and valid points were definitely expressed: while 2.0 is being written, 1.2.0 can't benefit from any of that work, and it's sad. We do need a working VyOS in any case, and we can't just stop doing anything about it and only work on 2.0. My original plan was to put 1.2.0 in maintenance mode once it's stabilized, but it would mean no updates at all for anyone, other than bugfixes. To make things worse, some things do need if not rewrite, but at least very deep refactoring bordering on rewrite just to make them work again, due to deep changes in the configs of e.g. StrongSWAN.&lt;/p&gt; 
 &lt;p&gt;There are three main issues with reusing the old code,&amp;nbsp; as I already said: it's written in Perl, it mixes config reading and checking with logic, and it can't be tested outside VyOS. The fourth issue is that the logic for generating, writing, and applying configs is not separated in most scripts either so they don't fit the 2.0 model of more transactional commits. The question is if we can do anything about those issues to enable rewriting bits of 1.2.0 in a way that will allow reusing that code in 2.0 when the config backend and base system are ready, and what exactly should we do.&lt;/p&gt; 
 &lt;p&gt;My conclusion so far is that we probably can, with some dirty hacks and extra care. Read on.&lt;br&gt;&lt;/p&gt; 
 &lt;h2&gt;The language&lt;/h2&gt; 
 &lt;p&gt;I guess by now everyone agrees that Perl is a bad idea. There are few people who know it these days, and there is no justification for knowing it. The language is a minefield that lacks proper error reporting mechanism or means to convey the semantics.&lt;/p&gt; 
 &lt;p&gt;If you are new to it, look at this examples:&lt;/p&gt; 
 &lt;p&gt;All "error reporting" enabled, let's try to divide a string by an integer. &lt;/p&gt; 
 &lt;pre&gt;$ perl -e 'use strict; use warnings; print "foobar" / 42'&lt;br&gt;
Argument "foobar" isn't numeric in division (/) at -e line 1.&lt;br&gt;
0
&lt;/pre&gt; 
 &lt;p&gt;A warning indeed... Didn't prevent program from producing a value though: garbage in, garbage out. And, my long time favorite: analogous issues bit me in real code a number of times!&lt;/p&gt; 
 &lt;pre&gt;$ perl -e 'print reverse "dog"'&lt;br&gt;
dog
&lt;/pre&gt; 
 &lt;p&gt;Even if you know that it has to do with "list context", good luck finding information about default context of this or that function in the docs. In short, if the language of VyOS 1.x wasn't Perl, a lot of bugs would be outright impossible.&lt;/p&gt; 
 &lt;p&gt;Python looks like a good candidate for config scripts: it's strongly typed, the type and object system is fairly expressive, there are nice unit test libraries and template processors and other things, and it's reasonably fast. What I don't like about it and dynamically typed languages in general is that it needs a damn good test coverage because the set of errors it can detect at compile time is limited and a lot of errors make it to runtime, but there are always compromises.&lt;br&gt;&lt;/p&gt; 
 &lt;p&gt;But, we need bindings. VyConf will use sockets and protobuf messages for its API which makes writing bindings for pretty much any language trivial, but in 1.x.x it's more complicated. The C++/Perl library from VyOS backend is not really easy to follow, and not trivial to produce bindings for. However, we have cli-shell-api, which is already used in config scripts written in shell, and behaves as it should. It also produces fairly machine-friendly output, even though its error reporting is rudimantary (then again, error reporting of the C++ and Perl library isn't all that nice either). So, for a proof of concept, I decided to make a thin wrapper around cli-shell-api: later it can be rewritten as a real C++ binding if this approach shows its limitations. It will need some C++ library logic extraction and cleanup to replicate the behaviour (why the C++ library itself links against Perl interpreter library? Did you know it also links to specific version of the apt-pkg library that was never meant for end users and made no promise of API stability, for its version comparison function that it uses for soring names of nodes like eth0? That's another story though).&lt;/p&gt; 
 &lt;p&gt;Anyway, I need to add the Python library to the vyatta-cfg package which I'll do soon, for the time being you can put the file to your VyOS (it works in 1.1.7 with python2.6) and play with it.&lt;/p&gt; 
 &lt;p&gt;&lt;i&gt;﻿Upd: since then, the Python library is a part of VyOS 1.2.0+ images and is in the default PYTHONPATH. Check out scripts in https://github.com/vyos/vyos-1x&lt;/i&gt;&lt;br&gt;&lt;/p&gt; 
 &lt;p&gt;Right now it exposes just a handful of functions: exists(), return_value(), return_values(), and list_nodes(). It also has is_leaf/is_tag/is_multi functions that it uses internally to produce somewhat better error reporting, though they are unnecessary in config scripts, since you already know that about nodes from templates. Those four functions are enough to write a config script for something like squid, dnsmasq, openvpn, or anything else that can reload its config on its own. It's programs that need fancy update logic that really need exists_orig or return_effective_value. Incidentally, a lot of components that need that rewrite to repair or could seriously benefit from serious overhaul are like that: for example. iptables is handled by manipulating individual rules right now even though iptables-restore is atomic, likewise openvpn is now managed by passing it the config in command line options while it's perfectly capable of reloading its config and this would make tunnel restarts a lot less disruptive, and strongswan, the holder of the least maintainable config script, is indeed capable of live reload too.&lt;br&gt;&lt;/p&gt; 
 &lt;p&gt;Which brings us to the next part...&lt;/p&gt; 
 &lt;h2&gt;The conventions&lt;/h2&gt; 
 &lt;p&gt;To avoid having to do two rewrites of the same code instead of just one, we need to make sure that at least substantial part of the code from VyOS 1.2.x can be reused in 2.0. For this we need to setup a set of conventions. I suggest the following, and let's discuss it.&lt;br&gt;&lt;/p&gt; 
 &lt;h3&gt;Language version&lt;/h3&gt; 
 &lt;p&gt;Python 3 SHALL be used.&lt;/p&gt; 
 &lt;p&gt;Rationale: well, how much longer can we all keep 2.x alive if 3.0 is just a cleaner and nicer implementation?&lt;/p&gt; 
 &lt;h3&gt;Coding standard&lt;/h3&gt; 
 &lt;p&gt;No single function shall SHOULD be longer than 100 lines.&lt;/p&gt; 
 &lt;p&gt;Rationale: &lt;a href="https://github.com/vyos/vyatta-cfg-vpn/blob/current/scripts/vpn-config.pl#L449-L1136" title="Link: https://github.com/vyos/vyatta-cfg-vpn/blob/current/scripts/vpn-config.pl#L449-L1136"&gt;https://github.com/vyos/vyatta-cfg-vpn/blob/current/scripts/vpn-config.pl#L449-L1134&lt;/a&gt; ;)&lt;br&gt;&lt;/p&gt; 
 &lt;h3&gt;Logic separation and testability&lt;/h3&gt; 
 &lt;p&gt;This is the most important part. To be able to reuse anything, we need to separate assumptions about the environment from the core logic. To be able to test it in isolation and make sure most of the bugs are caught on developer workstations rather than test routers, we need to avoid dependendies on the global state whenever possible. Also, to fit the transactional commit model of VyOS 2.0 later, we need to keep consistency checking, generating configs, and restarting services separated.&lt;/p&gt; 
 &lt;p&gt;For this, I suggest that we config scripts follow this blueprint:&lt;/p&gt; 
 &lt;p&gt;&lt;br&gt;&lt;/p&gt; 
 &lt;pre&gt;def get_config():&lt;br&gt;
    foo = vyos.config.return_value("foo bar")&lt;br&gt;
    bar = vyos.config.return_value("baz quux")&lt;br&gt;
    return {"foo": foo, "bar": bar} # Could be an object depending on size and complexity...
&lt;p&gt;def verify(config):&lt;br&gt;
    result do_some_checks(config)&lt;br&gt;
    if checks_succees(result):&lt;br&gt;
        return None&lt;br&gt;
    else:&lt;br&gt;
        raise ScaryException("Some error")&lt;/p&gt;
&lt;p&gt;def generate(config):&lt;br&gt;
    write_config_files(config)&lt;/p&gt;
&lt;p&gt;def apply(config):&lt;br&gt;
    restart_some_services(config)&lt;/p&gt;
&lt;p&gt;if __name__ == '__main__':&lt;br&gt;
    try:&lt;br&gt;
       c = get_config()&lt;br&gt;
       verify(c)&lt;br&gt;
       generate(c)&lt;br&gt;
       apply(c)&lt;br&gt;
    except ScaryException:&lt;br&gt;
        exit_gracefully()&lt;/p&gt;&lt;/pre&gt; 
 &lt;p&gt;This way the function that process the config can be tested outside of VyOS by creating the same stucture as get_config() would create by hand (or from file) and passing it as an argument. Likewise, in 2.0 we can call its verify(), update(), and apply() functions separately.&lt;/p&gt; 
 &lt;p&gt;Let me know what you think.&lt;br&gt;&lt;/p&gt; 
&lt;/div&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=4129050&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fblog.vyos.io%2Fvyos-2-dot-0-development-digest-number-5-doing-1-dot-2-x-and-2-dot-0-development-in-parallel&amp;amp;bu=https%253A%252F%252Fblog.vyos.io&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>development</category>
      <category>Uncategorized</category>
      <category>vyos 2.0</category>
      <category>1.2</category>
      <pubDate>Thu, 22 Dec 2016 01:33:41 GMT</pubDate>
      <author>daniil@sentrium.io (Daniil Baturin)</author>
      <guid>https://blog.vyos.io/vyos-2-dot-0-development-digest-number-5-doing-1-dot-2-x-and-2-dot-0-development-in-parallel</guid>
      <dc:date>2016-12-22T01:33:41Z</dc:date>
    </item>
  </channel>
</rss>
