blog

Using ClusterControl Advisor to Create Checks for SELinux and Meltdown/Spectre: Part One

Paul Namuag

We previously showed you how to create your first database advisor in ClusterControl. Now let’s see how we can create a security advisor to check for SELinux and Meltdown/Spectre. We will be using the ClusterControl Developer Studio for this. The ClusterControl DSL handles the call for our shell scripts to be invoked and do the checks.

Since this is a larger topic, we have separated into two parts. First part, let’s try to embed SELinux check and see how we can achieve this. Basically, there are certain cases where we do not need SELinux enabled, specially with database nodes such MySQL/MariaDB/MongoDB/PostgreSQL. When running these nodes in production, they are best kept within a private network. This blog does not advocate that you should disable SELinux everywhere, but in certain cases, this security module can cause issues with your production databases. So let’s begin!

If you have been through our previous blogs, ClusterControl Developer Studio relies on ClusterControl Domain Specific Language, or CCDSL or DSL for short. Part of the functions that DSL provides is host.system(cmd) function. You can check our DSL page for more functions and get familiar with its language specification. This is where we rely on simply invoking the shell command and manage it through our Developer Studio and handle the command output through CCDSL.

First, let’s create the file. Go to Cluster > Manage > Developer Studio > New and do the following:

This will create a folder and a sub-folder “myadvisors/host” and a file called selinux-checker.js.

For this exercise, I have uploaded the scripts to github which can be found here https://github.com/paulnamuag/s9s_CCDSL_scripts. So let’s paste the contents of the file selinux-checker.js from the repository I have uploaded.

Always do not forget to frequently save your work here if you are working on the Developer Studio workspace, otherwise you’ll lose your modifications/changes if you lose your session or if you accidentally close the browser or tab.

Now let’s go to the code tackling the important ones that I would like to share with you! If you look from lines 3 – 8,

var DESCRIPTION="This advisor is to check if SELinux is set to Enforcing otherwise"
                " it's disabled or set as Permissive";
var TITLE="SELinux Check";
var ADVICE_WARNING="Warning!!! getenforce reveals it is set to Enforcing. Run "setenforce permissive" "
                   "or edit /etc/selinux/config and set SELINUX=disabled but this requires a host restart" ;
var ADVICE_OK="SELinux is Permissive or disabled" ;

these are similar to the JavaScript variable initialization which is, in this case, declared as global. However, the use in this script is important as it’s being purposely assigned to be used in the Advisors results page which we will see in the following section.

Going through the main() function, in line 12, we are invoking:

var hosts     = cluster::mySqlNodes();

since I want only to check my MySQL nodes excluding the ClusterControl monitor host. So if you want to check and grab all the nodes, then use cluster::hosts(). More of these functions are in the Cluster Functions section of the CCDSL manual.

The script is very easy to understand if you are a JavaScript programmer or at least understand how JavaScript works. So we’ll take a shortcut and move on to line 33,

retval = host.system("/sbin/getenforce |tr -d 'n'");

The line above will invoke /sbin/getenforce |tr -d ‘n’ Linux command which basically means to retrieve SELinux state and then remove a trailing newline. The host.system() will return an array value consisting of key names which are “success”, “result”, and “errorMessage”.

The lines from 35 – 79, this if/else statement basically handles the return value from function host.system(). If we focus on lines 42 – 44,

advice.setSeverity(Ok);
advice.setJustification(msg);
advice.setAdvice("Nothing to do.");

we’re setting the properties for the object advice variable of type CmonAdvice(). These properties are used to setup our Advisor alerts. Take note that there are 4 types of enumerated types of Severity, these are Undefined, Ok, Warning, and Critical. These are used to set messages in our Advisor results page. Lastly, let’s move on to lines 75 – 78,

advice.setHost(host);
advice.setTitle(TITLE);
advisorMap[idx]= advice;
print(advice.toString("%E"));

