diff --git a/404.html b/404.html index 06caab3..762499e 100644 --- a/404.html +++ b/404.html @@ -29,10 +29,10 @@ })(); - +
- + diff --git a/assets/app-601417a4.js b/assets/app-170da3cb.js similarity index 99% rename from assets/app-601417a4.js rename to assets/app-170da3cb.js index a78afd1..1bbfd95 100644 --- a/assets/app-601417a4.js +++ b/assets/app-170da3cb.js @@ -1,4 +1,4 @@ -var en=Object.defineProperty;var tn=(e,t,n)=>t in e?en(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var T=(e,t,n)=>(tn(e,typeof t!="symbol"?t+"":t,n),n);import{d as x,r as I,a as nn,b as sn,i as fe,c as rn,e as on,f as ln,g as Me,h as an,j as cn,o as ie,k as D,l as ne,m as H,_ as B,n as d,p as b,q as v,u as k,t as C,F as W,s as j,v as S,w as Z,x as Be,y as ze,R as un,z as L,A as Q,B as O,T as Ae,C as w,D as _e,E as be,G as dn,H as X,I as J,J as se,K as De,L as We,M as hn,N as le,O as ae,P as z,Q as kt,S as me,U as pn,V as Y,W as fn,X as St,Y as mn,Z as gn,$ as _n,a0 as bn,a1 as vn,a2 as yn,a3 as wn}from"./framework-dd156d1c.js";const kn="modulepreload",Sn=function(e){return"/"+e},lt={},_=function(t,n,s){if(!n||n.length===0)return t();const r=document.getElementsByTagName("link");return Promise.all(n.map(i=>{if(i=Sn(i),i in lt)return;lt[i]=!0;const o=i.endsWith(".css"),l=o?'[rel="stylesheet"]':"";if(!!s)for(let u=r.length-1;u>=0;u--){const p=r[u];if(p.href===i&&(!o||p.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${i}"]${l}`))return;const a=document.createElement("link");if(a.rel=o?"stylesheet":kn,o||(a.as="script",a.crossOrigin=""),a.href=i,document.head.appendChild(a),o)return new Promise((u,p)=>{a.addEventListener("load",u),a.addEventListener("error",()=>p(new Error(`Unable to preload CSS for ${i}`)))})})).then(()=>t())},Ke={"v-8daa1a0e":()=>_(()=>import("./index.html-08354517.js"),[]).then(({data:e})=>e),"v-0bb9170d":()=>_(()=>import("./index.html-f1592cd8.js"),[]).then(({data:e})=>e),"v-80cfb998":()=>_(()=>import("./index.html-1ff1fe72.js"),[]).then(({data:e})=>e),"v-7a32f1d2":()=>_(()=>import("./index.html-dec3e580.js"),[]).then(({data:e})=>e),"v-071c6b11":()=>_(()=>import("./index.html-39a3888c.js"),[]).then(({data:e})=>e),"v-3fe8b7d4":()=>_(()=>import("./index.html-e985a833.js"),[]).then(({data:e})=>e),"v-7c243c4c":()=>_(()=>import("./index.html-6072362c.js"),[]).then(({data:e})=>e),"v-e25e5de2":()=>_(()=>import("./index.html-6c0a6077.js"),[]).then(({data:e})=>e),"v-35380e8e":()=>_(()=>import("./index.html-0e9e4b3a.js"),[]).then(({data:e})=>e),"v-1eaca3fb":()=>_(()=>import("./index.html-12858481.js"),[]).then(({data:e})=>e),"v-1132a2d4":()=>_(()=>import("./index.html-0247529f.js"),[]).then(({data:e})=>e),"v-08a5d2dc":()=>_(()=>import("./index.html-21267412.js"),[]).then(({data:e})=>e),"v-712e14fc":()=>_(()=>import("./index.html-4acf38da.js"),[]).then(({data:e})=>e),"v-7806765d":()=>_(()=>import("./index.html-f28801e4.js"),[]).then(({data:e})=>e),"v-52061356":()=>_(()=>import("./index.html-d286dbf1.js"),[]).then(({data:e})=>e),"v-4033d0f8":()=>_(()=>import("./index.html-22cab04e.js"),[]).then(({data:e})=>e),"v-622b1955":()=>_(()=>import("./index.html-b8233d3a.js"),[]).then(({data:e})=>e),"v-4c254346":()=>_(()=>import("./index.html-31beec6a.js"),[]).then(({data:e})=>e),"v-5c0c536d":()=>_(()=>import("./index.html-1ee5676e.js"),[]).then(({data:e})=>e),"v-6efefa1e":()=>_(()=>import("./index.html-f83fc907.js"),[]).then(({data:e})=>e),"v-3c3574f0":()=>_(()=>import("./index.html-ebfc3abb.js"),[]).then(({data:e})=>e),"v-c6a2a6d6":()=>_(()=>import("./whmcs_saved.html-e44574f5.js"),[]).then(({data:e})=>e),"v-1eebbbe3":()=>_(()=>import("./index.html-7e64b6d9.js"),[]).then(({data:e})=>e),"v-072f80ad":()=>_(()=>import("./index.html-c201377f.js"),[]).then(({data:e})=>e),"v-5fb9afd8":()=>_(()=>import("./index.html-3ec87d31.js"),[]).then(({data:e})=>e),"v-1fa05f33":()=>_(()=>import("./index.html-87f416f5.js"),[]).then(({data:e})=>e),"v-592f64e3":()=>_(()=>import("./index.html-a8ce4f49.js"),[]).then(({data:e})=>e),"v-32edcc64":()=>_(()=>import("./index.html-6d1480c5.js"),[]).then(({data:e})=>e),"v-5bc4e66a":()=>_(()=>import("./index.html-1fc8e0bd.js"),[]).then(({data:e})=>e),"v-7cd0824e":()=>_(()=>import("./index.html-23985833.js"),[]).then(({data:e})=>e),"v-1358bf29":()=>_(()=>import("./index.html-8ba2d8d8.js"),[]).then(({data:e})=>e),"v-e1c39426":()=>_(()=>import("./index.html-7f5598c8.js"),[]).then(({data:e})=>e),"v-22715874":()=>_(()=>import("./index.html-9854993a.js"),[]).then(({data:e})=>e),"v-972b9eb0":()=>_(()=>import("./index.html-233045da.js"),[]).then(({data:e})=>e),"v-246755db":()=>_(()=>import("./index.html-fe10d519.js"),[]).then(({data:e})=>e),"v-451db13f":()=>_(()=>import("./index.html-95490bb8.js"),[]).then(({data:e})=>e),"v-3706649a":()=>_(()=>import("./404.html-e0575d4e.js"),[]).then(({data:e})=>e)},xn=JSON.parse(`{"base":"/","lang":"en-US","title":"","description":"","head":[["script",{"type":"text/javascript","id":"hs-script-loader","async":true,"defer":true,"src":"//js.hs-scripts.com/5408110.js"}],["script",{},"\\n (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':\\n new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],\\n j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=\\n 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);\\n })(window,document,'script','dataLayer','GTM-5MC2SNS');\\n "],["script",{},"\\n (function() {\\n // Trigger the scroll event without actually scrolling\\n function triggerScrollEvent() {\\n const targetElement = window;\\n const scrollEvent = new Event('scroll', {\\n bubbles: true,\\n cancelable: true,\\n });\\n targetElement.dispatchEvent(scrollEvent);\\n }\\n \\n // Call the triggerScrollEvent and scrollBodyDown functions after the page is fully loaded\\n window.addEventListener('load', () => {\\n triggerScrollEvent();\\n });\\n })();\\n "]],"locales":{}}`),xt={"v-8daa1a0e":x(()=>_(()=>import("./index.html-15344a68.js"),["assets/index.html-15344a68.js","assets/framework-dd156d1c.js"])),"v-0bb9170d":x(()=>_(()=>import("./index.html-e4942f19.js"),["assets/index.html-e4942f19.js","assets/framework-dd156d1c.js"])),"v-80cfb998":x(()=>_(()=>import("./index.html-e6d88b7d.js"),["assets/index.html-e6d88b7d.js","assets/framework-dd156d1c.js"])),"v-7a32f1d2":x(()=>_(()=>import("./index.html-dd01c5e3.js"),["assets/index.html-dd01c5e3.js","assets/framework-dd156d1c.js"])),"v-071c6b11":x(()=>_(()=>import("./index.html-6a539da3.js"),["assets/index.html-6a539da3.js","assets/framework-dd156d1c.js"])),"v-3fe8b7d4":x(()=>_(()=>import("./index.html-fac0e447.js"),["assets/index.html-fac0e447.js","assets/crontabScanning-8fe4eed0.js","assets/framework-dd156d1c.js"])),"v-7c243c4c":x(()=>_(()=>import("./index.html-aa9d50e4.js"),["assets/index.html-aa9d50e4.js","assets/framework-dd156d1c.js"])),"v-e25e5de2":x(()=>_(()=>import("./index.html-0baa27f4.js"),["assets/index.html-0baa27f4.js","assets/ImunifyAgentNotRunning-4df3d20b.js","assets/framework-dd156d1c.js"])),"v-35380e8e":x(()=>_(()=>import("./index.html-4311e206.js"),["assets/index.html-4311e206.js","assets/framework-dd156d1c.js"])),"v-1eaca3fb":x(()=>_(()=>import("./index.html-3775e92c.js"),["assets/index.html-3775e92c.js","assets/framework-dd156d1c.js"])),"v-1132a2d4":x(()=>_(()=>import("./index.html-c032d564.js"),["assets/index.html-c032d564.js","assets/crontabScanning-8fe4eed0.js","assets/framework-dd156d1c.js"])),"v-08a5d2dc":x(()=>_(()=>import("./index.html-744aec23.js"),["assets/index.html-744aec23.js","assets/framework-dd156d1c.js"])),"v-712e14fc":x(()=>_(()=>import("./index.html-a8f9efa8.js"),["assets/index.html-a8f9efa8.js","assets/framework-dd156d1c.js"])),"v-7806765d":x(()=>_(()=>import("./index.html-3bb3ded7.js"),["assets/index.html-3bb3ded7.js","assets/framework-dd156d1c.js"])),"v-52061356":x(()=>_(()=>import("./index.html-cd3fc076.js"),["assets/index.html-cd3fc076.js","assets/framework-dd156d1c.js"])),"v-4033d0f8":x(()=>_(()=>import("./index.html-e4d04411.js"),["assets/index.html-e4d04411.js","assets/framework-dd156d1c.js"])),"v-622b1955":x(()=>_(()=>import("./index.html-ad4c8226.js"),["assets/index.html-ad4c8226.js","assets/framework-dd156d1c.js"])),"v-4c254346":x(()=>_(()=>import("./index.html-87c124aa.js"),["assets/index.html-87c124aa.js","assets/framework-dd156d1c.js"])),"v-5c0c536d":x(()=>_(()=>import("./index.html-3fc17a32.js"),["assets/index.html-3fc17a32.js","assets/framework-dd156d1c.js"])),"v-6efefa1e":x(()=>_(()=>import("./index.html-cad6ab27.js"),["assets/index.html-cad6ab27.js","assets/framework-dd156d1c.js"])),"v-3c3574f0":x(()=>_(()=>import("./index.html-7d2379ef.js"),["assets/index.html-7d2379ef.js","assets/framework-dd156d1c.js"])),"v-c6a2a6d6":x(()=>_(()=>import("./whmcs_saved.html-36c40ae2.js"),["assets/whmcs_saved.html-36c40ae2.js","assets/framework-dd156d1c.js"])),"v-1eebbbe3":x(()=>_(()=>import("./index.html-6d84f856.js"),["assets/index.html-6d84f856.js","assets/framework-dd156d1c.js"])),"v-072f80ad":x(()=>_(()=>import("./index.html-ba3eda83.js"),["assets/index.html-ba3eda83.js","assets/framework-dd156d1c.js"])),"v-5fb9afd8":x(()=>_(()=>import("./index.html-cf3b1789.js"),["assets/index.html-cf3b1789.js","assets/ImunifyAgentNotRunning-4df3d20b.js","assets/framework-dd156d1c.js"])),"v-1fa05f33":x(()=>_(()=>import("./index.html-8244b9d0.js"),["assets/index.html-8244b9d0.js","assets/framework-dd156d1c.js"])),"v-592f64e3":x(()=>_(()=>import("./index.html-ae4757f1.js"),["assets/index.html-ae4757f1.js","assets/framework-dd156d1c.js"])),"v-32edcc64":x(()=>_(()=>import("./index.html-be5b4dc7.js"),["assets/index.html-be5b4dc7.js","assets/framework-dd156d1c.js"])),"v-5bc4e66a":x(()=>_(()=>import("./index.html-0b6a05d2.js"),["assets/index.html-0b6a05d2.js","assets/framework-dd156d1c.js"])),"v-7cd0824e":x(()=>_(()=>import("./index.html-3d1a53c5.js"),["assets/index.html-3d1a53c5.js","assets/Max_filesize-e3c6efcb.js","assets/framework-dd156d1c.js"])),"v-1358bf29":x(()=>_(()=>import("./index.html-e54bbe7c.js"),["assets/index.html-e54bbe7c.js","assets/Max_filesize-e3c6efcb.js","assets/framework-dd156d1c.js"])),"v-e1c39426":x(()=>_(()=>import("./index.html-4cb674c0.js"),["assets/index.html-4cb674c0.js","assets/framework-dd156d1c.js"])),"v-22715874":x(()=>_(()=>import("./index.html-f9418e31.js"),["assets/index.html-f9418e31.js","assets/framework-dd156d1c.js"])),"v-972b9eb0":x(()=>_(()=>import("./index.html-3738eab3.js"),["assets/index.html-3738eab3.js","assets/framework-dd156d1c.js"])),"v-246755db":x(()=>_(()=>import("./index.html-9d2f7136.js"),["assets/index.html-9d2f7136.js","assets/framework-dd156d1c.js"])),"v-451db13f":x(()=>_(()=>import("./index.html-28729b0f.js"),["assets/index.html-28729b0f.js","assets/framework-dd156d1c.js"])),"v-3706649a":x(()=>_(()=>import("./404.html-2ec8d8e0.js"),["assets/404.html-2ec8d8e0.js","assets/framework-dd156d1c.js"]))};var En=Symbol(""),Ln=I(Ke),Et=nn({key:"",path:"",title:"",lang:"",frontmatter:{},headers:[]}),oe=I(Et),ue=()=>oe,Lt=Symbol(""),xe=()=>{const e=H(Lt);if(!e)throw new Error("usePageFrontmatter() is called without provider.");return e},$t=Symbol(""),$n=()=>{const e=H($t);if(!e)throw new Error("usePageHead() is called without provider.");return e},On=Symbol(""),Ot=Symbol(""),Dt=()=>{const e=H(Ot);if(!e)throw new Error("usePageLang() is called without provider.");return e},At=Symbol(""),Dn=()=>{const e=H(At);if(!e)throw new Error("usePageLayout() is called without provider.");return e},Rt=Symbol(""),Tt=()=>{const e=H(Rt);if(!e)throw new Error("useRouteLocale() is called without provider.");return e},we=I(xn),An=Symbol(""),Rn=Symbol(""),Tn="Layout",Vn="NotFound",te=sn({resolveLayouts:e=>e.reduce((t,n)=>({...t,...n.layouts}),{}),resolvePageData:async e=>{const t=Ln.value[e];return await(t==null?void 0:t())??Et},resolvePageFrontmatter:e=>e.frontmatter,resolvePageHead:(e,t,n)=>{const s=fe(t.description)?t.description:n.description,r=[...rn(t.head)?t.head:[],...n.head,["title",{},e],["meta",{name:"description",content:s}]];return on(r)},resolvePageHeadTitle:(e,t)=>[e.title,t.title].filter(n=>!!n).join(" | "),resolvePageLang:e=>e.lang||"en",resolvePageLayout:(e,t)=>{let n;if(e.path){const s=e.frontmatter.layout;fe(s)?n=s:n=Tn}else n=Vn;return t[n]},resolveRouteLocale:(e,t)=>ln(e,t),resolveSiteLocaleData:(e,t)=>({...e,...e.locales[t]})}),Pn=Me({name:"ClientOnly",setup(e,t){const n=I(!1);return ie(()=>{n.value=!0}),()=>{var s,r;return n.value?(r=(s=t.slots).default)==null?void 0:r.call(s):null}}}),In=Me({name:"Content",props:{pageKey:{type:String,required:!1,default:""}},setup(e){const t=ue(),n=D(()=>xt[e.pageKey||t.value.key]);return()=>n.value?ne(n.value):ne("div","404 Not Found")}}),Cn=(e={})=>e,G=e=>an(e)?e:`/${cn(e)}`;const Mn={enhance:({app:e})=>{}};function Bn(e){return{all:e=e||new Map,on:function(t,n){var s=e.get(t);s?s.push(n):e.set(t,[n])},off:function(t,n){var s=e.get(t);s&&(n?s.splice(s.indexOf(n)>>>0,1):e.set(t,[]))},emit:function(t,n){var s=e.get(t);s&&s.slice().map(function(r){r(n)}),(s=e.get("*"))&&s.slice().map(function(r){r(t,n)})}}}const zn={class:"footer__img"},Hn=["href"],qn=["src","alt"],Fn={class:"footer-company-title"},Nn={class:"social"},Wn={class:"social_links"},jn=["href"],Gn={class:"footer-social-text"},Un={class:"social-icons-wrapper"},Kn=["href"],Zn=["src"],Qn={__name:"Footer",setup(e){const{social:t,cloudlinuxSite:n,footerCustomLogo:s,footerCustomAltText:r,locales:i}=H("themeConfig"),o=xe(),l=D(()=>new Date().getFullYear()),c=D(()=>o.value.layout==="HomeLayout");return(a,u)=>(d(),b("div",{class:Z(["footer",{"footer-default-layout":!c.value}])},[v("div",zn,[v("a",{href:k(n)},[v("img",{src:k(G)(k(s)),alt:k(r)},null,8,qn)],8,Hn)]),v("div",Fn,C(l.value)+". CloudLinux Inc ",1),v("div",Nn,[v("div",Wn,[(d(!0),b(W,null,j(k(i).bottomLinks,p=>(d(),b("a",{href:p.url,target:"_blank"},C(p.text),9,jn))),256))]),v("span",Gn,C(k(i).stayInTouch),1),v("div",Un,[(d(!0),b(W,null,j(k(t),p=>(d(),b("a",{class:"social-icons-link",href:p==null?void 0:p.url,target:"_blank"},[p.icon?(d(),b("img",{key:0,class:"social-icons-link-img",src:k(G)(p==null?void 0:p.icon),alt:"footer logo"},null,8,Zn)):S("v-if",!0)],8,Kn))),256))])])],2))}},Re=B(Qn,[["__scopeId","data-v-f2902e71"],["__file","Footer.vue"]]),Vt={"/introduction/":[{collapsable:!1,children:["/introduction/"]}],"/terminology/":[{collapsable:!1,children:["/terminology/"]}],"/billing/":[{collapsable:!1,children:["/billing/"]}],"/installation/":[{collapsable:!1,children:["/installation/"]}],"/control_panel_integration/":[{collapsable:!1,children:["/control_panel_integration/"]}],"/ids_integration/":[{collapsable:!1,children:["/ids_integration/"]}],"/features/":[{collapsable:!1,children:["/features/"]}],"/localization/":[{collapsable:!1,children:["/localization/"]}],"/dashboard/":[{collapsable:!1,children:["/dashboard/"]}],"/user_interface/":[{collapsable:!1,children:["/user_interface/"]}],"/command_line_interface/":[{collapsable:!1,children:["/command_line_interface/"]}],"/config_file_description/":[{collapsable:!1,children:["/config_file_description/"]}],"/update/":[{collapsable:!1,children:["/update/"]}],"/whmcs_plugin/":[{collapsable:!1,children:["/whmcs_plugin/"]}],"/faq_and_known_issues/":[{collapsable:!1,children:["/faq_and_known_issues/"]}],"/uninstall/":[{collapsable:!1,children:["/uninstall/"]}],"/imunifyav/":[{collapsable:!1,children:["/imunifyav/","/imunifyav/imunifyav_for_plesk/","/imunifyav/imunifyav_for_ispmanager/","/imunifyav/imunifyav_for_webuzo/","/imunifyav/stand_alone_mode/","/imunifyav/cli/","/imunifyav/config_file_description/","/imunifyav/faq_and_known_issues/"]}],"/email/":[{collapsable:!1,children:["/email/"]}],"/myimunify/":[{collapsable:!1,children:["/myimunify/"]}],"/patchman/":[{collapsable:!1,children:["/patchman/","/patchman/getting_started/","/patchman/frequently_asked_questions/","/patchman/portal/","/patchman/policies/","/patchman/agent/","/patchman/platform_integrations/","/patchman/imunify/"]}]},Ze=/#.*$/,Xn=/\.(md|html)$/,pe=/\/$/,je=/^(https?:|mailto:|tel:)/;function ge(e){return decodeURI(e).replace(Ze,"").replace(Xn,"")}function Jn(e){const t=e==null?void 0:e.match(Ze);if(t)return t[0]}function Yn(e){return je.test(e)}function es(e){if(Yn(e))return e;const t=e==null?void 0:e.match(Ze),n=t?t[0]:"",s=ge(e);return pe.test(s)?e:s+".html"+n}function Te(e,t){const n=e.hash,s=Jn(t);if(s&&n!==s)return!1;const r=ge(e.path),i=ge(t);return r===i}function Ve(e,t,n){n&&(t=ts(t,n));const s=ge(t);for(let r=0;rIt(i,n,s)):[]}function ns(e){e=e.map(n=>Object.assign({},JSON.parse(JSON.stringify(n))));let t;return e.forEach(n=>{n.level!==1?t=n:t&&(t.children||(t.children=[])).push(n)}),e.filter(n=>n.level!==1)}function ss(e,t){if(Array.isArray(t))return{base:"/",config:t};for(const n in t)if(is(e.path).indexOf(n)===0)return{base:n,config:t[n]};return null}function is(e){return/(\.html|\/)$/.test(e)?e:e+"/"}function It(e,t,n,s){if(typeof e=="string")return Ve(t,e,n);if(Array.isArray(e))return Object.assign(Ve(t,e[0],n),{title:e[1]});{s&&console.error("[vuepress] Nested sidebar groups are not supported. Consider using navbar + categories instead.");const r=e.children||[];return{type:"group",title:e.title,children:r.map(i=>It(i,t,n,!0)),collapsable:e.collapsable!==!1}}}const rs={functional:!0,props:["item","closeSidebarDrawer"],render({item:e,closeSidebarDrawer:t}){var u,p;if(!e)return;const n=ue(),s=Be(),r=ze(),i=Te(s,e==null?void 0:e.path),o=(e==null?void 0:e.type)==="auto"?i||e.children.some(g=>Te(s,e.basePath+"#"+g.slug)):i,l=os(ne,e==null?void 0:e.path,e.title||(e==null?void 0:e.path),o,e.headers,t,r),c=((u=n.value.frontmatter)==null?void 0:u.sidebarDepth)!=null?(p=n.value.frontmatter)==null?void 0:p.sidebarDepth:5,a=c??1;if((e==null?void 0:e.type)==="auto")return[l,Ge(ne,e.children,e.basePath,s,a,1,t)];if(e.headers&&e.headers.length){const g=ns(e.headers);return[l,Ge(ne,g,e==null?void 0:e.path,s,a,1,t)]}return Qe(ne,e==null?void 0:e.path,e.title||(e==null?void 0:e.path),o,e.children,0,t)}};function Qe(e,t,n,s,r,i=0,o){const l=e(un,{"data-anchor":t,to:t,activeClass:"",exactActiveClass:"",class:{active:s,"sidebar-link":!0,["link-depth-level-"+i]:!0}},()=>[n]);return e("div",{class:{active:s,collapsed:!0,"sidebar-link-container":!!(r!=null&&r.length)},onClick:c=>{c.target.classList.toggle("collapsed"),c.target.tagName!=="DIV"&&o()}},[l])}function os(e,t,n,s,r,i,o){const l=!!r&&r.some(c=>c.level!==1);return e("div",{class:{active:s,collapsed:s,"sidebar-header":!0,"sidebar-link":!0,"sidebar-header--empty":!l},onClick:c=>{const a=c.target.classList,u=c.target.querySelector("a");a.toggle("collapsed"),u&&o.push(u.getAttribute("href"))}},[Qe(e,t,n,s,null,0,i)])}function Ge(e,t,n,s,r,i=1,o){return!t||i>r?null:e("ul",{class:"sidebar-sub-headers"},t.map(l=>{const c=Te(s,n+"#"+l.slug);return e("li",{class:{collapsible:i<3,"sidebar-sub-header":!0}},[Qe(e,n+"#"+l.slug,l.title,c,l.children,i,o),Ge(e,l.children,n,s,r,i+1,o)])}))}const Ct=B(rs,[["__file","SidebarLink.vue"]]);const ls={__name:"DropdownTransition",setup(e){const t=s=>{s.style.height=s.scrollHeight+"px"},n=s=>{s.style.height=""};return(s,r)=>(d(),L(Ae,{name:"dropdown",onEnter:t,onAfterEnter:n,onBeforeLeave:t},{default:Q(()=>[O(s.$slots,"default")]),_:3}))}},as=B(ls,[["__file","DropdownTransition.vue"]]);const cs={key:0,ref:"items",class:"sidebar-group-items"},us={__name:"SidebarGroup",props:{item:{type:Object,required:!0},first:{type:Boolean,required:!0},open:{type:Boolean,required:!0},collapsable:{type:Boolean,required:!0},closeSidebarDrawer:{type:Function,default:()=>{}}},setup(e){return(t,n)=>(d(),b("div",{class:Z(["sidebar-group",{first:e.first,collapsable:e.collapsable}])},[w(as,null,{default:Q(()=>{var s;return[e.open||!e.collapsable?(d(),b("ul",cs,[(d(!0),b(W,null,j((s=e.item)==null?void 0:s.children,r=>(d(),b("li",null,[w(Ct,{closeSidebarDrawer:e.closeSidebarDrawer,item:r},null,8,["closeSidebarDrawer","item"])]))),256))],512)):S("v-if",!0)]}),_:1})],2))}},ds=B(us,[["__file","SidebarGroup.vue"]]);const hs={class:"sidebar"},ps={key:0,class:"sidebar-links"},fs={__name:"Sidebar",props:{items:{type:Array,required:!0},closeSidebarDrawer:{type:Function,default:()=>{}},isMobileWidth:{type:Boolean}},setup(e){const t=e,n=D(()=>t.items),s=Be(),r=ue(),i=D(()=>Pt(r.value,s,n.value)),o=I(0),l=()=>{const h=p(s,t.items);h>-1&&(o.value=h)},c=h=>{o.value=h===o.value?-1:h},a=h=>{const m=h.getBoundingClientRect();return m.top>=0&&m.left>=0&&m.bottom<=(window.innerHeight/2||document.documentElement.clientHeight/2)&&m.right<=(window.innerWidth||document.documentElement.clientWidth)};_e(()=>s,l);const u=()=>{const h=document.querySelectorAll(".header-anchor"),m=document.querySelector(".sidebar"),f=m.querySelectorAll("a"),y=m.querySelectorAll(".collapsible.sidebar-sub-header"),V=Array.from(f).map($=>$.getAttribute("data-anchor"));h.forEach($=>{$.getAttribute("data-anchor")||$.setAttribute("data-anchor",r.value.path+$.hash)}),h.forEach($=>{if(a($)){const P=V.find(E=>E===$.getAttribute("data-anchor"));y.forEach(E=>{E.querySelectorAll(".sidebar-link-container").forEach(M=>{E.querySelector(`a[data-anchor="${P}"]`)?M.classList.remove("collapsed"):M.classList.add("collapsed")})}),m.querySelector(`a[data-anchor="${P}"]`)&&(f.forEach(E=>E.classList.remove("active")),m.querySelector(`a[data-anchor="${P}"]`).classList.add("active"))}})},p=(h,m)=>{for(let f=0;fTe(h,V.path)))return f}return-1},g=()=>{const h=window.location.hash,m=document.querySelectorAll(".sidebar a");m.forEach(f=>{if(f.getAttribute("data-anchor")===h){m.forEach(V=>V.classList.remove("active")),f.classList.add("active");const y=f.closest(".collapsible");y&&y.classList.remove("collapsed")}})};return ie(()=>{l(),t.isMobileWidth||window.addEventListener("scroll",u),t.isMobileWidth||window.addEventListener("resize",u),window.addEventListener("hashchange",g)}),be(()=>{window.removeEventListener("scroll",u),window.removeEventListener("resize",u),window.removeEventListener("hashchange",g)}),(h,m)=>(d(),b("div",hs,[O(h.$slots,"top"),i.value.length?(d(),b("ul",ps,[(d(!0),b(W,null,j(i.value,(f,y)=>(d(),b("li",{key:y},[f.type==="group"?(d(),L(ds,{key:0,item:f,first:y===0,open:y===o.value,closeSidebarDrawer:e.closeSidebarDrawer,collapsable:!!(f.collapsable||f.collapsible),onToggle:V=>c(y)},null,8,["item","first","open","closeSidebarDrawer","collapsable","onToggle"])):(d(),L(Ct,{key:1,closeSidebarDrawer:e.closeSidebarDrawer,item:f},null,8,["closeSidebarDrawer","item"]))]))),128))])):S("v-if",!0),O(h.$slots,"bottom")]))}},Mt=B(fs,[["__file","Sidebar.vue"]]);var ms=Object.defineProperty,gs=Object.defineProperties,_s=Object.getOwnPropertyDescriptors,at=Object.getOwnPropertySymbols,bs=Object.prototype.hasOwnProperty,vs=Object.prototype.propertyIsEnumerable,ct=(e,t,n)=>t in e?ms(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,he=(e,t)=>{for(var n in t||(t={}))bs.call(t,n)&&ct(e,n,t[n]);if(at)for(var n of at(t))vs.call(t,n)&&ct(e,n,t[n]);return e},ut=(e,t)=>gs(e,_s(t));const ys={props:{autoscroll:{type:Boolean,default:!0}},watch:{typeAheadPointer(){this.autoscroll&&this.maybeAdjustScroll()},open(e){this.autoscroll&&e&&this.$nextTick(()=>this.maybeAdjustScroll())}},methods:{maybeAdjustScroll(){var e;const t=((e=this.$refs.dropdownMenu)==null?void 0:e.children[this.typeAheadPointer])||!1;if(t){const n=this.getDropdownViewport(),{top:s,bottom:r,height:i}=t.getBoundingClientRect();if(sn.bottom)return this.$refs.dropdownMenu.scrollTop=t.offsetTop-(n.height-i)}},getDropdownViewport(){return this.$refs.dropdownMenu?this.$refs.dropdownMenu.getBoundingClientRect():{height:0,top:0,bottom:0}}}},ws={data(){return{typeAheadPointer:-1}},watch:{filteredOptions(){for(let e=0;e=0;e--)if(this.selectable(this.filteredOptions[e])){this.typeAheadPointer=e;break}},typeAheadDown(){for(let e=this.typeAheadPointer+1;e{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n},Ss={},xs={xmlns:"http://www.w3.org/2000/svg",width:"10",height:"10"},Es=v("path",{d:"M6.895455 5l2.842897-2.842898c.348864-.348863.348864-.914488 0-1.263636L9.106534.261648c-.348864-.348864-.914489-.348864-1.263636 0L5 3.104545 2.157102.261648c-.348863-.348864-.914488-.348864-1.263636 0L.261648.893466c-.348864.348864-.348864.914489 0 1.263636L3.104545 5 .261648 7.842898c-.348864.348863-.348864.914488 0 1.263636l.631818.631818c.348864.348864.914773.348864 1.263636 0L5 6.895455l2.842898 2.842897c.348863.348864.914772.348864 1.263636 0l.631818-.631818c.348864-.348864.348864-.914489 0-1.263636L6.895455 5z"},null,-1),Ls=[Es];function $s(e,t){return d(),b("svg",xs,Ls)}const Os=Xe(Ss,[["render",$s]]),Ds={},As={xmlns:"http://www.w3.org/2000/svg",width:"14",height:"10"},Rs=v("path",{d:"M9.211364 7.59931l4.48338-4.867229c.407008-.441854.407008-1.158247 0-1.60046l-.73712-.80023c-.407008-.441854-1.066904-.441854-1.474243 0L7 5.198617 2.51662.33139c-.407008-.441853-1.066904-.441853-1.474243 0l-.737121.80023c-.407008.441854-.407008 1.158248 0 1.600461l4.48338 4.867228L7 10l2.211364-2.40069z"},null,-1),Ts=[Rs];function Vs(e,t){return d(),b("svg",As,Ts)}const Ps=Xe(Ds,[["render",Vs]]),dt={Deselect:Os,OpenIndicator:Ps},Is={mounted(e,{instance:t}){if(t.appendToBody){const{height:n,top:s,left:r,width:i}=t.$refs.toggle.getBoundingClientRect();let o=window.scrollX||window.pageXOffset,l=window.scrollY||window.pageYOffset;e.unbindPosition=t.calculatePosition(e,t,{width:i+"px",left:o+r+"px",top:l+s+n+"px"}),document.body.appendChild(e)}},unmounted(e,{instance:t}){t.appendToBody&&(e.unbindPosition&&typeof e.unbindPosition=="function"&&e.unbindPosition(),e.parentNode&&e.parentNode.removeChild(e))}};function Cs(e){const t={};return Object.keys(e).sort().forEach(n=>{t[n]=e[n]}),JSON.stringify(t)}let Ms=0;function Bs(){return++Ms}const zs={components:he({},dt),directives:{appendToBody:Is},mixins:[ys,ws,ks],compatConfig:{MODE:3},emits:["open","close","update:modelValue","search","search:compositionstart","search:compositionend","search:keydown","search:blur","search:focus","search:input","option:created","option:selecting","option:selected","option:deselecting","option:deselected"],props:{modelValue:{},components:{type:Object,default:()=>({})},options:{type:Array,default(){return[]}},disabled:{type:Boolean,default:!1},clearable:{type:Boolean,default:!0},deselectFromDropdown:{type:Boolean,default:!1},searchable:{type:Boolean,default:!0},multiple:{type:Boolean,default:!1},placeholder:{type:String,default:""},transition:{type:String,default:"vs__fade"},clearSearchOnSelect:{type:Boolean,default:!0},closeOnSelect:{type:Boolean,default:!0},label:{type:String,default:"label"},autocomplete:{type:String,default:"off"},reduce:{type:Function,default:e=>e},selectable:{type:Function,default:e=>!0},getOptionLabel:{type:Function,default(e){return typeof e=="object"?e.hasOwnProperty(this.label)?e[this.label]:console.warn(`[vue-select warn]: Label key "option.${this.label}" does not exist in options object ${JSON.stringify(e)}. +var en=Object.defineProperty;var tn=(e,t,n)=>t in e?en(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var T=(e,t,n)=>(tn(e,typeof t!="symbol"?t+"":t,n),n);import{d as x,r as I,a as nn,b as sn,i as fe,c as rn,e as on,f as ln,g as Me,h as an,j as cn,o as ie,k as D,l as ne,m as H,_ as B,n as d,p as b,q as v,u as k,t as C,F as W,s as j,v as S,w as Z,x as Be,y as ze,R as un,z as L,A as Q,B as O,T as Ae,C as w,D as _e,E as be,G as dn,H as X,I as J,J as se,K as De,L as We,M as hn,N as le,O as ae,P as z,Q as kt,S as me,U as pn,V as Y,W as fn,X as St,Y as mn,Z as gn,$ as _n,a0 as bn,a1 as vn,a2 as yn,a3 as wn}from"./framework-dd156d1c.js";const kn="modulepreload",Sn=function(e){return"/"+e},lt={},_=function(t,n,s){if(!n||n.length===0)return t();const r=document.getElementsByTagName("link");return Promise.all(n.map(i=>{if(i=Sn(i),i in lt)return;lt[i]=!0;const o=i.endsWith(".css"),l=o?'[rel="stylesheet"]':"";if(!!s)for(let u=r.length-1;u>=0;u--){const p=r[u];if(p.href===i&&(!o||p.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${i}"]${l}`))return;const a=document.createElement("link");if(a.rel=o?"stylesheet":kn,o||(a.as="script",a.crossOrigin=""),a.href=i,document.head.appendChild(a),o)return new Promise((u,p)=>{a.addEventListener("load",u),a.addEventListener("error",()=>p(new Error(`Unable to preload CSS for ${i}`)))})})).then(()=>t())},Ke={"v-8daa1a0e":()=>_(()=>import("./index.html-08354517.js"),[]).then(({data:e})=>e),"v-0bb9170d":()=>_(()=>import("./index.html-f1592cd8.js"),[]).then(({data:e})=>e),"v-80cfb998":()=>_(()=>import("./index.html-1ff1fe72.js"),[]).then(({data:e})=>e),"v-7a32f1d2":()=>_(()=>import("./index.html-dec3e580.js"),[]).then(({data:e})=>e),"v-071c6b11":()=>_(()=>import("./index.html-39a3888c.js"),[]).then(({data:e})=>e),"v-3fe8b7d4":()=>_(()=>import("./index.html-e985a833.js"),[]).then(({data:e})=>e),"v-7c243c4c":()=>_(()=>import("./index.html-6072362c.js"),[]).then(({data:e})=>e),"v-e25e5de2":()=>_(()=>import("./index.html-6c0a6077.js"),[]).then(({data:e})=>e),"v-35380e8e":()=>_(()=>import("./index.html-0e9e4b3a.js"),[]).then(({data:e})=>e),"v-1eaca3fb":()=>_(()=>import("./index.html-12858481.js"),[]).then(({data:e})=>e),"v-1132a2d4":()=>_(()=>import("./index.html-0247529f.js"),[]).then(({data:e})=>e),"v-08a5d2dc":()=>_(()=>import("./index.html-21267412.js"),[]).then(({data:e})=>e),"v-712e14fc":()=>_(()=>import("./index.html-4acf38da.js"),[]).then(({data:e})=>e),"v-7806765d":()=>_(()=>import("./index.html-f28801e4.js"),[]).then(({data:e})=>e),"v-52061356":()=>_(()=>import("./index.html-d286dbf1.js"),[]).then(({data:e})=>e),"v-4033d0f8":()=>_(()=>import("./index.html-22cab04e.js"),[]).then(({data:e})=>e),"v-622b1955":()=>_(()=>import("./index.html-b8233d3a.js"),[]).then(({data:e})=>e),"v-4c254346":()=>_(()=>import("./index.html-31beec6a.js"),[]).then(({data:e})=>e),"v-5c0c536d":()=>_(()=>import("./index.html-1ee5676e.js"),[]).then(({data:e})=>e),"v-6efefa1e":()=>_(()=>import("./index.html-f83fc907.js"),[]).then(({data:e})=>e),"v-3c3574f0":()=>_(()=>import("./index.html-ebfc3abb.js"),[]).then(({data:e})=>e),"v-c6a2a6d6":()=>_(()=>import("./whmcs_saved.html-e44574f5.js"),[]).then(({data:e})=>e),"v-1eebbbe3":()=>_(()=>import("./index.html-7e64b6d9.js"),[]).then(({data:e})=>e),"v-072f80ad":()=>_(()=>import("./index.html-c201377f.js"),[]).then(({data:e})=>e),"v-5fb9afd8":()=>_(()=>import("./index.html-3ec87d31.js"),[]).then(({data:e})=>e),"v-1fa05f33":()=>_(()=>import("./index.html-87f416f5.js"),[]).then(({data:e})=>e),"v-592f64e3":()=>_(()=>import("./index.html-a8ce4f49.js"),[]).then(({data:e})=>e),"v-32edcc64":()=>_(()=>import("./index.html-6d1480c5.js"),[]).then(({data:e})=>e),"v-5bc4e66a":()=>_(()=>import("./index.html-1fc8e0bd.js"),[]).then(({data:e})=>e),"v-7cd0824e":()=>_(()=>import("./index.html-23985833.js"),[]).then(({data:e})=>e),"v-1358bf29":()=>_(()=>import("./index.html-8ba2d8d8.js"),[]).then(({data:e})=>e),"v-e1c39426":()=>_(()=>import("./index.html-7f5598c8.js"),[]).then(({data:e})=>e),"v-22715874":()=>_(()=>import("./index.html-9854993a.js"),[]).then(({data:e})=>e),"v-972b9eb0":()=>_(()=>import("./index.html-233045da.js"),[]).then(({data:e})=>e),"v-246755db":()=>_(()=>import("./index.html-fe10d519.js"),[]).then(({data:e})=>e),"v-451db13f":()=>_(()=>import("./index.html-95490bb8.js"),[]).then(({data:e})=>e),"v-3706649a":()=>_(()=>import("./404.html-e0575d4e.js"),[]).then(({data:e})=>e)},xn=JSON.parse(`{"base":"/","lang":"en-US","title":"","description":"","head":[["script",{"type":"text/javascript","id":"hs-script-loader","async":true,"defer":true,"src":"//js.hs-scripts.com/5408110.js"}],["script",{},"\\n (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':\\n new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],\\n j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=\\n 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);\\n })(window,document,'script','dataLayer','GTM-5MC2SNS');\\n "],["script",{},"\\n (function() {\\n // Trigger the scroll event without actually scrolling\\n function triggerScrollEvent() {\\n const targetElement = window;\\n const scrollEvent = new Event('scroll', {\\n bubbles: true,\\n cancelable: true,\\n });\\n targetElement.dispatchEvent(scrollEvent);\\n }\\n \\n // Call the triggerScrollEvent and scrollBodyDown functions after the page is fully loaded\\n window.addEventListener('load', () => {\\n triggerScrollEvent();\\n });\\n })();\\n "]],"locales":{}}`),xt={"v-8daa1a0e":x(()=>_(()=>import("./index.html-15344a68.js"),["assets/index.html-15344a68.js","assets/framework-dd156d1c.js"])),"v-0bb9170d":x(()=>_(()=>import("./index.html-e4942f19.js"),["assets/index.html-e4942f19.js","assets/framework-dd156d1c.js"])),"v-80cfb998":x(()=>_(()=>import("./index.html-e6d88b7d.js"),["assets/index.html-e6d88b7d.js","assets/framework-dd156d1c.js"])),"v-7a32f1d2":x(()=>_(()=>import("./index.html-dd01c5e3.js"),["assets/index.html-dd01c5e3.js","assets/framework-dd156d1c.js"])),"v-071c6b11":x(()=>_(()=>import("./index.html-6a539da3.js"),["assets/index.html-6a539da3.js","assets/framework-dd156d1c.js"])),"v-3fe8b7d4":x(()=>_(()=>import("./index.html-fac0e447.js"),["assets/index.html-fac0e447.js","assets/crontabScanning-8fe4eed0.js","assets/framework-dd156d1c.js"])),"v-7c243c4c":x(()=>_(()=>import("./index.html-aa9d50e4.js"),["assets/index.html-aa9d50e4.js","assets/framework-dd156d1c.js"])),"v-e25e5de2":x(()=>_(()=>import("./index.html-0baa27f4.js"),["assets/index.html-0baa27f4.js","assets/ImunifyAgentNotRunning-4df3d20b.js","assets/framework-dd156d1c.js"])),"v-35380e8e":x(()=>_(()=>import("./index.html-0c0d89d3.js"),["assets/index.html-0c0d89d3.js","assets/framework-dd156d1c.js"])),"v-1eaca3fb":x(()=>_(()=>import("./index.html-3775e92c.js"),["assets/index.html-3775e92c.js","assets/framework-dd156d1c.js"])),"v-1132a2d4":x(()=>_(()=>import("./index.html-c032d564.js"),["assets/index.html-c032d564.js","assets/crontabScanning-8fe4eed0.js","assets/framework-dd156d1c.js"])),"v-08a5d2dc":x(()=>_(()=>import("./index.html-744aec23.js"),["assets/index.html-744aec23.js","assets/framework-dd156d1c.js"])),"v-712e14fc":x(()=>_(()=>import("./index.html-a8f9efa8.js"),["assets/index.html-a8f9efa8.js","assets/framework-dd156d1c.js"])),"v-7806765d":x(()=>_(()=>import("./index.html-3bb3ded7.js"),["assets/index.html-3bb3ded7.js","assets/framework-dd156d1c.js"])),"v-52061356":x(()=>_(()=>import("./index.html-cd3fc076.js"),["assets/index.html-cd3fc076.js","assets/framework-dd156d1c.js"])),"v-4033d0f8":x(()=>_(()=>import("./index.html-e4d04411.js"),["assets/index.html-e4d04411.js","assets/framework-dd156d1c.js"])),"v-622b1955":x(()=>_(()=>import("./index.html-ad4c8226.js"),["assets/index.html-ad4c8226.js","assets/framework-dd156d1c.js"])),"v-4c254346":x(()=>_(()=>import("./index.html-87c124aa.js"),["assets/index.html-87c124aa.js","assets/framework-dd156d1c.js"])),"v-5c0c536d":x(()=>_(()=>import("./index.html-3fc17a32.js"),["assets/index.html-3fc17a32.js","assets/framework-dd156d1c.js"])),"v-6efefa1e":x(()=>_(()=>import("./index.html-cad6ab27.js"),["assets/index.html-cad6ab27.js","assets/framework-dd156d1c.js"])),"v-3c3574f0":x(()=>_(()=>import("./index.html-7d2379ef.js"),["assets/index.html-7d2379ef.js","assets/framework-dd156d1c.js"])),"v-c6a2a6d6":x(()=>_(()=>import("./whmcs_saved.html-36c40ae2.js"),["assets/whmcs_saved.html-36c40ae2.js","assets/framework-dd156d1c.js"])),"v-1eebbbe3":x(()=>_(()=>import("./index.html-6d84f856.js"),["assets/index.html-6d84f856.js","assets/framework-dd156d1c.js"])),"v-072f80ad":x(()=>_(()=>import("./index.html-ba3eda83.js"),["assets/index.html-ba3eda83.js","assets/framework-dd156d1c.js"])),"v-5fb9afd8":x(()=>_(()=>import("./index.html-cf3b1789.js"),["assets/index.html-cf3b1789.js","assets/ImunifyAgentNotRunning-4df3d20b.js","assets/framework-dd156d1c.js"])),"v-1fa05f33":x(()=>_(()=>import("./index.html-8244b9d0.js"),["assets/index.html-8244b9d0.js","assets/framework-dd156d1c.js"])),"v-592f64e3":x(()=>_(()=>import("./index.html-ae4757f1.js"),["assets/index.html-ae4757f1.js","assets/framework-dd156d1c.js"])),"v-32edcc64":x(()=>_(()=>import("./index.html-be5b4dc7.js"),["assets/index.html-be5b4dc7.js","assets/framework-dd156d1c.js"])),"v-5bc4e66a":x(()=>_(()=>import("./index.html-0b6a05d2.js"),["assets/index.html-0b6a05d2.js","assets/framework-dd156d1c.js"])),"v-7cd0824e":x(()=>_(()=>import("./index.html-3d1a53c5.js"),["assets/index.html-3d1a53c5.js","assets/Max_filesize-e3c6efcb.js","assets/framework-dd156d1c.js"])),"v-1358bf29":x(()=>_(()=>import("./index.html-e54bbe7c.js"),["assets/index.html-e54bbe7c.js","assets/Max_filesize-e3c6efcb.js","assets/framework-dd156d1c.js"])),"v-e1c39426":x(()=>_(()=>import("./index.html-4cb674c0.js"),["assets/index.html-4cb674c0.js","assets/framework-dd156d1c.js"])),"v-22715874":x(()=>_(()=>import("./index.html-f9418e31.js"),["assets/index.html-f9418e31.js","assets/framework-dd156d1c.js"])),"v-972b9eb0":x(()=>_(()=>import("./index.html-3738eab3.js"),["assets/index.html-3738eab3.js","assets/framework-dd156d1c.js"])),"v-246755db":x(()=>_(()=>import("./index.html-9d2f7136.js"),["assets/index.html-9d2f7136.js","assets/framework-dd156d1c.js"])),"v-451db13f":x(()=>_(()=>import("./index.html-28729b0f.js"),["assets/index.html-28729b0f.js","assets/framework-dd156d1c.js"])),"v-3706649a":x(()=>_(()=>import("./404.html-2ec8d8e0.js"),["assets/404.html-2ec8d8e0.js","assets/framework-dd156d1c.js"]))};var En=Symbol(""),Ln=I(Ke),Et=nn({key:"",path:"",title:"",lang:"",frontmatter:{},headers:[]}),oe=I(Et),ue=()=>oe,Lt=Symbol(""),xe=()=>{const e=H(Lt);if(!e)throw new Error("usePageFrontmatter() is called without provider.");return e},$t=Symbol(""),$n=()=>{const e=H($t);if(!e)throw new Error("usePageHead() is called without provider.");return e},On=Symbol(""),Ot=Symbol(""),Dt=()=>{const e=H(Ot);if(!e)throw new Error("usePageLang() is called without provider.");return e},At=Symbol(""),Dn=()=>{const e=H(At);if(!e)throw new Error("usePageLayout() is called without provider.");return e},Rt=Symbol(""),Tt=()=>{const e=H(Rt);if(!e)throw new Error("useRouteLocale() is called without provider.");return e},we=I(xn),An=Symbol(""),Rn=Symbol(""),Tn="Layout",Vn="NotFound",te=sn({resolveLayouts:e=>e.reduce((t,n)=>({...t,...n.layouts}),{}),resolvePageData:async e=>{const t=Ln.value[e];return await(t==null?void 0:t())??Et},resolvePageFrontmatter:e=>e.frontmatter,resolvePageHead:(e,t,n)=>{const s=fe(t.description)?t.description:n.description,r=[...rn(t.head)?t.head:[],...n.head,["title",{},e],["meta",{name:"description",content:s}]];return on(r)},resolvePageHeadTitle:(e,t)=>[e.title,t.title].filter(n=>!!n).join(" | "),resolvePageLang:e=>e.lang||"en",resolvePageLayout:(e,t)=>{let n;if(e.path){const s=e.frontmatter.layout;fe(s)?n=s:n=Tn}else n=Vn;return t[n]},resolveRouteLocale:(e,t)=>ln(e,t),resolveSiteLocaleData:(e,t)=>({...e,...e.locales[t]})}),Pn=Me({name:"ClientOnly",setup(e,t){const n=I(!1);return ie(()=>{n.value=!0}),()=>{var s,r;return n.value?(r=(s=t.slots).default)==null?void 0:r.call(s):null}}}),In=Me({name:"Content",props:{pageKey:{type:String,required:!1,default:""}},setup(e){const t=ue(),n=D(()=>xt[e.pageKey||t.value.key]);return()=>n.value?ne(n.value):ne("div","404 Not Found")}}),Cn=(e={})=>e,G=e=>an(e)?e:`/${cn(e)}`;const Mn={enhance:({app:e})=>{}};function Bn(e){return{all:e=e||new Map,on:function(t,n){var s=e.get(t);s?s.push(n):e.set(t,[n])},off:function(t,n){var s=e.get(t);s&&(n?s.splice(s.indexOf(n)>>>0,1):e.set(t,[]))},emit:function(t,n){var s=e.get(t);s&&s.slice().map(function(r){r(n)}),(s=e.get("*"))&&s.slice().map(function(r){r(t,n)})}}}const zn={class:"footer__img"},Hn=["href"],qn=["src","alt"],Fn={class:"footer-company-title"},Nn={class:"social"},Wn={class:"social_links"},jn=["href"],Gn={class:"footer-social-text"},Un={class:"social-icons-wrapper"},Kn=["href"],Zn=["src"],Qn={__name:"Footer",setup(e){const{social:t,cloudlinuxSite:n,footerCustomLogo:s,footerCustomAltText:r,locales:i}=H("themeConfig"),o=xe(),l=D(()=>new Date().getFullYear()),c=D(()=>o.value.layout==="HomeLayout");return(a,u)=>(d(),b("div",{class:Z(["footer",{"footer-default-layout":!c.value}])},[v("div",zn,[v("a",{href:k(n)},[v("img",{src:k(G)(k(s)),alt:k(r)},null,8,qn)],8,Hn)]),v("div",Fn,C(l.value)+". CloudLinux Inc ",1),v("div",Nn,[v("div",Wn,[(d(!0),b(W,null,j(k(i).bottomLinks,p=>(d(),b("a",{href:p.url,target:"_blank"},C(p.text),9,jn))),256))]),v("span",Gn,C(k(i).stayInTouch),1),v("div",Un,[(d(!0),b(W,null,j(k(t),p=>(d(),b("a",{class:"social-icons-link",href:p==null?void 0:p.url,target:"_blank"},[p.icon?(d(),b("img",{key:0,class:"social-icons-link-img",src:k(G)(p==null?void 0:p.icon),alt:"footer logo"},null,8,Zn)):S("v-if",!0)],8,Kn))),256))])])],2))}},Re=B(Qn,[["__scopeId","data-v-f2902e71"],["__file","Footer.vue"]]),Vt={"/introduction/":[{collapsable:!1,children:["/introduction/"]}],"/terminology/":[{collapsable:!1,children:["/terminology/"]}],"/billing/":[{collapsable:!1,children:["/billing/"]}],"/installation/":[{collapsable:!1,children:["/installation/"]}],"/control_panel_integration/":[{collapsable:!1,children:["/control_panel_integration/"]}],"/ids_integration/":[{collapsable:!1,children:["/ids_integration/"]}],"/features/":[{collapsable:!1,children:["/features/"]}],"/localization/":[{collapsable:!1,children:["/localization/"]}],"/dashboard/":[{collapsable:!1,children:["/dashboard/"]}],"/user_interface/":[{collapsable:!1,children:["/user_interface/"]}],"/command_line_interface/":[{collapsable:!1,children:["/command_line_interface/"]}],"/config_file_description/":[{collapsable:!1,children:["/config_file_description/"]}],"/update/":[{collapsable:!1,children:["/update/"]}],"/whmcs_plugin/":[{collapsable:!1,children:["/whmcs_plugin/"]}],"/faq_and_known_issues/":[{collapsable:!1,children:["/faq_and_known_issues/"]}],"/uninstall/":[{collapsable:!1,children:["/uninstall/"]}],"/imunifyav/":[{collapsable:!1,children:["/imunifyav/","/imunifyav/imunifyav_for_plesk/","/imunifyav/imunifyav_for_ispmanager/","/imunifyav/imunifyav_for_webuzo/","/imunifyav/stand_alone_mode/","/imunifyav/cli/","/imunifyav/config_file_description/","/imunifyav/faq_and_known_issues/"]}],"/email/":[{collapsable:!1,children:["/email/"]}],"/myimunify/":[{collapsable:!1,children:["/myimunify/"]}],"/patchman/":[{collapsable:!1,children:["/patchman/","/patchman/getting_started/","/patchman/frequently_asked_questions/","/patchman/portal/","/patchman/policies/","/patchman/agent/","/patchman/platform_integrations/","/patchman/imunify/"]}]},Ze=/#.*$/,Xn=/\.(md|html)$/,pe=/\/$/,je=/^(https?:|mailto:|tel:)/;function ge(e){return decodeURI(e).replace(Ze,"").replace(Xn,"")}function Jn(e){const t=e==null?void 0:e.match(Ze);if(t)return t[0]}function Yn(e){return je.test(e)}function es(e){if(Yn(e))return e;const t=e==null?void 0:e.match(Ze),n=t?t[0]:"",s=ge(e);return pe.test(s)?e:s+".html"+n}function Te(e,t){const n=e.hash,s=Jn(t);if(s&&n!==s)return!1;const r=ge(e.path),i=ge(t);return r===i}function Ve(e,t,n){n&&(t=ts(t,n));const s=ge(t);for(let r=0;rIt(i,n,s)):[]}function ns(e){e=e.map(n=>Object.assign({},JSON.parse(JSON.stringify(n))));let t;return e.forEach(n=>{n.level!==1?t=n:t&&(t.children||(t.children=[])).push(n)}),e.filter(n=>n.level!==1)}function ss(e,t){if(Array.isArray(t))return{base:"/",config:t};for(const n in t)if(is(e.path).indexOf(n)===0)return{base:n,config:t[n]};return null}function is(e){return/(\.html|\/)$/.test(e)?e:e+"/"}function It(e,t,n,s){if(typeof e=="string")return Ve(t,e,n);if(Array.isArray(e))return Object.assign(Ve(t,e[0],n),{title:e[1]});{s&&console.error("[vuepress] Nested sidebar groups are not supported. Consider using navbar + categories instead.");const r=e.children||[];return{type:"group",title:e.title,children:r.map(i=>It(i,t,n,!0)),collapsable:e.collapsable!==!1}}}const rs={functional:!0,props:["item","closeSidebarDrawer"],render({item:e,closeSidebarDrawer:t}){var u,p;if(!e)return;const n=ue(),s=Be(),r=ze(),i=Te(s,e==null?void 0:e.path),o=(e==null?void 0:e.type)==="auto"?i||e.children.some(g=>Te(s,e.basePath+"#"+g.slug)):i,l=os(ne,e==null?void 0:e.path,e.title||(e==null?void 0:e.path),o,e.headers,t,r),c=((u=n.value.frontmatter)==null?void 0:u.sidebarDepth)!=null?(p=n.value.frontmatter)==null?void 0:p.sidebarDepth:5,a=c??1;if((e==null?void 0:e.type)==="auto")return[l,Ge(ne,e.children,e.basePath,s,a,1,t)];if(e.headers&&e.headers.length){const g=ns(e.headers);return[l,Ge(ne,g,e==null?void 0:e.path,s,a,1,t)]}return Qe(ne,e==null?void 0:e.path,e.title||(e==null?void 0:e.path),o,e.children,0,t)}};function Qe(e,t,n,s,r,i=0,o){const l=e(un,{"data-anchor":t,to:t,activeClass:"",exactActiveClass:"",class:{active:s,"sidebar-link":!0,["link-depth-level-"+i]:!0}},()=>[n]);return e("div",{class:{active:s,collapsed:!0,"sidebar-link-container":!!(r!=null&&r.length)},onClick:c=>{c.target.classList.toggle("collapsed"),c.target.tagName!=="DIV"&&o()}},[l])}function os(e,t,n,s,r,i,o){const l=!!r&&r.some(c=>c.level!==1);return e("div",{class:{active:s,collapsed:s,"sidebar-header":!0,"sidebar-link":!0,"sidebar-header--empty":!l},onClick:c=>{const a=c.target.classList,u=c.target.querySelector("a");a.toggle("collapsed"),u&&o.push(u.getAttribute("href"))}},[Qe(e,t,n,s,null,0,i)])}function Ge(e,t,n,s,r,i=1,o){return!t||i>r?null:e("ul",{class:"sidebar-sub-headers"},t.map(l=>{const c=Te(s,n+"#"+l.slug);return e("li",{class:{collapsible:i<3,"sidebar-sub-header":!0}},[Qe(e,n+"#"+l.slug,l.title,c,l.children,i,o),Ge(e,l.children,n,s,r,i+1,o)])}))}const Ct=B(rs,[["__file","SidebarLink.vue"]]);const ls={__name:"DropdownTransition",setup(e){const t=s=>{s.style.height=s.scrollHeight+"px"},n=s=>{s.style.height=""};return(s,r)=>(d(),L(Ae,{name:"dropdown",onEnter:t,onAfterEnter:n,onBeforeLeave:t},{default:Q(()=>[O(s.$slots,"default")]),_:3}))}},as=B(ls,[["__file","DropdownTransition.vue"]]);const cs={key:0,ref:"items",class:"sidebar-group-items"},us={__name:"SidebarGroup",props:{item:{type:Object,required:!0},first:{type:Boolean,required:!0},open:{type:Boolean,required:!0},collapsable:{type:Boolean,required:!0},closeSidebarDrawer:{type:Function,default:()=>{}}},setup(e){return(t,n)=>(d(),b("div",{class:Z(["sidebar-group",{first:e.first,collapsable:e.collapsable}])},[w(as,null,{default:Q(()=>{var s;return[e.open||!e.collapsable?(d(),b("ul",cs,[(d(!0),b(W,null,j((s=e.item)==null?void 0:s.children,r=>(d(),b("li",null,[w(Ct,{closeSidebarDrawer:e.closeSidebarDrawer,item:r},null,8,["closeSidebarDrawer","item"])]))),256))],512)):S("v-if",!0)]}),_:1})],2))}},ds=B(us,[["__file","SidebarGroup.vue"]]);const hs={class:"sidebar"},ps={key:0,class:"sidebar-links"},fs={__name:"Sidebar",props:{items:{type:Array,required:!0},closeSidebarDrawer:{type:Function,default:()=>{}},isMobileWidth:{type:Boolean}},setup(e){const t=e,n=D(()=>t.items),s=Be(),r=ue(),i=D(()=>Pt(r.value,s,n.value)),o=I(0),l=()=>{const h=p(s,t.items);h>-1&&(o.value=h)},c=h=>{o.value=h===o.value?-1:h},a=h=>{const m=h.getBoundingClientRect();return m.top>=0&&m.left>=0&&m.bottom<=(window.innerHeight/2||document.documentElement.clientHeight/2)&&m.right<=(window.innerWidth||document.documentElement.clientWidth)};_e(()=>s,l);const u=()=>{const h=document.querySelectorAll(".header-anchor"),m=document.querySelector(".sidebar"),f=m.querySelectorAll("a"),y=m.querySelectorAll(".collapsible.sidebar-sub-header"),V=Array.from(f).map($=>$.getAttribute("data-anchor"));h.forEach($=>{$.getAttribute("data-anchor")||$.setAttribute("data-anchor",r.value.path+$.hash)}),h.forEach($=>{if(a($)){const P=V.find(E=>E===$.getAttribute("data-anchor"));y.forEach(E=>{E.querySelectorAll(".sidebar-link-container").forEach(M=>{E.querySelector(`a[data-anchor="${P}"]`)?M.classList.remove("collapsed"):M.classList.add("collapsed")})}),m.querySelector(`a[data-anchor="${P}"]`)&&(f.forEach(E=>E.classList.remove("active")),m.querySelector(`a[data-anchor="${P}"]`).classList.add("active"))}})},p=(h,m)=>{for(let f=0;fTe(h,V.path)))return f}return-1},g=()=>{const h=window.location.hash,m=document.querySelectorAll(".sidebar a");m.forEach(f=>{if(f.getAttribute("data-anchor")===h){m.forEach(V=>V.classList.remove("active")),f.classList.add("active");const y=f.closest(".collapsible");y&&y.classList.remove("collapsed")}})};return ie(()=>{l(),t.isMobileWidth||window.addEventListener("scroll",u),t.isMobileWidth||window.addEventListener("resize",u),window.addEventListener("hashchange",g)}),be(()=>{window.removeEventListener("scroll",u),window.removeEventListener("resize",u),window.removeEventListener("hashchange",g)}),(h,m)=>(d(),b("div",hs,[O(h.$slots,"top"),i.value.length?(d(),b("ul",ps,[(d(!0),b(W,null,j(i.value,(f,y)=>(d(),b("li",{key:y},[f.type==="group"?(d(),L(ds,{key:0,item:f,first:y===0,open:y===o.value,closeSidebarDrawer:e.closeSidebarDrawer,collapsable:!!(f.collapsable||f.collapsible),onToggle:V=>c(y)},null,8,["item","first","open","closeSidebarDrawer","collapsable","onToggle"])):(d(),L(Ct,{key:1,closeSidebarDrawer:e.closeSidebarDrawer,item:f},null,8,["closeSidebarDrawer","item"]))]))),128))])):S("v-if",!0),O(h.$slots,"bottom")]))}},Mt=B(fs,[["__file","Sidebar.vue"]]);var ms=Object.defineProperty,gs=Object.defineProperties,_s=Object.getOwnPropertyDescriptors,at=Object.getOwnPropertySymbols,bs=Object.prototype.hasOwnProperty,vs=Object.prototype.propertyIsEnumerable,ct=(e,t,n)=>t in e?ms(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,he=(e,t)=>{for(var n in t||(t={}))bs.call(t,n)&&ct(e,n,t[n]);if(at)for(var n of at(t))vs.call(t,n)&&ct(e,n,t[n]);return e},ut=(e,t)=>gs(e,_s(t));const ys={props:{autoscroll:{type:Boolean,default:!0}},watch:{typeAheadPointer(){this.autoscroll&&this.maybeAdjustScroll()},open(e){this.autoscroll&&e&&this.$nextTick(()=>this.maybeAdjustScroll())}},methods:{maybeAdjustScroll(){var e;const t=((e=this.$refs.dropdownMenu)==null?void 0:e.children[this.typeAheadPointer])||!1;if(t){const n=this.getDropdownViewport(),{top:s,bottom:r,height:i}=t.getBoundingClientRect();if(sn.bottom)return this.$refs.dropdownMenu.scrollTop=t.offsetTop-(n.height-i)}},getDropdownViewport(){return this.$refs.dropdownMenu?this.$refs.dropdownMenu.getBoundingClientRect():{height:0,top:0,bottom:0}}}},ws={data(){return{typeAheadPointer:-1}},watch:{filteredOptions(){for(let e=0;e=0;e--)if(this.selectable(this.filteredOptions[e])){this.typeAheadPointer=e;break}},typeAheadDown(){for(let e=this.typeAheadPointer+1;e{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n},Ss={},xs={xmlns:"http://www.w3.org/2000/svg",width:"10",height:"10"},Es=v("path",{d:"M6.895455 5l2.842897-2.842898c.348864-.348863.348864-.914488 0-1.263636L9.106534.261648c-.348864-.348864-.914489-.348864-1.263636 0L5 3.104545 2.157102.261648c-.348863-.348864-.914488-.348864-1.263636 0L.261648.893466c-.348864.348864-.348864.914489 0 1.263636L3.104545 5 .261648 7.842898c-.348864.348863-.348864.914488 0 1.263636l.631818.631818c.348864.348864.914773.348864 1.263636 0L5 6.895455l2.842898 2.842897c.348863.348864.914772.348864 1.263636 0l.631818-.631818c.348864-.348864.348864-.914489 0-1.263636L6.895455 5z"},null,-1),Ls=[Es];function $s(e,t){return d(),b("svg",xs,Ls)}const Os=Xe(Ss,[["render",$s]]),Ds={},As={xmlns:"http://www.w3.org/2000/svg",width:"14",height:"10"},Rs=v("path",{d:"M9.211364 7.59931l4.48338-4.867229c.407008-.441854.407008-1.158247 0-1.60046l-.73712-.80023c-.407008-.441854-1.066904-.441854-1.474243 0L7 5.198617 2.51662.33139c-.407008-.441853-1.066904-.441853-1.474243 0l-.737121.80023c-.407008.441854-.407008 1.158248 0 1.600461l4.48338 4.867228L7 10l2.211364-2.40069z"},null,-1),Ts=[Rs];function Vs(e,t){return d(),b("svg",As,Ts)}const Ps=Xe(Ds,[["render",Vs]]),dt={Deselect:Os,OpenIndicator:Ps},Is={mounted(e,{instance:t}){if(t.appendToBody){const{height:n,top:s,left:r,width:i}=t.$refs.toggle.getBoundingClientRect();let o=window.scrollX||window.pageXOffset,l=window.scrollY||window.pageYOffset;e.unbindPosition=t.calculatePosition(e,t,{width:i+"px",left:o+r+"px",top:l+s+n+"px"}),document.body.appendChild(e)}},unmounted(e,{instance:t}){t.appendToBody&&(e.unbindPosition&&typeof e.unbindPosition=="function"&&e.unbindPosition(),e.parentNode&&e.parentNode.removeChild(e))}};function Cs(e){const t={};return Object.keys(e).sort().forEach(n=>{t[n]=e[n]}),JSON.stringify(t)}let Ms=0;function Bs(){return++Ms}const zs={components:he({},dt),directives:{appendToBody:Is},mixins:[ys,ws,ks],compatConfig:{MODE:3},emits:["open","close","update:modelValue","search","search:compositionstart","search:compositionend","search:keydown","search:blur","search:focus","search:input","option:created","option:selecting","option:selected","option:deselecting","option:deselected"],props:{modelValue:{},components:{type:Object,default:()=>({})},options:{type:Array,default(){return[]}},disabled:{type:Boolean,default:!1},clearable:{type:Boolean,default:!0},deselectFromDropdown:{type:Boolean,default:!1},searchable:{type:Boolean,default:!0},multiple:{type:Boolean,default:!1},placeholder:{type:String,default:""},transition:{type:String,default:"vs__fade"},clearSearchOnSelect:{type:Boolean,default:!0},closeOnSelect:{type:Boolean,default:!0},label:{type:String,default:"label"},autocomplete:{type:String,default:"off"},reduce:{type:Function,default:e=>e},selectable:{type:Function,default:e=>!0},getOptionLabel:{type:Function,default(e){return typeof e=="object"?e.hasOwnProperty(this.label)?e[this.label]:console.warn(`[vue-select warn]: Label key "option.${this.label}" does not exist in options object ${JSON.stringify(e)}. https://vue-select.org/api/props.html#getoptionlabel`):e}},getOptionKey:{type:Function,default(e){if(typeof e!="object")return e;try{return e.hasOwnProperty("id")?e.id:Cs(e)}catch(t){return console.warn(`[vue-select warn]: Could not stringify this option to generate unique key. Please provide'getOptionKey' prop to return a unique key for each option. https://vue-select.org/api/props.html#getoptionkey`,e,t)}}},onTab:{type:Function,default:function(){this.selectOnTab&&!this.isComposing&&this.typeAheadSelect()}},taggable:{type:Boolean,default:!1},tabindex:{type:Number,default:null},pushTags:{type:Boolean,default:!1},filterable:{type:Boolean,default:!0},filterBy:{type:Function,default(e,t,n){return(t||"").toLocaleLowerCase().indexOf(n.toLocaleLowerCase())>-1}},filter:{type:Function,default(e,t){return e.filter(n=>{let s=this.getOptionLabel(n);return typeof s=="number"&&(s=s.toString()),this.filterBy(n,s,t)})}},createOption:{type:Function,default(e){return typeof this.optionList[0]=="object"?{[this.label]:e}:e}},resetOnOptionsChange:{default:!1,validator:e=>["function","boolean"].includes(typeof e)},clearSearchOnBlur:{type:Function,default:function({clearSearchOnSelect:e,multiple:t}){return e&&!t}},noDrop:{type:Boolean,default:!1},inputId:{type:String},dir:{type:String,default:"auto"},selectOnTab:{type:Boolean,default:!1},selectOnKeyCodes:{type:Array,default:()=>[13]},searchInputQuerySelector:{type:String,default:"[type=search]"},mapKeydown:{type:Function,default:(e,t)=>e},appendToBody:{type:Boolean,default:!1},calculatePosition:{type:Function,default(e,t,{width:n,top:s,left:r}){e.style.top=s,e.style.left=r,e.style.width=n}},dropdownShouldOpen:{type:Function,default({noDrop:e,open:t,mutableLoading:n}){return e?!1:t&&!n}},uid:{type:[String,Number],default:()=>Bs()}},data(){return{search:"",open:!1,isComposing:!1,pushedTags:[],_value:[],deselectButtons:[]}},computed:{isReducingValues(){return this.$props.reduce!==this.$options.props.reduce.default},isTrackingValues(){return typeof this.modelValue>"u"||this.isReducingValues},selectedValue(){let e=this.modelValue;return this.isTrackingValues&&(e=this.$data._value),e!=null&&e!==""?[].concat(e):[]},optionList(){return this.options.concat(this.pushTags?this.pushedTags:[])},searchEl(){return this.$slots.search?this.$refs.selectedOptions.querySelector(this.searchInputQuerySelector):this.$refs.search},scope(){const e={search:this.search,loading:this.loading,searching:this.searching,filteredOptions:this.filteredOptions};return{search:{attributes:he({disabled:this.disabled,placeholder:this.searchPlaceholder,tabindex:this.tabindex,readonly:!this.searchable,id:this.inputId,"aria-autocomplete":"list","aria-labelledby":`vs${this.uid}__combobox`,"aria-controls":`vs${this.uid}__listbox`,ref:"search",type:"search",autocomplete:this.autocomplete,value:this.search},this.dropdownOpen&&this.filteredOptions[this.typeAheadPointer]?{"aria-activedescendant":`vs${this.uid}__option-${this.typeAheadPointer}`}:{}),events:{compositionstart:()=>this.isComposing=!0,compositionend:()=>this.isComposing=!1,keydown:this.onSearchKeyDown,blur:this.onSearchBlur,focus:this.onSearchFocus,input:t=>this.search=t.target.value}},spinner:{loading:this.mutableLoading},noOptions:{search:this.search,loading:this.mutableLoading,searching:this.searching},openIndicator:{attributes:{ref:"openIndicator",role:"presentation",class:"vs__open-indicator"}},listHeader:e,listFooter:e,header:ut(he({},e),{deselect:this.deselect}),footer:ut(he({},e),{deselect:this.deselect})}},childComponents(){return he(he({},dt),this.components)},stateClasses(){return{"vs--open":this.dropdownOpen,"vs--single":!this.multiple,"vs--multiple":this.multiple,"vs--searching":this.searching&&!this.noDrop,"vs--searchable":this.searchable&&!this.noDrop,"vs--unsearchable":!this.searchable,"vs--loading":this.mutableLoading,"vs--disabled":this.disabled}},searching(){return!!this.search},dropdownOpen(){return this.dropdownShouldOpen(this)},searchPlaceholder(){return this.isValueEmpty&&this.placeholder?this.placeholder:void 0},filteredOptions(){const e=[].concat(this.optionList);if(!this.filterable&&!this.taggable)return e;const t=this.search.length?this.filter(e,this.search,this):e;if(this.taggable&&this.search.length){const n=this.createOption(this.search);this.optionExists(n)||t.unshift(n)}return t},isValueEmpty(){return this.selectedValue.length===0},showClearButton(){return!this.multiple&&this.clearable&&!this.open&&!this.isValueEmpty}},watch:{options(e,t){const n=()=>typeof this.resetOnOptionsChange=="function"?this.resetOnOptionsChange(e,t,this.selectedValue):this.resetOnOptionsChange;!this.taggable&&n()&&this.clearSelection(),this.modelValue&&this.isTrackingValues&&this.setInternalValueFromOptions(this.modelValue)},modelValue:{immediate:!0,handler(e){this.isTrackingValues&&this.setInternalValueFromOptions(e)}},multiple(){this.clearSelection()},open(e){this.$emit(e?"open":"close")}},created(){this.mutableLoading=this.loading},methods:{setInternalValueFromOptions(e){Array.isArray(e)?this.$data._value=e.map(t=>this.findOptionFromReducedValue(t)):this.$data._value=this.findOptionFromReducedValue(e)},select(e){this.$emit("option:selecting",e),this.isOptionSelected(e)?this.deselectFromDropdown&&(this.clearable||this.multiple&&this.selectedValue.length>1)&&this.deselect(e):(this.taggable&&!this.optionExists(e)&&(this.$emit("option:created",e),this.pushTag(e)),this.multiple&&(e=this.selectedValue.concat(e)),this.updateValue(e),this.$emit("option:selected",e)),this.onAfterSelect(e)},deselect(e){this.$emit("option:deselecting",e),this.updateValue(this.selectedValue.filter(t=>!this.optionComparator(t,e))),this.$emit("option:deselected",e)},clearSelection(){this.updateValue(this.multiple?[]:null)},onAfterSelect(e){this.closeOnSelect&&(this.open=!this.open,this.searchEl.blur()),this.clearSearchOnSelect&&(this.search="")},updateValue(e){typeof this.modelValue>"u"&&(this.$data._value=e),e!==null&&(Array.isArray(e)?e=e.map(t=>this.reduce(t)):e=this.reduce(e)),this.$emit("update:modelValue",e)},toggleDropdown(e){const t=e.target!==this.searchEl;t&&e.preventDefault();const n=[...this.deselectButtons||[],this.$refs.clearButton];if(this.searchEl===void 0||n.filter(Boolean).some(s=>s.contains(e.target)||s===e.target)){e.preventDefault();return}this.open&&t?this.searchEl.blur():this.disabled||(this.open=!0,this.searchEl.focus())},isOptionSelected(e){return this.selectedValue.some(t=>this.optionComparator(t,e))},isOptionDeselectable(e){return this.isOptionSelected(e)&&this.deselectFromDropdown},optionComparator(e,t){return this.getOptionKey(e)===this.getOptionKey(t)},findOptionFromReducedValue(e){const t=s=>JSON.stringify(this.reduce(s))===JSON.stringify(e),n=[...this.options,...this.pushedTags].filter(t);return n.length===1?n[0]:n.find(s=>this.optionComparator(s,this.$data._value))||e},closeSearchOptions(){this.open=!1,this.$emit("search:blur")},maybeDeleteValue(){if(!this.searchEl.value.length&&this.selectedValue&&this.selectedValue.length&&this.clearable){let e=null;this.multiple&&(e=[...this.selectedValue.slice(0,this.selectedValue.length-1)]),this.updateValue(e)}},optionExists(e){return this.optionList.some(t=>this.optionComparator(t,e))},normalizeOptionForSlot(e){return typeof e=="object"?e:{[this.label]:e}},pushTag(e){this.pushedTags.push(e)},onEscape(){this.search.length?this.search="":this.searchEl.blur()},onSearchBlur(){if(this.mousedown&&!this.searching)this.mousedown=!1;else{const{clearSearchOnSelect:e,multiple:t}=this;this.clearSearchOnBlur({clearSearchOnSelect:e,multiple:t})&&(this.search=""),this.closeSearchOptions();return}if(this.search.length===0&&this.options.length===0){this.closeSearchOptions();return}},onSearchFocus(){this.open=!0,this.$emit("search:focus")},onMousedown(){this.mousedown=!0},onMouseUp(){this.mousedown=!1},onSearchKeyDown(e){const t=r=>(r.preventDefault(),!this.isComposing&&this.typeAheadSelect()),n={8:r=>this.maybeDeleteValue(),9:r=>this.onTab(),27:r=>this.onEscape(),38:r=>(r.preventDefault(),this.typeAheadUp()),40:r=>(r.preventDefault(),this.typeAheadDown())};this.selectOnKeyCodes.forEach(r=>n[r]=t);const s=this.mapKeydown(n,this);if(typeof s[e.keyCode]=="function")return s[e.keyCode](e)}}},Hs=["dir"],qs=["id","aria-expanded","aria-owns"],Fs={ref:"selectedOptions",class:"vs__selected-options"},Ns=["disabled","title","aria-label","onClick"],Ws={ref:"actions",class:"vs__actions"},js=["disabled"],Gs={class:"vs__spinner"},Us=["id"],Ks=["id","aria-selected","onMouseover","onClick"],Zs={key:0,class:"vs__no-options"},Qs=se(" Sorry, no matching options. "),Xs=["id"];function Js(e,t,n,s,r,i){const o=dn("append-to-body");return d(),b("div",{dir:n.dir,class:Z(["v-select",i.stateClasses])},[O(e.$slots,"header",X(J(i.scope.header))),v("div",{id:`vs${n.uid}__combobox`,ref:"toggle",class:"vs__dropdown-toggle",role:"combobox","aria-expanded":i.dropdownOpen.toString(),"aria-owns":`vs${n.uid}__listbox`,"aria-label":"Search for option",onMousedown:t[1]||(t[1]=l=>i.toggleDropdown(l))},[v("div",Fs,[(d(!0),b(W,null,j(i.selectedValue,(l,c)=>O(e.$slots,"selected-option-container",{option:i.normalizeOptionForSlot(l),deselect:i.deselect,multiple:n.multiple,disabled:n.disabled},()=>[(d(),b("span",{key:n.getOptionKey(l),class:"vs__selected"},[O(e.$slots,"selected-option",X(J(i.normalizeOptionForSlot(l))),()=>[se(C(n.getOptionLabel(l)),1)]),n.multiple?(d(),b("button",{key:0,ref_for:!0,ref:a=>r.deselectButtons[c]=a,disabled:n.disabled,type:"button",class:"vs__deselect",title:`Deselect ${n.getOptionLabel(l)}`,"aria-label":`Deselect ${n.getOptionLabel(l)}`,onClick:a=>i.deselect(l)},[(d(),L(De(i.childComponents.Deselect)))],8,Ns)):S("",!0)]))])),256)),O(e.$slots,"search",X(J(i.scope.search)),()=>[v("input",We({class:"vs__search"},i.scope.search.attributes,hn(i.scope.search.events)),null,16)])],512),v("div",Ws,[le(v("button",{ref:"clearButton",disabled:n.disabled,type:"button",class:"vs__clear",title:"Clear Selected","aria-label":"Clear Selected",onClick:t[0]||(t[0]=(...l)=>i.clearSelection&&i.clearSelection(...l))},[(d(),L(De(i.childComponents.Deselect)))],8,js),[[ae,i.showClearButton]]),O(e.$slots,"open-indicator",X(J(i.scope.openIndicator)),()=>[n.noDrop?S("",!0):(d(),L(De(i.childComponents.OpenIndicator),X(We({key:0},i.scope.openIndicator.attributes)),null,16))]),O(e.$slots,"spinner",X(J(i.scope.spinner)),()=>[le(v("div",Gs,"Loading...",512),[[ae,e.mutableLoading]])])],512)],40,qs),w(Ae,{name:n.transition},{default:Q(()=>[i.dropdownOpen?le((d(),b("ul",{id:`vs${n.uid}__listbox`,ref:"dropdownMenu",key:`vs${n.uid}__listbox`,class:"vs__dropdown-menu",role:"listbox",tabindex:"-1",onMousedown:t[2]||(t[2]=z((...l)=>i.onMousedown&&i.onMousedown(...l),["prevent"])),onMouseup:t[3]||(t[3]=(...l)=>i.onMouseUp&&i.onMouseUp(...l))},[O(e.$slots,"list-header",X(J(i.scope.listHeader))),(d(!0),b(W,null,j(i.filteredOptions,(l,c)=>(d(),b("li",{id:`vs${n.uid}__option-${c}`,key:n.getOptionKey(l),role:"option",class:Z(["vs__dropdown-option",{"vs__dropdown-option--deselect":i.isOptionDeselectable(l)&&c===e.typeAheadPointer,"vs__dropdown-option--selected":i.isOptionSelected(l),"vs__dropdown-option--highlight":c===e.typeAheadPointer,"vs__dropdown-option--disabled":!n.selectable(l)}]),"aria-selected":c===e.typeAheadPointer?!0:null,onMouseover:a=>n.selectable(l)?e.typeAheadPointer=c:null,onClick:z(a=>n.selectable(l)?i.select(l):null,["prevent","stop"])},[O(e.$slots,"option",X(J(i.normalizeOptionForSlot(l))),()=>[se(C(n.getOptionLabel(l)),1)])],42,Ks))),128)),i.filteredOptions.length===0?(d(),b("li",Zs,[O(e.$slots,"no-options",X(J(i.scope.noOptions)),()=>[Qs])])):S("",!0),O(e.$slots,"list-footer",X(J(i.scope.listFooter)))],40,Us)),[[o]]):(d(),b("ul",{key:1,id:`vs${n.uid}__listbox`,role:"listbox",style:{display:"none",visibility:"hidden"}},null,8,Xs))]),_:3},8,["name"]),O(e.$slots,"footer",X(J(i.scope.footer)))],10,Hs)}const Ys=Xe(zs,[["render",Js]]);const ei=["src"],ti={key:1},ni={__name:"DSelect",props:{withIcon:{type:Boolean,default:!0},modelValue:{type:Object,default:()=>({label:"",value:""})},options:{type:Array,default:()=>[]}},emits:["changeSidebarItems","update:selectedValue","update:model-value"],setup(e,{emit:t}){const{searchSelectIcon:n}=H("themeConfig"),s=t,r=l=>{s("changeSidebarItems",l),s("update:model-value",l)},i=I(),o=()=>{i.value&&(i.value.open=!1)};return ie(()=>window.addEventListener("click",l=>{var c;(c=i.value)!=null&&c.$el.contains(l.target)||o()})),be(()=>window.removeEventListener("click",o)),(l,c)=>(d(),L(k(Ys),{ref_key:"dropdown",ref:i,"onUpdate:modelValue":r,"model-value":e.modelValue,label:"title",value:"link",clearable:!1,searchable:!1,options:e.options},{"open-indicator":Q(({attributes:a})=>[e.withIcon?(d(),b("div",We({key:0,class:"select-icon"},a),[v("img",{src:k(G)(k(n)),alt:"search Icon"},null,8,ei)],16)):(d(),b("span",ti))]),_:1},8,["model-value","options"]))}},Bt=B(ni,[["__file","DSelect.vue"]]),si={class:"sidebar-drawer__mobile"},ii={class:"sidebar-header"},ri=Me({__name:"SidebarDrawer",props:{allPages:{type:Array,required:!0,default:()=>[]},documents:{type:Array,required:!0,default:()=>[]},closeSidebarDrawer:{type:Function,default:()=>{}},modelValue:{type:Object,required:!0,default:()=>{}},isMobileWidth:{type:Boolean}},emits:["changeSidebarItems","update:model-value"],setup(e){return(t,n)=>(d(),b("div",si,[w(Mt,{closeSidebarDrawer:e.closeSidebarDrawer,items:e.allPages,isMobileWidth:e.isMobileWidth},{top:Q(()=>[v("div",ii,[n[2]||(n[2]=v("p",{class:"sidebar-header__paragraph"},"Select CL docs",-1)),w(Bt,{modelValue:e.modelValue,"onUpdate:modelValue":n[0]||(n[0]=s=>t.$emit("update:model-value",s)),onChangeSidebarItems:n[1]||(n[1]=s=>t.$emit("changeSidebarItems",s)),"with-icon":"",options:e.documents},null,8,["modelValue","options"])])]),_:1},8,["closeSidebarDrawer","items","isMobileWidth"])]))}});const oi=B(ri,[["__file","SidebarDrawer.vue"]]);function Je(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}let de=Je();function zt(e){de=e}const ke={exec:()=>null};function R(e,t=""){let n=typeof e=="string"?e:e.source;const s={replace:(r,i)=>{let o=typeof i=="string"?i:i.source;return o=o.replace(q.caret,"$1"),n=n.replace(r,o),s},getRegex:()=>new RegExp(n,t)};return s}const q={codeRemoveIndent:/^(?: {1,4}| {0,3}\t)/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceTabs:/^\t+/,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] /,listReplaceTask:/^\[[ xX]\] +/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,unescapeTest:/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:e=>new RegExp(`^( {0,3}${e})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),hrRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),fencesBeginRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}(?:\`\`\`|~~~)`),headingBeginRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}#`),htmlBeginRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}<(?:[a-z].*>|!--)`,"i")},li=/^(?:[ \t]*(?:\n|$))+/,ai=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,ci=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,Ee=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,ui=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,Ht=/(?:[*+-]|\d{1,9}[.)])/,qt=R(/^(?!bull |blockCode|fences|blockquote|heading|html)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html))+?)\n {0,3}(=+|-+) *(?:\n+|$)/).replace(/bull/g,Ht).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).getRegex(),Ye=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,di=/^[^\n]+/,et=/(?!\s*\])(?:\\.|[^\[\]\\])+/,hi=R(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",et).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),pi=R(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,Ht).getRegex(),He="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",tt=/|$))/,fi=R("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",tt).replace("tag",He).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),Ft=R(Ye).replace("hr",Ee).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",He).getRegex(),mi=R(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",Ft).getRegex(),nt={blockquote:mi,code:ai,def:hi,fences:ci,heading:ui,hr:Ee,html:fi,lheading:qt,list:pi,newline:li,paragraph:Ft,table:ke,text:di},ht=R("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",Ee).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",He).getRegex(),gi={...nt,table:ht,paragraph:R(Ye).replace("hr",Ee).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",ht).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",He).getRegex()},_i={...nt,html:R(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",tt).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:ke,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:R(Ye).replace("hr",Ee).replace("heading",` *#{1,6} *[^ ]`).replace("lheading",qt).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},bi=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,vi=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,Nt=/^( {2,}|\\)\n(?!\s*$)/,yi=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\]*?>/g,Gt=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,Ei=R(Gt,"u").replace(/punct/g,qe).getRegex(),Li=R(Gt,"u").replace(/punct/g,jt).getRegex(),Ut="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",$i=R(Ut,"gu").replace(/notPunctSpace/g,Wt).replace(/punctSpace/g,st).replace(/punct/g,qe).getRegex(),Oi=R(Ut,"gu").replace(/notPunctSpace/g,Si).replace(/punctSpace/g,ki).replace(/punct/g,jt).getRegex(),Di=R("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,Wt).replace(/punctSpace/g,st).replace(/punct/g,qe).getRegex(),Ai=R(/\\(punct)/,"gu").replace(/punct/g,qe).getRegex(),Ri=R(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),Ti=R(tt).replace("(?:-->|$)","-->").getRegex(),Vi=R("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",Ti).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),Pe=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,Pi=R(/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/).replace("label",Pe).replace("href",/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),Kt=R(/^!?\[(label)\]\[(ref)\]/).replace("label",Pe).replace("ref",et).getRegex(),Zt=R(/^!?\[(ref)\](?:\[\])?/).replace("ref",et).getRegex(),Ii=R("reflink|nolink(?!\\()","g").replace("reflink",Kt).replace("nolink",Zt).getRegex(),it={_backpedal:ke,anyPunctuation:Ai,autolink:Ri,blockSkip:xi,br:Nt,code:vi,del:ke,emStrongLDelim:Ei,emStrongRDelimAst:$i,emStrongRDelimUnd:Di,escape:bi,link:Pi,nolink:Zt,punctuation:wi,reflink:Kt,reflinkSearch:Ii,tag:Vi,text:yi,url:ke},Ci={...it,link:R(/^!?\[(label)\]\((.*?)\)/).replace("label",Pe).getRegex(),reflink:R(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",Pe).getRegex()},Ue={...it,emStrongRDelimAst:Oi,emStrongLDelim:Li,url:R(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,"i").replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\.|[^\\])*?(?:\\.|[^\s~\\]))\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\":">",'"':""","'":"'"},pt=e=>Bi[e];function ee(e,t){if(t){if(q.escapeTest.test(e))return e.replace(q.escapeReplace,pt)}else if(q.escapeTestNoEncode.test(e))return e.replace(q.escapeReplaceNoEncode,pt);return e}function ft(e){try{e=encodeURI(e).replace(q.percentDecode,"%")}catch{return null}return e}function mt(e,t){var i;const n=e.replace(q.findPipe,(o,l,c)=>{let a=!1,u=l;for(;--u>=0&&c[u]==="\\";)a=!a;return a?"|":" |"}),s=n.split(q.splitPipe);let r=0;if(s[0].trim()||s.shift(),s.length>0&&!((i=s.at(-1))!=null&&i.trim())&&s.pop(),t)if(s.length>t)s.splice(t);else for(;s.lengthe[0]||(e[0]=[a("External Black/Whitelist Management")])),_:1})]),t("li",null,[n(i,{to:"#global-ignore-list"},{default:s(()=>e[1]||(e[1]=[a("Global Ignore List")])),_:1})]),t("li",null,[n(i,{to:"#rapidscan"},{default:s(()=>e[2]||(e[2]=[a("RapidScan")])),_:1})]),t("li",null,[n(i,{to:"#low-resource-usage-mode"},{default:s(()=>e[3]||(e[3]=[a("Low Resource Usage mode")])),_:1})]),t("li",null,[n(i,{to:"#exim-dovecot-brute-force-attack-protection"},{default:s(()=>e[4]||(e[4]=[a("Exim+Dovecot brute-force attack protection")])),_:1}),t("ul",null,[t("li",null,[n(i,{to:"#dovecot-native-brute-force-protection"},{default:s(()=>e[5]||(e[5]=[a("Dovecot native brute force protection")])),_:1})])])]),t("li",null,[n(i,{to:"#notifications"},{default:s(()=>e[6]||(e[6]=[a("Notifications")])),_:1})]),t("li",null,[n(i,{to:"#malware-database-scanner-mds"},{default:s(()=>e[7]||(e[7]=[a("Malware Database Scanner (MDS)")])),_:1}),t("ul",null,[t("li",null,[n(i,{to:"#how-to-use-malware-database-scanner-mds"},{default:s(()=>e[8]||(e[8]=[a("How to use Malware Database Scanner (MDS)")])),_:1})])])]),t("li",null,[n(i,{to:"#webshield"},{default:s(()=>e[9]||(e[9]=[a("Webshield")])),_:1}),t("ul",null,[t("li",null,[n(i,{to:"#greylist-and-anti-bot-challenge"},{default:s(()=>e[10]||(e[10]=[a("Greylist and Anti-Bot Challenge")])),_:1})]),t("li",null,[n(i,{to:"#cdn-support"},{default:s(()=>e[11]||(e[11]=[a("CDN Support")])),_:1})]),t("li",null,[n(i,{to:"#using-cloudflare-edge-cache-ttl-cache-everything-and-browser-cache-ttl-with-imunify360"},{default:s(()=>e[12]||(e[12]=[a("Using Cloudflare “Edge Cache TTL“, “Cache Everything”, and “Browser Cache TTL” with Imunify360")])),_:1})]),t("li",null,[n(i,{to:"#anti-bot-protection"},{default:s(()=>e[13]||(e[13]=[a("Anti-bot protection")])),_:1})])])]),t("li",null,[n(i,{to:"#overridable-config"},{default:s(()=>e[14]||(e[14]=[a("Overridable config")])),_:1})]),t("li",null,[n(i,{to:"#scan-of-the-system-and-user-crontab-files-for-malicious-jobs"},{default:s(()=>e[15]||(e[15]=[a("Scan of the system and user crontab files for malicious jobs "),t("Badge",{text:"Experimental",type:"note"},null,-1)])),_:1})]),t("li",null,[n(i,{to:"#hooks"},{default:s(()=>e[16]||(e[16]=[a("Hooks "),t("Badge",{text:"Deprecated",type:"warning"},null,-1)])),_:1}),t("ul",null,[t("li",null,[n(i,{to:"#overview"},{default:s(()=>e[17]||(e[17]=[a("Overview")])),_:1})]),t("li",null,[n(i,{to:"#how-to-start-using-hooks"},{default:s(()=>e[18]||(e[18]=[a("How to start using hooks")])),_:1})]),t("li",null,[n(i,{to:"#available-events-and-their-parameters"},{default:s(()=>e[19]||(e[19]=[a("Available events and their parameters")])),_:1})]),t("li",null,[n(i,{to:"#cli"},{default:s(()=>e[20]||(e[20]=[a("CLI")])),_:1})]),t("li",null,[n(i,{to:"#native"},{default:s(()=>e[21]||(e[21]=[a("Native")])),_:1})]),t("li",null,[n(i,{to:"#log-file"},{default:s(()=>e[22]||(e[22]=[a("Log File")])),_:1})]),t("li",null,[n(i,{to:"#structure-and-examples-of-a-hook-script"},{default:s(()=>e[23]||(e[23]=[a("Structure and examples of a hook script")])),_:1})])])])])]),e[72]||(e[72]=l(`

# External Black/Whitelist Management

To use external files with the list of Black/White IPs, place this list into the following directory:

  • for the White List:
/etc/imunify360/whitelist/*.txt
+import{_ as d,S as r,n as c,p as u,q as t,J as a,C as n,A as s,a4 as l,v as p}from"./framework-dd156d1c.js";const m="/images/LowResourceUsage.png",h="/images/WebShieldEnabled.jpeg",v="/images/MinimazedModSecRulesetDisable.jpeg",g="/images/notifications.png",f="/images/RealTimeScanDetected.png",b="/images/UserScanStarted.png",w="/images/CustomScanStarted.png",y="/images/UserScanFinished.png",x="/images/CustomScanFinished.png",q="/images/CustomScanDetected.png",k="/images/UserScanDetected.png",I="/images/ScriptBlocked.png",S="/images/new_cache_everything.png",_="/images/new_cache_control.png",C={},T={class:"table-of-contents"},P={class:"notranslate"},L={class:"notranslate"},E={start:"3"};function D(A,e){const i=r("router-link"),o=r("RouterLink");return c(),u("div",null,[e[71]||(e[71]=t("h1",{id:"features",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#features"},"#"),a(" Features")],-1)),t("nav",T,[t("ul",null,[t("li",null,[n(i,{to:"#external-black-whitelist-management"},{default:s(()=>e[0]||(e[0]=[a("External Black/Whitelist Management")])),_:1})]),t("li",null,[n(i,{to:"#global-ignore-list"},{default:s(()=>e[1]||(e[1]=[a("Global Ignore List")])),_:1})]),t("li",null,[n(i,{to:"#rapidscan"},{default:s(()=>e[2]||(e[2]=[a("RapidScan")])),_:1})]),t("li",null,[n(i,{to:"#low-resource-usage-mode"},{default:s(()=>e[3]||(e[3]=[a("Low Resource Usage mode")])),_:1})]),t("li",null,[n(i,{to:"#exim-dovecot-brute-force-attack-protection"},{default:s(()=>e[4]||(e[4]=[a("Exim+Dovecot brute-force attack protection")])),_:1}),t("ul",null,[t("li",null,[n(i,{to:"#dovecot-native-brute-force-protection"},{default:s(()=>e[5]||(e[5]=[a("Dovecot native brute force protection")])),_:1})])])]),t("li",null,[n(i,{to:"#notifications"},{default:s(()=>e[6]||(e[6]=[a("Notifications")])),_:1})]),t("li",null,[n(i,{to:"#malware-database-scanner-mds"},{default:s(()=>e[7]||(e[7]=[a("Malware Database Scanner (MDS)")])),_:1}),t("ul",null,[t("li",null,[n(i,{to:"#how-to-use-malware-database-scanner-mds"},{default:s(()=>e[8]||(e[8]=[a("How to use Malware Database Scanner (MDS)")])),_:1})])])]),t("li",null,[n(i,{to:"#webshield"},{default:s(()=>e[9]||(e[9]=[a("Webshield")])),_:1}),t("ul",null,[t("li",null,[n(i,{to:"#greylist-and-anti-bot-challenge"},{default:s(()=>e[10]||(e[10]=[a("Greylist and Anti-Bot Challenge")])),_:1})]),t("li",null,[n(i,{to:"#cdn-support"},{default:s(()=>e[11]||(e[11]=[a("CDN Support")])),_:1})]),t("li",null,[n(i,{to:"#using-cloudflare-edge-cache-ttl-cache-everything-and-browser-cache-ttl-with-imunify360"},{default:s(()=>e[12]||(e[12]=[a("Using Cloudflare “Edge Cache TTL“, “Cache Everything”, and “Browser Cache TTL” with Imunify360")])),_:1})]),t("li",null,[n(i,{to:"#anti-bot-protection"},{default:s(()=>e[13]||(e[13]=[a("Anti-bot protection")])),_:1})])])]),t("li",null,[n(i,{to:"#overridable-config"},{default:s(()=>e[14]||(e[14]=[a("Overridable config")])),_:1})]),t("li",null,[n(i,{to:"#scan-of-the-system-and-user-crontab-files-for-malicious-jobs"},{default:s(()=>e[15]||(e[15]=[a("Scan of the system and user crontab files for malicious jobs "),t("Badge",{text:"Experimental",type:"note"},null,-1)])),_:1})]),t("li",null,[n(i,{to:"#hooks"},{default:s(()=>e[16]||(e[16]=[a("Hooks "),t("Badge",{text:"Deprecated",type:"warning"},null,-1)])),_:1}),t("ul",null,[t("li",null,[n(i,{to:"#overview"},{default:s(()=>e[17]||(e[17]=[a("Overview")])),_:1})]),t("li",null,[n(i,{to:"#how-to-start-using-hooks"},{default:s(()=>e[18]||(e[18]=[a("How to start using hooks")])),_:1})]),t("li",null,[n(i,{to:"#available-events-and-their-parameters"},{default:s(()=>e[19]||(e[19]=[a("Available events and their parameters")])),_:1})]),t("li",null,[n(i,{to:"#cli"},{default:s(()=>e[20]||(e[20]=[a("CLI")])),_:1})]),t("li",null,[n(i,{to:"#native"},{default:s(()=>e[21]||(e[21]=[a("Native")])),_:1})]),t("li",null,[n(i,{to:"#log-file"},{default:s(()=>e[22]||(e[22]=[a("Log File")])),_:1})]),t("li",null,[n(i,{to:"#structure-and-examples-of-a-hook-script"},{default:s(()=>e[23]||(e[23]=[a("Structure and examples of a hook script")])),_:1})])])])])]),e[72]||(e[72]=l(`

# External Black/Whitelist Management

To use external files with the list of Black/White IPs, place this list into the following directory:

  • for the White List:
/etc/imunify360/whitelist/*.txt
 
  • for the Black List:
/etc/imunify360/blacklist/*.txt
 

The files may have IP addresses or subnet in CIDR notation.

In order to apply the IP lists, run the following command:

imunify360-agent reload-lists
 

Or restart the agent.

Warning

Specifying IPs in those files will not prevent Imunify from adding the same IPs to dynamic lists (like Gray list), but all White lists always have the priority over Black lists when it comes to actual filtering of requests/packages.

# Global Ignore List

The Global Ignore List feature allows you to exclude files from malware scanning based on their content instead of location.

The following file contains the list of file hashes to be excluded:

/etc/imunify360/malware-ignore-hashes.txt
@@ -8,7 +8,7 @@ f157c3ede78333087829cdd211c55822e635d6c419606c3675bc8201b556bc9f
 
 # Adminer, added 14/09/2024
 dcfd0433dc46bd82ec5aa7c9998b4ae7087731a45d3a443e3724da7aabe1e4c5
-

A regular path-based ignore list is also functional.

# RapidScan

The RapidScan feature increases scanning speed by lowering system resource usage. Increased scanning speeds and a higher scanning rate further hardens system security posture.

# RapidScan techniques

  • Faster File Integrity Checking. File metadata - file hashes are stored locally. This means that if the file didn't change since the last scan it won't need to be re-scanned.
  • Efficient Cloud-assisted Scanning. Imunify360 stores its malicious file hash database in the cloud. Cloud assistance helps to detect malicious files and skip well known files that were white-listed. This means that only unfamiliar files remain to be scanned locally, resulting in significantly reduced scan times.
  • Optimized Malware Signatures. Our malware signature database continually grows to reflect the ever-expanding variety of malicious software. As the database becomes more accurate and comprehensive, it also becomes larger and more cumbersome to index. We tackle this by actively curating the database and re-evaluating complex signatures, recasting any of them that could be improved in order to make a positive effect on scanning performance.

# What does it mean for you?

After enabling the RapidScan feature, the next scan runs with the usual speed. However, the subsequent scans speeds will improve, and they will run anywhere between 5 to 20 times faster. This is the case for both on-demand and scheduled scans, and it means, among other things, you can can increase scan frequency without affecting system performance.

`,24)),t("p",null,[e[25]||(e[25]=a("To take advantage of this feature, go to your Imunify360 control panel and enable RapidScan in Settings→Malware Scanner. Please see the details ")),n(o,{to:"/dashboard/#malware"},{default:s(()=>e[24]||(e[24]=[a("here")])),_:1}),e[26]||(e[26]=a("."))]),e[73]||(e[73]=t("h2",{id:"low-resource-usage-mode",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#low-resource-usage-mode"},"#"),a(" Low Resource Usage mode")],-1)),e[74]||(e[74]=t("p",null,"This is a special operation mode where Imunify360 consumes less CPU and RAM. It is intended for servers with limited resources.",-1)),t("p",null,[e[28]||(e[28]=a("This mode disables ")),t("span",P,[n(o,{to:"/webshield/"},{default:s(()=>e[27]||(e[27]=[a("WebShield")])),_:1})]),e[29]||(e[29]=a(" switching off GrayList and Anti-bot Challenge."))]),t("p",null,[e[31]||(e[31]=t("span",{class:"notranslate"},[t("em",null,"Low Resource Usage")],-1)),e[32]||(e[32]=a(" mode also enables the ")),t("span",E,[t("em",null,[n(o,{to:"/dashboard/#waf-settings"},{default:s(()=>e[30]||(e[30]=[a("Minimized Modsec Ruleset")])),_:1})])]),e[33]||(e[33]=a(" option that disables Imunify WAF rules with a high memory footprint, leaving critical rulesets enabled."))]),e[75]||(e[75]=l('

When the Low Resource Usage mode is activated it is reflected on the UI: an Imunify main menu changes color to light green, and an appropriate label appears on the top right.

# How to switch from the Low Resource Usage mode to the normal resource usage mode

You can switch the mode via CLI and in the UI.

In CLI, run the following commands:

imunify360-agent config update '{"WEBSHIELD": {"enable": true}}'
+

A regular path-based ignore list is also functional.

# RapidScan

The RapidScan feature increases scanning speed by lowering system resource usage. Increased scanning speeds and a higher scanning rate further hardens system security posture.

# RapidScan techniques

  • Faster File Integrity Checking. File metadata - file hashes are stored locally. This means that if the file didn't change since the last scan it won't need to be re-scanned.
  • Efficient Cloud-assisted Scanning. Imunify360 stores its malicious file hash database in the cloud. Cloud assistance helps to detect malicious files and skip well known files that were white-listed. This means that only unfamiliar files remain to be scanned locally, resulting in significantly reduced scan times.
  • Optimized Malware Signatures. Our malware signature database continually grows to reflect the ever-expanding variety of malicious software. As the database becomes more accurate and comprehensive, it also becomes larger and more cumbersome to index. We tackle this by actively curating the database and re-evaluating complex signatures, recasting any of them that could be improved in order to make a positive effect on scanning performance.

# What does it mean for you?

After enabling the RapidScan feature, the next scan runs with the usual speed. However, the subsequent scans speeds will improve, and they will run anywhere between 5 to 20 times faster. This is the case for both on-demand and scheduled scans, and it means, among other things, you can can increase scan frequency without affecting system performance.

`,24)),t("p",null,[e[25]||(e[25]=a("To take advantage of this feature, go to your Imunify360 control panel and enable RapidScan in Settings→Malware Scanner. Please see the details ")),n(o,{to:"/dashboard/#malware"},{default:s(()=>e[24]||(e[24]=[a("here")])),_:1}),e[26]||(e[26]=a("."))]),e[73]||(e[73]=t("h2",{id:"low-resource-usage-mode",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#low-resource-usage-mode"},"#"),a(" Low Resource Usage mode")],-1)),e[74]||(e[74]=t("p",null,"This is a special operation mode where Imunify360 consumes less CPU and RAM. It is intended for servers with limited resources.",-1)),t("p",null,[e[28]||(e[28]=a("This mode disables ")),t("span",P,[n(o,{to:"/webshield/"},{default:s(()=>e[27]||(e[27]=[a("WebShield")])),_:1})]),e[29]||(e[29]=a(" switching off GrayList and Anti-bot Challenge."))]),t("p",null,[e[31]||(e[31]=t("span",{class:"notranslate"},[t("em",null,"Low Resource Usage")],-1)),e[32]||(e[32]=a(" mode also enables the ")),t("span",L,[t("em",null,[n(o,{to:"/dashboard/#waf-settings"},{default:s(()=>e[30]||(e[30]=[a("Minimized Modsec Ruleset")])),_:1})])]),e[33]||(e[33]=a(" option that disables Imunify WAF rules with a high memory footprint, leaving critical rulesets enabled."))]),e[75]||(e[75]=l('

When the Low Resource Usage mode is activated it is reflected on the UI: an Imunify main menu changes color to light green, and an appropriate label appears on the top right.

# How to switch from the Low Resource Usage mode to the normal resource usage mode

You can switch the mode via CLI and in the UI.

In CLI, run the following commands:

imunify360-agent config update '{"WEBSHIELD": {"enable": true}}'
 imunify360-agent config update '{"MOD_SEC": {"ruleset": "FULL"}}'
 

In the UI, do the following steps:

  1. Go to Settings | General | WebShield and enable WebShield:

  1. Go to Settings | General | WAF Settings and disable Minimized ModSec Ruleset:

# Exim+Dovecot brute-force attack protection

Note

cPanel only, other panels will be added later

Exim+Dovecot brute-force attack protection is an advanced protection against Dovecot brute-force attacks. PAM module protects against IMAP/POP3 brute-force attack and prevents mail account from being compromised via brute-forcing.

How to enable Dovecot

We recommend using Imunify360 agent config to enable Dovecot because this allows to correctly switch OSSEC rules/configs:

imunify360-agent config update '{"PAM": {"enable": true, "exim_dovecot_protection": true}}'
 

How to disable Dovecot

To disable all PAM module via config file:

imunify360-agent config update '{"PAM": {"enable": false, "exim_dovecot_protection": false}}'
@@ -21,7 +21,7 @@ imunify360-agent config update '{"MOD_SEC": {"ruleset":
 

# Notifications

Starting from version 4.10, an administrator is able to configure email addresses to submit reports and execute custom scripts. Go to Settings and choose Notifications tab.

  • Default admin emails: specify the default list of emails used for all enabled admin email notifications.
  • From: specify a sender of all emails sent by the Hooks.

The following events are available.

# Real-Time scan: malware detected

Occurs when malware is detected during the real-time scanning.

  • Enable email notifications for admin: move the slider to ON to notify the administrator and a custom user list via email upon event occurrence. To notify the administrator on the default admin email, tick the Default admin emails checkbox.
  • Notify every (mins): set a notification interval in minutes. The data for all events that happened within the interval will be accumulated and sent altogether.
  • Admin emails: tick the Default admin emails and/or specify your emails for notifications.
  • Enable script execution: move the slide to ON to run a script (event handler) upon event occurrence.
  • Notify every (sec): set a notification interval in seconds. The data for all events that happened within the interval will be accumulated and sent altogether.
  • Run a script: specify the full path to the script(s) or any other Linux executable to be launched on event occurrence. Make sure that the script has an executable bit (+x) on. A line-separated list of scripts is supported.

# User scan: started

Occurs immediately after the user scanning has started.

# Custom scan: started

Occurs immediately after on-demand (manual) scanning has started.

# User scan: finished

Occurs immediately after the user scanning has finished, regardless the malware has found or not.

# Custom scan: finished

Occurs immediately after on-demand (manual) scanning has finished, regardless the malware has found or not.

# Custom scan: malware detected

Occurs when the on-demand scanning process has finished and malware found.

# User scan: malware detected

Occurs when the malware scanning process of a user account has finished and malware found.

# Script blocked

Occurs when the Proactive Defense has blocked malicious script.

Click Save changes at the bottom to apply all changes.

# Malware Database Scanner (MDS)

Malware Database Scanner (MDS) is designed to solve all malware related problems in the database.

Note

Version Imunify360 6.0 or later supports the use of MDS in UI.

Warning

For now, Malware Database Scanner (MDS) supports WordPress and Joomla databases only.

# How to use Malware Database Scanner (MDS)

To provide safe work with database MDS supports several methods:

  • --scan - only scan the database, no changes will be applied
  • --clean - scan database and clean-up malicious
  • --restore - restore data affected by clean-up from the backup CSV file

Note

“Clean” operation includes “scan”, so you don’t need to run a scan before the cleanup. Whereas the “scan” can be used for non-disruptive checks of the database. Cleanup mode creates a backup file that can be used to rollback all changes back. It makes MDS safe to use and prevents websites from breaking and data loss.

The easiest way to use MDS is to run it with --search-configs argument: MDS will try to find the config files and print out database credentials that should be later specified for scanning.

--creds-from-xargs argument can be used to run MDS without a need to manually enter credentials. It allows automating the process of credentials discovery and the scan process.

# Usage

/opt/ai-bolit/wrapper /opt/ai-bolit/imunify_dbscan.php [OPTIONS] [PATH]\n

Options

--host=<host>Database host
--port=<port>Database port
--login=<username>Database username
--password=<password>Database password
--password-from-stdinGet database password from stdin
--database=<db_name>Database name
--prefix=<prefix>Prefix for table
--scanDo scan
--cleanDo clean
--search-configsFind the config files and print out database credentials
--creds-from-xargsDiscover credentials and do scan
--report-file=<filepath>Filepath where to put the report
--signature-db=<filepath>Filepath with signatures
--progress=<filepath>Filepath with progress
--shared-mem-progress=<shmem_id>ID of shared memory segment
--create-shared-memMDS create own shared memory segment
--status=<filepath>Filepath with status for control task
--avdb=<filepath>Filepath with ai-bolit signatures database
--procudb=<filepath>Filepath with procu signatures database
--state-file=<filepath>Filepath with info about state (content: new/working/done/canceled). You can change it on canceled.
--restore=<filepath>Filepath to restore CSV file
-h, --helpDisplay this help and exit
-v, --versionShow version

# Example of usage

# Scan database

# /opt/ai-bolit/wrapper /opt/ai-bolit/imunify_dbscan.php --port=3306 --login=user --password-from-stdin --database=$DATABASE --avdb=/var/imunify360/files/sigs/v1/aibolit/mds-ai-bolit-hoster.db --report-file=`pwd`/report.json --scan\n

Scan results will be stored in the report.json.

# Scan & Clean-up database

#  /opt/ai-bolit/wrapper /opt/ai-bolit/imunify_dbscan.php --port=3306 --login=user --password-from-stdin --database=$DATABASE --avdb=/var/imunify360/files/sigs/v1/aibolit/mds-ai-bolit-hoster.db --procudb=/var/imunify360/files/sigs/v1/aibolit/mds-procu2.db --report-file=`pwd`/report.json --clean\n

Cleanup results will be stored in the results.json. Also, backup of the affected data will be created with a filename similar to the mds_backup_1597223818.csv.

# Undo changes (restore)

# /opt/ai-bolit/wrapper /opt/ai-bolit/imunify_dbscan.php --port=3306 --login=user --password-from-stdin --database=$DATABASE --report-file=$REPORT --restore=`pwd`/mds_backup_1597223818.csv\n

# Webshield

Warning

When the interface IP address is added to or deleted from the system, the restart of the webshield is required for the latter to recognize the new IP.

service imunify360-webshield restart\n

# Greylist and Anti-Bot Challenge

The Greylist is a feature intended to distinguish human from machine input and protect websites from the spam and different types of automated abuse.

Warning

Please note that the WebShield Anti-Bot Challenge is not compatible with aggressive CDN caching modes, like Cloudflare "Browser Cache TTL" or "cache everything" with "Edge Cache TTL". If the Сaptcha page is cached by CDN, a visitor will see the Anti-Bot challenge from CDN cache disregarding it has been passed or not. In order to fix that, either disable the aggressive CDN caching or the Anti-Bot Challenge functionality in the Imunify360.

There are two layers in GreyList behavior:

  1. If a user of a website is added to the Grey List (the access is blocked), then the GreyList behavior allows him to unblock himself. When he tries to get to the website he receives the JS challenge. If the challenge is solved by the browser successfully (a human user is not required to go through human confirmation - the process will pass under the hood), a user is redirected to the website, which means that the access is unblocked and the IP address of this user is removed from the Grey List.

  2. The GreyList behavior is always on guard of the websites and checks the activity of each IP, constantly adding suspicious IPs to the global GreyList.

# CDN Support

',109)),t("p",null,[e[35]||(e[35]=a("Imunify360 correctly graylists and blocks IPs behind Cloudflare and other CDNs (see ")),n(o,{to:"/features/#supported-cdn-providers"},{default:s(()=>e[34]||(e[34]=[a("here")])),_:1}),e[36]||(e[36]=a(" for the full list)."))]),e[76]||(e[76]=l(`

Imunify360 passes all requests from CDN through WebShield, and uses CF-Connecting-IP and X-Forwarded-For headers to identify real IPs.

To enable it now, run the command:

imunify360-agent config update '{"WEBSHIELD": {"known_proxies_support": true}}'
 

Note

If you are using cPanel/EasyApache3, Imunify360 will not automatically deploy mod_remoteip, and log files will show local server IP for visitors coming from CDN. EasyApache 3 is EOL since December 2018, and we don't plan to add automated mod_remoteip setup and configuration for it.

Note

For cPanel/EasyApache 4, Plesk, DirectAdmin and LiteSpeed mod_remoteip will be automatically installed and configured.

# Supported CDN providers:

  • Cloudflare
  • MaxCDN
  • StackPath CDN
  • KeyCDN
  • Dartspeed.com
  • QUIC.cloud CDN
  • NuCDN
  • Google CDN
  • CloudFront CDN
  • GoCache CDN
  • Opera
  • QUANTIL
  • QUIC.cloud CDN
  • BunnyCDN
  • Sucuri WAF
  • Ezoic
  • Fastly

# How to trust all IPs that are specified by Ezoic CDN

The “trust_ezoic” option for WebShield allows you to trust all IPs that are specified by Ezoic CDN as their own servers. By default the option is switched off, but it can be switched on in a straightforward way. Be aware when using this option, at this moment the list of Ezoic CDN servers is quite big and includes ranges that can be controlled by someone else in Amazon EC2.

To enable it, open the /etc/imunify360-webshield/virtserver.conf file, find the directive set

$trust_ezoic 0;
 

replace 0 with 1, save the file and restart WebShield, using the following command:

# service imunify360-webshield restart
-

# How to block attacks from a particular country in WebShield

`,14)),t("p",null,[e[39]||(e[39]=a("Country blocking is available in both ")),n(o,{to:"/dashboard/#black-list"},{default:s(()=>e[37]||(e[37]=[a("Admin UI")])),_:1}),e[40]||(e[40]=a(" and ")),n(o,{to:"/command_line_interface/#blacklist"},{default:s(()=>e[38]||(e[38]=[a("CLI")])),_:1})]),e[77]||(e[77]=l('

# Using Cloudflare “Edge Cache TTL“, “Cache Everything”, and “Browser Cache TTL” with Imunify360

According to the Cloudflare documentation, Cache Everything with Edge Cache TTL enabled makes Cloudflare ignore all origin cache-related headers (see attached screenshots) which in the past, caused issues by custom cache settings in the Cloudflare control panel resulting in the inability to pass the Anti-Bot Challenge causing an endless loop:

Quote:

Level “Cache Everything” – Treats all content as static and caches all file types beyond the Cloudflare default cached content. Respects cache headers from the origin web server unless Edge Cache TTL is also set in the Page Rule. When combined with an Edge Cache TTL > 0, Cache Everything removes cookies from the origin web server response.

Setting Edge Cache TTL along with the Cache Everything option is not recommended though it should not create any issues now because Anti-Bot Challenge is already disabled for Cloudflare IPs by default. It is possible to enable Anti-Bot Challenge as long as you don’t use “Edge Cache TTL” + “Cache Everything” in Cloudflare.

  1. Edit the file /etc/imunify360-webshield/wscheck.conf
  2. Set cloudflare_captcha on;
  3. Run systemctl reload imunify360-webshield

Similarly, Browser Cache TTL overrides the original Cache-Control and Expires headers served to the browser. We recommend setting it to "Respect Existing Header".

# Anti-bot protection

Starting from version 5.6, Imunify360 distinguishes bots from real visitors using the Anti-Bot Challenge. Most bots don’t solve the challenge, and their requests will not reach web applications such as WordPress, Drupal, and others. This can save the server’s resources and protects websites from scanners, automated attacks, and web-spammers.

Only bad actors will be redirected to the Imunify360 Anti-Bot Challenge page. Legitimate visitors get original content without any verification page nor any delay. Cookies and JavaScript support are required in a browser to successfully pass the challenge of Anti-bot protection.

The “Anti-bot protection” feature will not block legitimate bots (e.g., Google crawler).

',11)),t("p",null,[e[42]||(e[42]=a("You can enable ")),e[43]||(e[43]=t("span",{class:"notranslate"},"Anti-bot protection",-1)),e[44]||(e[44]=a(", in the UI. Go to the ")),e[45]||(e[45]=t("span",{class:"notranslate"},"General",-1)),e[46]||(e[46]=a(" tab -> ")),e[47]||(e[47]=t("span",{class:"notranslate"},"Settings",-1)),e[48]||(e[48]=a(" and check the ")),e[49]||(e[49]=t("span",{class:"notranslate"},"Anti-bot protection",-1)),e[50]||(e[50]=a(" checkbox. You can find the details ")),n(o,{to:"/dashboard/#anti-bot-protection"},{default:s(()=>e[41]||(e[41]=[a("here")])),_:1}),e[51]||(e[51]=a("."))]),e[78]||(e[78]=l(`

Or via CLI. To do so, run the following command:

# imunify360-agent config update '{"WEBSHIELD": {"splash_screen": true}}'
+

# How to block attacks from a particular country in WebShield

`,14)),t("p",null,[e[39]||(e[39]=a("Country blocking is available in both ")),n(o,{to:"/dashboard/#black-list"},{default:s(()=>e[37]||(e[37]=[a("Admin UI")])),_:1}),e[40]||(e[40]=a(" and ")),n(o,{to:"/command_line_interface/#blacklist"},{default:s(()=>e[38]||(e[38]=[a("CLI")])),_:1})]),e[77]||(e[77]=l('

# Using Cloudflare “Edge Cache TTL“, “Cache Everything”, and “Browser Cache TTL” with Imunify360

According to the Cloudflare documentation, Cache Everything with Edge Cache TTL enabled makes Cloudflare ignore all origin cache-related headers (see attached screenshots) which in the past, caused issues by custom cache settings in the Cloudflare control panel resulting in the inability to pass the Anti-Bot Challenge causing an endless loop:

Quote:

Level “Cache Everything” – Treats all content as static and caches all file types beyond the Cloudflare default cached content. Respects cache headers from the origin web server unless Edge Cache TTL is also set in the Page Rule. When combined with an Edge Cache TTL > 0, Cache Everything removes cookies from the origin web server response.

Setting Edge Cache TTL along with the Cache Everything option is not recommended.

Similarly, Browser Cache TTL overrides the original Cache-Control and Expires headers served to the browser. We recommend setting it to "Respect Existing Header".

Instead consider using Cache Rules, that respect cache headers of the origin response, as shown on the screenshot below:

# Anti-bot protection

Starting from version 5.6, Imunify360 distinguishes bots from real visitors using the Anti-Bot Challenge. Most bots don’t solve the challenge, and their requests will not reach web applications such as WordPress, Drupal, and others. This can save the server’s resources and protects websites from scanners, automated attacks, and web-spammers.

Only bad actors will be redirected to the Imunify360 Anti-Bot Challenge page. Legitimate visitors get original content without any verification page nor any delay. Cookies and JavaScript support are required in a browser to successfully pass the challenge of Anti-bot protection.

The “Anti-bot protection” feature will not block legitimate bots (e.g., Google crawler).

',11)),t("p",null,[e[42]||(e[42]=a("You can enable ")),e[43]||(e[43]=t("span",{class:"notranslate"},"Anti-bot protection",-1)),e[44]||(e[44]=a(", in the UI. Go to the ")),e[45]||(e[45]=t("span",{class:"notranslate"},"General",-1)),e[46]||(e[46]=a(" tab -> ")),e[47]||(e[47]=t("span",{class:"notranslate"},"Settings",-1)),e[48]||(e[48]=a(" and check the ")),e[49]||(e[49]=t("span",{class:"notranslate"},"Anti-bot protection",-1)),e[50]||(e[50]=a(" checkbox. You can find the details ")),n(o,{to:"/dashboard/#anti-bot-protection"},{default:s(()=>e[41]||(e[41]=[a("here")])),_:1}),e[51]||(e[51]=a("."))]),e[78]||(e[78]=l(`

Or via CLI. To do so, run the following command:

# imunify360-agent config update '{"WEBSHIELD": {"splash_screen": true}}'
 

# cPanel account protection

`,3)),t("p",null,[e[53]||(e[53]=a("Starting from v7.1, Imunify360 includes the extended the well-established ")),n(o,{to:"/features/#anti-bot-protection"},{default:s(()=>e[52]||(e[52]=[a("Anti-bot protection")])),_:1}),e[54]||(e[54]=a(" functionality to cPanel to ensure that users are protected from bot attacks. All users trying to log in to cPanel will face up with the “Anti-Bot Challenge”."))]),e[79]||(e[79]=t("p",null,"Most bots are unable to solve the challenge, and their requests will not reach the cPanel login page. All users using regular browsers may pass the challenge automatically. After passing the Anti-Bot challenge, a user receives a cookie for 24 hours and does not need to pass it again for the whole session.",-1)),t("p",null,[e[56]||(e[56]=a("As bots and other automation are not supposed to pass the challenge, all legitimate automation should be ")),n(o,{to:"/command_line_interface/#whitelist"},{default:s(()=>e[55]||(e[55]=[a("whitelisted by IPs")])),_:1}),e[57]||(e[57]=a("."))]),e[80]||(e[80]=l(`

The feature is switched off by default. To switch the feature on, use the following CLI command:

# imunify360-agent config update '{"WEBSHIELD":{"panel_protection":true}}'
 

To switch it off:

# imunify360-agent config update '{"WEBSHIELD":{"panel_protection":false}}'
 

Note

  1. You can find WebShield and Anti-bot related logs in the /var/log/imunify360-webshield directory.
  2. The feature works with the standard cPanel ports (2082, 2083). Contact Support if you have a non-standard cPanel ports configuration or need the feature for other ports.
`,5)),p(` ## How to write custom code on WebShield @@ -111,7 +111,7 @@ In the example the \`OPTIONS\` method is disabl

The mechanics is as follows: first-level "sections" - for example FIREWALL are merged, while second-level "options" - for example FIREWALL.TCP_IN_IPv4 are replaced completely.

Those who don’t need this type of overridable configs can continue using custom configurations in the /etc/sysconfig/imunify360/imunify360.config.

This feature is backward compatible.

`,21)),e[82]||(e[82]=t("h2",{id:"scan-of-the-system-and-user-crontab-files-for-malicious-jobs",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#scan-of-the-system-and-user-crontab-files-for-malicious-jobs"},"#"),a(" Scan of the system and user crontab files for malicious jobs "),t("Badge",{text:"Experimental",type:"note"})],-1)),e[83]||(e[83]=l(`

On the web server, the user’s Crontab files are notoriously tricky to maintain secure because of specific format and various placement of the files outside of users’ home directories depending on specific OS and platform, which makes them a compelling target for malicious actors.

This feature detects any Crontab infection among the files that are owned by users of the server for every role that has access to run the scans on that server.

The feature is available as experimental starting from Imunify360 version 6.10 and switched off by default.

The setting MALWARE_SCANNING.crontabs allows you to enable or disable scan of the system and user crontab files for malicious jobs.

Manage it through CLI:

To switch it on:

# imunify360-agent config update '{"MALWARE_SCANNING": {"crontabs": true}}' 
 

And to switch it off:

# imunify360-agent config update '{"MALWARE_SCANNING": {"crontabs": false}}'
 
`,9)),e[84]||(e[84]=t("h2",{id:"hooks",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#hooks"},"#"),a(" Hooks "),t("Badge",{text:"Deprecated",type:"warning"})],-1)),t("p",null,[e[60]||(e[60]=a("You can use a new notification system via ")),n(o,{to:"/command_line_interface/#notifications-config"},{default:s(()=>e[58]||(e[58]=[a("CLI")])),_:1}),e[61]||(e[61]=a(" and ")),n(o,{to:"/features/#notifications"},{default:s(()=>e[59]||(e[59]=[a("UI")])),_:1}),e[62]||(e[62]=a("."))]),e[85]||(e[85]=l('

# Overview

Hooks are introduced as a script-based interface for various application events. This is a simple and effective way to automate Imunify360 alerts and event processing. For example, an administrator can have Imunify360 calling his own script when malicious files are detected or misconfigurations are detected and perform a custom processing or specific actions, for example, create a ticket. Hooks are available only via CLI.

# Requirements

  • You can use any programming language to create a hook script
  • A hook script should be executable
  • For Native hooks, you should use Python 3.5 only

# How to start using hooks

Start using hooks with three simple steps:

',6)),t("ol",null,[t("li",null,[e[67]||(e[67]=t("p",null,"Create a script to handle an event (a hook handler):",-1)),t("ul",null,[t("li",null,[e[64]||(e[64]=a("you can use our ")),n(o,{to:"/features/#structure-and-examples-of-a-hook-script"},{default:s(()=>e[63]||(e[63]=[a("scripts example")])),_:1}),e[65]||(e[65]=a(" as a template"))]),t("li",null,[n(o,{to:"/features/#available-events-and-their-parameters"},{default:s(()=>e[66]||(e[66]=[a("the following events are available")])),_:1})])])]),e[68]||(e[68]=t("li",null,[t("p",null,"Register your hook handler in Imunify360 agent - use registration command:")],-1))]),e[86]||(e[86]=l(`
imunify360-agent hook add --event <event name> --path </path/to/hook_script>
-
`,1)),t("ol",L,[t("li",null,[e[70]||(e[70]=a("Once the event added - check results and the ")),n(o,{to:"/features/#log-file"},{default:s(()=>e[69]||(e[69]=[a("log file")])),_:1})])]),e[87]||(e[87]=l(`

# Available events and their parameters

# agent

  • subtype ( started | misconfig )
    • started - the event is generated each time the Imunify agent is started/restarted

      • params[]
        • version / string / version of agent
      {"version": "4.6.2-2"}
      +
      `,1)),t("ol",E,[t("li",null,[e[70]||(e[70]=a("Once the event added - check results and the ")),n(o,{to:"/features/#log-file"},{default:s(()=>e[69]||(e[69]=[a("log file")])),_:1})])]),e[87]||(e[87]=l(`

      # Available events and their parameters

      # agent

      • subtype ( started | misconfig )
        • started - the event is generated each time the Imunify agent is started/restarted

          • params[]
            • version / string / version of agent
          {"version": "4.6.2-2"}
           
        • misconfig - the event is generated when the agent detects agent misconfiguration / broken settings / etc.

          • params[]
            • error / string / error message where / what type of misconfiguration was detected and some details
          {
           "error": "ValidationError({'SMTP_BLOCKING': [{'allow_groups': ['must be of list type']}]},)"
           }
          @@ -265,4 +265,4 @@ esac
                      raise Exception('Unhandled subtype {}'.format(subtype))
              else:
                  raise Exception('Unhandled event {}'.format(event))
          -
          `,34))])}const M=d(T,[["render",D],["__file","index.html.vue"]]);export{M as default}; +`,34))])}const M=d(C,[["render",D],["__file","index.html.vue"]]);export{M as default}; diff --git a/billing/index.html b/billing/index.html index affcabc..464f3d4 100644 --- a/billing/index.html +++ b/billing/index.html @@ -29,10 +29,10 @@ })(); Licensing - +
          sidebar hamburger menu

          # Licensing

          Imunify360 pricing depends on the users registered on the installed server:

          • For cPanel, Plesk, and DirectAdmin hosting panels it calculates the number of users in it, excluding system users.

          • For standalone installation, it calculates users with UID equal or more than 500 in CentOS 6 and UID equal or more than 1000 in CentOS 7.

          The pricing model of Imunify360 includes 4 types of server licenses which are billed monthly per one server license:

          1. Single user — good for servers with only one user in the system.
          2. Up to 30 users — good for servers with users quantity less than 30 or equal.
          3. Up to 250 users — good for servers with users quantity less than 250 or equal.
          4. Unlimited — good for servers with users quantity more than 250.

          You can change server license for each server in your CloudLinux Network (CLN) account. If you don’t have CloudLinux Network account, please fill out the simple registration form to create it on https://cln.cloudlinux.com.

          Please find the detailed description in the CLN Help Article or check the Official CLN Documentation.

          - + diff --git a/command_line_interface/index.html b/command_line_interface/index.html index ebe2cb9..3002d06 100644 --- a/command_line_interface/index.html +++ b/command_line_interface/index.html @@ -29,7 +29,7 @@ })(); Command-line Interface (CLI) - +
          sidebar hamburger menu

          # Command-line Interface (CLI)

          # Description

          Imunify360 command-line interface (CLI) makes working with Imunify360 basics and features from your terminal even simpler.

          # Usage

          For access to Imunify360 agent features from command-line interface (CLI), use the following command:

          imunify360-agent
          @@ -520,6 +520,6 @@
           Google       ['.google.com', '.googlebot.com']             1 
           Yandex       ['.yandex.ru', '.yandex.com', '.yandex.net']  2 
           
        • - + diff --git a/config_file_description/index.html b/config_file_description/index.html index 590be86..847b8c1 100644 --- a/config_file_description/index.html +++ b/config_file_description/index.html @@ -29,7 +29,7 @@ })(); Config File Description - +
          sidebar hamburger menu

          # Config File Description

          Imunify360 config file is available on the following location after installation:

          /etc/sysconfig/imunify360/imunify360.config

          In the config file it is possible to set up Imunify360 configuration. The following options are available:

          Note that if YAML is used, it accepts any format: True/true/yes/y, etc. However, the CLI uses JSON which is strict – only lowercase true/false. Thus, if you are using the imunify360-agent CLI tool to make changes to the configuration, make sure you are using the lowercase.

          AUTO_WHITELIST:
          timeout: 1440# set in minutes how long to keep automatically whitelisted IP
          after_unblock_timeout: 1440 # set in minutes for how long IP will be added to the White List after it passes Imunify360 Anti-bot challenge
          DOS:
          enabled: True# allows to enable (True, the default value) or disable (False) DOS detection
          interval: 30# interval in seconds between DoS detection system activation
          default_limit: 250# maximum default limit of connections from remote IP to local port before DoS protection will be triggered. Cannot be set lower than 100
          port_limits:# allows to set limits per local port
          80: 150 # limit on port 80 is set to 150 connections
          ENHANCED_DOS:
          enabled: True# allows to enable or disable (False) the Enhanced DOS protection
          time_frame: 60# the default timeframe in seconds between the Enhanced DoS detection system activation
          default_limit: 500# the threshold of requests (their number) from remote IP to local port before the Enhanced DoS protection will be triggered.
          port_limits:# allows to set requests limits for different ports
          80: 300 # limit on port 80 is set to 300 connections
          FIREWALL:
          port_blocking_mode: ALLOW# allows to set firewall port blocking mode.

          ALLOW (default) - allow all except specified.
          DENY - block all except specified.

          Exact ports and port-ranges to be allowed can be configured by the following fields in the config file:
          - FIREWALL.TCP_IN_IPv4
          - FIREWALL.TCP_OUT_IPv4
          - FIREWALL.UDP_IN_IPv4
          - FIREWALL.UDP_OUT_IPv4

          Changes of config files will be applied automatically. You don’t need to restart the server or Imunify360.

          Please note, the feature doesn’t support IPv6 addresses at this moment and CSF needs to be disabled due to conflicts.
          INCIDENT_LOGGING:
          min_log_level: 4# minimum severity level for incidents displayed in UI. Please find the levels description here
          num_days: 100# incidents older than num_days are automatically deleted
          limit: 100000# how many incidents should be stored in Imunify360 log file
          ui_autorefresh_timeout: 10# set auto refresh time for incidents in user interface
          LOGGER:
          max_log_file_size: 62914560# defines the maximum size of the log file in bytes (default is 60 MB)
          backup_count: 5# defines how many log files to store. If 5, it will store app.log, app.log.1, and up to app.log.5.
          syscall_monitor: False

          Collect and report the source of suspicious actions using Syscall Monitor (True).

          Supported operating systems:
          • CentOS 6/7
          • CloudLinux OS 6/7.
          Additional requirements:
          • auditd needs to be installed
          • auditsp needs to be switched off.

          Imunify360 uses auditd to discover malicious cron jobs that are not detected by other methods yet and thus block them much faster.

          Additionally, it's also used for internal quality control and monitoring - e.g. if auditd records that PHP processes drop malware, but there are no related events/blocks from Proactive Defense, Imunify team receives an alert prompting an investigation.

          MOD_SEC:# defines ModSecurity settings
          ruleset: FULL# defines what ruleset to use: FULL (default value) or MINIMAL. If the amount of RAM on the server is less than 2.1GB, the ruleset value is automatically set to MINIMAL.
          cms_account_compromise_prevention: False# enables WordPress account brute-force protection. Default is False.
          app_specific_ruleset: True# enables WAF Rules Auto-Configurator. Default is True.
          prev_settings: # for internal usage, do not edit
          MOD_SEC_BLOCK_BY_SEVERITY:
          enable: True# allows to enable or disable option that moves IPs to Gray List if the ModSecurity rule is triggered
          max_incidents: 2# set a number of repeats of the ModSecurity incident from the same IP for adding it to Gray List
          check_period: 120# set a period in seconds during which incident from the same IP will be recorded as a repeat
          severity_limit: 2# set a level of severity for DOS detection sensitivity. Read more about severity levels
          MOD_SEC_BLOCK_BY_CUSTOM_RULE:# this section allows to add custom configuration for blocking by ModSecurity incidents
          33332:# set ModSecurity rule ID
          check_period: 120# set a period in seconds during which incident from the same IP will be recorded as a repeat
          max_incidents: 10# set a number of repeats of the ModSecurity incident from the same IP for adding it to Gray List
          MALWARE_SCANNING:
          try_restore_from_backup_first: False# allows to enable (True) or disable (False – the default value) automatic malicious file restore from backup if a clean copy exists, otherwise default_action is applied
          default_action: cleanup# default action on malicious file detected.
          Available options:
          • notify – just display in dashboard
          • cleanup – cleanup malicious file (default)
          enable_scan_inotify: True# enable (True (default)) or disable (False) real-time scanning for modified files using inotify library
          enable_scan_pure_ftpd: True# enable (True (default)) or disable (False) real-time scanning for files uploaded through PureFTPd
          enable_scan_modsec: True# enable (True (default) or disable (False) real-time scanning of all the files that were uploaded via http/https. Note that it requires ModSecurity to be installed
          max_signature_size_to_scan: 1048576# max file size to scan in the standard mode; value is set in bytes
          max_cloudscan_size_to_scan: 10485760# max file size to scan in the cloud-assisted (by hashes) mode; value is set in bytes
          max_mrs_upload_file: 10485760# max file size to upload to CloudLinux malware research service; value is set in bytes
          detect_elf: True# enable (True) (default value) or disable (False) binary (ELF) malware detection
          notify_on_detect: False# notify (True) or not (False) (default value) an admin when malware is detected
          optimize_realtime_scan: True# enable (True) (default value) or disable (False) the File Change API and fanotify support to reduce the system load while watching for file changes in comparison with inotify watch. You can find the comparison table here
          sends_file_for_analysis: True# send (True) (default value) or not (False) malicious and suspicious files to the Imunify team for analysis
          i360_clamd: False# obsolete (not used)
          show_clamav_results: False# obsolete (not used)
          clamav_binary: True# obsolete (not used)
          scan_modified_files: Null# enable (True) or disable (False) (default is not set). If disabled, it checks the file's timestamps (c/mtime) before scanning, and if the timestamp is not changed since the last scan, the file is skipped. Scanner's behaviour is based on other scan optimizations, therefore it is better to rely on default values and UI, although this parameter provides an option to overwrite this behaviour. This option is not available within UI.
          cloud_assisted_scan: True# speed up scans by check file hashes using cloud database
          rapid_scan: True# speeds up (True) (default value) ot not (False) repeated scans based on smart re-scan approach, local result caching and cloud-assisted scan.
          rapid_scan_rescan_unchanging_files_frequency: null# defines what part of all files will be rescanned during each scan. For example, if set 10 then 1/10 part of all files will be rescanned. The default value `null` - means "choose frequency based on scan schedule". E.g. month - 1, week - 5, day - 10.
          hyperscan: True# allows to use (True) the regex matching Hyperscan library in Malware Scanner to greatly improve the scanning speed. True is the default value. Hyperscan requires its own signatures set that will be downloaded from the files.imunify360.com and compiled locally.
          Platform requirements:
          * Hyperscan supports Debian, Ubuntu and CentOS/CloudLinux 7 and later.
          * SSE3 processor instructions support. It is quite common nowadays, but may be lacking in virtual environments or in some rather old servers.
          enable_scan_cpanel: False# enable (True) blocking malicious file uploads via cPanel File Manager. The default value is False. The type of operations processed are: edits and saves
          crontabs: True# enable (True) scan of the system and user crontab files for malicious jobs. The default value is True.
          db_timeout: 15# set the maximum time in seconds for connecting to or reading from a database during a scan/clean/restore operation.
          CAPTCHA:
          cert_refresh_timeout: 3600# set in seconds how often SSL certificate will be refreshed
          CONTROL_PANEL:
          compromised_user_password_reset: True# enables resetting passwords for compromised cPanel accounts. Upon activating this functionality, our platform will detect instances where a cPanel account password has been breached and will subsequently prevent access using the previous password. End-users will then be prompted to create a new password via the cPanel password reset process.
          ERROR_REPORTING:
          enable: True# automatically report errors to imunify360 team
          SEND_ADDITIONAL_DATA:
          enable: True# send anonymized data from query string/post parameters and cookies. True is the default value.
          NETWORK_INTERFACE:# manages for what network interfaces Imunify360 rules will be applied
          eth_device: None# by default, Imunify360 will auto-configure iptables to filter all traffic. If you want iptables rules to be applied to a specific NIC only, list them here (e.g. eth1)
          eth6_device: None# it is the same as eth_device, but configures ip6tables to use specific device
          eth_device_skip: []# if you don't want iptables\ip6tables rules to be applied to specific NICs, list them here (e.g [eth1, eth2])
          BACKUP_RESTORE:
          max_days_in_backup: 90# restore from backup files that are not older than max_days_in_backup
          CAPTCHA_DOS:
          enabled: True# enable (True (default) or disable (False) Anti-bot Challenge Dos protection
          time_frame: 21600# set a period in seconds during which requests to Anti-bot Challenge from the same IP will be recorded as repeated
          max_count: 100# set the maximum number of repeated Anti-bot Challenge requests after which IP is moved to the Anti-bot Challenge Dos list without an ability to request Anti-bot Challenge again
          timeout: 864000# set in seconds the time on which to add the IP in Anti-bot Challenge Dos list without an ability to request Anti-bot Challenge again
          BLOCKED_PORTS:
          default_mode: allowed# defines the default state of ports which is not explicitly set by user (denied by default or allowed by default). Currently only allowed is supported
          WEBSHIELD:
          known_proxies_support: True# enable CDN support, treat IPs behind CDN as any other IPs. (True is the default value).
          enable: True# enable (True) (default value) or disable (False) WebShield
          splash_screen: True# enable (True) or disable (False) Anti-bot protection
          PROACTIVE_DEFENCE:
          blamer: True# enable (True (default)) or disable (False) Blamer. See also: How to forcibly enable Blamer for all users on the server.
          mode: LOG# available modes:
          • KILL
          • DISABLED
          • LOG (default)
          php_immunity: False# enable (True) or disable (False (default)) PHP Immunity (allows to automatically detect & patch vulnerabilities in software at the Proactive Defense level preventing re-infections through the same vulnerability). By enabling this feature, Blamer will be enabled as well and Proactive Defence switched into the KILL mode.
          MALWARE_SCAN_INTENSITY:
          cpu: 2# intensity level for CPU consumption. Can be set from 1 to 7, default is 2
          io: 2# intensity level for file operations. Can be set from 1 to 7, default is 2
          ram: 1024# intensity level for RAM consumption. The default value is 1024
          MALWARE_SCAN_SCHEDULE:
          day_of_month: <next day after installation># when the background scan shall start, day of the month. Can be from 1 to 31, the default value is the <next day after installation>.
          day_of_week: 0# when the background scan shall start, day of the week. Can be from 0 to 7 (0 for Sunday, 1 for Monday..., 7 for Sunday (again)), the default value is 0
          hour: 3# when the background scan shall start, hour. Can be from 0 to 23, the default value is 3
          interval: MONTH# interval of scan. Supported values: strings `NONE` (no scan), `DAY`, `WEEK`, `MONTH`, the default value is `MONTH`
          PAM:# effective way to prevent brute-force attacks against FTP/SSH
          enable: False# enable (True) or disable (False) (default value) PAM brute-force attack protection
          exim_dovecot_protection: False# enable (True) or disable (False) (default value) Exim+Dovecot brute-force attack protection against Dovecot brute-force attacks.
          ftp_protection: False# enable (True) or disable (False) (default value) FTP brute-force attack protection.
          exim_dovecot_native: True# enable (True) (default value) or disable (False) the Dovecot native module.
          KERNELCARE: (deprecated)# KernelCare extension for Imunify360 which allows tracing malicious invocations to detect privilege escalation attempts
          edf: False (deprecated)# enable (True) or disable (False) (default value) exploit detection framework
          MALWARE_CLEANUP:
          trim_file_instead_of_removal: True# do not remove infected file during cleanup but make the file zero-size (for malwares like web-shells) (True) (default value)
          keep_original_files_days: 14# the original infected file is available for restore within the defined period. The default is 14 days. The minimum value is one day.
          OSSEC:
          active_response: False# block (True) access to a specific server port being attacked. The ports include FTP (21), SSH (any port) and SMTP (25, 465, 587). The default value is False.
          ADMIN_CONTACTS:
          emails: youremail@email.com# your email to receive reports about critical issues, security alerts or system misconfigurations detected on your servers.
          SMTP_BLOCKING:
          enable: False# enable (True) or disable (False) (default value) SMTP Traffic Management. When enabled, the outgoing SMTP traffic would be blocked according to the settings.
          ports: 25,587,465# a list of the ports to be blocked. The defaults are: 25, 587,465.
          allow_users:# a list of users to be ignored (not blocked). By default it is empty. Including Unix and cPanel users (if a process that sends an email has a UID of one of the `allow_users`, it will not be blocked).
          allow_groups: mail# a list of the groups to be ignored (not blocked). By default it is empty. Including Unix and cPanel users (if a process that sends an email has a UID of one of the `allow_users`, it will not be blocked).
          allow_local: False# block (True) all, except the local SMTP (localhost). False is the default value.
          redirect: False# enable (True) or disable (False) (the default value) automatic redirection to the local ports for outgoing mail traffic.
          CSF_INTEGRATION:
          catch_lfd_events: False# let (True) Imunify360 use Login Failure Daemon (LFD) as a source for security events. Default is False.
          PERMISSIONS:
          support_form: True# show (True) (the default value) or hide (False) the Support icon in the Imunify360 UI.
          user_ignore_list: True# show (True) (the default value) or hide (False) the Ignore List tab for end-users in the Imunify360 UI.
          allow_malware_scan: False# enable (True) or disable (False) (the default value) “scan” action in the UI of the end-user.
          advisor: True# enable (True - the default value) or disable (False) the Imunify Advisor.
          user_override_malware_actions: False# "True" allows overriding of actions applied to malware by a regular user. E.g., users will be able to disable automatic cleanup for their own files even if it was enabled by the admin.
          user_override_proactive_defense: False# "True" allows overriding of Proactive Defense work mode by a regular user. E.g., users will be able to switch Proactive Defense mode to LOG for their websites even if the admin has set it to KILL.
          allow_local_rules_management: True# enable (True - the default value) or disable (False) managing the Disabled Rules in the Imunify360 UI.
          STOP_MANAGING:
          modsec_directives: False# for internal usage, do not edit
          WEB_SERVICES:
          http_ports: # additional http ports for Anti-bot Challenge
          https_ports: # additional https ports for Anti-bot Challenge
          MALWARE_DATABASE_SCAN:
          enable: True# enable (True) the Malware Database Scanner - a database antivirus with automated malware detection and clean-up of web applications. Requires MariaDB/MySQL DB management system version 5.5. Recommended version is 5.6+. Note, only WordPress databases are supported as for now.

          Active Response is an ossec-driven (IDS) feature of Imunify360 which has been re-engineered to make it capable of blocking access to a specific server port being attacked.

          The purpose of the feature is significantly reducing false positive rate while increasing its capabilities to detect and block aggressive brute force requests.

          In order to activate Active Response, the following lines should be added into /etc/sysconfig/imunify360/imunify360.config:

          OSSEC:
          @@ -40,6 +40,6 @@
           

          It is also possible to apply several parameters at once. For example:

          imunify360-agent config update '{"PAM": {"exim_dovecot_protection": false, "enable":true}}'
           

          For string configuration values, such as the administrator's email address, it is necessary to use the following command format:

          imunify360-agent config update '{"ADMIN_CONTACTS": {"emails": ["email@domain.com"]}}'
           
          - + diff --git a/control_panel_integration/index.html b/control_panel_integration/index.html index 2bf6ab8..2806181 100644 --- a/control_panel_integration/index.html +++ b/control_panel_integration/index.html @@ -29,7 +29,7 @@ })(); Generic panels and no-panel installation and integration - +
          sidebar hamburger menu

          # Generic panels and no-panel installation and integration

          # Introduction

          Imunify360 can be installed directly on the server, independent of any panel, regardless of the administrative interface. It is also called stand-alone, non-panel, generic panel integration.

          # Limitations

          # Requirements

          Supported Operating Systems

          • The same list as here.

          Web Servers

          • Apache >= 2.4.30
          • LiteSpeed
          • Nginx

          # There are four main steps in general required for having Imunify360 Stand-alone running on your server:

          1. Install and configure the prerequisites such as ModSecurity, PHP with JSON support, and other common WEB server packages.
          2. Download and edit integration.conf file to configure Imunify360 required integrations BEFORE running the installation script.
          3. Install Imunify360 using the deploy script
          4. Check the installed modules work and change the Imunify360 settings to reflect your needs.

          CageFS Warning

          If Imunify360 runs in CageFS, you'll need to configure it accordingly. It is required to make sure Imunify Web-UI PHP code can be executed under a non-root user and grant access to /var/run/defence360agent/non_root_simple_rpc.sock.

          To allow non-root user in CageFS access to the socket, this workaround should be applied:

          # Ensure the existence of the related cagefs directory for the user
          @@ -221,6 +221,6 @@
             }
           }
           

          web_server_config_path should point to a path that is added as IncludeOptional in this domain's virtual host e.g., /path/to/example.com/specific/config/to/include path should be added for the example.com domain.

          - + diff --git a/dashboard/index.html b/dashboard/index.html index 73497ab..952c80c 100644 --- a/dashboard/index.html +++ b/dashboard/index.html @@ -29,7 +29,7 @@ })(); Admin Interface - +
          sidebar hamburger menu

          # Admin Interface

          Imunify360 is an all-in-one security solution with robust cloud protection against the newest attacks, and it is available directly within your control panel (cPanel, Plesk, and DirectAdmin).

          When you log in to your control panel, Imunify360 asks you to enter your email address.

          By entering your email address you agree to receive email reports about critical issues, security alerts or system misconfigurations detected on your servers.

          Note

          This email address is used ONLY for receiving server reports.

          Or you can do it later in the Settings | General | Contact Details.

          Log in to your control panel as an admin and go to Plugins, choose Imunify360 to get to the Imunify360 admin interface.

          It allows to access:

          • Support – allows you to contact our support team directly from your Imunify360 Admin Interface

          • Dashboard – allows you to see retrospective data in form of charts/heatmaps in your Imunify360 Admin Interface

          • Incidents – the list of all suspicious activity on the server.

          • Firewall – a dashboard of Black List, White List and Gray List, and Blocked Ports with the ability to manage them.

          • Malware Scanner – real-time file scanner.

          • Proactive Defense – a unique Imunify360 feature that can prevent malicious activity through PHP scripts

          • Reputation Management – analyzing and notifying tool intended to inform about websites blocking and blacklisting.

          • KernelCare – KernelCare current state.

          • Imunify360 Settings – configuring and controlling Imunify360 options.

          # Support

          This tab allows you to contact our support team directly from your Imunify360 Admin Interface. You can create a request and attach some files to it.

          To contact our support team in Imunify360 Admin Interface, please click the Call icon at the top right corner of the page.

          A support ticket will be created and an email will be sent to a specified email address. When a status of your request will change you receive a notification to your email address. You will be able to track your request via https://cloudlinux.zendesk.com/hc/ and email.

          # Dashboard

          You can access the Imunify360 Dashboard from your control panel. It shows security events as charts and heat maps. It's a great way to analyze incidents that happened within the past day, week or month.

          Click Dashboard tab to display an overview of incidents recorded during the selected time interval, an estimate of the intensity of attacks, and correlate events across all sources.

          Here you can see notifications about server security and Imunify360 configuration, along with recommendations for making server security effective and proactive.

          # Imunify Advisor

          The Imunify Advisor checks your server’s current settings, then provides a list of optimal settings for your individual server.

          A dialog box pops up to display recommendations.

          You can accept or reject them (by unchecking a corresponding checkbox) and apply settings by clicking Apply.

          Rejected recommendations will not appear again for a while.

          Note

          If you do not want to use the recommendations you can disable Imunify Advisor via the config file.

          Note

          If your server's settings differ from the recommended, the Imunify Advisor will pop up again to display the settings.

          # Multi-server Dashboard

          Dashboard can display Imunify360 performance data for a number of specified servers.

          • You can add a specified server using its server key – a unique server id that identifies an installed Imunify360 instance.

            Note

            Server key is NOT a license key.

          • You can easily remove a server from the Dashboard.

          • You can use Server drop-down to show a list of all servers added into the Dashboard.

          • You can choose in the multi-server drop-down for which server the Dashboard would represent its data: a current server (where the Imunify360 is installed) or a remote one (it is indicated on the Dashboard).

          # How to get a server key

          There are two ways to get a server key.

          1. Click the key symbol to copy server key of the selected server to the clipboard.

          2. Go to the /var/imunify360/license.json file and find id field. Your server id looks like an alphanumeric string SghjhgFESDh65CFLfvz.

          # How to add a server

          If you'd like to display performance data for the server A on the Dashboard of the server B, please do the following:

          • Go to the server A Dashboard and copy its server key (see How to get a server key)
          • Go to the server B Dashboard and click the Add Server button
          • The Add server key pop-up opens

          • Paste the server key belonging to the server A to the Server key field
          • Click Confirm to add the server A to the Dashboard of the server B. To stop adding the server and close the pop-up, click Cancel.

          Go to the Server drop-down to check all added servers – it contains a list of hostnames of all added servers and/or a list of IPs (if a hostname is not found).

          # How to remove a server

          To remove a server, click the Trash Can symbol . The Remove Server pop-up opens.

          Click Confirm to remove the server. To stop removing the server and close the pop-up, click Cancel.

          Note

          You cannot remove a server from its Imunify360 Dashboard.

          # Charts and heat maps

          The following time periods are available:

          • Last 24 hours
          • Last 7 days
          • Last 30 days

          The following representation forms are available:

          • Heatmap visualizes the geographical distribution of incidents
          • Histogram represents the numerical distribution of incidents

          Hover mouse over the particular bar to check the accurate value.

          Note

          Charts may have gaps. This means that no incidents or alerts were recorded during that day/time period.

          The following charts are available.

          • Alerts total

          Security incidents recorded within the selected time interval. Data includes all ModSecurity incidents, Imunify360 DOS plugin alerts, cPanel Login Failure Daemon (for cPanel only) and OSSEC alerts. This is a summary of all major alert sources.

          • Anti-Bot challenge events

          Recorded requests coming from detected attackers or bad bots that show the Anti-Bot challenge within the selected interval.

          • WAF alerts

          Web attacks recorded by ModSecurity within the selected time interval. It may include CMS brute-force and login attempts, websites hacking attempts, attempts to access “sensitive” files or restricted areas, and other malicious requests.

          • Web-based Brute-force Attacks

          Web-based brute-force attacks against the CMS and hosting panel, and incidents recorded by ModSecurity.

          • OSSEC: Network Level Attacks

          Attacks against network services, e.g. FTP, SSH, POP, IMAP, etc., recorded by OSSEC IDS within the selected time interval. It includes authentication failures, requests from blocked IPs, break-in attempts alerts and more.

          • Denied Requests from Bad Bots

          Attacks detected by the Imunify360 Bot-Detector heuristics-based plugin. Bot-Detector is a part of Imunify360’s “cloud heuristics” feature that collects and analyzes a massive amount of information on new attacks on a global scale which it uses to prevent attacks across multiple servers.

          • Cleaned malicious files

          This chart lists the number of cleaned malicious files.

          Note

          Some charts may be hidden if no alerts of a particular type were recorded within the selected time interval.

          # Incidents

          Choose Incidents tab to view and manage the list of all the incidents. The table displays a list of detected incidents with all the information about the incidents reasons.

          Use filters to show the exact list of incidents:

          • Timeframe – allows filtering incidents by different time periods.
          • List – allows filtering incidents by White List, Black List, or Gray List, or showing the incidents from all lists.
          • Search field – allows showing all the incidents of a proper IP address, domain or description. Tick Description/IP checkbox to enable input field where you can enter a proper IP or a part of it, domain or description and filter the list.
          • Country – allows filtering the incidents by abusers country. Tick Country checkbox to enable input field with auto-complete where you can enter a proper country and  filter the incidents by clicking magnifier or Enter.

          Move Auto-refresh to enable or disable automatic refresh of the incidents in the table without reloading the web page.

          The list of incidents contains the following information:

          • Date – the time when the incident happened.

          • IP - the IP address of the abuser. There is a color indication for IP address.

            • A gray bubble means that this IP address is currently in the Gray List (so, every connection from this IP address will redirect to the Anti-Bot Challenge).
            • A blue bubble means that this IP address is currently in no one list (White/Gray/Black). IP is not blocked.
            • A white bubble means that this IP address is currently in the White List. IP will never be blocked by Imunify360.
            • A black bubble means that this IP address is currently in the Black List. And access from this IP is totally blocked without ability to unblock by the Anti-Bot Challenge.
            • No bubble is shown when this incident doesn’t contain IP address.
          • Country– country origin of the abuser IP address.

          • Count – the number of times the abuser tried to repeat the action.

          • Event – description of the event or suspicious activity (as it is described by OSSEC and Mod_Security sensors).

          • Severity – severity level of the incidents (as it is estimated in OSSEC severity levels and Mod_Security severity levels). The color of severity means:

            • Green – Mod_Security levels 7-5, OSSEC levels 00-03
            • Orange – Mod_Security level 4, OSSEC levels 04-10
            • Red – Mod_Security levels 3-0, OSSEC levels 11-15
          • Actions – actions available for the Incident.

          Click an incident to expand the detailed information.

          Starting from version 6.2 Imunify360 will scan zip archives by default. It will not be possible to disable this functionality through the UI, but it will be possible through the command line.

          For Ubuntu, CentOS/CloudLinux >= 7

          To disable scanning of archives, you will need to run the following command:

          echo '' > /etc/sysconfig/aibolit-resident && systemctl daemon-reload && systemctl restart aibolit-resident.service
          @@ -78,6 +78,6 @@
           ossec:1008
           modsec:1001:this is why
           

          # Features Management

          Overview

          Features Management allows hosters to enable/disable Imunify360 features for each customer. On Features Management it is possible to manage Proactive Defense and Malware Cleanup for each customer account. If a feature is enabled for the user in the hoster’s account, the user will be able to see and use it in his account.

          Note

          Default settings in Features Management are inherited by newly created user accounts only.

          Note

          Features are enabled/disabled account-wide.

          Below, there is a table with all users and their domains and features for each user.

          • Name — username or path to a user;
          • Domains — a list of user’s domains;
          • Proactive Defense — a slider to enable/disable the feature for a specific user. Move a slider in feature column to enable/disable that feature for a specific user. After that, this specific feature tab will be displayed/hid in that user’s account.
          • Malware Cleanup — a slider to enable/disable the feature for a specific user. Move a slider in feature column to enable/disable that feature for a specific user. After that, the Cleanup button will be available in the Malicious files list in that user’s account.

          Group Action To perform a group action tick the users and move sliders for them.

          How to enable/disable Proactive Defense

          The Proactive Defense feature is enabled by default account-wide. So, all newly created user accounts will have Proactive Defence tab in their Imunify360 Section.

          To disable Proactive Defense account-wide just move the slider to Turned Off. And confirm the action in the popup by clicking Yes, disable Proactive Defense for new users or click Cancel to close the popup.

          How to enable/disable Malware Cleanup

          The Malware Cleanup feature is enabled by default account-wide. So, all newly created user accounts will have Malware Cleanup feature in their Imunify360.

          To disable Malware Cleanup account-wide just move the slider to Turned Off. And confirm the action in the popup by clicking Yes, disable Malware Cleanup for new users or click Cancel to close the popup.

          You can perform all these actions via CLI.

          # Native Feature Management

          Feature Management allows a hoster to enable/disable different Imunify360 features for server users. Using this functionality, hosting companies may resell chosen Imunify360 features as a part of hosting packages to end-users as well as make features available/unavailable for a group of end-users.

          # WHM/cPanel

          WHM/cPanel Feature Management is now available under WHM/cPanel Package Manager via Package Extension (PE). Using WHM/cPanel Native Feature Management a hoster can enable/disable Malware Scanner and Proactive Defense for all users with the same package (service plan) instantly.

          Note

          When switched to WHM/cPanel Feature Management, the same functionality will be disabled in the Imunify360 UI. The previous Feature Management config becomes overridden by defaults.

          How to switch to WHM/cPanel Feature Management

          Go to Imunify360 → Settings → Features Management. You will see the following.

          Click Details. You will see the following pop-up.

          Click Agree and Switch to confirm the action or click Cancel to close the popup.

          Note

          Note that current Imunify360 settings will be reset to default values after switching to WHM/cPanel Feature Management mode. You can switch back to in-app Imunify360 Feature Management mode at any time via CLI command. The end-user values will be reset to default values upon any mode switching.

          When switched, you will see the following.

          How to configure Imunify360 Features using WHM/cPanel Package Extensions

          Go to WHM/cPanel → Add a Package → Package Extensions and tick Imunify360 Features (if it’s not selected).

          Choose an option for each feature.

          Malware Scanner

          • View reports + Cleanup – a user can view scanning reports and cleanup found malware
          • View reports only – a user can view scanning reports but can't cleanup found malware
          • Not available – the Malware Scanner is not available for a user, and its tab is hidden on the Imunify360 main menu

          Note

          The last option is available in the WHM/cPanel Package Manager only and is not available via Imunify360 UI or CLI.

          Note

          When the Malware Scanner is not available for the end-user, it doesn't exclude user folders from scanning, so his files will be scanned and the results will be listed in an admin UI as usual.

          Proactive Defense

          • Available – the Proactive Defense feature is available for a user
          • Not available – the Proactive Defense is deactivated for a user: the feature does not run and its UI is hidden from the Imunify360 main menu

          Click Add to apply changes.

          See also: CLI.

          # Attributions

          Click Settings and choose Attributions tab to observe a list of IDS install on the server.

          • Name – name of the IDS
          • Version – IDS version
          • License – under which licenses this IDS is working
          • Link – URL to the IDS official page

          Country-based white or blacklisting includes GeoLite2 data created by MaxMind, available from https://www.maxmind.com.

          # Hosting panels specific settings

          cPanel

          It is possible to enable the Service Status checker for Imunify360. Perform the following steps:

          • Go to Service Configuration and choose Service Manager.
          • In Additional Services section tick imunify360 checkbox.
          • Click Save and wait until cPanel enables the Service Status checker for Imunify360.

          If succeeded, the status of the Imunify360 service will be displayed at the Service Status section of Server Status.

          - + diff --git a/email/index.html b/email/index.html index 35025f2..517585d 100644 --- a/email/index.html +++ b/email/index.html @@ -29,7 +29,7 @@ })(); Email - +
          sidebar hamburger menu

          # Email

          # Imunify Email compatibility

          Imunify Email has been checked for compatibility with following tools and mail gateways:

          # Installation

          Note

          Hosting administrator only.

          Imunify Email requires Imunify360 to be installed on the server.

          Imunify Email is simple to install.

          At the moment, it runs on the following distributions:

          • CentOS 7, 8 with support of cPanel/WHM control panel.
          • CloudLinux OS 7, 8, 9 with support of cPanel/WHM control panel.
          • AlmaLinux 8, 9 with support of cPanel/WHM control panel.

          Minimum system requirements for installation:

          x64 | 512 Mb | 20 Gb disk space

          Note

          • Imunify Email RAM consumption depends on the mail traffic. In a waiting state it consumes little RAM, however for scanning large mails temporary increase of RAM consumption can be observed.

          • Used disk space depends on the number of accounts on a server. By default, each account will have 100 MB limitation for quarantine space. This limit can be adjusted using UI later.

          To install ImunifyEmail, you need to enable the corresponding option in your CLN account. After that the product will be installed automatically within 24 hours. To install it immediately you can use on of the following command as root user:

          /usr/bin/imunify360-agent update-license
          @@ -444,6 +444,6 @@
           }
           

          # Uninstallation

          To remove Imunify Email from your system, you need to disable the corresponding option in your CLN account. That will disable Imunify Email on the server, but rpm packages still will be presented. To remove them as well, execute the following command as root:

          Command

          yum autoremove imunifyemail
           

          This command ensures the removal of all associated components related to Imunify Email from your system.

          - + diff --git a/faq_and_known_issues/index.html b/faq_and_known_issues/index.html index 1d720b7..32e2520 100644 --- a/faq_and_known_issues/index.html +++ b/faq_and_known_issues/index.html @@ -29,7 +29,7 @@ })(); FAQ and Known Issues - +
          sidebar hamburger menu

          # FAQ and Known Issues

          # Common Questions

          # 1. End user IP is blocked and I do not know why

          If you use CSF, then try to find the IP in CSF Allow/Deny Lists using their documentation and support. If not, then do the following:

          • Go to cPanel Plugins section, choose Imunify360 and enter the Incidents page.

          • Make sure that the IP checkbox at the top of the table is ticked. Enter proper IP or part of IP in the input field and click Enter.

            • If the IP was found, then follow instructions on Incidents page and perform the actions you need, like: add IP to the White List or disable the security rule that has detected this incident.
          • If the IP was not found on the Incidents page, then go to Firewall page and using the same way as in the previous step try to find proper IP in Black List or Grey List.

            • If the IP was found then follow this instruction for Grey List or Black List and move the IP to the White List or just remove from the Black List or Grey List.

          If nothing helps, then contact our support team.

          Note

          There is a corner case of IP whitelisting/port blocking precedence

          # 2. Could I disable IPtables (firewall) or OSSEC, when using Imunify360?

          No. Imunify360 will not be able to stop an attack without IPtables and will not be able to detect an attack without OSSEC.

          # 3. Does Imunify360 log events such as adding or removing an IP to/from the Gray List?

          Most Imunify360 logs are saved in /var/log/imunify360/console.log. For example, when IP is blocked and added to the Black List, the following lines are added:

          INFO [2017-04-15 18:30:00,889]
          @@ -181,6 +181,6 @@
           <!--Information about additional key-->
           
          1. This is your base64-encoded key, and it should be decoded using a CLI utility or an online base64 decoder into UTF-8, e.g. https://www.base64decode.org. The new license key should have the following format: IMxxxxxxxxxxxxxxx.

          2. Use the new key decoded to activate the service:

          # imunify360-agent register DECODED_KEY_HERE
           

          This is it!

          - + diff --git a/features/index.html b/features/index.html index 83cf188..aee16cf 100644 --- a/features/index.html +++ b/features/index.html @@ -29,7 +29,7 @@ })(); Features - +
          sidebar hamburger menu

          # Features

          # External Black/Whitelist Management

          To use external files with the list of Black/White IPs, place this list into the following directory:

          • for the White List:
          /etc/imunify360/whitelist/*.txt
          @@ -60,7 +60,7 @@
           

          # Greylist and Anti-Bot Challenge

          The Greylist is a feature intended to distinguish human from machine input and protect websites from the spam and different types of automated abuse.

          Warning

          Please note that the WebShield Anti-Bot Challenge is not compatible with aggressive CDN caching modes, like Cloudflare "Browser Cache TTL" or "cache everything" with "Edge Cache TTL". If the Сaptcha page is cached by CDN, a visitor will see the Anti-Bot challenge from CDN cache disregarding it has been passed or not. In order to fix that, either disable the aggressive CDN caching or the Anti-Bot Challenge functionality in the Imunify360.

          There are two layers in GreyList behavior:

          1. If a user of a website is added to the Grey List (the access is blocked), then the GreyList behavior allows him to unblock himself. When he tries to get to the website he receives the JS challenge. If the challenge is solved by the browser successfully (a human user is not required to go through human confirmation - the process will pass under the hood), a user is redirected to the website, which means that the access is unblocked and the IP address of this user is removed from the Grey List.

          2. The GreyList behavior is always on guard of the websites and checks the activity of each IP, constantly adding suspicious IPs to the global GreyList.

          # CDN Support

          Imunify360 correctly graylists and blocks IPs behind Cloudflare and other CDNs (see here for the full list).

          Imunify360 passes all requests from CDN through WebShield, and uses CF-Connecting-IP and X-Forwarded-For headers to identify real IPs.

          To enable it now, run the command:

          imunify360-agent config update '{"WEBSHIELD": {"known_proxies_support": true}}'
           

          Note

          If you are using cPanel/EasyApache3, Imunify360 will not automatically deploy mod_remoteip, and log files will show local server IP for visitors coming from CDN. EasyApache 3 is EOL since December 2018, and we don't plan to add automated mod_remoteip setup and configuration for it.

          Note

          For cPanel/EasyApache 4, Plesk, DirectAdmin and LiteSpeed mod_remoteip will be automatically installed and configured.

          # Supported CDN providers:

          • Cloudflare
          • MaxCDN
          • StackPath CDN
          • KeyCDN
          • Dartspeed.com
          • QUIC.cloud CDN
          • NuCDN
          • Google CDN
          • CloudFront CDN
          • GoCache CDN
          • Opera
          • QUANTIL
          • QUIC.cloud CDN
          • BunnyCDN
          • Sucuri WAF
          • Ezoic
          • Fastly

          # How to trust all IPs that are specified by Ezoic CDN

          The “trust_ezoic” option for WebShield allows you to trust all IPs that are specified by Ezoic CDN as their own servers. By default the option is switched off, but it can be switched on in a straightforward way. Be aware when using this option, at this moment the list of Ezoic CDN servers is quite big and includes ranges that can be controlled by someone else in Amazon EC2.

          To enable it, open the /etc/imunify360-webshield/virtserver.conf file, find the directive set

          $trust_ezoic 0;
           

          replace 0 with 1, save the file and restart WebShield, using the following command:

          # service imunify360-webshield restart
          -

          # How to block attacks from a particular country in WebShield

          Country blocking is available in both Admin UI and CLI

          # Using Cloudflare “Edge Cache TTL“, “Cache Everything”, and “Browser Cache TTL” with Imunify360

          According to the Cloudflare documentation, Cache Everything with Edge Cache TTL enabled makes Cloudflare ignore all origin cache-related headers (see attached screenshots) which in the past, caused issues by custom cache settings in the Cloudflare control panel resulting in the inability to pass the Anti-Bot Challenge causing an endless loop:

          Quote:

          Level “Cache Everything” – Treats all content as static and caches all file types beyond the Cloudflare default cached content. Respects cache headers from the origin web server unless Edge Cache TTL is also set in the Page Rule. When combined with an Edge Cache TTL > 0, Cache Everything removes cookies from the origin web server response.

          Setting Edge Cache TTL along with the Cache Everything option is not recommended though it should not create any issues now because Anti-Bot Challenge is already disabled for Cloudflare IPs by default. It is possible to enable Anti-Bot Challenge as long as you don’t use “Edge Cache TTL” + “Cache Everything” in Cloudflare.

          1. Edit the file /etc/imunify360-webshield/wscheck.conf
          2. Set cloudflare_captcha on;
          3. Run systemctl reload imunify360-webshield

          Similarly, Browser Cache TTL overrides the original Cache-Control and Expires headers served to the browser. We recommend setting it to "Respect Existing Header".

          # Anti-bot protection

          Starting from version 5.6, Imunify360 distinguishes bots from real visitors using the Anti-Bot Challenge. Most bots don’t solve the challenge, and their requests will not reach web applications such as WordPress, Drupal, and others. This can save the server’s resources and protects websites from scanners, automated attacks, and web-spammers.

          Only bad actors will be redirected to the Imunify360 Anti-Bot Challenge page. Legitimate visitors get original content without any verification page nor any delay. Cookies and JavaScript support are required in a browser to successfully pass the challenge of Anti-bot protection.

          The “Anti-bot protection” feature will not block legitimate bots (e.g., Google crawler).

          You can enable Anti-bot protection, in the UI. Go to the General tab -> Settings and check the Anti-bot protection checkbox. You can find the details here.

          Or via CLI. To do so, run the following command:

          # imunify360-agent config update '{"WEBSHIELD": {"splash_screen": true}}'
          +

          # How to block attacks from a particular country in WebShield

          Country blocking is available in both Admin UI and CLI

          # Using Cloudflare “Edge Cache TTL“, “Cache Everything”, and “Browser Cache TTL” with Imunify360

          According to the Cloudflare documentation, Cache Everything with Edge Cache TTL enabled makes Cloudflare ignore all origin cache-related headers (see attached screenshots) which in the past, caused issues by custom cache settings in the Cloudflare control panel resulting in the inability to pass the Anti-Bot Challenge causing an endless loop:

          Quote:

          Level “Cache Everything” – Treats all content as static and caches all file types beyond the Cloudflare default cached content. Respects cache headers from the origin web server unless Edge Cache TTL is also set in the Page Rule. When combined with an Edge Cache TTL > 0, Cache Everything removes cookies from the origin web server response.

          Setting Edge Cache TTL along with the Cache Everything option is not recommended.

          Similarly, Browser Cache TTL overrides the original Cache-Control and Expires headers served to the browser. We recommend setting it to "Respect Existing Header".

          Instead consider using Cache Rules, that respect cache headers of the origin response, as shown on the screenshot below:

          # Anti-bot protection

          Starting from version 5.6, Imunify360 distinguishes bots from real visitors using the Anti-Bot Challenge. Most bots don’t solve the challenge, and their requests will not reach web applications such as WordPress, Drupal, and others. This can save the server’s resources and protects websites from scanners, automated attacks, and web-spammers.

          Only bad actors will be redirected to the Imunify360 Anti-Bot Challenge page. Legitimate visitors get original content without any verification page nor any delay. Cookies and JavaScript support are required in a browser to successfully pass the challenge of Anti-bot protection.

          The “Anti-bot protection” feature will not block legitimate bots (e.g., Google crawler).

          You can enable Anti-bot protection, in the UI. Go to the General tab -> Settings and check the Anti-bot protection checkbox. You can find the details here.

          Or via CLI. To do so, run the following command:

          # imunify360-agent config update '{"WEBSHIELD": {"splash_screen": true}}'
           

          # cPanel account protection

          Starting from v7.1, Imunify360 includes the extended the well-established Anti-bot protection functionality to cPanel to ensure that users are protected from bot attacks. All users trying to log in to cPanel will face up with the “Anti-Bot Challenge”.

          Most bots are unable to solve the challenge, and their requests will not reach the cPanel login page. All users using regular browsers may pass the challenge automatically. After passing the Anti-Bot challenge, a user receives a cookie for 24 hours and does not need to pass it again for the whole session.

          As bots and other automation are not supposed to pass the challenge, all legitimate automation should be whitelisted by IPs.

          The feature is switched off by default. To switch the feature on, use the following CLI command:

          # imunify360-agent config update '{"WEBSHIELD":{"panel_protection":true}}'
           

          To switch it off:

          # imunify360-agent config update '{"WEBSHIELD":{"panel_protection":false}}'
           

          Note

          1. You can find WebShield and Anti-bot related logs in the /var/log/imunify360-webshield directory.
          2. The feature works with the standard cPanel ports (2082, 2083). Contact Support if you have a non-standard cPanel ports configuration or need the feature for other ports.
          - + diff --git a/ids_integration/index.html b/ids_integration/index.html index 4ce8720..56f53b8 100644 --- a/ids_integration/index.html +++ b/ids_integration/index.html @@ -29,7 +29,7 @@ })(); Other Integrations - +
          sidebar hamburger menu

          # Other Integrations

          # IDS Integration

          # CSF Integration

          It is possible to use ConfigServer Security & Firewall (CSF) along with Imunify360.

          Imunify360 automatically detects that CSF is running (you can enable it anytime). Imunify360 Blocked Ports, DoS Protection and SMTP Traffic Manager features are automatically disabled in this case. In general:

          • Black List, Gray List, and White List can be managed in Imunify360 regardless of CSF.
          • CSF Allow, Deny and Ignore Lists are not automatically imported from CSF. They can still be managed using CSF interface.
          • Imunify360 will not block addresses from CSF Allow and Ignore Lists.

          To check that running CSF is detected, go to Imunify360 → Firewall tab → White List section and check if there is a warning message "CSF is enabled. Please manage IPs whitelisted in CSF using CSF user interface or config file".

          Mod_security recommendations

          When mod_security is configured with SecRuleEngine On (blocking mode), CSF blocks IP addresses by mod_security events. The number of events to block IP address is defined by LF_MODSEC variable in csf.conf. This can lead to a large number of false positives.

          We recommend to set LF_MODSEC variable to 0.

          In this case, Imunify360 will block IPs only by mod_security events with high severity.

          # 3-rd Party Integration mode

          The main setting that defines how Imunify360 works along with CSF is 3-rd Party Integration switch. (The config file equivalent is CSF_INTEGRATION.catch_lfd_events). When this mode is disabled (default), CSF and Imunify360 work as two independent solutions (with redundant modules disabled on the Imunify360 side - see above).

          When 3-rd Party Integration mode is enabled Imunify360 uses Login Failure Daemon (LFD) as source for security events instead of OSSEC. To get events from Login Failure Daemon (LFD), Imunify360 automatically replaces BLOCK_REPORT variable to the file path of Imunify360 script. When some IP address is blocked by LFD, Imunify360 adds this IP address to its Graylist and then removes it from CSF deny/tempdeny lists. The latter is done to unblock IP by passing Anti-Bot Challenge and to store all automatically blocked IP addresses in a single place. Thus, no IP is automatically added to CSF deny/tempdeny lists.

          # CXS Integration

          ConfigServer eXploit Scanner (CXS) has different types of malware scanning, which affects Imunify360 Malware Scanner functionality. Below we describe how to make Imunify360 Malware Scanner work properly. These functionalities can be configured at Malware Scanner settings page, but CXS itself must be configured  as follows:

          1. Automatically scan all modified files

            CXS Watch daemon must be disabled.

          2. Automatically scan any files uploaded using web

            CXS ModSecurity vendor should be disabled.

          3. Automatically scan any file uploaded using ftp

            Imunify360 supports only Pure-FTPd. For Pure-FTPd CXS launches pure-uploadscript for the scan. Any pure-uploadscript used by CXS must be disabled. You can use the following commands to do that:

          systemctl stop pure-uploadscript.service
          @@ -168,6 +168,6 @@
           

          Note

          Please make sure that Update rule sets option is disabled in your Plesk Web Application Firewall interface on the Settings tab.

          Note

          Note that in the current version of Plesk, Update rule sets option is available if one of the Atomic Basic ModSecurity/Advanced ModSecurity Rules by Atomicorp/Comodo ModSecurity Rule Set is enabled.

          # DirectAdmin

          During installation on DirectAdmin, Imunify360 will try to install mod_security automatically using custombuild 2.0.

          Note

          Automatic installation of Imunify360 ruleset is only supported with custombuild 2.0.

          The following values in the custombuild configuration are required for the installation of Imunify360 ModSecurity ruleset:

          modsecurity=yes
           modsecurity_ruleset=no
           
          - + diff --git a/imunifyav/cli/index.html b/imunifyav/cli/index.html index 4b40046..fa4fce2 100644 --- a/imunifyav/cli/index.html +++ b/imunifyav/cli/index.html @@ -29,7 +29,7 @@ })(); Command-Line Interface - +
          sidebar hamburger menu

          # Command-Line Interface

          # Description

          ImunifyAV(+) command-line interface (CLI) makes working with ImunifyAV(+) basics and features from your terminal even simpler.

          Note

          CLI commands are available only for cPanel and DirectAdmin control panels. Plesk and ISPmanager CLI support is coming soon.

          # Usage

          For access to the ImunifyAV agent features from the command-line interface, use the following command:

          imunify-antivirus
          @@ -282,6 +282,6 @@
           imunify-antivirus config update '{"MALWARE_SCANNING": {"rapid_scan": true}}'
           

          It is also possible to apply several parameters at once.

          For example:

          imunify-antivirus config update '{"MALWARE_SCAN_INTENSITY": {"cpu": 5, "io": 7}}'
           
          - + diff --git a/imunifyav/config_file_description/index.html b/imunifyav/config_file_description/index.html index 1677a9d..146994a 100644 --- a/imunifyav/config_file_description/index.html +++ b/imunifyav/config_file_description/index.html @@ -29,7 +29,7 @@ })(); Config File Description - +
          sidebar hamburger menu

          # Config File Description

          ImunifyAV(+) config file is available on the following location after installation:

          /etc/sysconfig/imunify360/imunify360.config

          In the config file it is possible to set up ImunifyAV(+) configuration. The following options are available:

          MALWARE_SCANNING:
          max_signature_size_to_scan: 1048576# max file size to scan in the standard mode; value is set in bytes
          max_cloudscan_size_to_scan: 10485760# max file size to scan in the cloud-assisted (by hashes) mode; value is set in bytes
          max_mrs_upload_file: 10485760# max file size to upload to CloudLinux malware research service; value is set in bytes
          detect_elf: False# enable (True) or disable (False) (default value) binary (ELF) malware detection
          sends_file_for_analysis: True# send (True) (default value) or not (False) malicious and suspicious files to the Imunify team for analysis
          cloud_assisted_scan: True# speed up scans by check file hashes using cloud database
          rapid_scan: True# speeds up (True) (default value) ot not (False) repeated scans based on smart re-scan approach, local result caching and cloud-assisted scan.
          rapid_scan_rescan_unchanging_files_frequency: null# defines what part of all files will be rescanned during each scan. For example, if set 10 then 1/10 part of all files will be rescanned. The default value `null` - means "choose frequency based on scan schedule". E.g. month - 1, week - 5, day - 10.
          hyperscan: True# allows to use (True) the regex matching Hyperscan library in Malware Scanner to greatly improve the scanning speed. True is the default value. Hyperscan requires its own signatures set that will be downloaded from the files.imunify360.com and compiled locally.
          Platform requirements:
          * Hyperscan supports Debian, Ubuntu and CentOS/CloudLinux 7 and later.
          * SSE3 processor instructions support. It is quite common nowadays, but may be lacking in virtual environments or in some rather old servers.
          crontabs: True# enable (True) scan of the system and user crontab files for malicious jobs. The default value is True.
          ERROR_REPORTING:
          enable: True# automatically report errors to the Imunify team
          MALWARE_SCAN_INTENSITY:
          cpu: 2# intensity level for CPU consumption. Can be set from 1 to 7, default is 2
          io: 2# intensity level for file operations. Can be set from 1 to 7, default is 2
          ram: 2048# intensity level for RAM consumption. Minimum value is 1024, default is 2048
          MALWARE_SCAN_SCHEDULE:
          day_of_month: <next day after installation># when the background scan shall start, day of the month. Can be from 1 to 31, the default value is the <next day after installation>.
          day_of_week: 0# when the background scan shall start, day of the week. Can be from 0 to 7 (0 for Sunday, 1 for Monday..., 7 for Sunday (again)), the default value is 0
          hour: 3# when the background scan shall start, hour. Can be from 0 to 23, the default value is 3
          interval: MONTH# interval of scan. Supported values: strings `NONE` (no scan), `DAY`, `WEEK`, `MONTH`, the default value is `MONTH`
          MALWARE_CLEANUP:
          trim_file_instead_of_removal: True# do not remove infected file during cleanup but make the file zero-size (for malwares like web-shells) (True) (default value)
          keep_original_files_days: 14# the original infected file is available for restore within the defined period. The default is 14 days. The minimum value is one day.
          ADMIN_CONTACTS:
          emails: youremail@email.com# your email to receive reports about critical issues, security alerts or system misconfigurations detected on your servers.
          enable_icontact_notifications: True# receive notifications about malicious activity detected (no more than once in 24h) and when malware scan was not performed for not more than once per week (once a week). Available for cPanel and cPanel-supported OSes. Default value is True.
          PERMISSIONS:
          support_form: True# show (True) (the default value) or hide (False) the Support icon in the ImunifyAV(+) UI.
          user_ignore_list: True# show (True) (the default value) or hide (False) the Ignore List tab for end-users in the ImunifyAV(+) UI.
          allow_malware_scan: False# enable (True) or disable (False) (the default value) “scan” action in the UI of the end-user.
          upgrade_button: True# enable (True - the default value) or disable (False) the Imunify upgrade button.
          RESOURCE_MANAGEMENT:
          ram_limit: 500# intensity level for RAM consumption. Minimum value is 500, default is 500
          io_limit: 2# intensity level for file operations. Can be set from 1 to 7, default is 2
          cpu_limit: 2# intensity level for CPU consumption. Can be set from 1 to 7, default is 2

          # How to apply changes from CLI

          In order to apply changes via command-line interface (CLI), you can use the following command:

          imunify-antivirus config update '{"SECTION": {"parameter": value}}'
          @@ -42,6 +42,6 @@
             - '12345'
             port_blocking_mode: DENY
           

          The mechanics is as follows: first-level "sections" - for example FIREWALL are merged, while second-level "options" - for example FIREWALL.TCP_IN_IPv4 are replaced completely.

          Those who don’t need this type of overridable configs can continue using custom configurations in the /etc/sysconfig/imunify360/imunify360.config.

          This feature is backward compatible.

          - + diff --git a/imunifyav/faq_and_known_issues/index.html b/imunifyav/faq_and_known_issues/index.html index a4ba29f..4524779 100644 --- a/imunifyav/faq_and_known_issues/index.html +++ b/imunifyav/faq_and_known_issues/index.html @@ -29,7 +29,7 @@ })(); FAQ and Known Issues - +
          sidebar hamburger menu

          # FAQ and Known Issues

          # "Imunify agent is not running" troubleshooting

          Having the Imunify service installed, you may come across the situation when the message "Imunify agent is not running" is displayed when you try to access the Dashboard:

          First of all, try to check the status of the service via the command line using the following command:

          # service imunify-antivirus status
          @@ -73,6 +73,6 @@
           

          and provide the output to our Support Team at https://cloudlinux.zendesk.com/hc/requests/new.

          # How to enable/disable the "Start scanning" button for ImunifyAV\AV+

          To enable the "Start scanning" button, run the following command:

          # imunify-antivirus config update '{"PERMISSIONS": {"allow_malware_scan": true}}'
           

          To disable the "Start scanning" button, run the following command:

          # imunify-antivirus config update '{"PERMISSIONS": {"allow_malware_scan": false}}'
           

          # Our customers are getting emails about infections. How can we disable that? The "Notify on website infection via email" setting is already disabled

          Try to switch off the "Send notifications" option in the "Users" menu as shown on the screenshot below:

          Note

          Please note that the "Adjust alert" parameter prevents the user from changing the notification settings.

          - + diff --git a/imunifyav/imunifyav_for_ispmanager/index.html b/imunifyav/imunifyav_for_ispmanager/index.html index 970386b..41c8096 100644 --- a/imunifyav/imunifyav_for_ispmanager/index.html +++ b/imunifyav/imunifyav_for_ispmanager/index.html @@ -29,10 +29,10 @@ })(); ImunifyAV(+) for ISPmanager - +
          sidebar hamburger menu

          # ImunifyAV(+) for ISPmanager

          You can find documentation for ImunifyAV(+) for ISPmanager here.

          - + diff --git a/imunifyav/imunifyav_for_plesk/index.html b/imunifyav/imunifyav_for_plesk/index.html index b1640c2..f41ef14 100644 --- a/imunifyav/imunifyav_for_plesk/index.html +++ b/imunifyav/imunifyav_for_plesk/index.html @@ -29,7 +29,7 @@ })(); ImunifyAV(+) for Plesk - +
          sidebar hamburger menu

          # ImunifyAV(+) for Plesk

          Warning:

          The extension will be deprecated soon and replaced with a modern version: Imunify Extension. See the instructions of how to upgrade to the new Imunify Extension here.

          ImunifyAV for Plesk is an intelligent antivirus and security monitoring tool designed to work with Plesk CMS. It performs one-click automatic malware cleanup, domain reputation monitoring as well as blacklist status check and is available as a Free and a Premium (ImunifyAV+) version.

          # Quick introduction for server admins

          In order to scan your websites for malware using the ImunifyAV all you need is to install the extension from Plesk Marketplace, open the Domains tab and click the Scan All.

          It will queue tasks to scan a complete list of websites for viruses, backdoors, web-shells, hacker’s scripts, phishing pages and other malware and run the process of websites scanning depending on specified number of concurrent scanning threads (1, 2 or 4) in the Settings tab. Also it will check each domain for blacklist status in search engines and antivirus services.

          Another option is to click the Scan button next to the particular website to check the single website for malware and blacklist status.

          In order to prevent server resources overload during scanning a set of websites the antivirus extension queues the scanning tasks and runs them with respect to the configured resources limitations (Max working threads in the Settings tab).

          Take into consideration that default settings may not be optimal in terms of scanning speed so we would recommend to check the Settings tab before start and adjust the following parameters manually to set optimal values for better performance (or less server load).

          Note

          The Max working threads is limited by a half of CPU core number on server. So the 1 or 2 CPU cores gives one working thread as maximum.

          When the scanning process is finished, check infection statuses of your websites. If everything in the report is green, congrats! It usually means your websites are neither compromised nor infected and blacklisted.

          If you’ve noticed some “red alerts” next to the domain most likely it means the particular website is compromised and infected. Click the View Report button and see the details.

          If you see some “orange alerts” next to the domain and Domain blacklisted notice it means the domain is blacklisted in either search engines or antivirus services. Click the View Report button to see blacklist status details.

          The detailed report shows you the list of detected malware and domain blacklist status.

          # Premium (ImunifyAV+) version and automatic malware cleanup

          In the Premium version of the Antivirus you can clean the malware automatically using the Clean Malware button.

          # Video

          Watch the quick demo on how it works and then try it on your own.

          # Quick introduction for users

          In order to scan your websites for malware using the ImunifyAV all you need is to click the ImunifyAV icon under the particular domain and then click the Scan button.

          When you click the Scan button the Antivirus queues a scanning task and runs it when server resources are available (it may start immediately or with some delay). The resources are configured by server admin so there might be a queue for the scanning process. The queue lets all users checking their websites on demand without server overload. Thus if you see Queued in the status column – everything is OK, scanning will start as soon as the resources are available or another scanning is finished.

          Upon completion check the status. If the report shows a green icon, congrats, it usually means your website is not compromised and clean.

          If you’ve noticed some “red alerts” next to the domain most likely it means the particular website is compromised and infected. Click the View Report button and see the details.

          If you see some “orange alerts” next to the domain and Domain blacklisted notice it means the domain is blacklisted in either search engines or antivirus services. Click the View Report button to see blacklist status details.

          Watch the quick demo on how it works.

          # Explanations

          # Explaining the Domain tab

          The screen below explains controls on the Domain tab.

          # Explaining the Settings tab

          • Quick Scan mode It configures antivirus to check critical files only: ph*, js, htm*, .htaccess, txt, tpl and some others. It will not scan media files (.png, .jpg, …), documents (.docx, .xlsx, .pdf, ..), and some other types. This helps to reduce server load and increase scanning speed dramatically.
          • Skip images and other media files It configures antivirus to check all files besides media files and documents. This also helps to reduce server load and increase scanning speed dramatically. The difference between previous option is that enabled Skip images… makes antivirus scan unknown extensions, but Quick scan will skip them.
          • Optimize scanning by speed It configures antivirus to turn on an “intelligent mode” while scanning cache folders. It will scan files from cache folders selectively which sometimes dramatically speed up the scanning process with the same level of malware detection.
          • Max working threads It specifies the amount of concurrent scanning threads, i.e how many websites will be scanned or cleaned concurrently. By default it is limited by a half of CPU core number. So if your server has 8 cores, the antivirus allows you to configure 4 concurrent threads as maximum. But you can set it to 1 or 2 just to reduce server load during the scanning process.
          • Scheduled rescanning It configures the interval of automatic website rescanning: once a day, once a week, once a month or never. We recommend to set it to “Daily” to be notified ASAP about any security issues. This option is available in the Premium version of antivirus.
          • Start automatic scanning at It configures the exact time of automatic website scanning.
          • Notify on website infection via email It configures antivirus to send out an email notification after scheduled scanning if websites are infected or blacklisted.This option is available in the Premium version of antivirus.
          • Max allocated memory… It configures how much memory is allowed for a single scanning process. If some websites fail to scan try to increase this value. It is limited by 1GB.
          • Number of days to keep… It configures antivirus to keep backup versions of cleaned files. During this period you can restore these files back using “Undo” button.
          • Trim malicious files instead of deleting it It configures antivirus do not delete files when malware is detected but trim it instead. So the file will be 0 length but kept in the file system. If you are 100% sure that all detected malicious files are not included into another files or database so you can uncheck this option and run Cleanup.
          • Update antivirus database automatically It configures antivirus to update malware database automatically every day. We recommend to enable this option.
          • Allow users to use files ignore list It allows common users to add files that should be omitted by the scanner to the Ignore list.
          • Enable antivirus warning banners It configures antivirus to show warnings.
          • Enable ImunifyAV menu shortcut
          • Scanning timeout It configures antivirus to update/increase scan time. Sometimes there are situations when the site is too large or the server is loaded and the scanning process can be terminated due to timeout. It means that the scanner did not have time to complete the scan.
          • Log level

          # How to activate a license key (for paid versions)

          Once you have paid for the Premium version of antivirus in Plesk Extension directory you receive a confirmation mail with details and activation link. If you have already followed those steps and still have not got the Premium version try manual activation:

          1. Login in as Administrator to the Plesk panel. Go to Tools & Settings -> License Management

          2. Click the Retrieve Keys

          3. You will see the screen like below

          4. Ensure that you have a license for the ext-revisium-antivirus under the Additional License Keys tab

          5. Congrats! Now you are ready to experience Premium version of the ImunifyAV. Check the About tab to ensure that the Premium version is enabled.

          In case of any issues with purchasing or activating extension contact Support at https://cloudlinux.zendesk.com/hc/en-us/requests/new.

          # How the Antivirus removes malware

          ImunifyAV works as a regular antivirus: it looks for the malicious piece of code in the files of a website while scanning and shows infected files in the report when the scanning finishes. If the user selects to cleanup malware, then the antivirus either removes a piece of malicious injection in the file or removes the entire file depending on the detected threat.

          If the entire file is a web-shell or doorway or some other type of malicious file, then antivirus removes it entirely. If there’s only a small injection at the beginning or at the end, or somewhere in the middle of the file, the exact malicious piece of code will be removed, but the rest content is left unchanged. Generally, the antivirus removes the malware and keeps a website up and running.

          There’s an option in the settings which defines whether the file is to be removed or just truncated (content of the file is completely removed but the file itself is left on the file system empty and has zero file length).

          The truncation is safer than removal because if the file is included in a database template or some other system file or a config file then the website might become broken after a cleanup. Therefore the antivirus uses a safer cleanup by default to keep the website working properly all the time. But one can disable this option in the Settings so the antivirus will remove the file completely in case the entire file is malware.

          # FAQ

          # Does ImunifyAV protect websites?

          ImunifyAV is a comprehensive malware detection and removal tool. Website protection is not a part of the Antivirus.

          ImunifyAV can effectively detect any type of website malware and remove it automatically using “one-click” cleanup, but it does not provide a proactive protection from future hacks and web-attacks. Therefore we strongly recommend to “harden” your websites after malware removal:

          • Update CMS version and update every plugin
          • Enable two-factor authentication for web hosting panel and CMS admin panel
          • Setup a Web Application Firewall or corresponding plugin for your CMS
          • Set new strong and random passwords for every account (FTP, SSH, ISP, Admin panel)
          • Isolate websites from each other under single hosting account or place them on different accounts to prevent cross-contamination
          • For VPS admins: update OS and service components of your server, disable any unused services and components

          # My websites are clean, what to do next?

          It is good to hear that everything in the report has “green” status.

          Just follow the recommendations on websites security to keep them safe and secured. And do not forget to re-scan your websites on a regular basis.

          If you are server admin we recommend to schedule re-scanning in the Settings tab so the Antivirus will be checking websites for malware automatically with selected interval. This option is available in the Premium version of the extension.

          # My websites are infected, what to do next?

          First of all – keep calm and check the detailed report.

          Click the View Report button next to the “red” mark and check the list of detected malware.

          Depending on your expertise and experience in web development you may resolve it in different ways.

          Check the options below.

          • Option 1: In the Premium version of the ImunifyAV you can click the Clean Malware button and it will remove the malware automatically. The Antivirus will keep your website up and running after the malware cleanup. It keeps original files for configured period of time (7 days by default) in its backup folder so you can restore them via the Undo button next to the website.

            The cleanup report looks like this:

            So try automatic one-button malware cleanup in the Premium version of the ImunifyAV.

          • Option 2: If you are an experienced webmaster and using the Free version of the Antivirus you can manually check the files one-by-one in the Plesk File Explorer or in your favourite FTP software to be sure that the listed files are not legitimate and contain the viruses. Just remove the malicious injections or entire file if it’s malicious. We recommend to create a backup of the entire website before any changes just to be sure that you could restore any changed file when needed.

          # What to do when antivirus has detected malware in the legitimate file?

          There's a small chance that you may face so-called “false-positives” while scanning the websites for malware i.e. when antivirus software marks a legitimate file as malicious because the file may contain some specific piece of code previously noticed in malware.

          Just send us the file and we will include it into the exceptions list of the Antivirus so it will never show up in the report after the antivirus update.

          # How to speed up the Antivirus?

          The Antivirus scanning performance mostly depends on server performance. But the default configuration of the Antivirus may not be optimal so we would recommend server admins to adjust the default settings for better performance. Just open the Settings tab and check the current parameters.

          • Quick Scan mode – if checked, the antivirus scans critical files only (php, js, html, htaccess, txt and some others). If you need to scan all files, uncheck the option.
          • Skip images and other media – if checked, it will skip jpg, png, gif, avi, mpg, mov, bmp, tiff, docx, xlsx, pptx, pdf, and some others. if you need to scan all files, uncheck the option.
          • Optimize by speed – if checked, the antivirus will do intelligent scanning of cache folders of CMS to speed up overall process. Uncheck the option for careful scanning.
          • Max working threads – how many websites are to be scanned simultaneously.

          Strong recommendation for server admins managing servers with 4 or more number of CPU cores or lots of websites installed to change the Max working threads option.

          As the opposite, if you feel that the Antivirus consumes lots of server resources just decrease the Max working threads parameters and the Max allocated memory… parameter.

          # How to update the Antivirus?

          In the Settings tab you can enable the auto-update option of the Antivirus databases.

          Another way for quick update of the ImunifyAV(+) databases is to open the About tab and click the Update Databases.

          Also we recommend for server admins checking the ImunifyAV extension for a newer version just to keep the core files up-to-date.

          # What if the Antivirus has not detected some malicious files?

          We do our best to keep the Antivirus database frequently updated and complete in order to detect as many threats as possible. But still there might be a small chance that some newly released malicious files are not yet in the database. Or there might be also another drawbacks:

          1. Check if you’re using the latest version of the ImunifyAV (check for the extension updates)
          2. Check if you’re using the latest version of the Antivirus database (check it in the About tab)
          3. Check current settings in the Settings tab. By default the Antivirus scans for critical extensions only (php, js, html, and some others). It provides a better performance while scanning everything besides the media files and documents. But the viruses may be located in those files either. So you may want to try the Antivirus in the full scan mode by switching the scanning option.
          4. If you try everything above but the Antivirus still does not see the infected file, please, send us the file. We will analyse it and add to the Antivirus database for the next update.

          If you found a malicious file which has not been detected by antivirus, please send it to us via https://cloudlinux.zendesk.com/hc/en-us/requests/new.

          Thanks!

          # Where can I find the ImunifyAV log file on Plesk?

          You can find the ImunifyAV log file here: /usr/local/psa/var/modules/revisium-antivirus/revisium-antivirus-local.log

          Sometimes you can face the issue that during scanning the scan process failed on one domain. And Dashboard says "scan failed" without an error message.

          In most cases, the site is large and the scan was terminated due to timeout.

          You can try to check records in the /usr/local/psa/admin/logs/panel.log and in the /usr/local/psa/var/modules/revisium-antivirus/revisium-antivirus-local.log log files.

          Please consider increasing the Scanning timeout value in the ImunifyAV settings and re-run the scan engine.

          # Troubleshooting

          # I payed for the extension, but it is not yet Premium

          If you purchased the license for the Premium version and cannot activate the key, check this section.

          # I click the Scan button, but it doesn’t start scanning

          When you click the Scan button it doesn’t start immediately, it queues the task to scan the website. You should see the Queued status in the line. Once the server resources are available it starts scanning and displaying a progress.

          # The Antivirus doesn’t cleanup some of malicious files

          Check the Malware Removal report to see the details. There might be the following reasons:

          • Malicious file is write-protected or a folder of the file is write-protected so the antivirus cannot write or delete it. Check it with the server administrator.
          • Malicious file was missed or not readable at the time of cleanup.
          • Malicious file is not in the cleanup database of the Antivirus. In this case you can see the Manual cleanup required status next to the file. Please, send it to us and we will check and add it for automatic cleanup.

          # I scheduled re-scanning for today but it does not start at specified time

          Scheduled re-scanning of files starts at specified time only if it’s been more than 24 hours since last website scanning. So if you would not scan it manually it will be checked the day after.

          # When I click the Scan All button the websites start scanning in random order

          Order of websites scanning depends on two things:

          • selected order in the table
          • order of domains registration

          For your convenience we would recommend sorting the table by the State column. Just click it to reorder.

          # When I click Scan or Clean it fails

          Please, follow the steps to gather information for analysis and send it to us.

          # Problem with websites cleanup

          This topic explains how to resolve the issue with one-click automatic cleanup in the 2.0-x version.

          # Issue description

          When administrator of server purchased the license and tries to cleanup malware within 24 hours since the purchase it gets “Failed to remove malware…”.

          # Root cause

          Background process is restarted every 24 hours and updates the license information on restart. So until restart it will keep old license type.

          # Resolution

          Administrator needs to restart the background process. There’re several ways to do this:

          • Wait for 24 hours, or

          • Change the Max working threads under the Settings tab and Save settings, or

          • Re-install ImunifyAV, or

          • Kill the process named ra_executor.php, it will be restarted in a couple of minutes.

            kill -9 `ps aux | grep 'ra_exec' | awk {'print$2'}`
            @@ -49,6 +49,6 @@
             
             filter.priority=7
             

            or change the value to the default one (usually – filter.priority=3).

            # Manual upgrade from deprecated ImunifyAV to the new Imunify Extension

            Starting from the extension version 2.13.1 of the ImunifyAV antivirus extension users will see the following warning about the upcoming extension deprecation. It will now be possible to manually switch to the new version of the ImunifyAV and ImunifyAV+ products available in the Imunify extension with no additional costs.

            Warning:

            The extension will be deprecated soon and replaced with a modern version: Imunify Extension. Your license data will be transferred to the new extension, allowing you to enjoy all the benefits of Imunify. You can start using the new version now by following these steps:

            1. Install the Imunify Extension.
            2. Migrate your existing license, if you have one, through Plesk 360. Please note that in a few months, the migration to the new extension will occur automatically.

            # What benefits of this upgrade:

            Enhancements for All Users:

            • Enhanced Security: AI-powered analysis for rapid, comprehensive file assessments.
            • Customization: The New Ignore List feature allows for tailored scanning.
            • Faster Scanning: Enhanced performance with the Fast scanning feature using the Hyperscan regexp engine.
            • Modern Interface: A sleek, user-friendly design simplifies navigation and management.
            • CLI Support: A robust command-line interface for advanced users and automation.
            • Stability Improvements: The embedded problem escalation mechanism helps the Imunify team react swiftly to instability issues.

            Additional Benefits for Premium Users (ImunifyAV+):

            • One-click Malware Cleanup
            • Restore Cleanup Functionality
            • Comprehensive Reputation Management Tools
            • Premium Support: 24/7 access to our Professional Technical Support team.

            # How to do the upgrade:

            For users with ImunifyAV Free to upgrade to Imunify extension to the new ImunifyAV product

            1. Go to the Plesk marketplace and find the Imunify extension (you use the link from the old extension)
            2. Choose ImunifyAV (free) from the list of products and click on “Get it Free”

            1. This will start the Installation process of the new Imunify extension from the Plesk marketplace
            2. Wait until the Imunify extension is installed and it will automatically enable the ImunifyAV free product.

            1. After successful installation the old ImunifyAV extension will be disabled and can be removed

            For the users of ImunifyAV Premium to upgrade to the Imunify extension with the new ImunifyAV+ product

            1. Go to the Plesk marketplace and find the Imunify extension (you use the link from the old extension)
            2. Choose ImunifyAV (free) from the list of products and click on “Get it Free”.

            You don’t need to choose the ImunifyAV+ product if you already have paid license for old extension.

            1. This will start the Installation process of the new Imunify extension from the Plesk marketplace
            2. Wait until the Imunify extension is installed and it will automatically enable the ImunifyAV+ product.

            1. Migrate your existing license with https://www.plesk.com/upgrade-extension/
            2. After successful installation, the old ImunifyAV(Revisium antivirus) extension will be disabled and can be removed

            For the users who want to upgrade to Imunify360

            1. If you are using the old ImunifyAV/AV+ extension (ImunifyAV and ImunifyAV Premium) you have to upgrade to the new version of the Extension as described above.
            2. Go to the Plesk marketplace and find the Imunify extension
            3. Choose one of the Imunify360 products from the list: Single-user, 30 users, 250 users, Unlimited users, and click on the “Buy” button.

            1. You will be redirected to the page where you must purchase the product.
            2. After a successful purchase, the installation of the Imunify extension will start automatically on your server.

            1. Wait until the Imunify extension is installed and it will automatically enable the Imunify360 product.

          - + diff --git a/imunifyav/imunifyav_for_webuzo/index.html b/imunifyav/imunifyav_for_webuzo/index.html index bcfba83..a6ea5c0 100644 --- a/imunifyav/imunifyav_for_webuzo/index.html +++ b/imunifyav/imunifyav_for_webuzo/index.html @@ -29,10 +29,10 @@ })(); ImunifyAV(+) for Webuzo - +
          sidebar hamburger menu

          # ImunifyAV(+) for Webuzo

          You can find documentation for ImunifyAV(+) for Webuzo here.

          - + diff --git a/imunifyav/index.html b/imunifyav/index.html index 3539353..e9d96ec 100644 --- a/imunifyav/index.html +++ b/imunifyav/index.html @@ -29,7 +29,7 @@ })(); ImunifyAV(+) for cPanel, Plesk and DirectAdmin - +
          sidebar hamburger menu

          # ImunifyAV(+) for cPanel, Plesk and DirectAdmin

          Note

          This ImunifyAV documentation is applicable for cPanel, Plesk and DirectAdmin control panels only.

          • You can find documentation for ImunifyAV for Plesk (will be deprecated soon) here.
          • You can find documentation for ImunifyAV for ISPmanager here
          • You can find documentation for stand-alone (no-panel) version of ImunifyAV here

          ImunifyAV provides malware scanning features for cPanel, Plesk and DirectAdmin control panels.

          # Installation Guide

          # Requirements

          Supported operating system

          • CentOS/RHEL 7, 8, 9
          • CloudLinux OS 7, 8, 9
          • Ubuntu 16.04 (LTS only), 18.04, 20.04 (LTS), 22.04 (cPanel, Plesk, DirectAdmin, and standalone), and 24.04
          • Debian 9 (up to Imunify v6.11 (including)), 10 (requires buster-backports), 11 & 12 (Plesk, DirectAdmin, and Stand-alone)
          • AlmaLinux 8, 9
          • Rocky Linux 8, 9 (cPanel, Plesk, and standalone)

          Virtualization

          • OpenVZ - Works for Virtuozzo 7

          Hardware

          • RAM: 512 Mb
          • HDD: 20 Gb available disk space
          • CPU: 64bit version on x86_64 processors only

          Supported hosting panels

          Required browsers

          • Safari version 9.1 or later
          • Chrome version 39 or later
          • Firefox version 28 or later
          • Edge version 17 or later
          • Internet Explorer version 11 or later

          # Installation Instructions

          Warning

          • On DirectAdmin, Imunify UI requires the proc_open PHP function to be enabled. If you are unable to open the Imunify UI, you might see a related message in the errror.log of the web-server. If so, please remove it from the disable_functions list in php.ini.
          • On Plesk panel you can install the Imunify extension from the Plesk Marketplace as an alternative of steps below.

          To install ImunifyAV proceed the following steps:

          1. Log in with root privileges to the server where ImunifyAV should be installed.

          2. Go to your home directory and run the commands:

          wget https://repo.imunify360.cloudlinux.com/defence360/imav-deploy.sh -O imav-deploy.sh
          @@ -193,6 +193,6 @@
              else:
                  raise Exception('Unhandled event {}'.format(event))
           

          # Notifications

          Starting from version 5.1, ImunifyAV/AV+ provides a completely new Hooks system configuration. Hooks can be configured via the separate UI “Notifications” tab in the Settings, or via the command-line interface (CLI).

          The administrator can configure to execute custom scripts (“hook handler”). Also, hooks support a new set of events and notification types:

          • Events occurring in each type of scan (real-time scan, user account scan, custom folder scan)
          • Events occurring at different stages of malware scanning process: upon scanning start, finish, when malware is found

          Each hook can be configured from the UI and the CLI. Each hook type has the enable/disable toggle and event handler script.

          Notes

          • The hook script field accepts a fully qualified path
          • The hook script requires “execution” (+x) permissions to be set to work
          • Email notifications available in Imunify360
          - + diff --git a/imunifyav/stand_alone_mode/index.html b/imunifyav/stand_alone_mode/index.html index 8c3437c..5966605 100644 --- a/imunifyav/stand_alone_mode/index.html +++ b/imunifyav/stand_alone_mode/index.html @@ -29,7 +29,7 @@ })(); Stand-alone version of ImunifyAV(+) (non-panel, generic panel integration) - +
          sidebar hamburger menu

          # Stand-alone version of ImunifyAV(+) (non-panel, generic panel integration)

          Below you can find the steps to install and run ImunifyAV(+), in stand-alone mode, or within any hosting panel.

          # Requirements

          Operating system

          • The same list as here.

          # Prerequisites

          • PHP with proc_open function enabled (remove it from the disable_functions list in php.ini)

          There are some basic steps to run ImunifyAV as a stand-alone application:

          1. Define a way to serve web-based UI
          2. Provide ImunifyAV with an actual list of users in the system
          3. Configure a user authentication process

          Warning

          Imunify Web-UI PHP code has to be executed under a non-root user which has access to /var/run/defence360agent/non_root_simple_rpc.sock. If it runs in CageFS, you'll need to configure it accordingly.

          To allow non-root user in CageFS access to the socket, this workaround should be applied:

          # create directory for moun-point
          @@ -204,6 +204,6 @@
             }
           }
           
          - + diff --git a/index.html b/index.html index 33c472c..d91a379 100644 --- a/index.html +++ b/index.html @@ -29,10 +29,10 @@ })(); Imunify360 Product Documentation - +
          document icon

          Introduction to Imunify360

          Introduction to Imunify360 features and their description.

          document icon

          Terminology

          Imunify360 terminology explained.

          document icon

          Licensing

          Here you will find a list of available Imunify360 subscription types, an explanation of how to determine what is the most suitable license type for your server, and what pricing actually depends on.

          document icon

          Installation

          System requirements and installation instructions for Imunify360.

          document icon

          Non-Supported Panel Integration

          Imunify360 can be installed directly on the server, independent of any panel, regardless of the administrative interface. It is also called stand-alone, non-panel, generic panel integration.

          document icon

          Other Integrations

          Integration with CSF/CXS, backup systems, and firewall ruleset specific configuration based on control panels supported.

          document icon

          Features

          Imunify360 features detailed description and configuration explained.

          document icon

          Admin Interface

          Complete overview of the Imunify360 Dashboard features and options available to admins (root level).

          document icon

          User Interface

          Documentation section for end-users on Imunify360 Dashboard.

          document icon

          Command-Line Interface (CLI)

          Imunify360 command-line interface (CLI) makes working with Imunify360 basics and features from your terminal even simpler. Here you will find the available CLI tools described and examples of their usage.

          document icon

          Config File Description

          Despite the UI settings and CLI tools, Imunify360 can be set up by modifying the configuration file directly. This documentation section contains config file options and available parameters explained.

          document icon

          Update

          Imunify360 update conditions and instructions.

          document icon

          Localization

          This section includes a list of the supported languages and instructions on how to translate the UI into your own language.

          document icon

          WHMCS Plugin

          Using WHMCS Plugin for Imunify360.

          document icon

          FAQ and Known Issues

          Frequently asked questions about Imunify360 performance, configuration, and known issues troubleshooting and resolution.

          document icon

          Uninstall

          Here you will find the guidelines on stopping the Imunify360 service, software uninstallation, and how to disable updated on demand.

          document icon

          ImunifyAV/AV+ Product

          ImunifyAV/AV+ documentation section.

          document icon

          Imunify Email Product

          Imunify Email documentation section.

          document icon

          MyImunify Documentation

          MyImunify is a meticulously crafted solution aimed at turning security from a mere cost center into a powerful revenue generator.

          document icon

          Patchman

          Automated vulnerability patching and malware removal.

          - + diff --git a/installation/index.html b/installation/index.html index 2cc2ef6..2944e88 100644 --- a/installation/index.html +++ b/installation/index.html @@ -29,7 +29,7 @@ })(); Installation Guide - +
          sidebar hamburger menu

          # Installation Guide

          # Requirements

          Supported operating systems

          • CentOS/RHEL 7, 8, 9
          • CloudLinux OS 7, 8, 9
          • Ubuntu 16.04 (LTS only), 18.04, 20.04 (LTS), 22.04 (cPanel, Plesk, DirectAdmin, and standalone), and 24.04
          • Debian 9 (up to Imunify v6.11 (including)), 10 (requires buster-backports), 11 & 12 (Plesk, DirectAdmin, and stand-alone)
          • AlmaLinux 8, 9
          • Rocky Linux 8, 9 (cPanel, Plesk, and standalone)

          Virtualization

          OpenVZ - works for Virtuozzo 7 with kernel 3.10.0-1160.80.1.vz7.191.4 or newer.

          Hardware

          • RAM: 1GB
          • HDD: 20GB available disk space
          • CPU: 64bit version on x86_64 processors only

          Supported hosting panels

          Required browsers

          • Safari version 10 or later
          • Chrome version 39 or later
          • Firefox version 28 or later
          • Edge version 17 or later

          Supported Web-servers

          • Apache
          • LiteSpeed
          • Nginx (fully supported in the Standalone mode; for supported control panels – with ModSec 3 only for now)

          # Installation Instructions

          No hosting panel installation note:

          This instruction is intended for supported panels such as cPanel, Plesk, DirectAdmin, etc. from the list above. If you are currently using a non-supported control panel, please proceed with the Stand-Alone documentation section.

          1. Get your license key at https://www.imunify360.com/. You can purchase it or get a trial key from a received email.

          2. Log in with root privileges to the server where Imunify360 should be installed.

          3. Go to your home directory and run the commands:

          wget https://repo.imunify360.cloudlinux.com/defence360/i360deploy.sh -O i360deploy.sh
          @@ -48,6 +48,6 @@
           systemctl restart imunify360-webshield
           

          If checkmodule command is not found, please, install it: For CentOS8/CloudLinux 8:

          yum install policycoreutils-python-utils
           

          # Troubleshooting

          On DirectAdmin, Imunify UI requires the proc_open PHP function to be enabled. If you are unable to open the Imunify UI, you might see a related message in the web server error log. If so, please remove it from the disable_functions list in php.ini.

          # Compatibility

          Compatible

          IDS nameComment
          LiteSpeedIntegrates with version 5.1 or higher.
          EasyApache3Works only in cPanel.
          EasyApache4Works only in cPanel.
          CSFIntegrated with CSF, more details here.
          CWAF AgentNo problems detected.
          PatchmanNo problems detected.
          SuhosinWe are ignoring alerts by Suhosin.
          CloudflareImunify360 supports graylisting IP addresses behind Cloudflare. More details here.
          CXSSpecial actions required to use Imunify360 with CXS installed.
          cPHulkImunify360 disables cPHulk during installation. However in case of enabling it back, Imunify360 integrates with it and shows cPHulk events in the incident screen.
          OpenVZWorks for Virtuozzo 7 with kernel 3.10.0-1160.80.1.vz7.191.4 or later.
          UptimeRobotNo problems detected.

          Incompatible

          IDS nameComment
          ASL (Atomicorp Secured Linux)ASL is not compatible with Imunify360, and cannot be run with Imunify360 on the same server.
          fail2banImunify360 disables fail2ban: the latter resets chains of iptables rules which causes inconsistency with Imunify360
          - + diff --git a/introduction/index.html b/introduction/index.html index 707c157..efab6f4 100644 --- a/introduction/index.html +++ b/introduction/index.html @@ -29,10 +29,10 @@ })(); Introduction - +
          sidebar hamburger menu

          # Introduction

          Imunify360 is the security solution for Linux web servers based on machine learning technology which utilizes a multi-layer approach to provide total protection against any types of malicious attacks or abnormal behavior including distributed brute force attacks.

          Imunify360 provides:

          • Advanced firewall with cloud heuristics and artificial intelligence for detecting new threats and protecting all servers that run the software -  capable of defending against brute force attacks, DoS attacks.

          • Intrusion Detection and Protection System -  comprehensive collection of “deny” policy rules for blocking all known attacks.

          • Malware Scanning - automatic scanning file systems for malware injection and cleaning up infected files.

          • Patch Management - rebootless Secure Kernel powered by KernelCare keeps the server secure by automatically patching kernels without having to reboot the server.

          • Website Reputation Monitoring - analyzing if web-site or IPs are blocked by any blacklists and notifying if they are.

          • Proactive Defense - Proactive Defense protects websites running PHP, against zero-day attacks by blocking potentially malicious executions automatically and with zero latency.

          If a user violates Imunify360 security rules (trying to enter a wrong password, etc.), then Imunify360 will automatically block the access to this user IP-address, adding the IP-address to the Gray List.

          If, after that, a user will try to access the HTTP/S port (#80/443), he will see the [Anti-bot Challenge](/features/#Anti-bot Challenge). After entering the Anti-bot Challenge correctly, Imunify360 will remove that user from the Gray List. In a case of repeated violation, the IP address will be automatically added to the Gray List again.

          An administrator can remove any IP-address from the Gray List and add to the White List if needed. In this case, the user will not be blocked when attempting to violate Imunify360 security rules.

          - + diff --git a/localization/index.html b/localization/index.html index 22e78f4..fecba55 100644 --- a/localization/index.html +++ b/localization/index.html @@ -29,10 +29,10 @@ })(); Localization - +
          sidebar hamburger menu

          # Localization

          Imunify360 supports the following languages in addition to default (en-US):

          • de-DE
          • es-ES
          • fr-FR
          • ja-JP
          • it-IT
          • tr-TR
          • nl-NL
          • ru-RU
          • pt-BR
          • zh-CN

          # How to perform a translation to your own language using our language file

          Contact Imunify360 support to request the latest language file. The file is actually in JSON format, which values are the translation. We use this syntax to translate plurals and other dynamic content: https://messageformat.github.io/messageformat/guide/.

          Note

          You can use it to provide translation for each plural case in your language: http://cldr.unicode.org/index/cldr-spec/plural-rules.

          You can use this tool to simplify the process: https://translation-manager-86c3d.firebaseapp.com/.

          Send the translated version to us and we will gladly include it in one of the nearest releases of Imunify360.

          - + diff --git a/myimunify/index.html b/myimunify/index.html index 65ae07d..eb9442a 100644 --- a/myimunify/index.html +++ b/myimunify/index.html @@ -29,10 +29,10 @@ })(); MyImunify User Documentation - +
          sidebar hamburger menu

          # MyImunify User Documentation

          # Hosting Administrator

          # What is MyImunify (for hosting admin)?

          It is a feature of Imunify360 included in the disabled-by-default state always. With MyImunify enabled, the Imunify360 service changes its protection behavior.

          When enabled, Imunify360 will still protect the server against all known network attacks but with the malware cleanup disabled for users’ home directories and the Proactive Defense feature in the Log Mode by default.

          In the MyImunify Protection disabled mode, Imunify360 will still scan users' directories, show found malware inside the UI, and also notify users about the detected malware if possible, proposing to purchase MyImunify protection via the hosting company billing system.

          # Prerequisites

          # What features will be enabled/disabled when I turn MyImunify on?

          When you enable the MyImunify feature on your server, you have to adjust your product plan to enable MyImunify protection for existing users. Otherwise, all the existing users on this server will have the protection disabled and no malware cleanup or Proactive Defense will be working until they purchase MyImunify individually. Please see how to enable MyImunify for existing users here.

          The following features are present and fully functioning regardless of the MyImunify Status.

          • Advanced firewall with cloud heuristics and artificial intelligence for detecting new threats and protecting all servers that run the software - capable of defending against brute force attacks, DoS attacks, and port scans.
          • Intrusion Detection and Protection System - a comprehensive collection of “deny” policy rules for blocking all known attacks.
          • Patch Management - rebootless Secure Kernel powered by KernelCare keeps the server secure by automatically patching kernels without having to reboot the server.
          • Website Reputation Monitoring - analyzing if websites or IPs are blocked by any blacklists and notifying if they are.

          The features whose behavior is changed when MyImunify is enabled.

          • Malware Scanning - automatic scanning of file systems for malware injection and cleaning up infected files.

            • When MyImunify is enabled on the server, Imunify360 will continue to scan the user’s home directories finding malware scripts and viruses, however, users with MyImunify Protection Disabled will not be able to clean up files using Imunify360. They will either need to clean up files themselves or purchase complete protection from the hosting company.
            • At the same time, a hosting administrator still be able to clean up files if needed.
          • Account owner's UI when Protection is Disabled (Malicious Tab):

          • Proactive Defense - Proactive Defense protects websites running PHP, against zero-day attacks by blocking potentially malicious executions automatically and with zero latency.

            • When MyImunify is enabled, Proactive Defense will Log only suspicious events for all the users who haven’t yet had MyImunify Protection Enabled mode.
            • Once MyImunify is enabled, Proactive Defense will automatically enabled into Kill Mode unless it is disabled on the server.
          • Account’s owner’s UI when Protection is Disabled (Proactive Defence tab):

          # How to enable MyImunify

          # Configuring the billing system (WHMCS) side

          Install the CloudLinux Advantages plugin if you don’t have it yet. Once installed check presence in WHMCS -> Addons menu.

          Don’t forget to add your server under WHMCS management: System -> Settings -> Servers -> Add New Server. Refer to https://docs.whmcs.com/Servers#Add_a_Server.

          # Adding a new Configurable option to a hosting plan

          1. Go to WHMCS System Settings -> Configurable Options, select the MyImunify Group, and edit it.

          1. my_imunify_hosting needs to be assigned to the hosting plans. Select linceses - my_imunify_hosting and your hosting configuration together in the Assiged Product list (Shift+click).

          1. Edit the price for the configurable option MyImunify – Account Protection. For more info, visit https://docs.whmcs.com/Configurable_Options.

          # Enabling MyImunify for existing users by default

          In case a hosting company wants to enable MyImunify on a server that already has Imunify360 installed avoid existing users getting no protection users, but at the same time make new users purchase protection on demand, then WHMCS administrator will need to configure two different hosting plans:

          • The first plan will have MyImunify enabled by default at no cost, so existing users will see no change in the protection.
          • The second plan will have the MyImunify configurable option off by default, so it can be assigned to new users to allow them to purchase it on demand.

          Here is how to configure an existing hosting plan by WHMCS administrator to enable MyImunify Protection Enabled at no additional cost.

          1. Go to Settings -> Configurable Options Groups -> Create New Group:

          1. Create a new group with a distinct name and assign it to your existing product/plan:

          1. Add a new configurable option to the group and press “Add New Configurable Option”:

          1. Fill in the option name field. It is important for the option to start with my_imunify_account_protection| (don’t forget | at the end).

          2. Then add the option awp_on|On. Use awp_on| as a prefix, the rest is the text that a user will see.

            • To avoid inflicting additional costs, the price line needs to be filled with 0.00. The Order value must be set to “1”.
            • It is also possible to add an awp_off| option here to allow the users to disable protection. In this case, the Order field must have a value “2”.

          Confirming the changes

          1. To check if the Configurable option is assigned to the hosting plan, see “Settings -> Product Services -> Select your hosting plan -> Configurable options”. Make sure that the created Configurable Option is assigned to the needed hosting plan.

          2. Once it is done, it is required to sync changes to the existing servers. In order to do so select “Addons -> CloudLinuxAdvantages”

          There is an area called Configurable option status. Your new option will appear here, preceded by the "PUSH" button. The button needs to be pressed in order to sync changes with the existing hosting plan to your servers. Once pressed it will show the list of servers and users where the "Configurable option" change will be propagated. Press “Send Changes” if everything is ok.

          Now you have to configure your new hosting plan for the users who will need to purchase protection on demand.

          # Configuring the Imunify360 side

          1. Configuration of MyImunify on the Imunify360 side is pretty easy. Navigate to the Imunify360 -> Settings -> General -> MyImunify section.
          2. Click “Resell MyImunify package to site owners” and specify the billing system (WHMCS) hostname. If your system is running on the port other than standard HTTPS port (443), specify it as well e.g. whmcs.example.com:8443. Don’t forget to hit the Save Changes button.

          # Approving Orders

          By default, every purchase of a configurable option creates an order that needs to be accepted.

          1. Select Orders -> List Orders:

          1. Select pending orders and accept them.

          # Account Owner

          # What is MyImunify (for an account/site owner)?

          MyImunify - your comprehensive web security solution. In today's digital landscape, the importance of robust web security cannot be understated. MyImunify provides an integrated solution for website owners keen on ensuring maximum protection. Here are the essentials of what MyImunify offers:

          • Automated Malware Management: MyImunify automatically scans file systems for traces of malware, swiftly identifying and cleaning infected files. This not only maintains the integrity of your website but also significantly reduces the administrative efforts required in manual malware detection and removal.

          • Proactive Defense: With a vast majority of websites running PHP, it becomes crucial to guard them against not just known threats, but also potential zero-day attacks. MyImunify's Proactive Defense feature is designed to achieve this by blocking potentially malicious executions in real time, ensuring your website operates securely without latency issues.

          By integrating MyImunify, you equip your website with a cutting-edge protective layer that is both efficient and unobtrusive. It is a prudent choice for those prioritizing digital safety.

          # Where MyImunify is located?

          1. Log into your hosting account control panel (cPanel) and find Imunify360 in the Security section (or use a search tool for "Imunify360").

          1. Open Imunify360.

          On the screenshot, you can see an example of an account with malware detected.

          MyImunify automatically scans the account’s home and website directories and finds malware and other suspicious files. Once malware is detected, it is time to remove it. Site administrators can either remove it manually or press the "Get Protected" button to enable MyImunify protection.

          # MyImunify Protection enabled mode

          Once a user clicks on the Get Protected button, he/she will be navigated to the WHMCS Client Area "Upgrade/Downgrade" page with the preselected configurable option “MyImunify - Account protection”.

          1. Click on "New Configuration", select “On” and complete the purchase:

          1. Here the user needs to select New Conifugation “On”:

          # Using MyImunify Protection Enabled

          Once the purchase is completed, the Imunify360 plugin will be turned into the MyImunify Protection Enabled mode.

          MyImunify Protection is completely automated. It takes the burden of scanning and cleaning off a user. However, it might be useful to press “Clean up all” once MyImunify Protection is enabled to expedite malware cleanup.

          Users can either see the results of real-time malware scans, clean up malware if needed and use Proactive Defense in “Kill mode”, stopping unknown types of malware. Below is the Proactive Defense in the “Kill mode” demostrated:

          - + diff --git a/patchman/agent/index.html b/patchman/agent/index.html index c93d171..aaf33b7 100644 --- a/patchman/agent/index.html +++ b/patchman/agent/index.html @@ -29,7 +29,7 @@ })(); Agent (patchman-client) - +
          sidebar hamburger menu

          # Agent (patchman-client)

          # Where can I find the software changelog?

          # Online changelog

          You can find the central Patchman software changelog at the following URL:

          https://download.patchman.co/changelog

          In addition to the above, the changelog for each software update is also available through your system package manager.

          # CentOS / CloudLinux

          Use the RPM package management utility with the following command:

          rpm -q --changelog patchman-client
          @@ -56,6 +56,6 @@
           

          or

          dnf remove patchman-client
           

          # Debian / Ubuntu

          Use the apt package management utility with the following command:

          apt-get remove patchman-client
           

          # Cancelling the server license

          Make sure to cancel the server license in the Patchman Portal. We strongly suggest you do this after the removal of the software from your system, because if the software is still running it may automatically request a new license on your account (according to the standard installation procedure).

          In the Patchman Portal, go to the server configuration page under Servers. If your plan requires advance notice for cancelling servers, click the red Cancel button to cancel your license and deactivate it per the renewal date. Otherwise, click the red Delete button to immediately remove the server license from your account. This will make sure you are no longer billed for this server.

          - + diff --git a/patchman/frequently_asked_questions/index.html b/patchman/frequently_asked_questions/index.html index 6760aca..bc79592 100644 --- a/patchman/frequently_asked_questions/index.html +++ b/patchman/frequently_asked_questions/index.html @@ -29,7 +29,7 @@ })(); Frequently Asked Question - +
          sidebar hamburger menu

          # Frequently Asked Question

          # Which applications does Patchman detect and fix?

          If you want to be notified every time we add new patches and signatures, please see Can you notify me every time a new vulnerability patch is released?

          Currently, Patchman has two types of definitions.

          • When a version is supported by patches, fixes are available for most security flaws in these applications. This means that vulnerabilities in these applications are automatically fixed.
          • When only detection support is available, Patchman is able to detect installed versions of this application, which allows you to notify your users of outdated applications.

          Patch and detection support for various versions of the supported applications are listed below. If you think there is a vulnerability in one of these applications that Patchman does not patch, please check Why is vulnerability X not fixed by Patchman? for more information.

          ApplicationPatchesBundle / Plan (for patching)Version detection (all plans)
          WordPress3.6 and laterPatchman CORE,
          Patchman COVERAGE,
          Patchman COVERAGE+CLEAN
          all
          Joomla2.5 and laterPatchman CORE,
          Patchman COVERAGE,
          Patchman COVERAGE+CLEAN
          all
          Drupal6.0 and laterPatchman CORE,
          Patchman COVERAGE,
          Patchman COVERAGE+CLEAN
          all
          Magento1.9.2.0 and laterPatchman COVERAGE,
          Patchman COVERAGE+CLEAN
          all
          WooCommerce2.1.0 and laterPatchman COVERAGE,
          Patchman COVERAGE+CLEAN
          all
          PrestaShop1.6.0.1 and laterPatchman COVERAGE,
          Patchman COVERAGE+CLEAN
          all
          Coppermineall
          Dolibarrall
          Dotprojectall
          Feng Officeall
          FrontAccountingall
          Galleryall
          LifeTypeall
          LimeSurveyall major releases
          (some plus versions)
          LinPHAall
          LiveHelperChatall
          MailPoetSpecific, see belowSpecific, see belownone
          MediaWikiall
          MODXall
          Nextcloud9.0.54 and later
          NOCCall
          OpenBiblioall
          OpenCartall
          OrangeHRMall
          osCommerceSpecific, see belowSpecific, see below2.2 - 2.4
          ownCloudall
          phpBBall
          phpESPall
          PHPFusionall
          phpListall
          phpMyChatall
          PhpWikiall
          Pliggall
          PyroCMSall
          SquirrelMailall
          TYPO3all
          vTigerall
          Wikiwigall
          XOOPSall
          YourLSall
          ZenPhotoall

          # Plugins and libraries

          A list of plugins fully supported by Patchman for patching and/or version detection is included below. If you are wondering why a specific plugin is not part of our coverage, please check Why is plugin X not patched by Patchman? for more information.

          PluginVersion(s)Bundle / Plan (for patching)Version detection (all plans)
          WordPress Plugin:
          Advanced Editor Tools / TinyMCE
          3.5.9 and laterCOVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          Akismet
          5.0 and laterCOVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          All in One SEO Pack
          2.3.9.2 and laterCOVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          Contact Form 7
          3.6 and laterCOVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          Duplicator
          Specific, see belowSpecific, see belowall
          WordPress Plugin:
          Easy WP SMTP
          Specific, see belowSpecific, see belowall
          WordPress Plugin:
          Elementor Website Builder
          3.17.0 and laterCOVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          GDPR Cookie Consent
          Specific, see belowSpecific, see belowall
          WordPress Plugin:
          Google XML Sitemaps
          4.0.8 and laterCOVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          InfiniteWP Client
          Specific, see belowSpecific, see belowall
          WordPress Plugin:
          Jetpack
          2.7 and laterCOVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          Popup Builder
          Specific, see belowSpecific, see belowall
          WordPress Plugin:
          ThemeGrill Demo Importer
          Specific, see belowSpecific, see belowall
          WordPress Plugin:
          WordPress Importer
          0.6.2 and laterCOVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          Yoast SEO
          1.6.1 and laterCOVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          Classic Editor
          1.6 and laterCOVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          Really Simple SSL
          7.2.2 and laterCOVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          Updraft Plus
          1.23.13 and laterCOVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          Duplicate pages
          4.5 and laterCOVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          Classic Widgets
          0.3 and laterCOVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          Popup Builder by OptinMonster
          1.15.0 and laterCOVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          Smush
          3.15.2 and laterCOVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          Popup Builder by Fooking Forward
          4.2.3 and laterCOVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          Rank Math SEO
          1.0.215 and laterCOVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          WP super Cache
          1.5.0+COVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          GDPR cookie consent
          1.5.3+COVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          LimitLoginAttempts
          1.7.2+COVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          ThemeGrill demo importer
          1.0+COVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          ND shortcuts
          1.1+COVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          InfiniteWP client
          1.6.0+COVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          Duplicator
          1.2.0+COVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          MonsterInsights
          8.1.0+COVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          WPForms
          1.3.2+COVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          WP Mail SMTP by WPForms
          1.2.3+COVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          All-in-One WP Migration and backup
          7.76+COVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          LiteSpeed Security
          1.9.1.1+COVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          MC4WP: Mailchimp for WordPress
          4.0+COVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          WordFence Security
          3.6+COVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          Yoast Duplicate Post
          3.2.2+COVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          Site Kit by Google
          1.0.0+COVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          Redirection
          3.0+COVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          WP Fastest Cache
          >=0.8.6.6COVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          File Manager
          >=6.0COVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          Essential Addons for Elementor
          >=4.3.8COVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          WP-Optimize - cache, compare images, minify & clean DB to boost page speed & performance
          >=3.1.6COVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          Loginizer
          >=1.6.6COVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          WPCode - insert headers and footers - custom code snippets
          >=1.6.0COVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          Secure custom field aka Advanced custom field
          >=5.9.0COVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          Cookie Notice & compliance for GDPR/CCPA
          >=2.0.0COVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          W3 Total cache
          >=2.0.0COVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          Disable comments - Remove comments and remove spam
          >=2.1.0COVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          Limit login Attempts reloaded
          2.10.0+COVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          Ultimate Addons for Elementor
          1.1.0+COVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          SVG-support
          2.4+COVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          ultimate-addons-for-gutenberg
          0.0.1+COVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          safe svg
          1.8.0+COVERAGE, COVERAGE+CLEANall
          WordPress Plugin:
          Automize
          2.5.1+COVERAGE, COVERAGE+CLEANall
          Joomla! Plugin:
          Akeeba Backup
          all
          Joomla! Plugin:
          Joomla Content Editor (JCE)
          all
          LibraryVersion(s)Bundle / Plan (for patching)Version detection (all plans)
          PhpUnitSpecific, see belowSpecific, see belowall

          # Specific (critical) vulnerabilities

          Some select vulnerabilities patched in plugins due to their critical nature, but aren't covered by full patch support. A list of these can be found below:

          ApplicationVulnerability / FixBundle / PlanVersion(s) covered by patches
          MailPoetVulnerability in privilege checkingCORE, COVERAGE, COVERAGE+CLEAN2.x
          osCommerceFile Manager upload
          Script/basename
          Language Manager CSRF
          CORE, COVERAGE, COVERAGE+CLEAN2.2
          PluginVulnerability / FixBundle / PlanVersion(s) covered by patches
          WordPress Plugin:
          Duplicator
          Adding hashes to file path to avoid arbitrary file download.COVERAGE, COVERAGE+CLEAN1.3.26 - 1.3.24
          WordPress Plugin:
          Easy WP SMTP
          Unauthenticated user to modify WordPress optionsCOVERAGE, COVERAGE+CLEAN1.3.9 - 1.2.8
          WordPress Plugin:
          GDPR Cookie Consent
          Added check if user can manage options to prevent privilege escalationCOVERAGE, COVERAGE+CLEAN1.8.2 - 1.6.6
          WordPress Plugin:
          InfiniteWP Client
          Check added for add_site and read_site to avoid authentication bypassCOVERAGE, COVERAGE+CLEAN1.9.4.4 - 1.8.1
          WordPress Plugin:
          Popup Builder
          Added authorization check to AJAX actions

          Unauthenticated Stored Cross-Site Scripting / Authenticated Settings Modification, Configuration Disclosure, and User Data Export
          COVERAGE, COVERAGE+CLEAN3.72 - 3.0.5 


          3.63 - 3.0.5
          WordPress Plugin:
          ThemeGrill Demo Importer
          Added check if user can manage options to prevent privilege escalationCOVERAGE, COVERAGE+CLEAN1.6.1 - 1.3.4
          WordPress Plugin:
          WP Supercache
          Added checks in settings page to prevent authenticated remote code execution (RCE)

          Persistent XSS on cached page
          CORE, COVERAGE, COVERAGE+CLEAN1.7.1 - 1.4.5




          0.x, 1.0, 1.1, 1.2, 1.3.x and 1.4.x
          Drupal Module:
          Coder
          SA-CONTRIB-2016-039CORE, COVERAGE, COVERAGE+CLEAN7.x and 8.x
          Drupal Module:
          RESTWS
          SA-CONTRIB-2016-040CORE, COVERAGE, COVERAGE+CLEAN7.x
          Drupal Module:
          Webform Multifile
          SA-CONTRIB-2016-038CORE, COVERAGE, COVERAGE+CLEAN6.x and 7.x
          LibraryVulnerability / FixBundle / PlanVersion(s) covered by patches
          GenericonsXSS in Genericons example fileCORE, COVERAGE, COVERAGE+CLEANWordPress 4.0.x and Genericons 3.1
          PHPMailerCVE-2020-36326
          CVE-2018-19296
          CVE-2016-10033
          CVE-2016-10045
          CORE, COVERAGE, COVERAGE+CLEAN5.2.4 - 6.4.0
          5.2.4 - 6.4.0
          5.0.0 - 5.2.18
          5.0.0 - 5.2.20
          PhpUnitPrevent remote code execution of Util/PHP/eval-stdin.php via HTTP POST data beginning with "<?php " substringCOVERAGE, COVERAGE+CLEAN8.5.0 - 2.2.0

          # What does the error "Registration key required but not present!" mean?

          You may see the following error in the logfiles at /var/log/patchman/patchman.log:

          ERROR: Registration key required but not present! Please enter your key for registration purposes (/etc/patchman/license/key)
          @@ -47,6 +47,6 @@
           
           Install? [y/N]
           

          Real-time scanning will automatically start within 5 minutes of this installation.

          # What is required for real-time scanning?

          This feature requires the Linux Audit Framework to be enabled, which is part of the Linux kernel by default on all our supported distributions. It might be disabled if you use a custom kernel; in that case, refer to your compilation parameters.

          Most configurations (including defaults) for the Linux Audit Framework are safe to use with Patchman real-time scanning. However, if you have customized it, we strongly recommend you check the following 2 settings:

          • Depending on your distribution, check /etc/audit/auditd.conf or /etc/audispd/audispd.conf for a setting called overflow_action. The values ignore or syslog are safe. We do not support this value being set to suspend, single or halt.
          • Check the output of the command auditctl -s, and verify that the line starting with failure is set to either 0 or 1. We do not support this value being set to 2.

          Configuring the above against our recommendations would risk inadvertent halting or suspension of your server as an unwanted side effect, and as such we strongly advise against such configuration if you are using Patchman real-time scanning. We can’t provide support for problems of any sorts if your configuration goes against the above recommendations.

          # Which limitations does real-time scanning have?

          In our initial release, real-time scanning is not always able to properly resolve events in chrooted environments. The most common scenario affected by this is uploading a file by FTP, if the FTP daemon is configured to use chroots, as is common across control panel software. We are currently working on improvements in our next release which will capture such events correctly.

          If you are unsure whether our implementation is catching or missing events, feel free to contact us so we can take a look if we can do more to improve our solution for your needs!

          - + diff --git a/patchman/getting_started/index.html b/patchman/getting_started/index.html index 5df4943..d1912bb 100644 --- a/patchman/getting_started/index.html +++ b/patchman/getting_started/index.html @@ -29,11 +29,11 @@ })(); Getting started - +
          sidebar hamburger menu

          # Getting started

          # Logging into the Patchman Portal

          This guide is meant for people who have a Patchman Portal account, who are attempting to log in or seeking aid in resetting their password.

          If you don't have an account yet and are interested in trying Patchman, you can sign up for our free Insights trial here: https://portal.patchman.co/user/signup/.

          In order to get started, you can navigate to the Patchman management portal, found at https://portal.patchman.co/user/login/.

          The portal is the central environment that allows you to manage and configure Patchman, as well as to gain insight regarding the problems it finds and fixes for your servers and users.

          # Entering your credentials and logging in

          The login page asks for three credentials;

          Hitting "Sign me in" on this page will log you into your Patchman portal account if the provided credentials have been entered correctly.

          # Recovering your credentials

          There are three distinct methods to recover your credentials, should you lose them:

          • Organization identifier

            • You can find the organization identifier on the original email sent to you upon creation of the Portal account, assuming you have not changed it in the interim.
            • If you no longer have your sign-up email or have changed it since account creation and subsequently lost it, you can always reach out to support to recover your organization identifier.
          • Email address

            • If you no longer know the email address with which you signed up for Patchman, you can reach out to support for aid in recovering your account.
          • Password

            • If you no longer know your password, you can reset it via the link on the login page (or by direct navigation to https://portal.patchman.co/user/reset/). Note that this requires that you know your email address and organization identifier.

          As always, if you have any questions or if anything remains unclear after reading this article, don't hesitate to reach out to support for further assistance!

          # Adding your first server

          When you've just signed up for Patchman, the first thing you will want to do is add a server to start scanning for vulnerabilities. This only takes a few minutes and requires just a few simple steps.

          Step 1: Find your license key

          Make sure you are logged in to the Patchman Portal at https://portal.patchman.co. Navigate to the "Add server" option in the menu bar on the left side of the screen.

          Located here is your license key, that you will need during the installation of the agent on a new server.

          If this key is compromised, you can revoke it and generate a new one.

          Step 2: Install agent

          On the command line of the server you would like to install Patchman on, execute the following command:

          wget https://download.patchman.co/install-patchman.sh && /bin/bash -e install-patchman.sh && rm -f install-patchman.sh
           

          This downloads the install script for the Patchman agent, installs the agent, and then starts the Patchman daemon. The install script uses your operating systems' package manager (apt or yum) to install the agent, and performs a few checks to make sure your server is suitable for installing Patchman.

          During the installation, the script will ask you for the license key you found in step one. After entering the key, the server will request and set up a license for your server and start connecting to the Portal.

          Step 3: Verify installation

          When the Patchman agent on the server is running, it is time to confirm the connection to your account in the Portal.

          In step 3 of the "Add server" window in the Portal, there is a button called "Verify addition". When you click this button, the Portal will check if it can connect with your server, which if successful should give you a message like this:

          When you see this message on your dashboard, you can click the message's link to add your new server. The only thing you need to do now is to verify the information and approve the connection of the server:

          Once you have verified the process went well, your first server has been added successfully!

          Troubleshooting

          Please note that it might take a while for your server to connect to the Portal. This can depend on the amount of traffic we currently have queued. Any disturbances in our service are reported on the dashboard and on our status page. If the server is not connecting after you've installed the agent, please double-check if Patchman is running correctly on your server. If the agent is running without any issues, please allow for some time for the server to connect. A message will automatically pop up on your dashboard once your server has connected to the Portal.

          In the rare case your agent is running correctly, there is no reported service disruption and the server still hasn't appeared after an hour, please contact our support department for assistance.

          # Insights Quick Start Guide

          This guide is meant for people who have newly signed up for the Patchman Insights trial. In this brief guide you'll go from the signup process to taking a look at detections for your server(s).

          If you don't have an account yet, and are interested in trying Patchman, you can sign up for our free Insights trial here: https://portal.patchman.co/user/signup/.

          Step 1: Access the Portal

          In order to get started, log onto the Patchman management portal, found at https://portal.patchman.co

          The Portal is the central environment that allows you to manage and configure Patchman, as well as gain insight regarding the problems it finds and fixes for your servers and users.

          Step 2: Adding the first server

          Once you're logged in, the next step is to add your first server so you can start scanning. You can click the Portal's Dashboard notification:

          Or navigate to the "Add server" option in the left hand menu:

          On the Add server page, you can find the instructions for installing the Patchman Agent on the server you're adding, and for adding and activating the license key that allows the agent  to be linked to your Portal account.

          Step 3: Set scan times

          If desired, you can now navigate to the "Servers" menu option, in order to configure the scan timing for the newly added server:

          This allow you to determine when Patchman should run the daily scan for this server, usually during low activity hours. For even more configurability, you can use the 'Server Groups' section, and then the (default) group you added the server to, to set Nice value and I/O priority for the Patchman agent:

          Step 4: A first look at Detections

          Once the server has been scanned by Patchman, you can go to the "Detections" or "Dashboard" portal options, to review the results for your platform. Detections especially will give you a very clear overview, across your entire platform as well as per server and per user, of what vulnerabilities and malware Patchman can find and Patch / quarantine.

          Additionally, clicking on the 'Description' can offer you more information regarding a specific vulnerability of malware file.

          Any issue shown through these overviews can be automatically resolved by Patchman when using the full version of the software. Additionally, you can configure any number of policies you want Patchman to use when dealing with detections.

          This includes determining whether you notify your end-users and when, and customising the email templates to use for these notifications. This creates a flexible and powerful channel through which to inform and educate your end-users, and show them that you're on top of security with their best interests in mind.

          Step 5: Learn more

          If you have any questions about detection results for your servers, or want to know more about features or volume pricing for the full Patchman product, feel free to reach out to us by requesting a quote through the "Get a quote" Portal option.

          You can find the option in the left hand menu, or through this URL: https://portal.patchman.co/subscriptions/quote/

          This also allows you to provide some additional data about your platform size and configuration, and include any comments or questions you might have about Patchman.

          Alternatively, you can always send us an email.

          Ready to buy?

          If you're ready to buy and start Patching vulnerabilities on your servers, you can navigate to the upgrade page within the portal, which can be found at this URL (or Via the Billing > Change Plan option):

          https://portal.patchman.co/subscriptions/change/

          # Contact us

          If you wish to open a support ticket, please send an email to support@patchman.co. Include as much information as you can regarding your question or problem, including:

          • Your organization identifier
          • The server it concerns (hostname or IP)
          • Any relevant logs (e.g. from /var/log/patchman) or error messages (e.g. screenshots from the Patchman Portal)

          We strive to respond to you within 1 business day.

          - + diff --git a/patchman/imunify/index.html b/patchman/imunify/index.html index f2bfa58..a90b077 100644 --- a/patchman/imunify/index.html +++ b/patchman/imunify/index.html @@ -29,12 +29,12 @@ })(); Migrating to new agent - +
          sidebar hamburger menu

          # Migrating to new agent

          # Overview

          Patchman now offers enhanced malware scanning capabilities powered by Imunify360 technology. This migration is voluntary and provides advanced malware detection and cleanup capabilities while maintaining the familiar Patchman portal experience.

          # What's New

          • Enhanced malware detection and cleanup.
          • Integration with Imunify360 scanning technology.
          • Full retention of Patchman portal functionality.

          # Important Migration Notes

          • Migration is optional and not automatic.
          • After migration, files cannot be restored from the Patchman quarantine.
          • Imunify creates backups of all cleaned files.
          • Patchman portal functionality remains unchanged.

          # Migration Process

          Prerequisites

          • SSH access to the server with root privileges.
          • Active Patchman installation.

          Migration Steps

          Download the Imunify deployment script:

          wget https://repo.imunify360.cloudlinux.com/defence360/imav-deploy.sh -O imav-deploy.sh
           

          Run the script:

          bash imav-deploy.sh
           

          Post-Migration Verification

          After installation is complete, verify that:

          • Server agent has been successfully upgraded.
          • Patchman portal shows the correct server status.
          • Scanning features are accessible through the control panel.

          # Frequently Asked Questions

          Q: Do I have to migrate?
          A: No, migration is entirely optional. You can continue using your current version of Patchman.

          Q: Will the Patchman portal experience change?
          A: No, the Patchman portal interface and functionality remain exactly the same.

          Q: Can I migrate multiple servers at once?
          A: No, the migration script must be run individually on each server.

          Q: What happens to my existing security settings?
          A: Your current security configurations will be preserved while gaining access to enhanced scanning capabilities.

          # Support

          If you have questions or need assistance with the migration process, please contact Patchman support team.

          - + diff --git a/patchman/index.html b/patchman/index.html index a196281..7907be0 100644 --- a/patchman/index.html +++ b/patchman/index.html @@ -29,10 +29,10 @@ })(); Patchman - +
          sidebar hamburger menu

          # Patchman

          Getting started


          Frequently Asked Questions


          Policies


          Portal


          Agent (patchman-client)


          Platform Integrations

          - + diff --git a/patchman/platform_integrations/index.html b/patchman/platform_integrations/index.html index 3ac3ce8..17a9da9 100644 --- a/patchman/platform_integrations/index.html +++ b/patchman/platform_integrations/index.html @@ -29,7 +29,7 @@ })(); Platform Integrations - +
          sidebar hamburger menu

          # Platform Integrations

          # Using Patchman with a non-standard control panel

          Patchman provides out-of-the-box integrations for the cPanel, DirectAdmin and Plesk control panels. If you are not using one of these panels, Patchman will show the following message in the logs:

          ERROR: Could not determine platform software, unable to activate integrations
          @@ -66,6 +66,6 @@
           			<errtext>Protocol version '1.6.6.0' is not supported. Current protocol version is '1.6.3.5'</errtext>
           		</system>	</packet>'
           

          Your version of Plesk is too old for Patchman integration. Please refer to What are the minimal requirements for running Patchman?


          # How do I activate my Plesk-bought Patchman license?

          # Linking your first license

          When purchasing a license for Patchman through the Plesk extensions catalog, it needs to be linked to an account in the Patchman Portal to start using it. However, in order to link a Patchman Portal account, there are some requirements.

          A Portal account will only be eligible for linking when:

          • It is still on the Patchman Insights trial
          • It does not have any registered servers yet, except (optionally) the server for which you are linking a license

          If you are unsure of whether you have registered servers, You can check this by viewing the server overview: https://portal.patchman.co/servers/

          In many cases, if you don’t already have an active Portal account that is eligible for linking, a straightforward solution is to simply create a new one. This can be done through the Portal signup page, here.

          Once you have an account that can be linked, you can open the extension in Plesk and it will ask you for the organization identifier of your account. Enter the identifier in the extension, and the linking will automatically be completed.

          # Linking more licenses

          Once you have an account that has one Plesk-bought license linked to it, you can safely link more. This way, you can manage all servers with licenses bought through Plesk easily in one single Portal account. There is no need to create a separate account for each individual license/server.

          # Potential problems

          If you get an error during linking, please check the following:

          • Is the organization identifier used during the activation process typed correctly? Make sure you are using the identifier, and not your email address, name or business name.
          • Is the server for which you’re trying to activate a Plesk-bought license already registered to a different Patchman Portal account? In this case, you need to remove the server from the existing account first.
          • Is your Portal account currently on a paid plan, such as CORE, COVERAGE or COVERAGE+CLEAN? Unfortunately, you can’t mix licenses from Plesk with licenses bought through the Portal. You need to create a new, separate account to link the Plesk-bought license to.
          • Does your Portal account currently have multiple registered servers, which you all want to link to Plesk-bought licenses? Unfortunately, it is not possible to link multiple licenses at the same time. Please remove all servers from the Portal first, and then complete the linking process for one server at a time.

          If you have to remove a server from the Portal for any of the above reasons, please note that historical detection data will be permantently destroyed. It is not possible to retain history for servers when transitioning between accounts, or from a Portal-bought license to a Plesk-bought license.

          # Additional help

          Naturally, if you run into trouble during this process, you can always contact us for help. When doing so, we recommend expediting the support process by supplying:

          • the IP address of the server you are attempting to activate the license for, as well as
          • the organization identifier of the Portal account you are attempting to add it to.

          This will enable us to offer swift assistance.


          - + diff --git a/patchman/policies/index.html b/patchman/policies/index.html index d28bb05..5700447 100644 --- a/patchman/policies/index.html +++ b/patchman/policies/index.html @@ -29,10 +29,10 @@ })(); Policies - +
          sidebar hamburger menu

          # Policies

          # Policy notification settings

          The policy settings in the Patchman backend dictate when a user is notified of actions taken regarding detections of malware and vulnerabilities. Emails are sent every 30 minutes and always group the actions taken in the last 30 minutes. In the case that multiple detections for the same user are not registered in the same half hour window, the user may receive multiple notifications in a short period of time. Actions are only grouped by their action type (i.e. applicable template); users may receive multiple notifications at the same time if different actions were taken.

          You can specify the email templates when adding or modifying a policy. Each action can have their own notification email template in all supported Patchman languages.

          • Some actions are instructions to the server, for instance the instruction to patch a vulnerability or quarantine malware. You can schedule these actions to automatically take place several hours after a detection. If you set a notification for these kinds of actions, the notification is sent after the action was reported as completed by the server. Note, however, that no notification is sent of any action manually issued through the Patchman web interface.
          • The second kind of actions are those that are not instructions to the server and are typically status updates from the server, e.g. when a new detection was made. You can't schedule these, but you can specify in the policy that you want to send a notification when these actions occur.
          • Finally, you can send reminders for detections. These can be scheduled and complete automatically after the set amount of hours.

          General notification limitations

          Notifications are not sent in several cases. These relate to the presence of the email template and the source of the action. Listed below are the exclusion criteria for email notifications:

          1. Users are never notified of actions taken in the Patchman web interface, independent of who performed this action. Please note that detections resulting from manual scan tasks are not considered manual actions and may result in notifications.
          2. A user is not notified if there is no valid email address known at the time of notification.
          3. A user is not notified if there was no appropriate email template present for the policy at the time of detection, even if one is present at the time of sending the notification.
          4. A user is not notified if the email template that was assigned at the time of detection, was deleted afterwards. Creating a replacement template does not reassign it to previous detections.
          5. A user is not notified if the email template is not active at the time of sending the notification. It does not matter what the state was at the time of detection.

          All detections use the policy that applied at the time of detection. Therefore, changing the policy of a user, does not change the applicable email template. However, changing the previously applicable policy does update the email template for past detections.

          Advanced policy tasks

          When enabling "Show advanced tasks", you get the option of setting a task for handling retracted definitions for both Vulnerabilities and Malware.

          The "definition retracted" state is triggered when our definitions have changed. This means that we have decided that a detection should no longer be considered as vulnerability or malware.

          This option has been placed under the advanced tasks section, because under normal circumstances this state should not be triggered. Our team takes much care reviewing every vulnerability and malware before releasing the definitions, to prevent cases where unnecessary detections are made.

          Notified user level settings

          A policy allows you to set the 'notified user level'. This is used to determine which user receives the notification. While you may choose to always send the notification to the affected user, you may also want to send the reseller of this user, or even the administrator in the panel of choice.

          The following table lists four different types of users: the administrator user, the reseller user, users created by resellers (not the admin) and (non-reseller) users created by the administrator (i.e. where the adminstrator acted as reseller).

          Notified user levelDetection in adminDetection in resellerDetection in user of resellerDetection in user of admin
          adminadminadminadminadmin
          reselleradminresellerreselleradmin
          useradminreselleruseruser
          descendant of adminadminresellerreselleruser

          While determining the notified user, the user tree is traversed bottom-up, i.e. if the user is lower than the required level, the parent of this user is inspected. This repeats until at least the requested level is found. If no appropriate parent is found, the highest parent is used instead.

          For instance, if you have selected 'admin' as the notified user level, but you only have reseller users, resellers will receive notifications instead.

          If you wish to use other combinations, you should choose different default policies for users and resellers in the server group settings.

          The applicable notified user level is taken from the policy that applied at the time of detection. Changing policies does not change the applicable notified user level, while changing the settings in the original policy does update the setting for existing detections.

          # Policy applicability

          You can use policies to determine how your end users are getting notified of new detections and which actions you wish to automatically execute for your end users.

          Each server group has default reseller and default user policy settings. The default reseller policy applies to all reseller users and to all users of resellers. The default user policy applies to all users that have no intermediate reseller user. This distinction allows for the common case where the users of a reseller should be handled more conservatively. The admin user itself will use the default user policy (and not the default reseller policy as one might expect).

          It is possible to override the policy on a per-user basis. This policy then applies to the user itself, but also for all children of this end user, e.g. if a reseller has policy A set, policy A will also apply to the reseller's users.

          User levelApplicable policy (tried in order)
          admin1. Admin policy
          2. Default user policy
          reseller1. Reseller policy
          2. Default reseller policy
          user of reseller1. User policy
          2. Reseller policy
          3. Default reseller policy
          user of admin1. User policy
          2. Admin policy
          3. Default user policy

          # Email template editing

          For each message that is sent out by Patchman on behalf of your organization, you can fully customize the layout and contents. The layout and contents are specified on a per-policy basis, giving you the flexibility to provide different experiences for different users.

          Each template consists of two parts:

          • A HTML template. This is the message most users will see when they open their email client and gives you the ability to include images and rich text layouts. However, note that most email clients are very limited in their HTML capabilites. By default, we will inline all CSS for you when rendering the email, but you should still verify the emails render like you expect them to in the most popular email clients.
          • A text template. This is the simplified version of your HTML template and can only contain simple text. This is used by all clients that don't support HTML. When editing your HTML template (base templates excluded), we will automatically try to get a text template out of it.

          When editing your template, you can choose between a simple rich text editor and an HTML editor. While the rich text editor can be useful, it could get complex when using lots of Mustache tags (see below). If this is the case, we recommend switching to the HTML editor when you want more advanced capabilities.

          Please note that due to safety concerns, JavaScript and linking to external stylesheets is not allowed within a template. It is not possible to save your template as long as there is disallowed code in the HTML.

          We show a live preview for the template using an example Mustache context, but note that this rendering is only indicative and the actual email may look different (due to email client limitations, but also due to CSS inlining). To more accurately verify the rendering of your email templates, you could use the 'Send test email' option. This will send a message to your own email address, allowing you to view how your email is actually rendered.

          Base templates

          Since you may want to use the same base template for all mails in the same policy, we offer you the ability to specify a base template for both HTML and text templates. This allows you to dumb-down the actual mail templates to the message itself and focus less on its presentation.

          Base templates must contain a placeholder for the actual message contents and a placeholder for the Patchman branding. Please ensure that the branding is visible and not obscured by any other element.

          Since base templates can get very complex, we do not offer a full editor for these kind of templates. If you do not know anything about HTML, you could stick to the default template we provided for you, or build one yourself, for instance using Zurb's Ink.

          Special tags

          To include information in the email templates, we use Mustache, which is a very simple template engine. Below you'll find a short primer on Mustache's syntax. If you need more information, you can find the full documentation online.

          Tag TypeDescription
          VariablesUsing {{var}} will display the value of the variable. If it is not available, an empty string will be displayed instead:

          <br>Dear {{username}},<br>
          VerbatimIf you need to include a variable unescaped (e.g. in text templates), use {{&var}} instead.
          Sections: listWhen the variable is a list, you can use sections to repeat the same block multiple times. Inside the section, you can access the attributes of the individual list items:

          <br>{{#detections}}<br>We found a detection of {{name}}.<br>{{/detections}}<br>
          Sections: conditionalSimilarly, sections work as conditional statements. When a variable is optional, the data within the section is only shown when the variable is available:

          <br>{{#definition_multiple}}<br>The detection consists of {{definition_count}} vulnerabilities<br>{{/definition_multiple}}<br>
          Sections: invertIf you need to invert the statement, i.e. show a message in the case of an empty list or untrue variable, you can use the caret:

          <br>{{^definition_multiple}}<br>The detection consists of only one vulnerability.<br>{{/definition_multiple}}<br>
          CommentsIf you need to place a comment in your template, you can do so using {{! comment }}
          PartialsYou can include partials using {{>partial}}. A partial is a subtemplate and is used only by the policy generic templates to include the sub-templates.

          You must always include the {{>content}} and {{>branding}} partial in your templates.

          Template Context

          The following data is available in all templates:

          usernameThe username of the affected user
          domainsA list of all domains of this user
          domainA single comma-separated string of affected domains
          affected_domainsA list of all domains with detections of this user
          affected_domainA single comma-separated string of affected domains
          server_hostnameThe hostname of the detection's server
          server_ip_addressThe IP address of the detection's server
          detectionsA list of detections
          .domainsA list of domains affected by this detection
          .domainA single comma-separated string of affected domains
          .definitionsA list of definitions that are found in this file
          .nameThe name of this definition
          .typeThe type of this definition
          .definition_countThe amount of definitions
          .definition_multipleA boolean indicating whether multiple definitions were found
          .directoryA single comma-separated strin gof affected directories
          .directoriesA list of all directories affected
          .applicationsA list of all software applications
          .applicationA single comma-separated string of applications
          .filesA list of affected file paths
          .fileA single comma-separated string of file paths

          # Setting operational hours

          By default, policy notifications can be sent 24/7 by Patchman. The exact time a notification is sent is determined by the time the detection was originally made, and by the relative delay settings in your policy. This means that detections can very well be patched at night, or in the weekend, and notifications could be sent at those times as well.

          This behavior can be undesirable in some situations. You may not have support staff on hand to deal with questions following a detection in the weekend, for example. For this reason, we have a feature that allows you to set your operational hours. This feature defines the time ranges in which actions can be executed by Patchman. You are able to configure a time range per day of the week, including options for "all day" and "not at all".

          The operational hours are based on the time zone for the organization or suborganization that owns the policy. This timezone can be set in the Company Profile page.

          To set up the operational hours for a policy, go to the Policies page, select the policy you want to edit and go to the "Operational hours" section. Here, you can enable this feature, and configure the custom schedule.

          Please note that the operational hours come with trade-offs in efficacy and resource management. Vulnerabilities and malware detections will not be resolved outside of operational hours, which means that your servers and users will stay vulnerable until the next window of operational hours.

          Secondly, shifting Patchman's operational hours to align with your business hours means that actions can be concentrated and executed during the hours that your server is busiest. Consider if this change in load distribution is acceptable for your situation, and disable or adjust the operational hours accordingly.

          # Modifications to server groups and policies

          When you are managing your servers, server groups and policies through the Patchman web interface, you may be warned that some actions apply immediately, while others apply only for new detections.

          Server group modifications

          The following applies when:

          • updating a server group, or
          • modifying the server group to which a server belongs

          Note that a server group only specifies default settings and these can be overridden for individual users. These settings will never affect individual settings.

          SettingDescription
          Language overrideIf set: Effective immediately.

          If unset: Requires a user refresh from the server before all language settings are updated, retaining the previous value until this refresh has occurred. This refresh is not automatically scheduled.
          Default policySee below.

          Policy modifications

          By modifying a policy, some settings will apply immediately and others will only affect new detections. The following list shows which settings are affected:

          SettingsDescription
          Notification parentEffective immediately for all future notifications based on this policy.
          End user loginEffective immediately.
          Block suspendedIs only applied after the suspension state at the server is updated. This means that existing suspended users will not have their tasks automatically blocked when changing (or conversely, that currently blocked tasks are not automatically unblocked).

          Furthermore, if this setting is set to off, currently blocked tasks are never automatically unblocked, even if the user's suspension state is modified.
          Automatic actionsEffective only for new detections.
          Notifications enabledEffective immediately to all existing detections. This setting is only inspected at the moment of notification.

          Changing the policy of the user does not affect this setting.
          Email templateIf the template is created, it applies only to new detections.

          If the template is modified, it applies immediately to all notifications that were created based on this template.

          If the template is deleted, it is deleted for all pending notifications. No notification will be sent anymore for these.

          Changing the policy of the user does not affect the email template.
          - + diff --git a/patchman/portal/index.html b/patchman/portal/index.html index a9c8cd0..b33d3d3 100644 --- a/patchman/portal/index.html +++ b/patchman/portal/index.html @@ -29,11 +29,11 @@ })(); Portal - +
          sidebar hamburger menu

          # Portal

          # What permissions do the different user roles have?

          Permissions in the Portal are managed by three roles. These roles are:

          • Owner
          • Manager
          • Staff

          Owners have full permissions. Managers have the limitation that they cannot view billing related pages and that they cannot manage sub-organizations. Staff users can only view detections and perform actions on them (i.e. patch, undo, etc.).

          StaffManagerOwner
          Billing
          View invoice
          Change credit card
          Sub-organizations
          Add
          Change
          Delete
          User accounts (for organization Portal access)
          Add
          Change
          Delete
          Approved e-mail domains
          Add
          Delete
          Servers
          Add
          Change
          Delete
          Server groups
          Add
          Change
          Delete
          Policies
          Add
          Change
          Delete
          Change e-mail templates
          Change default e-mail template
          Event log
          View
          End users
          Change
          Detections
          View

          # What are the minimum browser requirements for the Patchman Portal?

          In order to make optimal use of the Patchman Portal, the following minimum browser versions are required. Note that if you are using an unlisted browser or an older browser version, we cannot guarantee full Portal functionality.

          BrowserVersionDate
          Chrome58Apr 2017
          Firefox54Jun 2017
          Edge15Aug 2016
          Safari10Sep 2016
          Opera55Aug 2017

          # Reporting malware to Patchman

          You can report malicious files that the solution does not currently detect to Patchman in a variety of ways. By doing this, you're helping us protect your platform, but also those of other Patchman users through the concept of herd immunity; if only a single Patchman customer finds and reports a malicious file, it may end up (if valid) being quarantined / cleaned across all servers protected by Patchman.

          Regardless of the submission method, malware will be thoroughly checked and tested before being added to our detection database (either as a file hash for exact matching, or as a dynamic signature in CLEAN).

          Once it is, Patchman will be able to detect & quarantine/clean said across your entire platform.

          # How to report a malicious file

          # Via the command-line using patchman-report

          You can report malware to us directly on the command line on any server that has the Patchman agent installed. In order do do this, simply call the command 'patchman-report' followed by the path to the malicious file:

          patchman-report /path/to/file.php
           

          # Via the API

          You can also report malware via the Patchman portal API, using the following endpoint. Note that this can also be used to submit malware via the browser: https://portal.patchman.co/api/v1/report/


          # Detection states and actions

          In the Patchman Portal, every detection has their own state. The following states are defined:

          StateDescription
          UNRESOLVEDThe detection is new or no action has been taken yet.
          RESOLVEDThe detection has been resolved.
          BLOCKEDNo automatically scheduled actions will be executed for this detection. (Manual actions will still be executed.)
          REVERTEDThe detection was resolved, but the fix has been reverted putting the file back in its original state.
          RETRACTEDThe detection has been resolved, because the file was changed (outside of Patchman) or has been removed. Most likely the end user has updated his CMS to a newer version.
          Exclusive to Patchman CLEAN
          PENDING CHANGEDetection of malicious code occurred and clean scheduled, but pending review by Patchman.
          REQUIRES ATTENTIONDetection of malicious code occurred and clean scheduled, but unable to clean automatically. Review by website owner required.

          The following actions are available for detections:

          ActionDescription
          PatchResolve the vulnerability by patching the file.
          QuarantineResolve the malware detection by moving it to quarantine.
          DeleteResolve the malware detection by removing the file.

          NB! This action is permanent and cannot be reverted.
          Undo patchRevert the vulnerability fix by restoring the original file.
          Undo quarantineRevert the malware by fix restoring the original file.
          BlockBlock all automatically scheduled tasks of the detection.
          UnblockResume all automatically schedule tasks of the detection.
          Exclusive to Patchman CLEAN
          CleanRemove detected malicious code from the file, leaving the file in place.
          Undo cleanRevert the removal of detected malicious code from the file.

          # Organization identifier

          Every organization in the Portal has its own organization identifier. This identifier consists of a unique combination of letters (a-z), numbers (0-9), underscores (_) and hyphens (-). The maximum length of the identifier is 50 characters.

          The organization identifier is automatically generated based on the name of your organization. You can check the generated identifier in your organization profile in the Portal. If you are not satisfied with the identifier that was generated for your organization, you can always update it in this view.

          You are required to enter this identifier alongside your password and email address during the login process for the Patchman Portal. The identifier is also a part of your login URL. This enables you to bookmark the page, in order to avoid having to enter your organization identifier each time you want to log in.

          If you did not receive an email containing your organization's identifier, or in case you lose the email and do not remember the identifier, please reach out to our support department for assistance.


          # Status page subscriptions

          Any incidents regarding the services of Patchman will be communicated through our status page. If you subscribe to our status page you will receive email notifications with updates about the status of our services, including information about planned maintenance.

          The subscriptions to our status page can now be managed from the Portal. Each Portal user can subscribe to the notifications, and users with the "owner" role can manually add email addresses in the organization management page. Organization owners can also manage subscriptions by unsubscribing users.

          Subscribing as a user

          You can subscribe to our status page updates by going to your profile (under "My account") and check or uncheck the "Get notifications from the status page" option. The notifications will be sent to the email address set in your profile. Please note that you will receive an email which contains instructions on how to confirm your subscription.

          Manual subscriptions

          Organization owners can manually add email addresses to receive updates of our status page. This enables users without a Portal account to receive our status page notifications. All subscriptions for an organization can be managed in the status page view, under the Company section of the Portal.

          Please note that our subscription system checks for duplicate email addresses. If a user subscribed to the notifications, but his/her email address gets added manually as well, the updates will only be sent to that address once.


          # Control panel user level equivalents

          Patchman gathers some metadata from each end user of your servers to determine its permission level. This concerns the user level (e.g. reseller or admin) and the parent user (e.g. a reseller or admin user).

          If a user acts on multiple user levels, e.g. reseller and user, or admin and reseller, Patchman considers the highest level the user level.

          Patchman itself considers the following user levels:

          Patchman levelDirectAdmin equivalentCPanel equivalentPlesk equivalent
          adminadminadminadmin
          resellerresellerresellerreseller
          useruserusercustomer
          - + diff --git a/terminology/index.html b/terminology/index.html index 5ced256..dc733e5 100644 --- a/terminology/index.html +++ b/terminology/index.html @@ -29,10 +29,10 @@ })(); Terminology - +
          sidebar hamburger menu

          # Terminology

          Black List is a list of IPs automatically blocked by Imunify360 without access to Anti-bot Challenge and manually blocked by a user.

          Gray List is a list of IPs that will be redirected to Anti-bot Challenge to pass verification. Once the IP passes Anti-bot Challenge, it will be unblocked and removed from Gray List.

          White List is a list of IPs that will not be blocked in any case.

          Sensor – 3rd party applications and services that serve as agents to detect the suspicious activity of different types. Imunify360 central server also serves as one of the sensors.

          IDS – the Intrusion Detection System (IDS) is a software application that monitors a network or systems for malicious activity or policy violations.

          Incident – a detected event on the server that is qualified as suspicious activity.

          Ignore list – the list of files and folders that Malware Scanner will ignore during automatic and manual scan processes.

          IP – IPv4 or IPv6 address (corresponding to 64 bits subnet prefix length).

          Whitelisted domain – no Anti-bot Challenge will be shown while visiting a whitelisted domain from a graylisted IP.

          - + diff --git a/uninstall/index.html b/uninstall/index.html index e5a53fe..4839773 100644 --- a/uninstall/index.html +++ b/uninstall/index.html @@ -29,7 +29,7 @@ })(); Uninstall - +
          sidebar hamburger menu

          # Uninstall

          # How to stop Imunify360

          For CentOS6/CloudLinux6, run the following command:

          service imunify360 stop
          @@ -41,6 +41,6 @@
           

          to remount CageFS and remove files from user's local directories as after uninstalling these files are not removed automatically and can generate errors to Apache log.

          See also: Imunify360/AV uninstallation FAQ.

          # How to disable updates

          Starting from Imunify360 v.4.10, if you need to disable Imunify360 then you need to disable updates as well by editing cron file and comment out the update command.

          CloudLinux OS/CentOS

          /etc/cron.daily/imunify360.cron
           

          Ubuntu

          /etc/cron.daily/imunify360-firewall
           
          - + diff --git a/update/index.html b/update/index.html index 4b211f1..bb3b350 100644 --- a/update/index.html +++ b/update/index.html @@ -29,7 +29,7 @@ })(); Update Guide - +
          sidebar hamburger menu

          # Update Guide

          Note

          Updates are unconditionally enabled and the Imunify360 service starts during the package update.

          # Gradual roll-out

          New stable Imunify360 versions are scheduled for the gradual roll-out from our production repository and are available for all customers in about two weeks or less from the release.

          If you do not want to wait for the gradual roll-out, you can update Imunify360 to the latest version by running the following commands:

          wget -O imunify-force-update.sh https://repo.imunify360.cloudlinux.com/defence360/imunify-force-update.sh
          @@ -59,6 +59,6 @@
           

          release-upgrade will require manually edit Imunify repositories before enabling them.

          Debian 9 (supported up to Imunify v6.11 (including)), 10, and 11 systems:

          apt-get update
           apt-get install --only-upgrade imunify360-firewall
           
          - + diff --git a/user_interface/index.html b/user_interface/index.html index 297e028..ea7d6d5 100644 --- a/user_interface/index.html +++ b/user_interface/index.html @@ -29,10 +29,10 @@ })(); User Interface - +
          sidebar hamburger menu

          # User Interface

          There are following tabs in the Imunify360 end user interface:

          # Files

          Go to Imunify360 → Files tab. Here, there is a table with a list of infected files.

          The table has the following columns:

          • Detected — displays the exact time when a file was detected as malicious
          • File — the path where the file is located starting with root
          • Reason — describes the signature which was detected during the scanning process. Names in this column depend on the signature vendor. You can derive some information from the signature ID itself. SMW-SA-05155-wshll – in this Signature ID:
            • The first section can be either SMW or CMW. SMW stands for Server Malware and CMW stands for Client Malware
            • The second section of ID can be either INJ or SA. INJ stands for Injection (means Malware is Injected to some legitimate file) and SA stands for StandAlone (means File is Completely Malicious)
            • The third section is 05155. This is simply an identification number for the signature.
            • The fourth section wshll/mlw.wp/etc explains the category and class of malware identified. Here, wshll stands for web shell (mlw stands for malware).
            • The fifth section is 0, which provides the version number of the signature.
          • Status — displays the file status:
            • Infected — threat was detected after scanning. If a file was not cleaned after cleanup, the info icon is displayed. Hover mouse over info icon to display the reason
            • Cleaned — infected file is cleaned up
            • Content removed — a file content was removed after cleanup
            • Cleanup queued — infected file is queued for cleanup. Actions:
          • Add to Ignore List — add file to Ignore List and remove it from the Malicious files list. Note that if a file is added to Ignore List, Imunify360 will no longer scan this file
          • View file — click eye icon in the file line and the file content will be displayed in the popup. Only the first 100Kb of the file content will be shown in case if a file has bigger size
          • Cleanup — click to cleanup the file.
          • Delete — remove the file from the server and from the list of Malicious files.
          • Restore original — click Restore original to restore original file after cleaning up if backup is available.

          To perform a bulk action, tick required users and click the corresponding button above the table.

          The following filters are available:

          • Timeframe — displays the results filtered by chosen period or date.
          • Status — displays the results filtered by chosen status.
          • Items per page displayed — click the number at the table bottom.

          The table can be sorted by detection date (Detected), file path (File), Reason, and Status.

          If a user is allowed by an administrator to scan his files, he can see the Start scanning button.

          # History

          History tab contains data of all actions for all files. Go to Imunify360 → History tab. Here, there is a table with a list of files.

          The table has the following columns:

          • Date — action timestamp.
          • Path to File — path to the file starting from the root.
          • Cause — displays the way malicious file was found:
            • Manual — scanning or cleaning was manually processed by a user.
            • On-demand — scanning or cleaning was initiated/made by a user;
            • Real time — scanning or cleaning was automatically processed by the system.
          • Owner — displays a user name of file owner.
          • Initiator — displays the name of a user who was initiated the action. For system actions the name is System.
          • Event — displays the action with the file:
            • Detected as malicious — after scanning the file was detected as infected;
            • Cleaned — the file is cleaned up.
            • Failed to clean up — there was a problem during cleanup. Hover mouse over the info icon to read more.
            • Added to Ignore List — the file was added to Ignore List. Imunify360 will not scan it.
            • Restored original — file content was restored as not malicious.
            • Cleanup removed content — file contend was removed after cleanup.
            • Deleted from Ignore List — the file was removed from Ignore List. Imunify360 will scan it.
            • Deleted — the file was deleted.
            • Submitted for analysis — the file was submitted to Imunify team for analysis.
            • Failed to delete — there was a problem during removal. Hover mouse over the info icon to read more.
            • Failed to ignore — there was a problem during adding to Ignore List. Hover mouse over the info icon to read more.
            • Failed to delete from ignore — there was a problem during removal from Ignore List. Hover mouse over the info icon to read more.

          The table can be sorted by Date, Path to File, Cause, and Owner.

          # Ignore List

          Ignore List tab contains the list of files and directories that are excluded from Malware Scanner scanning. Go to Imunify360 → Ignore List tab. Here, there is a table with a list of files.

          The table has the following columns:

          • Added — the date when the file was added to Ignore List.
          • Path — path to the file starting from the root.
          • Actions:
            • Remove from Ignore List — click Bin icon to remove the file from the Ignore List and start scanning.
            • Add new file or directory — click Plus icon to add a new file or directory to Ignore List. To perform a bulk action, tick required files and click the corresponding button above the table.

          The following filters are available:

          • Timeframe — displays the results filtered by chosen period or date.
          • Items per page displayed — click the number at the table bottom.

          The table can be sorted by Added and Path. By default, it is sorted from newest to oldest.

          - + diff --git a/whmcs_plugin/index.html b/whmcs_plugin/index.html index 8593827..8a65f74 100644 --- a/whmcs_plugin/index.html +++ b/whmcs_plugin/index.html @@ -29,10 +29,10 @@ })(); WHMCS Plugin - +
          sidebar hamburger menu

          # WHMCS Plugin

          WHMCS Plugin description can be found in CLN Documentation.

          - + diff --git a/whmcs_plugin/whmcs_saved.html b/whmcs_plugin/whmcs_saved.html index 1ad29aa..0804013 100644 --- a/whmcs_plugin/whmcs_saved.html +++ b/whmcs_plugin/whmcs_saved.html @@ -29,11 +29,11 @@ })(); Imunify360 WHMCS Plugin - +
          sidebar hamburger menu

          # Imunify360 WHMCS Plugin

          # Overview

          CloudLinux Licenses For WHMCS allows you to automatically provision CloudLinux, Imunify360, and KernelCare licenses along with selected products. You can provision them for free or as a paid add-on to your product. Owing to CloudLinux Licenses add-on, all module commands on your main product are automatically reproduced on the license product.

          Admin Area Functionality

          • Create license
          • Terminate license
          • Suspend/Unsuspend license (only IP-based licenses)
          • Change license IP address
          • View license details

          Client Area Functionality

          • View license details
          • Change license IP address

          Addon Functionality

          • Manage relations between addon and license product
          • Manage relations between server and license product
          • Manage relations between configurable options and license product
          • Automatically add license product to order when relation is triggered
          • View existing license
          • Dependencies between module actions – every action: Create, Terminate, Suspend or Unsuspend called on the server product will result with the same action performed on the licensed products
          • Flexible filtering of existing licenses

          Additionally

          • Multi-Language Support – only provisioning module
          • Supports CloudLinux, KernelCare and Imunify360 Licenses
          • Supports WHMCS V6 and later

          # Installation and Configuration

          In this section we will show you how to set up our products.

          # Installation and Update

          1. Download CloudLinux Licenses For WHMCS:
          2. Upload archive to your WHMCS root folder and extract it. Files should automatically jump into their places.
          3. Run the following script:
          php <whmcs_root>/clDeploy.php --migrate
           

          Note

          If your hosting requires specific files permissions, change them accordingly in the folder: <whmcs_root>/modules/servers/CloudLinuxLicenses

          # Configuration of Product

          1. Log into your WHMCS admin area and go to Setup → Products/Services → Products/Services. Click Create a New Group
          2. Fill Product Group Name (product group will be visible under that name in your WHMCS system) and click Save Changes
          3. Click Create a New Product. Choose Other from Product Type drop-down menu and previously created product group from Product Group drop-down menu.
          4. Fill Product Name and click Continue.
          5. Set up this product as hidden through marking Hidden checkbox at Details tab. Do not set up pricing for this product, it will be done in another way.
          6. Go to the Module Settings tab and select CloudLinux Licenses from Module Name drop-down.
          7. Fill Username and Password with your CloudLinux API access details (you can find them on your CLN profile page, username is your login and password is API secret key) and select Imunify360 from Product drop-down, then choose desired License Type. If you'd like to use key based licenses, tick Create Key based license checkbox.
          8. Click Save Changes to confirm.
          9. Setup desired Auto-setup options.

          Note

          You can use the CloudLinux license module as an individual product. By default, for IP license a client’s IP address defined while ordering is used. You can change license IP in service settings (as an administrator or a user). If you want to use a custom field to get the correct IP during the order, you should create a custom field with any field name where IP phrase is used.

          Example:

          # Configuration of Add-on

          1. Go to Setup → Add-on Modules, find CloudLinux Licenses Add-on and click Activate next to it.
          2. The next step is permitting access to this module. Click Configure, select admin roles and confirm by clicking Save Changes.

          Fig 1: Imunify360 License For WHMCS provisioning module configuration.

          Fig 2: Imunify360 License For WHMCS add-on module main page.

          # Management

          In this section you can find two ways of linking license product with your server product as well as other possibilities of the module.

          In order to allow your client to decide whether he wants to order a server with or without the license, we will use Product Add-on. In this way, when the client orders an add-on, the relation will be triggered and the license product will be ordered along with the module.

          The following steps must be performed to prepare such connection:

          1. Go to Setup → Products/Services → Products Add-ons and click Add New Add-on.
          2. Fill addon name, set up billing cycle and price. Then tick Show on Order checkbox, assign add-on to the product and click Save Changes.

          Fig 3: Configuration of product add-on, which will trigger license product adding.

          1. Go to Add-ons → CloudLinux Licenses Add-on → Add-on Relations and click Add Relation.
          2. Select previously created product add-on and license product as shown below and click Add Relation.

          Fig 4: Creating relation between product add-on and provisioning module.

          If you want to offer server along with the license, perform the following steps.

          Note

          Please do not set up pricing for license provisioning product. In exchange, you can increase a price for server provisioning product.

          1. Prepare license provisioning product as described in the Configuration of Product section of this documentation.
          2. Go to Add-ons → CloudLinux Licenses Add-on → Products Relations and click Add Relation.
          3. Select server provisioning product from the Main product drop-down list and license provisioning product from the Linked Product With License and click Add Relation.

          Fig 5: Creating relations directly between server and license provisioning modules.

          In order to allow your client to decide whether he wants to order server with or without license we can use Configurable Options ( https://docs.whmcs.com/Addons_and_Configurable_Options).

          Below we will show what steps to proceed to prepare such connection:

          1. Configure CloudLinuxLicenses product as described here.
          2. Go to Setup → Products/Services → Configurable Options and click Create a New Group.
          3. Fill group name and add New Configurable Option, set up billing cycle, price and option type. Then save changes.
          4. Go to Add-ons → CloudLinux Licenses Add-on → Configurable Options Relations and click Add Relation.
          5. Choose appropriate configurable option and license product which it is assigned to and click Add relation.

          Notes

          • Plugin doesn’t support “quantity” type of Configurable Options
          • A related product can’t contain two (or more) products with the same license type
          • If you have changed Dedicated IP of the main product, then each related IP-based product will terminate an old IP license and create a new one for a new IP

          Fig 6: Creating relation directly between server and license provisioning modules.

          WHMCS 7.2 introduces the ability to associate Product Add-ons with Provisioning Modules.

          In order to allow your client to decide whether he wants to order server with or without license we will use product addon. Below we will show you what steps to proceed to prepare such connection:

          1. Go to Setup → Products/Services → Products Add-ons and click Add New Add-on.
          2. Fill add-on name, set up billing cycle and price. Then tick Show on Order checkbox, assign add-on to product.
          3. Go to the Module Settings tab and select CloudLinux Licenses from Module Name drop-down.
          4. Fill Username and Password with your CloudLinux API access (API secret key) details and select desired license type from License Type drop-down. Click Save Changes to confirm.

          Fig 7: Configuration of product add-on with Provisioning Modules.

          # Imunify360 Key Licenses

          1. To set Imunify360 Key license while adding service in Module Settings, do the following:

            • choose Imunify360 in License Type drop-down
            • mark Use Key (instead of IP address) checkbox
            • enter IP registration token (API secret key) from Profile page in CLN
            • in Max Users field enter the number of users per server
            • in Key Limit field enter the number of servers and click Save Changes

          Fig 8: Imunify360 Product settings.

          • the License Key Custom Field will be automatically added
          • the License Key Custom Field is displayed while editing service
          1. To edit service do the following:
            • when Service Created Successfully message appears, you can edit Service
            • enter information and settings and click Save Changes

          Fig 9: Imunify360 Service settings.

          # Order

          All the services registered in the account are displayed in My Products & Services area. When you choose a particular Product/Service and click View Details, you can view Product information, change license key, view Add-ons or make changes in Management Actions section.

          Fig 10: Client’s products list.

          Fig 11: Licenses details.

          To order and purchase a new service do the following:

          • choose Category → Imunify360 Group and click Order Now on a particular service

          Fig 12: Order - Products group.

          • choose Billing Cycle if possible
          • enter information in Configure Server area
          • choose Available Add-ons and click Continue Shopping to proceed or Checkout to view service details

          Fig 13: Order - Configure product.

          • enter Promotional Code in a specific field if you have one
          • choose Payment Method and click Continue Shopping

          Fig 14: Order - review and checkout.

          # Admin Area

          From the admin area it is possible to command such actions as create, terminate, suspend/unsuspend and change IP address. Nonetheless, these actions can be ordered only on the server provisioning module and will be automatically reproduced for the license provisioning product.

          Only change IP address functionality have to be ordered manually.

          You can also view the details of created license.

          Fig 15: Imunify360 Licenses For WHMCS admin area.

          # Client Area

          The clients are also able to view their servers license details. And as well as you, they are able to change IP address of their licenses.

          Fig 16: Imunify360 Licenses For WHMCS Client Area.

          To change IP address, click Change as shown on the screen above. Then specify IP address and click Save.

          Fig 17: Changing License IP Address.

          # Licenses List

          You can view the list of all licenses owned by your client at our add-on → Licenses List. You can filter the list of licenses by client name, server provisioning products, license provisioning products and license IP address/Key.

          Fig 18: Licenses List.

          # Add-on Licenses ListWHMCS 7.2.x+

          You can view list of all product add-on with Provisioning Modules licenses owned by your client at our addon → Licenses List.

          Fig 19: Add-on Licenses List.

          # Common Problems

          After activating the server provisioning product, license provisioning product bounded to it is still pending.

          Reason: License IP address may be already taken. Solution: Change server IP address.

          - +