Providers/Modules/Plugins/Antimalware/plugin/collectmcafeeinfo.rb (240 lines of code) (raw):

require "rexml/document" require "cgi" require 'digest' require 'json' require 'date' require 'time' require 'logger' require_relative 'antimalwarecommon' class McAfee def self.detect() begin if !File.file?('/opt/isec/ens/threatprevention/bin/isecav') return false end detectioncmd = `/opt/isec/ens/threatprevention/bin/isecav --version 2>&1`.lines.map(&:chomp) if !$?.success? || detectioncmd.nil? || detectioncmd.empty? return false else mcafeeName = detectioncmd[0] mcafeeVersion = detectioncmd[1].split(" : ")[1] if mcafeeName != "McAfee Endpoint Security for Linux Threat Prevention" return false elsif mcafeeVersion.split(".")[0].to_i < 10 return false end end return true rescue => e return false end end def self.getprotectionstatus() ret = {} mcafeeName = "McAfee Endpoint Security for Linux Threat Prevention" mcafeeVersion = "NA" datVersion = "NA" datTime = "NA" engineVersion = "NA" quickscan = "NA" fullscan = "NA" datengupdate = "NA" onaccessscan = "NA" gti = "NA" accessprotection = "NA" scandate = "" protectionStatusDetails = "" protectionStatusDetailsString = "" protectionStatusDetailsArray = [] fullscanoutofdate = false quickscanoutofdate = false error = "" ($ProtectionStatusRank, $ProtectionStatus) = AntimalwareCommon::UnknownProtectionCode ($ThreatStatusRank, $ThreatStatus) = AntimalwareCommon::UnknownThreatCode begin detectioncmd = `/opt/isec/ens/threatprevention/bin/isecav --version 2>&1`.lines.map(&:chomp) if !$?.success? || detectioncmd.nil? || detectioncmd.empty? error += "Fail to get mcafee version info; " else mcafeeVersion = detectioncmd[1].split(" : ")[1] datVersion = detectioncmd[3].split(" : ")[1] datTime = detectioncmd[4].split(" : ")[1] engineVersion = detectioncmd[5].split(" : ")[1] end taskcmd = `LANG=en_US.UTF-8 /opt/isec/ens/threatprevention/bin/isecav --listtask 2>&1`.lines.map(&:chomp) if !$?.success? || taskcmd.nil? || taskcmd.empty? error += "fail to run listtask cmd; " else $i = 3 $len = taskcmd.length while $i < $len-1 do if taskcmd[$i].include? "quick scan" if taskcmd[$i].include? "Not Applicable" quickscan = "NA" else quickscanarray = taskcmd[$i].split(" ") quickscanStatus = 'NA' quickscan, quickscanStatus = parseMcAfeeDateTime(quickscanarray) if quickscan == "NA" protectionStatusDetailsArray.push("Fail to parse quickscan date: " + taskcmd[$i]) end if quickscanStatus != 'NA' protectionStatusDetailsString += "Quick scan status: " + quickscanStatus + ". " end end elsif taskcmd[$i].include? "full scan" if taskcmd[$i].include? "Not Applicable" fullscan = "NA" else fullscanarray = taskcmd[$i].split(" ") fullscanStatus = 'NA' fullscan, fullscanStatus = parseMcAfeeDateTime(fullscanarray) if fullscan == "NA" protectionStatusDetailsArray.push("Fail to parse fullscan date: " + taskcmd[$i]) end if fullscanStatus != 'NA' protectionStatusDetailsString += "Full scan status: " + fullscanStatus + ". " end end elsif taskcmd[$i].include? "DAT and Engine Update" if taskcmd[$i].include? "Not Applicable" datengupdate = "NA" else datengupdatearray = taskcmd[$i].split(" ") datengupdateStatus = 'NA' datengupdate, datengupdateStatus = parseMcAfeeDateTime(datengupdatearray) if datengupdate == "NA" protectionStatusDetailsArray.push("Fail to parse DAT Engine update date: " + taskcmd[$i]) end if datengupdateStatus != 'NA' protectionStatusDetailsString += "DAT Engine update status: " + datengupdateStatus + ". " end end end $i +=1 end end oascmd = `/opt/isec/ens/threatprevention/bin/isecav --getoasconfig --summary 2>&1`.lines.map(&:chomp) if !$?.success? || oascmd.nil? || oascmd.empty? error += "fail to run getoasconfig cmd; " else if (oascmd[0].include? "On-Access Scan") onaccessscan = oascmd[0].split(": ")[1].strip end if (oascmd[3].include? "GTI") gti = oascmd[3].split(": ")[1].strip end end apcmd = `/opt/isec/ens/threatprevention/bin/isecav --getapstatus 2>&1`.lines.map(&:chomp) if !$?.success? || apcmd.nil? || apcmd.empty? error += "fail to run getapstatus cmd; " else if (apcmd[0].include? "Access Protection") accessprotection = apcmd[0].split(": ")[1].strip end end if (datTime == "NA" && datengupdate == "NA" ) ($ProtectionStatusRank, $ProtectionStatus) = AntimalwareCommon::NotReportingProtectionCode protectionStatusDetailsArray.push("DAT and Engine update not found") elsif (datTime == "NA" || (Time.strptime(datTime, "%d-%m-%Y") < (Time.now - 7*24*3600))) && (datengupdate == "NA" || datengupdate < (Time.now - 7*24*3600).utc) ($ProtectionStatusRank, $ProtectionStatus) = AntimalwareCommon::SignaturesOutOfDateProtectionCode protectionStatusDetailsArray.push("DAT and Engine update are out of 7 days: " + datengupdate.to_s) end if (!fullscan.nil? && fullscan != "NA") scandate = fullscan if (fullscan < (Time.now - 7*24*3600).utc) fullscanoutofdate = true end end if (!quickscan.nil? && quickscan != "NA") if (quickscan < (Time.now - 7*24*3600).utc) quickscanoutofdate = true end if ((fullscanoutofdate && !quickscanoutofdate) || scandate == "") scandate = quickscan end else ($ProtectionStatusRank, $ProtectionStatus) = AntimalwareCommon::ActionRequiredProtectionCode protectionStatusDetailsArray.push("Full Scan and quick Scan are Not Applicable, please run an active scan") end if (fullscanoutofdate && quickscanoutofdate) || (fullscanoutofdate && (quickscan.nil? || quickscan == "NA")) || (quickscanoutofdate && (fullscan.nil? || fullscan == "NA")) ($ProtectionStatusRank, $ProtectionStatus) = AntimalwareCommon::ActionRequiredProtectionCode protectionStatusDetailsArray.push("Both quick scan and full scan are out of 7 days, please run an active scan") end if (onaccessscan == "NA") ($ProtectionStatusRank, $ProtectionStatus) = AntimalwareCommon::NotReportingProtectionCode protectionStatusDetailsArray.push("On access scan status not found: " + onaccessscan) elsif (!onaccessscan.downcase.include? "enabled") ($ProtectionStatusRank, $ProtectionStatus) = AntimalwareCommon::NoRealTimeProtectionProtectionCode protectionStatusDetailsArray.push("On access scan is not enabled: " + onaccessscan) else protectionStatusDetailsString += "On access scan status: " + onaccessscan + ". " end if (gti != "NA") protectionStatusDetailsString += "GIT status: " + gti + ". " end if (accessprotection != "NA") protectionStatusDetailsString += "Access Protection status: " + accessprotection + ". " end if (datengupdate != "NA") protectionStatusDetailsString += "DAT and Engine update Time: " + datengupdate.to_s + ". " elsif(datTime != "NA") protectionStatusDetailsString += "DAT and Engine update Time: " + datTime.to_s + ". " end if protectionStatusDetailsArray.length == 0 ($ProtectionStatusRank, $ProtectionStatus) = AntimalwareCommon::RealTimeProtectionCode protectionStatusDetailsString += "McAfee is running healthy." protectionStatusDetails = protectionStatusDetailsString else protectionStatusDetails = protectionStatusDetailsArray.join('; ') end rescue => e error += "Getting exception when trying to find mcafee health info: " + e.message + " " + e.backtrace.inspect ret["Error"] = error end if(scandate != "") scanarray = scandate.to_s.split(" ") if (scanarray.length >= 3) scandate = scanarray[0] + " " + scanarray[1] end end ret["ProtectionStatusRank"] = $ProtectionStatusRank ret["ProtectionStatus"] = $ProtectionStatus ret["ProtectionStatusDetails"] = protectionStatusDetails ret["DetectionId"] = SecureRandom.uuid ret["Threat"] = "" ret["ThreatStatusRank"] = $ThreatStatusRank ret["ThreatStatus"] = $ThreatStatus ret["ThreatStatusDetails"] = "Threat Status is currently not supported in Linux McAfee" ret["Signature"] = (datVersion.nil? || datVersion.empty? || datVersion == "NA")? "Signature version not found" : datVersion ret["ScanDate"] = scandate ret["DateCollected"] = DateTime.now.strftime("%m/%d/%Y %H:%M") ret["Tool"] = mcafeeName ret["AMProductVersion"] = (mcafeeVersion.nil? || mcafeeVersion.empty? || mcafeeVersion == "NA")? "McAfee version not found" : mcafeeVersion return ret end def self.parseMcAfeeDateTime(datearray) $l = datearray.length scandate = 'NA' scanstatus = 'NA' if $l >= 4 if(!datearray[$l-3].include? "AM") && (!datearray[$l-3].include? "PM") scandate = datearray[$l-4] + " " + datearray[$l-3] + " " + datearray[$l-2] scandate = Time.strptime(scandate, '%d/%m/%y %H:%M:%S %Z') elsif $l >= 8 scandate = datearray[$l-7] + " " + datearray[$l-6] + " " + datearray[$l-5] + " " + datearray[$l-4] + " " + datearray[$l-3] + " " + datearray[$l-2] scandate = Time.strptime(scandate, '%d %b %Y %I:%M:%S %p %Z') end if $l >= 5 && (!datearray[4].include? "Not") scanstatus = datearray[4] end if $l >= 10 && (datearray[4].include? "task") && (!datearray[9].include? "Not") scanstatus = datearray[9] end end return scandate, scanstatus end end