advice.setHost() defines which host is currently being checked for SELinux. Then advice.setTitle()</span> is the name or title used in our <strong>Advisors results</strong> page. Line 77 sets the advisorMap associative array with the object advice which is being returned to our CMON API as seen in line 80. Then in line 78, we are printing the advice object in multi line description which contains multiple properties.</p> <p>Now, let’s hit button <img width="218" height="48" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20218%2048'%3E%3C/svg%3E" data-lazy-src="https://severalnines.com/sites/default/files/blog/node_5396/image4.jpg"><noscript><img width="218" height="48" src="https://severalnines.com/sites/default/files/blog/node_5396/image4.jpg"></noscript>. This would print in the Messages tab as seen below:</p> <div class="image"> <div class="image_inner"><img width="1322" height="884" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%201322%20884'%3E%3C/svg%3E" data-lazy-src="https://severalnines.com/sites/default/files/blog/node_5396/image1.jpg"><noscript><img width="1322" height="884" src="https://severalnines.com/sites/default/files/blog/node_5396/image1.jpg"></noscript><br />  </div> </div> <p>Looking good now? Well, let’s see and schedule the advisor, let say run this check for every 30 minutes and set tags as <em>myadvisors;host;selinux-checker</em>.</p> <div class="image"> <div class="image_inner"><img width="804" height="1084" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20804%201084'%3E%3C/svg%3E" data-lazy-src="https://severalnines.com/sites/default/files/blog/node_5396/image5.jpg"><noscript><img width="804" height="1084" src="https://severalnines.com/sites/default/files/blog/node_5396/image5.jpg"></noscript></div> </div> <p>Now, what else do we expect?</p> <h2>The Advisors Results</h2> <p>Since we had the our SELinux Check advisor scheduled, let’s now go to Cluster > Performance > Advisors. Then select the tags we had previously defined which are <em>myadvisors</em> and <em>selinux-checker</em>.</p> <div class="image"> <div class="image_inner"><img width="1999" height="1085" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%201999%201085'%3E%3C/svg%3E" data-lazy-src="https://severalnines.com/sites/default/files/blog/node_5396/image2.jpg"><noscript><img width="1999" height="1085" src="https://severalnines.com/sites/default/files/blog/node_5396/image2.jpg"></noscript></div> </div> <p>You’ll see here all of your advisors, whether they are provided by Severalnines or are custom-made by you. Once it’s scheduled, it’ll be viewed here. This is one of the coolest part, because here you can check and monitor the advisors that you want to focus on. You can prioritise the most important ones by enabling them, and disable the ones that you no longer need.</p> <p>In Part 2 of this blog, we’ll go over creating a more challenging one to check for Meltdown/Spectre and incorporate alarms. We’ll also show you how to debug your CCDSL code like a pro.</p> </div> <aside class="sidebar col-12 col-md-5 col-bleed-x"> <div class="sidebar-content"> <h5>Related Products</h5> <ul class="related-products"> <li class="product"> <a href="https://severalnines.com/product/clustercontrol/""> <img width="202" height="32" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20202%2032'%3E%3C/svg%3E" alt="logo-clustercontrol" data-lazy-src="https://severalnines.com/wp-content/themes/severalnines/assets/img/acf/logo-clustercontrol.svg"><noscript><img width="202" height="32" src="https://severalnines.com/wp-content/themes/severalnines/assets/img/acf/logo-clustercontrol.svg" alt="logo-clustercontrol"></noscript> <p>Worry-free database automation</p> </a> </li> </ul> </div> </aside> </div> <section class="archive-block"> <div class="container"> <div class="grid"> <header class="col-12 block-header"> <h2 class="section-title">Related content</h2> </header> <div class="col-12 archive-list"> <div class="archive-wrapper"> <div class="box post"> <div class="box-content"> <div class="image-wrapper"> <a href="https://severalnines.com/blog/clustercontrol-adds-scale-out-for-redis-sql-server-and-elasticsearch-in-latest-release/" title="ClusterControl adds scale out for Redis, SQL Server, and Elasticsearch in latest release"> <picture><source data-lazy-srcset="https://severalnines.com/wp-content/webp-express/webp-images/uploads/2022/08/Several9s_post_3_image-600x340.png.webp" type="image/webp"><img width="600" height="340" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20600%20340'%3E%3C/svg%3E" class="attachment-archive size-archive wp-post-image webpexpress-processed" alt="" loading="lazy" data-lazy-src="https://severalnines.com/wp-content/uploads/2022/08/Several9s_post_3_image-600x340.png"><noscript><img width="600" height="340" src="https://severalnines.com/wp-content/uploads/2022/08/Several9s_post_3_image-600x340.png" class="attachment-archive size-archive wp-post-image webpexpress-processed" alt="" loading="lazy"></noscript></picture> </a> </div> <div class="text-area"> <div class="taxonomy-meta"> <a class="related-product" href="https://severalnines.com/related-product/clustercontrol/"> <img width="40" height="40" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2040%2040'%3E%3C/svg%3E" alt="clustercontrol" data-lazy-src="https://severalnines.com/wp-content/themes/severalnines/assets/img/acf/clustercontrol.svg"><noscript><img width="40" height="40" src="https://severalnines.com/wp-content/themes/severalnines/assets/img/acf/clustercontrol.svg" alt="clustercontrol"></noscript> </a> </div> <div class="meta-content"> <span class="date">August 2, 2022</span> <span class="author">Sarah Morris</span> </div> <div class="content-wrapper"> <a href="https://severalnines.com/blog/clustercontrol-adds-scale-out-for-redis-sql-server-and-elasticsearch-in-latest-release/" title="ClusterControl adds scale out for Redis, SQL Server, and Elasticsearch in latest release"> <h3 class="archive-title"> ClusterControl adds scale out for Redis, SQL Server, and Elasticsearch in latest release </h3> </a> </div> </div> </div> </div> <div class="box post"> <div class="box-content"> <div class="image-wrapper"> <a href="https://severalnines.com/blog/private-cloud-and-on-prem-database-architectures-with-clustercontrol/" title="Private cloud and on-prem database architectures with ClusterControl"> <picture><source data-lazy-srcset="https://severalnines.com/wp-content/webp-express/webp-images/uploads/2022/05/thisisengineering-raeng-zBLtU0zbJcU-unsplash-600x340.png.webp" type="image/webp"><img width="600" height="340" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20600%20340'%3E%3C/svg%3E" class="attachment-archive size-archive wp-post-image webpexpress-processed" alt="" loading="lazy" data-lazy-src="https://severalnines.com/wp-content/uploads/2022/05/thisisengineering-raeng-zBLtU0zbJcU-unsplash-600x340.png"><noscript><img width="600" height="340" src="https://severalnines.com/wp-content/uploads/2022/05/thisisengineering-raeng-zBLtU0zbJcU-unsplash-600x340.png" class="attachment-archive size-archive wp-post-image webpexpress-processed" alt="" loading="lazy"></noscript></picture> </a> </div> <div class="text-area"> <div class="taxonomy-meta"> <a class="related-product" href="https://severalnines.com/related-product/clustercontrol/"> <img width="40" height="40" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2040%2040'%3E%3C/svg%3E" alt="clustercontrol" data-lazy-src="https://severalnines.com/wp-content/themes/severalnines/assets/img/acf/clustercontrol.svg"><noscript><img width="40" height="40" src="https://severalnines.com/wp-content/themes/severalnines/assets/img/acf/clustercontrol.svg" alt="clustercontrol"></noscript> </a> </div> <div class="meta-content"> <span class="date">June 8, 2022</span> <span class="author">Kyle Buzzell</span> </div> <div class="content-wrapper"> <a href="https://severalnines.com/blog/private-cloud-and-on-prem-database-architectures-with-clustercontrol/" title="Private cloud and on-prem database architectures with ClusterControl"> <h3 class="archive-title"> Private cloud and on-prem database architectures with ClusterControl </h3> </a> </div> </div> </div> </div> <div class="box post"> <div class="box-content"> <div class="image-wrapper"> <a href="https://severalnines.com/blog/a-true-alternative-to-elastic-cloud-for-elasticsearch-ops-automation/" title="A true alternative to Elastic Cloud for Elasticsearch ops automation"> <picture><source data-lazy-srcset="https://severalnines.com/wp-content/webp-express/webp-images/uploads/2022/05/husna-miskandar-FC4z3l4sUYc-unsplash-600x340.png.webp" type="image/webp"><img width="600" height="340" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20600%20340'%3E%3C/svg%3E" class="attachment-archive size-archive wp-post-image webpexpress-processed" alt="" loading="lazy" data-lazy-src="https://severalnines.com/wp-content/uploads/2022/05/husna-miskandar-FC4z3l4sUYc-unsplash-600x340.png"><noscript><img width="600" height="340" src="https://severalnines.com/wp-content/uploads/2022/05/husna-miskandar-FC4z3l4sUYc-unsplash-600x340.png" class="attachment-archive size-archive wp-post-image webpexpress-processed" alt="" loading="lazy"></noscript></picture> </a> </div> <div class="text-area"> <div class="taxonomy-meta"> <a class="related-product" href="https://severalnines.com/related-product/clustercontrol/"> <img width="40" height="40" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2040%2040'%3E%3C/svg%3E" alt="clustercontrol" data-lazy-src="https://severalnines.com/wp-content/themes/severalnines/assets/img/acf/clustercontrol.svg"><noscript><img width="40" height="40" src="https://severalnines.com/wp-content/themes/severalnines/assets/img/acf/clustercontrol.svg" alt="clustercontrol"></noscript> </a> </div> <div class="meta-content"> <span class="date">May 19, 2022</span> <span class="author">Sarah Morris</span> </div> <div class="content-wrapper"> <a href="https://severalnines.com/blog/a-true-alternative-to-elastic-cloud-for-elasticsearch-ops-automation/" title="A true alternative to Elastic Cloud for Elasticsearch ops automation"> <h3 class="archive-title"> A true alternative to Elastic Cloud for Elasticsearch ops automation </h3> </a> </div> </div> </div> </div> </div> </div> </div> </div> </section> <section class="cover-with-text-box subscribe"> <div data-bg="https://severalnines.com/wp-content/uploads/2021/09/ilya-pavlov-wbXdGS_D17U-unsplash.png" class="background rocket-lazyload" style=""> <div class="container"> <div class="text-box"> <h3>Subscribe to get our best and freshest content</h3> <script type="rocketlazyloadscript" data-rocket-type="text/javascript">var gform;gform||(document.addEventListener("gform_main_scripts_loaded",function(){gform.scriptsLoaded=!0}),window.addEventListener("DOMContentLoaded",function(){gform.domLoaded=!0}),gform={domLoaded:!1,scriptsLoaded:!1,initializeOnLoaded:function(o){gform.domLoaded&&gform.scriptsLoaded?o():!gform.domLoaded&&gform.scriptsLoaded?window.addEventListener("DOMContentLoaded",o):document.addEventListener("gform_main_scripts_loaded",o)},hooks:{action:{},filter:{}},addAction:function(o,n,r,t){gform.addHook("action",o,n,r,t)},addFilter:function(o,n,r,t){gform.addHook("filter",o,n,r,t)},doAction:function(o){gform.doHook("action",o,arguments)},applyFilters:function(o){return gform.doHook("filter",o,arguments)},removeAction:function(o,n){gform.removeHook("action",o,n)},removeFilter:function(o,n,r){gform.removeHook("filter",o,n,r)},addHook:function(o,n,r,t,i){null==gform.hooks[o][n]&&(gform.hooks[o][n]=[]);var e=gform.hooks[o][n];null==i&&(i=n+"_"+e.length),gform.hooks[o][n].push({tag:i,callable:r,priority:t=null==t?10:t})},doHook:function(n,o,r){var t;if(r=Array.prototype.slice.call(r,1),null!=gform.hooks[n][o]&&((o=gform.hooks[n][o]).sort(function(o,n){return o.priority-n.priority}),o.forEach(function(o){"function"!=typeof(t=o.callable)&&(t=window[t]),"action"==n?t.apply(null,r):r[0]=t.apply(null,r)})),"filter"==n)return r[0]},removeHook:function(o,n,t,i){var r;null!=gform.hooks[o][n]&&(r=(r=gform.hooks[o][n]).filter(function(o,n,r){return!!(null!=i&&i!=o.tag||null!=t&&t!=o.priority)}),gform.hooks[o][n]=r)}});</script> <div class='gf_browser_safari gform_wrapper gravity-theme' id='gform_wrapper_10' > <div class='gform_heading'> <span class='gform_description'>Newsletter Subscription</span> </div><form method='post' enctype='multipart/form-data' id='gform_10' action='/blog/clustercontrol-devstudio-using-advisor-create-checks-selinux-meltdown-spectre-part-1/' > <div class='gform_body gform-body'><div id='gform_fields_10' class='gform_fields top_label form_sublabel_below description_below'><div id="field_10_1" class="gfield gfield--width-full field_sublabel_below field_description_below hidden_label gfield_visibility_visible" data-js-reload="field_10_1"><label class='gfield_label' for='input_10_1' >Email</label><div class='ginput_container ginput_container_email'> <input name='input_1' id='input_10_1' type='text' value='' class='large' placeholder='Email' aria-invalid="false" /> </div></div><div id="field_10_3" class="gfield gfield--width-full field_sublabel_below field_description_below gfield_visibility_hidden" data-js-reload="field_10_3"><div class='admin-hidden-markup'><i class='gform-icon gform-icon--hidden'></i><span>Hidden</span></div><label class='gfield_label' for='input_10_3' >State</label><div class='ginput_container ginput_container_text'><input name='input_3' id='input_10_3' type='text' value='' class='large' aria-invalid="false" /> </div></div><div id="field_10_2" class="gfield gfield--width-full gform_hidden field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_10_2"><div class='ginput_container ginput_container_text'><input name='input_2' id='input_10_2' type='hidden' class='gform_hidden' aria-invalid="false" value='' /></div></div><div id="field_10_4" class="gfield field_sublabel_below field_description_below hidden_label gfield_visibility_visible" data-js-reload="field_10_4"><label class='gfield_label' for='input_10_4' >CAPTCHA</label><div id='input_10_4' class='ginput_container ginput_recaptcha' data-sitekey='6LeVGEAUAAAAANOt9l9-3MmtL4uormHOIttoKf_O' data-theme='light' data-tabindex='0' data-badge=''></div></div></div></div> <div class='gform_footer top_label'> <input type='submit' id='gform_submit_button_10' class='gform_button button' value='Subscribe' onclick='if(window["gf_submitting_10"]){return false;} window["gf_submitting_10"]=true; ' onkeypress='if( event.keyCode == 13 ){ if(window["gf_submitting_10"]){return false;} window["gf_submitting_10"]=true; jQuery("#gform_10").trigger("submit",[true]); }' /> <input type='hidden' class='gform_hidden' name='is_submit_10' value='1' /> <input type='hidden' class='gform_hidden' name='gform_submit' value='10' /> <input type='hidden' class='gform_hidden' name='gform_unique_id' value='' /> <input type='hidden' class='gform_hidden' name='state_10' value='WyJbXSIsIjk1OWIxODI3MGFjMmFlNzNjMGFjYWQwNDE1NzBkOTczIl0=' /> <input type='hidden' class='gform_hidden' name='gform_target_page_number_10' id='gform_target_page_number_10' value='0' /> <input type='hidden' class='gform_hidden' name='gform_source_page_number_10' id='gform_source_page_number_10' value='1' /> <input type='hidden' name='gform_field_values' value='' /> </div> </form> </div> <p class="small-grey"></p> </div> </div> </div> </section> </div><!-- .entry-content --> </article><!-- #post-13179 --> </main><!-- #main --> <footer class="site-footer"> <div class="wrapper-mid"> <div class="wrapper"> <div class="site-footer__mid"> <div class="column logo socialmedia"> <a class="logo" href="https://severalnines.com"> <img width="112" height="24" class="lazyloaded" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%20112%2024'%3E%3C/svg%3E" alt="severalnines white logo" data-lazy-src="https://severalnines.com/wp-content/themes/severalnines/assets/img/seve9-logo-white.svg"><noscript><img width="112" height="24" class="lazyloaded" src="https://severalnines.com/wp-content/themes/severalnines/assets/img/seve9-logo-white.svg" alt="severalnines white logo"></noscript> </a> <ul class="severalnines-socialmedia"> <li> <a target="_blank" class="icon-Twitter" href="https://twitter.com/severalnines/" target="_self" title="Twitter"> <span class="screen-reader-text">Twitter</span> </a> </li> <li> <a target="_blank" class="icon-Facebook" href="https://www.facebook.com/severalnines/" target="_self" title="Facebook"> <span class="screen-reader-text">Facebook</span> </a> </li> <li> <a target="_blank" class="icon-Linkedin" href="https://www.linkedin.com/company/severalnines/" target="_self" title="Linkedin"> <span class="screen-reader-text">Linkedin</span> </a> </li> <li> <a target="_blank" class="icon-Youtube" href="http://www.youtube.com/c/Severalnines/" target="_self" title="Youtube"> <span class="screen-reader-text">Youtube</span> </a> </li> <li> <a target="_blank" class="icon-Slideshare" href="https://www.slideshare.net/severalnines/" target="_self" title="Slideshare"> <span class="screen-reader-text">Slideshare</span> </a> </li> <li> <a target="_blank" class="icon-RSS" href="https://severalnines.com/feed" target="_self" title="RSS"> <span class="screen-reader-text">RSS</span> </a> </li> </ul> </div> <div class="column footer-menu"> <ul id="menu-footer" class="menu-footer"><li id="menu-item-1117" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-1117"><a>Products</a> <ul class="sub-menu"> <li id="menu-item-1112" class="menu-item menu-item-type-post_type menu-item-object-product menu-item-1112"><a href="https://severalnines.com/clustercontrol/">CC</a></li> <li id="menu-item-1115" class="menu-item menu-item-type-post_type menu-item-object-product menu-item-1115"><a href="https://severalnines.com/ccx/">CCX</a></li> <li id="menu-item-1452" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1452"><a href="https://backup.ninja">Backup Ninja</a></li> </ul> </li> <li id="menu-item-24957" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-24957"><a>CC</a> <ul class="sub-menu"> <li id="menu-item-24923" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-24923"><a href="/clustercontrol/databases/mysql/">MySQL</a></li> <li id="menu-item-24924" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-24924"><a href="/clustercontrol/databases/mariadb/">MariaDB</a></li> <li id="menu-item-24925" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-24925"><a href="/clustercontrol/databases/mongodb/">MongoDB</a></li> <li id="menu-item-24926" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-24926"><a href="/clustercontrol/databases/postgresql/">PostgreSQL</a></li> <li id="menu-item-24927" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-24927"><a href="/clustercontrol/databases/mysql-ndb-cluster/">MySQL NDB</a></li> <li id="menu-item-24928" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-24928"><a href="/clustercontrol/databases/timescaledb/">TimescaleDB</a></li> <li id="menu-item-24929" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-24929"><a href="/clustercontrol/databases/mysql-galera-cluster/">MySQL Galera</a></li> </ul> </li> <li id="menu-item-24930" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-24930"><a>Solutions</a> <ul class="sub-menu"> <li id="menu-item-24931" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-24931"><a href="/clustercontrol/solutions/multi-cloud/">Multi cloud</a></li> <li id="menu-item-24932" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-24932"><a href="/clustercontrol/solutions/hybrid-cloud/">Hybrid cloud</a></li> <li id="menu-item-24933" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-24933"><a href="/clustercontrol/solutions/disaster-recovery/">Disaster recovery</a></li> </ul> </li> <li id="menu-item-1444" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-1444"><a>Developers</a> <ul class="sub-menu"> <li id="menu-item-1445" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1445"><a href="https://docs.severalnines.com/">Docs</a></li> <li id="menu-item-1436" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1436"><a href="https://severalnines.com/support/">Support</a></li> <li id="menu-item-1451" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1451"><a href="https://join.slack.com/t/clustercontrol/shared_invite/zt-b15k9477-jLllD6qJOUm3bGnOWynVig">S9S slack</a></li> <li id="menu-item-1447" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1447"><a href="/clustercontrol/training/">CC Training</a></li> <li id="menu-item-1449" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1449"><a href="/clustercontrol/certification/">CC Certification</a></li> </ul> </li> <li id="menu-item-24934" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-24934"><a>Corporate</a> <ul class="sub-menu"> <li id="menu-item-23354" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-23354"><a href="https://severalnines.com/about-us/">About us</a></li> <li id="menu-item-23073" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-23073"><a href="https://severalnines.com/contact/">Contact</a></li> <li id="menu-item-24935" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-24935"><a href="https://severalnines.com/career/">Careers</a></li> <li id="menu-item-23835" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-23835"><a href="https://severalnines.com/partners/">Partners</a></li> </ul> </li> </ul> </div> <div class="column subscribe"> <h3>The Planet9s newsletter</h3> <p>Join for inspiration, news about database stuff, this, that and more.</p> <div class="iframe-wrapper"> <div class='gf_browser_safari gform_wrapper gravity-theme' id='gform_wrapper_1' > <div class='gform_heading'> <span class='gform_description'>Newsletter Subscription</span> </div><form method='post' enctype='multipart/form-data' id='gform_1' action='/blog/clustercontrol-devstudio-using-advisor-create-checks-selinux-meltdown-spectre-part-1/' > <div class='gform_body gform-body'><div id='gform_fields_1' class='gform_fields top_label form_sublabel_below description_below'><div id="field_1_1" class="gfield gfield--width-full field_sublabel_below field_description_below hidden_label gfield_visibility_visible" data-js-reload="field_1_1"><label class='gfield_label' for='input_1_1' >Email</label><div class='ginput_container ginput_container_email'> <input name='input_1' id='input_1_1' type='text' value='' class='large' placeholder='Email' aria-invalid="false" /> </div></div><div id="field_1_3" class="gfield gfield--width-full field_sublabel_below field_description_below gfield_visibility_hidden" data-js-reload="field_1_3"><div class='admin-hidden-markup'><i class='gform-icon gform-icon--hidden'></i><span>Hidden</span></div><label class='gfield_label' for='input_1_3' >State</label><div class='ginput_container ginput_container_text'><input name='input_3' id='input_1_3' type='text' value='' class='large' aria-invalid="false" /> </div></div><div id="field_1_2" class="gfield gfield--width-full gform_hidden field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_1_2"><div class='ginput_container ginput_container_text'><input name='input_2' id='input_1_2' type='hidden' class='gform_hidden' aria-invalid="false" value='' /></div></div><div id="field_1_4" class="gfield field_sublabel_below field_description_below hidden_label gfield_visibility_visible" data-js-reload="field_1_4"><label class='gfield_label' for='input_1_4' >CAPTCHA</label><div id='input_1_4' class='ginput_container ginput_recaptcha' data-sitekey='6LeVGEAUAAAAANOt9l9-3MmtL4uormHOIttoKf_O' data-theme='light' data-tabindex='0' data-badge=''></div></div></div></div> <div class='gform_footer top_label'> <input type='submit' id='gform_submit_button_1' class='gform_button button' value='Subscribe' onclick='if(window["gf_submitting_1"]){return false;} window["gf_submitting_1"]=true; ' onkeypress='if( event.keyCode == 13 ){ if(window["gf_submitting_1"]){return false;} window["gf_submitting_1"]=true; jQuery("#gform_1").trigger("submit",[true]); }' /> <input type='hidden' class='gform_hidden' name='is_submit_1' value='1' /> <input type='hidden' class='gform_hidden' name='gform_submit' value='1' /> <input type='hidden' class='gform_hidden' name='gform_unique_id' value='' /> <input type='hidden' class='gform_hidden' name='state_1' value='WyJbXSIsIjk1OWIxODI3MGFjMmFlNzNjMGFjYWQwNDE1NzBkOTczIl0=' /> <input type='hidden' class='gform_hidden' name='gform_target_page_number_1' id='gform_target_page_number_1' value='0' /> <input type='hidden' class='gform_hidden' name='gform_source_page_number_1' id='gform_source_page_number_1' value='1' /> <input type='hidden' name='gform_field_values' value='' /> </div> </form> </div> </div> </div> </div> </div> </div> <div class="wrapper-bottom"> <div class="wrapper"> <div class="site-footer__bottom"> <ul class="severalnines-socialmedia"> <li> <a target="_blank" class="icon-Twitter" href="https://twitter.com/severalnines/" target="_self" title="Twitter"> <span class="screen-reader-text">Twitter</span> </a> </li> <li> <a target="_blank" class="icon-Facebook" href="https://www.facebook.com/severalnines/" target="_self" title="Facebook"> <span class="screen-reader-text">Facebook</span> </a> </li> <li> <a target="_blank" class="icon-Linkedin" href="https://www.linkedin.com/company/severalnines/" target="_self" title="Linkedin"> <span class="screen-reader-text">Linkedin</span> </a> </li> <li> <a target="_blank" class="icon-Youtube" href="http://www.youtube.com/c/Severalnines/" target="_self" title="Youtube"> <span class="screen-reader-text">Youtube</span> </a> </li> <li> <a target="_blank" class="icon-Slideshare" href="https://www.slideshare.net/severalnines/" target="_self" title="Slideshare"> <span class="screen-reader-text">Slideshare</span> </a> </li> <li> <a target="_blank" class="icon-RSS" href="https://severalnines.com/feed" target="_self" title="RSS"> <span class="screen-reader-text">RSS</span> </a> </li> </ul> <div class="site-footer__copyright bottom-left"> </div> <div class="site-footer__mandatory-links bottom-right"> <ul class="mandatory-links"> <li><a href="https://severalnines.com/privacy/" target="_self" title="Privacy Policy">Privacy Policy</a> </li> <li><a href="https://severalnines.com/ccx/terms/" target="_self" title="Terms and Conditions">Terms and Conditions</a> </li> </ul> </div> </div> </div> </div> </footer> </div> <!-- Zopim chat bot code --> <script type="rocketlazyloadscript" data-rocket-type="text/javascript"> window.$zopim||(function(d,s){var z=$zopim=function(c){z._.push(c)},$=z.s= d.createElement(s),e=d.getElementsByTagName(s)[0];z.set=function(o){z.set. _.push(o)};z._=[];z.set._=[];$.async=!0;$.setAttribute("charset","utf-8"); $.src="//v2.zopim.com/?3P2DzaW6KX6JrCYBbnEAaeOa2IVmBM5T";z.t=+new Date;$. type="text/javascript";e.parentNode.insertBefore($,e)})(document,"script"); </script> <!-- scrolling functionality for when hash clicked/ hash for another page form --> <script type="rocketlazyloadscript" data-rocket-type="text/javascript">window.addEventListener('DOMContentLoaded', function() { jQuery(document).ready(function(){ jQuery(".acf-button-block a").on('click', function(event) { if ((this.hash !== "" && this.hash == this.href) || this.hash == '#gform_wrapper_7') { event.preventDefault(); var hash = this.hash; jQuery('html, body').animate({ scrollTop: jQuery(hash).offset().top-200 }, 0, function(){ window.location.hash = hash; }); } }); setTimeout(() => { id = window.location.hash; if ( jQuery(id).length > 0 ) { jQuery('html, body').animate({ scrollTop: jQuery(id).offset().top-180 }, 0, function(){ window.location.hash = id; }); } }, 100); /*Reload window after cookie consent(DOM interaction issue)*/ jQuery(document).on('click', '#CybotCookiebotDialogBodyLevelButtonLevelOptinAllowAll', function(){ console.log('#CybotCookiebotDialogBodyLevelButtonLevelOptinAllowAll clicked'); windowReload_s9s(); }); function windowReload_s9s(){ console.log('windowReload_s9s'); location.reload(); } }); });</script> <!-- Cookiebot --> <script id="Cookiebot" src="https://consent.cookiebot.com/uc.js" data-cbid="63821ef7-a3fe-4148-810f-7a081871033e" data-blockingmode="auto" type="text/javascript" defer></script> <script type="rocketlazyloadscript" id='rocket-browser-checker-js-after'> "use strict";var _createClass=function(){function defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||!1,descriptor.configurable=!0,"value"in descriptor&&(descriptor.writable=!0),Object.defineProperty(target,descriptor.key,descriptor)}}return function(Constructor,protoProps,staticProps){return protoProps&&defineProperties(Constructor.prototype,protoProps),staticProps&&defineProperties(Constructor,staticProps),Constructor}}();function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}var RocketBrowserCompatibilityChecker=function(){function RocketBrowserCompatibilityChecker(options){_classCallCheck(this,RocketBrowserCompatibilityChecker),this.passiveSupported=!1,this._checkPassiveOption(this),this.options=!!this.passiveSupported&&options}return _createClass(RocketBrowserCompatibilityChecker,[{key:"_checkPassiveOption",value:function(self){try{var options={get passive(){return!(self.passiveSupported=!0)}};window.addEventListener("test",null,options),window.removeEventListener("test",null,options)}catch(err){self.passiveSupported=!1}}},{key:"initRequestIdleCallback",value:function(){!1 in window&&(window.requestIdleCallback=function(cb){var start=Date.now();return setTimeout(function(){cb({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-start))}})},1)}),!1 in window&&(window.cancelIdleCallback=function(id){return clearTimeout(id)})}},{key:"isDataSaverModeOn",value:function(){return"connection"in navigator&&!0===navigator.connection.saveData}},{key:"supportsLinkPrefetch",value:function(){var elem=document.createElement("link");return elem.relList&&elem.relList.supports&&elem.relList.supports("prefetch")&&window.IntersectionObserver&&"isIntersecting"in IntersectionObserverEntry.prototype}},{key:"isSlowConnection",value:function(){return"connection"in navigator&&"effectiveType"in navigator.connection&&("2g"===navigator.connection.effectiveType||"slow-2g"===navigator.connection.effectiveType)}}]),RocketBrowserCompatibilityChecker}(); </script> <script id='rocket-preload-links-js-extra'> var RocketPreloadLinksConfig = {"excludeUris":"\/(?:.+\/)?feed(?:\/(?:.+\/?)?)?$|\/(?:.+\/)?embed\/|\/(index\\.php\/)?wp\\-json(\/.*|$)|\/refer\/|\/go\/|\/recommend\/|\/recommends\/","usesTrailingSlash":"1","imageExt":"jpg|jpeg|gif|png|tiff|bmp|webp|avif|pdf|doc|docx|xls|xlsx|php","fileExt":"jpg|jpeg|gif|png|tiff|bmp|webp|avif|pdf|doc|docx|xls|xlsx|php|html|htm","siteUrl":"https:\/\/severalnines.com","onHoverDelay":"100","rateThrottle":"3"}; </script> <script type="rocketlazyloadscript" id='rocket-preload-links-js-after'> (function() { "use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e=function(){function i(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(e,t,n){return t&&i(e.prototype,t),n&&i(e,n),e}}();function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var t=function(){function n(e,t){i(this,n),this.browser=e,this.config=t,this.options=this.browser.options,this.prefetched=new Set,this.eventTime=null,this.threshold=1111,this.numOnHover=0}return e(n,[{key:"init",value:function(){!this.browser.supportsLinkPrefetch()||this.browser.isDataSaverModeOn()||this.browser.isSlowConnection()||(this.regex={excludeUris:RegExp(this.config.excludeUris,"i"),images:RegExp(".("+this.config.imageExt+")$","i"),fileExt:RegExp(".("+this.config.fileExt+")$","i")},this._initListeners(this))}},{key:"_initListeners",value:function(e){-1<this.config.onHoverDelay&&document.addEventListener("mouseover",e.listener.bind(e),e.listenerOptions),document.addEventListener("mousedown",e.listener.bind(e),e.listenerOptions),document.addEventListener("touchstart",e.listener.bind(e),e.listenerOptions)}},{key:"listener",value:function(e){var t=e.target.closest("a"),n=this._prepareUrl(t);if(null!==n)switch(e.type){case"mousedown":case"touchstart":this._addPrefetchLink(n);break;case"mouseover":this._earlyPrefetch(t,n,"mouseout")}}},{key:"_earlyPrefetch",value:function(t,e,n){var i=this,r=setTimeout(function(){if(r=null,0===i.numOnHover)setTimeout(function(){return i.numOnHover=0},1e3);else if(i.numOnHover>i.config.rateThrottle)return;i.numOnHover++,i._addPrefetchLink(e)},this.config.onHoverDelay);t.addEventListener(n,function e(){t.removeEventListener(n,e,{passive:!0}),null!==r&&(clearTimeout(r),r=null)},{passive:!0})}},{key:"_addPrefetchLink",value:function(i){return this.prefetched.add(i.href),new Promise(function(e,t){var n=document.createElement("link");n.rel="prefetch",n.href=i.href,n.onload=e,n.onerror=t,document.head.appendChild(n)}).catch(function(){})}},{key:"_prepareUrl",value:function(e){if(null===e||"object"!==(void 0===e?"undefined":r(e))||!1 in e||-1===["http:","https:"].indexOf(e.protocol))return null;var t=e.href.substring(0,this.config.siteUrl.length),n=this._getPathname(e.href,t),i={original:e.href,protocol:e.protocol,origin:t,pathname:n,href:t+n};return this._isLinkOk(i)?i:null}},{key:"_getPathname",value:function(e,t){var n=t?e.substring(this.config.siteUrl.length):e;return n.startsWith("/")||(n="/"+n),this._shouldAddTrailingSlash(n)?n+"/":n}},{key:"_shouldAddTrailingSlash",value:function(e){return this.config.usesTrailingSlash&&!e.endsWith("/")&&!this.regex.fileExt.test(e)}},{key:"_isLinkOk",value:function(e){return null!==e&&"object"===(void 0===e?"undefined":r(e))&&(!this.prefetched.has(e.href)&&e.origin===this.config.siteUrl&&-1===e.href.indexOf("?")&&-1===e.href.indexOf("#")&&!this.regex.excludeUris.test(e.href)&&!this.regex.images.test(e.href))}}],[{key:"run",value:function(){"undefined"!=typeof RocketPreloadLinksConfig&&new n(new RocketBrowserCompatibilityChecker({capture:!0,passive:!0}),RocketPreloadLinksConfig).init()}}]),n}();t.run(); }()); </script> <script type="rocketlazyloadscript" src='https://severalnines.com/wp-content/themes/severalnines/assets/dist/frontend.js?ver=1658752958' id='cntrst-scripts-js' defer></script> <script type="rocketlazyloadscript" src='https://severalnines.com/wp-includes/js/dist/vendor/regenerator-runtime.min.js?ver=0.13.9' id='regenerator-runtime-js' defer></script> <script type="rocketlazyloadscript" src='https://severalnines.com/wp-includes/js/dist/vendor/wp-polyfill.min.js?ver=3.15.0' id='wp-polyfill-js'></script> <script type="rocketlazyloadscript" src='https://severalnines.com/wp-includes/js/dist/dom-ready.min.js?ver=d996b53411d1533a84951212ab6ac4ff' id='wp-dom-ready-js' defer></script> <script type="rocketlazyloadscript" src='https://severalnines.com/wp-includes/js/dist/hooks.min.js?ver=c6d64f2cb8f5c6bb49caca37f8828ce3' id='wp-hooks-js'></script> <script type="rocketlazyloadscript" src='https://severalnines.com/wp-includes/js/dist/i18n.min.js?ver=ebee46757c6a411e38fd079a7ac71d94' id='wp-i18n-js'></script> <script type="rocketlazyloadscript" id='wp-i18n-js-after'> wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } ); </script> <script type="rocketlazyloadscript" src='https://severalnines.com/wp-includes/js/dist/a11y.min.js?ver=a38319d7ba46c6e60f7f9d4c371222c5' id='wp-a11y-js' defer></script> <script type="rocketlazyloadscript" defer='defer' src='https://severalnines.com/wp-content/plugins/gravityforms/js/jquery.json.min.js?ver=2.6.4' id='gform_json-js'></script> <script id='gform_gravityforms-js-extra'> var gform_i18n = {"datepicker":{"days":{"monday":"Mon","tuesday":"Tue","wednesday":"Wed","thursday":"Thu","friday":"Fri","saturday":"Sat","sunday":"Sun"},"months":{"january":"January","february":"February","march":"March","april":"April","may":"May","june":"June","july":"July","august":"August","september":"September","october":"October","november":"November","december":"December"},"firstDay":1,"iconText":"Select date"}}; var gf_legacy_multi = []; var gform_gravityforms = {"strings":{"invalid_file_extension":"This type of file is not allowed. Must be one of the following:","delete_file":"Delete this file","in_progress":"in progress","file_exceeds_limit":"File exceeds size limit","illegal_extension":"This type of file is not allowed.","max_reached":"Maximum number of files reached","unknown_error":"There was a problem while saving the file on the server","currently_uploading":"Please wait for the uploading to complete","cancel":"Cancel","cancel_upload":"Cancel this upload","cancelled":"Cancelled"},"vars":{"images_url":"https:\/\/severalnines.com\/wp-content\/plugins\/gravityforms\/images"}}; var gf_global = {"gf_currency_config":{"name":"U.S. Dollar","symbol_left":"$","symbol_right":"","symbol_padding":"","thousand_separator":",","decimal_separator":".","decimals":2,"code":"USD"},"base_url":"https:\/\/severalnines.com\/wp-content\/plugins\/gravityforms","number_formats":[],"spinnerUrl":"https:\/\/severalnines.com\/wp-content\/plugins\/gravityforms\/images\/spinner.svg","strings":{"newRowAdded":"New row added.","rowRemoved":"Row removed","formSaved":"The form has been saved. The content contains the link to return and complete the form."}}; var gf_global = {"gf_currency_config":{"name":"U.S. Dollar","symbol_left":"$","symbol_right":"","symbol_padding":"","thousand_separator":",","decimal_separator":".","decimals":2,"code":"USD"},"base_url":"https:\/\/severalnines.com\/wp-content\/plugins\/gravityforms","number_formats":[],"spinnerUrl":"https:\/\/severalnines.com\/wp-content\/plugins\/gravityforms\/images\/spinner.svg","strings":{"newRowAdded":"New row added.","rowRemoved":"Row removed","formSaved":"The form has been saved. The content contains the link to return and complete the form."}}; </script> <script type="rocketlazyloadscript" defer='defer' src='https://severalnines.com/wp-content/plugins/gravityforms/js/gravityforms.min.js?ver=2.6.4' id='gform_gravityforms-js'></script> <script type="rocketlazyloadscript" defer='defer' src='https://www.google.com/recaptcha/api.js?hl=en&ver=6.0#038;render=explicit' id='gform_recaptcha-js'></script> <script type="rocketlazyloadscript" defer='defer' src='https://severalnines.com/wp-content/plugins/gravityforms/js/placeholders.jquery.min.js?ver=2.6.4' id='gform_placeholder-js'></script> <script type="rocketlazyloadscript">window.addEventListener('DOMContentLoaded', function() { gform.initializeOnLoaded( function() { jQuery(document).on('gform_post_render', function(event, formId, currentPage){if(formId == 10) {if(typeof Placeholders != 'undefined'){ Placeholders.enable(); }} } );jQuery(document).bind('gform_post_conditional_logic', function(event, formId, fields, isInit){} ) } ); });</script> <script type="rocketlazyloadscript">window.addEventListener('DOMContentLoaded', function() { gform.initializeOnLoaded( function() { jQuery(document).trigger('gform_post_render', [10, 1]) } ); });</script> <script type="rocketlazyloadscript">window.addEventListener('DOMContentLoaded', function() { gform.initializeOnLoaded( function() { jQuery(document).on('gform_post_render', function(event, formId, currentPage){if(formId == 1) {if(typeof Placeholders != 'undefined'){ Placeholders.enable(); }} } );jQuery(document).bind('gform_post_conditional_logic', function(event, formId, fields, isInit){} ) } ); });</script> <script type="rocketlazyloadscript">window.addEventListener('DOMContentLoaded', function() { gform.initializeOnLoaded( function() { jQuery(document).trigger('gform_post_render', [1, 1]) } ); });</script> <script>window.lazyLoadOptions=[{elements_selector:"img[data-lazy-src],.rocket-lazyload,iframe[data-lazy-src]",data_src:"lazy-src",data_srcset:"lazy-srcset",data_sizes:"lazy-sizes",class_loading:"lazyloading",class_loaded:"lazyloaded",threshold:300,callback_loaded:function(element){if(element.tagName==="IFRAME"&&element.dataset.rocketLazyload=="fitvidscompatible"){if(element.classList.contains("lazyloaded")){if(typeof window.jQuery!="undefined"){if(jQuery.fn.fitVids){jQuery(element).parent().fitVids()}}}}}},{elements_selector:".rocket-lazyload",data_src:"lazy-src",data_srcset:"lazy-srcset",data_sizes:"lazy-sizes",class_loading:"lazyloading",class_loaded:"lazyloaded",threshold:300,}];window.addEventListener('LazyLoad::Initialized',function(e){var lazyLoadInstance=e.detail.instance;if(window.MutationObserver){var observer=new MutationObserver(function(mutations){var image_count=0;var iframe_count=0;var rocketlazy_count=0;mutations.forEach(function(mutation){for(var i=0;i<mutation.addedNodes.length;i++){if(typeof mutation.addedNodes[i].getElementsByTagName!=='function'){continue} if(typeof mutation.addedNodes[i].getElementsByClassName!=='function'){continue} images=mutation.addedNodes[i].getElementsByTagName('img');is_image=mutation.addedNodes[i].tagName=="IMG";iframes=mutation.addedNodes[i].getElementsByTagName('iframe');is_iframe=mutation.addedNodes[i].tagName=="IFRAME";rocket_lazy=mutation.addedNodes[i].getElementsByClassName('rocket-lazyload');image_count+=images.length;iframe_count+=iframes.length;rocketlazy_count+=rocket_lazy.length;if(is_image){image_count+=1} if(is_iframe){iframe_count+=1}}});if(image_count>0||iframe_count>0||rocketlazy_count>0){lazyLoadInstance.update()}});var b=document.getElementsByTagName("body")[0];var config={childList:!0,subtree:!0};observer.observe(b,config)}},!1)</script><script data-no-minify="1" async src="https://severalnines.com/wp-content/plugins/wp-rocket/assets/js/lazyload/17.5/lazyload.min.js"></script><!-- The Modal --> <div id="s9s_modal" class="modal image_lightbox_popup"> <span id="s9s_modal-close" class="modal-close">×</span> <img id="s9s_modal-content" class="modal-content"> </div> </body> </html> <!-- This website is like a Rocket, isn't it? Performance optimized by WP Rocket. Learn more: https://wp-rocket.me - Debug: cached@1660163335 -->