@ -0,0 +1,6 @@
|
||||
[default]
|
||||
python.version = {default|python|python2|python3}
|
||||
* For Splunk 8.0.x and Python scripts only, selects which Python version to use.
|
||||
* Either "default" or "python" select the system-wide default Python version.
|
||||
* Optional.
|
||||
* Default: not set; uses the system-wide Python version.
|
||||
@ -0,0 +1,33 @@
|
||||
######################################################
|
||||
#
|
||||
# Splunk_TA_windows_admon
|
||||
# Custom: This is a sub-TA from the Splunk_TA_windows
|
||||
# application, that consist of only the admon input that
|
||||
# collects AD object and Attributes data from the
|
||||
# Active Directory environment. Note, it is recommended
|
||||
# to have this input enabled on Only one Domain Controller
|
||||
# or Windows system per AD Domain.
|
||||
# This input includes a single predefined input, [admon://default]
|
||||
# with the additional setting of baseline = 1 which is required
|
||||
# by the MS Windows AD Objects application. It
|
||||
# is provided by the MS Windows AD Objects application.
|
||||
# Copyright (C) 2020 Splunk Inc. All Rights Reserved.
|
||||
#
|
||||
######################################################
|
||||
|
||||
[install]
|
||||
is_configured = false
|
||||
state = enabled
|
||||
build = 1
|
||||
|
||||
[ui]
|
||||
is_visible = false
|
||||
label = admon Input from the Splunk Add-on for Microsoft Windows TA
|
||||
|
||||
[launcher]
|
||||
author = Splunk, Inc. Custom Splunkworks
|
||||
version = 8.0.0
|
||||
description = Splunk Add-on for Microsoft Windows with specific predefined admon input to collect Active Directory Object and Attributes data.
|
||||
|
||||
[package]
|
||||
id = Splunk_TA_windows_admon
|
||||
@ -0,0 +1,14 @@
|
||||
# Copyright (C) 2020 Splunk Inc. All Rights Reserved.
|
||||
# Custom TA Used by the MS Windows AD Objects application
|
||||
# Uses the Splunk_TA_windows TA
|
||||
# DO NOT EDIT THIS FILE!
|
||||
# Please make all changes to files in $SPLUNK_HOME/etc/apps/Splunk_TA_windows/local.
|
||||
# To make changes, copy the section/stanza you want to change from $SPLUNK_HOME/etc/apps/Splunk_TA_windows_admon/default
|
||||
# into $SPLUNK_HOME/etc/apps/Splunk_TA_windows_admon/local and edit there.
|
||||
#
|
||||
|
||||
[admon://default]
|
||||
disabled = 1
|
||||
monitorSubtree = 1
|
||||
baseline = 1
|
||||
#targetDc = enter hostname for a Domain Controller
|
||||
@ -0,0 +1,34 @@
|
||||
# MS Windows AD Objects provided pre-defined - admon input
|
||||
# - Custom Input Settings from the Splunk_TA_windows TA
|
||||
#
|
||||
# ---------------------------------------------------------------------------------------
|
||||
# NOTE:
|
||||
# *** This inputs.conf only contains the admon input, and should ONLY be placed
|
||||
# on one Windows System per AD Domain, preferably on a Domain Controller,
|
||||
# or it can be a member server. IF use a non-Domain Controller system, then the
|
||||
# SplunkForwarder service needs to be running as an AD Account with read access
|
||||
# to the target domain, and it is recommended to add the setting of targetDc
|
||||
# with the value as an AD Domain Controllers Hostname.
|
||||
# - For best performance running it from the local domain controller is the
|
||||
# best option.
|
||||
# ---------------------------------------------------------------------------------------
|
||||
#
|
||||
# Special Notes:
|
||||
# - **Important:
|
||||
# - The setting index=... has been added to the admon enabled input.
|
||||
# Make sure you have created the msad index or you can specify a different index.
|
||||
# - A baseline is create ONLY during the first iteration of data collection. So if you aren't seeing
|
||||
# any sourcetype=ActiveDirectory admonEventType="Sync" data returned in your splunk search view, then:
|
||||
# - 1. Stop the splunk Forwarder Service
|
||||
# - 2. Using Windows File Explorer go to
|
||||
# /SplunkUniversalForwarder/var/lib/splunk/persisstantstorage/AdMon directory.
|
||||
# - 3. Delete all of the .ini's from this directory (ie default.ini, etc)
|
||||
# - 4. Start the Splunk Forwarder Service
|
||||
# ---------------------------------------------------------------------------------------
|
||||
|
||||
[admon://default]
|
||||
disabled = 0
|
||||
monitorSubtree = 1
|
||||
baseline = 1
|
||||
index=msad
|
||||
#targetDc = enter hostname for a Domain Controller
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 25 KiB |
@ -0,0 +1,6 @@
|
||||
[default]
|
||||
python.version = {default|python|python2|python3}
|
||||
* For Splunk 8.0.x and Python scripts only, selects which Python version to use.
|
||||
* Either "default" or "python" select the system-wide default Python version.
|
||||
* Optional.
|
||||
* Default: not set; uses the system-wide Python version.
|
||||
@ -0,0 +1,89 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
& .\Invoke-MonitoredScript.ps1 "MyScript.ps1"
|
||||
|
||||
.DESCRIPTION
|
||||
Outputs additional Splunk events related to the running and
|
||||
errors in the script.
|
||||
#>
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
#Command to execute.
|
||||
[Parameter(Position=0, Mandatory=$true)]
|
||||
[ValidateNotNullOrEmpty()]
|
||||
[string] $Command,
|
||||
|
||||
# Splunk Sourcetype Prefix for generated events
|
||||
[Parameter()]
|
||||
[ValidateNotNull()]
|
||||
[string] $SourceTypePrefix="Powershell:",
|
||||
|
||||
# Maximum number of errors to convert into events
|
||||
[Parameter()]
|
||||
[ValidateRange(0, 100)]
|
||||
[int] $MaxErrorCount
|
||||
)
|
||||
|
||||
$WrappedScriptExecutionSummary= New-Object -TypeName PSObject -Property (
|
||||
[ordered]@{
|
||||
SplunkSourceType="$($SourceTypePrefix)ScriptExecutionSummary";
|
||||
Identity=[guid]::NewGuid().ToString();
|
||||
InvocationLine=$MyInvocation.Line;
|
||||
TerminatingError=$false; ErrorCount=0; Elapsed=""
|
||||
})
|
||||
$originalLocation = Get-Location
|
||||
|
||||
try
|
||||
{
|
||||
Set-Location (Split-Path -Parent $MyInvocation.MyCommand.Definition)
|
||||
$ScriptStopWatch = [System.Diagnostics.Stopwatch]::StartNew()
|
||||
$Error.Clear()
|
||||
Invoke-Expression $Command
|
||||
}
|
||||
catch
|
||||
{
|
||||
$WrappedScriptExecutionSummary.TerminatingError = $true;
|
||||
}
|
||||
finally
|
||||
{
|
||||
Set-Location $originalLocation
|
||||
$WrappedScriptExecutionSummary.Elapsed = $ScriptStopWatch.Elapsed.ToString("hh\:mm\:ss\.fff")
|
||||
$WrappedScriptExecutionSummary.ErrorCount = $Error.Count
|
||||
|
||||
if ($Error.Count -gt 0) {
|
||||
$ei = $Error.Count - 1
|
||||
if ($PSBoundParameters.ContainsKey('MaxErrorCount')) {
|
||||
if ($MaxErrorCount -lt $Error.Count) {
|
||||
$ei = $MaxErrorCount - 1
|
||||
}
|
||||
# Always emit terminating errors
|
||||
if ($ei -eq -1 -and $WrappedScriptExecutionSummary.TerminatingError) {
|
||||
$ei = 1
|
||||
}
|
||||
}
|
||||
|
||||
for(; $ei -ge 0; $ei--) {
|
||||
$errorRecord = New-Object -TypeName PSObject -Property (
|
||||
[ordered]@{
|
||||
SplunkSourceType="$($SourceTypePrefix)ScriptExecutionErrorRecord";
|
||||
ParentIdentity=$WrappedScriptExecutionSummary.Identity;
|
||||
ErrorIndex=$ei;
|
||||
ErrorMessage=$Error[$ei].ToString();
|
||||
PositionMessage=$Error[$ei].InvocationInfo.PositionMessage;
|
||||
CategoryInfo=$Error[$ei].CategoryInfo.ToString();
|
||||
FullyQualifiedErrorId=$Error[$ei].FullyQualifiedErrorId
|
||||
})
|
||||
|
||||
if ($Error[$ei].Exception -ne $null) {
|
||||
Add-Member -InputObject $errorRecord -MemberType NoteProperty -Name Exception -Value $Error[$ei].Exception.ToString()
|
||||
if ($Error[$ei].Exception.InnerException -ne $null) {
|
||||
Add-Member -InputObject $errorRecord -MemberType NoteProperty -Name InnerException -Value $Error[$ei].Exception.InnerException.ToString()
|
||||
}
|
||||
}
|
||||
|
||||
Write-Output $errorRecord
|
||||
}
|
||||
}
|
||||
|
||||
Write-Output $WrappedScriptExecutionSummary
|
||||
}
|
||||
@ -0,0 +1,111 @@
|
||||
import logging
|
||||
import logging.handlers as handlers
|
||||
import os.path as op
|
||||
import os
|
||||
import time
|
||||
try:
|
||||
from splunk.clilib.bundle_paths import make_splunkhome_path
|
||||
except ImportError:
|
||||
from splunk.appserver.mrsparkle.lib.util import make_splunkhome_path
|
||||
|
||||
logging.Formatter.converter = time.gmtime
|
||||
|
||||
__LOG_FORMAT__ = "%(asctime)s +0000 log_level=%(levelname)s, pid=%(process)d, " \
|
||||
"tid=%(threadName)s, file=%(filename)s, " \
|
||||
"func_name=%(funcName)s, code_line_no=%(lineno)d | %(message)s"
|
||||
|
||||
class Log(object):
|
||||
|
||||
def __init__(self, namespace=None, default_level=logging.INFO):
|
||||
self._loggers = {}
|
||||
self._default_level = default_level
|
||||
if namespace is None:
|
||||
namespace = self._get_appname_from_path(op.abspath(__file__))
|
||||
|
||||
if namespace:
|
||||
namespace = namespace.lower()
|
||||
self._namespace = namespace
|
||||
|
||||
def get_logger(self, name, level=None,
|
||||
maxBytes=25000000, backupCount=5):
|
||||
"""
|
||||
Set up a default logger.
|
||||
|
||||
:param name: The log file name.
|
||||
:param level: The logging level.
|
||||
:param maxBytes: The maximum log file size before rollover.
|
||||
:param backupCount: The number of log files to retain.
|
||||
"""
|
||||
|
||||
# Strip ".py" from the log file name if auto-generated by a script.
|
||||
if level is None:
|
||||
level = self._default_level
|
||||
|
||||
name = self._get_log_name(name)
|
||||
if name in self._loggers:
|
||||
return self._loggers[name]
|
||||
|
||||
logger = logging.getLogger(name)
|
||||
|
||||
logfile = make_splunkhome_path(["var", "log", "splunk", name])
|
||||
handler_exists = any(
|
||||
[True for h in logger.handlers if h.baseFilename == logfile])
|
||||
if not handler_exists:
|
||||
file_handler = handlers.RotatingFileHandler(
|
||||
logfile, mode="a", maxBytes=maxBytes, backupCount=backupCount)
|
||||
formatter = logging.Formatter(__LOG_FORMAT__ )
|
||||
file_handler.setFormatter(formatter)
|
||||
logger.addHandler(file_handler)
|
||||
logger.setLevel(level)
|
||||
logger.propagate = False
|
||||
|
||||
self._loggers[name] = logger
|
||||
return logger
|
||||
|
||||
def set_level(self, level, name=None):
|
||||
"""
|
||||
Change the log level of the logging
|
||||
|
||||
:param level: the level of the logging to be setLevel
|
||||
:param name: the name of the logging to set, in case it is not set,
|
||||
all the loggers will be affected
|
||||
"""
|
||||
|
||||
if name is not None:
|
||||
name = self._get_log_name(name)
|
||||
logger = self._loggers.get(name)
|
||||
if logger is not None:
|
||||
logger.setLevel(level)
|
||||
else:
|
||||
self._default_level = level
|
||||
for logger in self._loggers.values():
|
||||
logger.setLevel(level)
|
||||
|
||||
def _get_log_name(self, name):
|
||||
if name.endswith(".py"):
|
||||
name = name.replace(".py", "")
|
||||
|
||||
if self._namespace:
|
||||
name = "{}_{}.log".format(self._namespace, name)
|
||||
else:
|
||||
name = "{}.log" .format(name)
|
||||
return name
|
||||
|
||||
def _get_appname_from_path(self, absolute_path):
|
||||
absolute_path = op.normpath(absolute_path)
|
||||
parts = absolute_path.split(os.path.sep)
|
||||
parts.reverse()
|
||||
for key in ("apps", "slave-apps", "master-apps"):
|
||||
try:
|
||||
idx = parts.index(key)
|
||||
except ValueError:
|
||||
continue
|
||||
else:
|
||||
try:
|
||||
if parts[idx + 1] == "etc":
|
||||
return parts[idx - 1]
|
||||
except IndexError:
|
||||
pass
|
||||
continue
|
||||
#return None
|
||||
return "-"
|
||||
@ -0,0 +1,5 @@
|
||||
@echo off
|
||||
REM --------------------------------------------------------
|
||||
REM Copyright (C) 2020 Splunk Inc. All Rights Reserved.
|
||||
REM --------------------------------------------------------
|
||||
netsh interface ip show address
|
||||
@ -0,0 +1,58 @@
|
||||
Import-Module ActiveDirectory -ErrorAction SilentlyContinue
|
||||
|
||||
$ServerName = $env:ComputerName
|
||||
|
||||
$DomainController = Get-ADDomainController -Identity $ServerName
|
||||
$Domain = Get-ADDomain -Identity $DomainController.Domain
|
||||
$Forest = Get-ADForest -Identity $DomainController.Forest
|
||||
$ReplicationSite = Get-ADReplicationSite -Identity $DomainController.Site
|
||||
$Computer = Get-ADComputer -Identity $ServerName -Properties *
|
||||
$RootDSE = Get-ADRootDSE -Server $ServerName
|
||||
$RequiredServices = @( "ntfrs", "dfsr", "netlogon", "kdc", "w32time", "ismserv" )
|
||||
|
||||
$ISTG = ($DomainController.NTDSSettingsObjectDN -eq $ReplicationSite.InterSiteTopologyGenerator)
|
||||
$SYSVOL = (Get-SMBShare SYSVOL -ErrorAction SilentlyContinue)
|
||||
Try {
|
||||
$DnsRegister = [System.Net.Dns]::GetHostByName($DomainController.HostName)
|
||||
} Catch {
|
||||
# The Catch will set $DnsRegister = $null if the GetHostByName fails for some reason
|
||||
}
|
||||
$SchemaVersion= Get-ADObject -Filter * -SearchScope Base -Properties objectVersion `
|
||||
-SearchBase $RootDSE.schemaNamingContext
|
||||
$DCWeight = (Get-Item "HKLM:System\CurrentControlSet\Services\Netlogon\Parameters").GetValue("LdapSrvWeight", $null)
|
||||
if (!$DCWeight -or $DCWeight -eq $null -or $DCWeight -eq "") {
|
||||
$DCWeight = 100
|
||||
}
|
||||
$FSMORoles = ($DomainController | Select -Expand OperationMasterRoles | %{ $_.ToString().Replace("Master","") } )
|
||||
|
||||
$SvcRunning = @(Get-Service $RequiredServices | ? Status -eq "Running" | select -expand Name)
|
||||
$SvcStopped = @(Get-Service $RequiredServices | ? Status -ne "Running" | select -expand Name)
|
||||
$ProcsOK = (($SvcStopped.Count -eq 0) -or ($SvcStopped.Count -eq 1 -and ($SvcStopped[0] -eq "ntfrs" -or $SvcStopped[0] -eq "dfsr")))
|
||||
|
||||
New-Object PSObject -Property @{
|
||||
Server = $DomainController.Name
|
||||
DomainDNSName = $DomainController.Domain
|
||||
DomainNetBIOSName = $Domain.NetBIOSName
|
||||
DomainLevel = $Domain.DomainMode
|
||||
Site = $DomainController.Site
|
||||
ForestName = $DomainController.Forest
|
||||
ForestLevel = $Forest.ForestMode
|
||||
Created = $Computer.whenCreated
|
||||
Changed = $Computer.whenChanged
|
||||
GlobalCatalog = $DomainController.IsGlobalCatalog
|
||||
RODC = $DomainController.IsReadOnly
|
||||
Enabled = $DomainController.Enabled
|
||||
HighestUSN = $RootDSE.highestCommittedUSN
|
||||
SchemaVersion = $SchemaVersion.objectVersion
|
||||
DCWeight = $DCWeight
|
||||
IsIntersiteTopologyGenerator = $ISTG
|
||||
OperatingSystem = $DomainController.OperatingSystem
|
||||
ServicePack = $DomainController.OperatingSystemServicePack
|
||||
OSVersion = $DomainController.OperatingSystemVersion
|
||||
FSMORoles = $FSMORoles -join " "
|
||||
ServicesRunning = $SvcRunning -join ","
|
||||
ServicesNotRunning = $SvcStopped -join ","
|
||||
ProcsOK = $ProcsOK
|
||||
SYSVOLShare = ($SYSVOL -ne $null)
|
||||
DNSRegister = ($DnsRegister -ne $null)
|
||||
}
|
||||
@ -0,0 +1,17 @@
|
||||
Import-Module ActiveDirectory -ErrorAction SilentlyContinue
|
||||
|
||||
Get-ADReplicationPartnerMetaData -Target $env:ComputerName -PartnerType Inbound -Partition * | %{
|
||||
$src_host = Get-ADObject -Filter * -SearchBase $_.Partner.Replace("CN=NTDS Settings,","") `
|
||||
-SearchScope Base -Properties dNSHostName
|
||||
|
||||
New-Object PSObject -Property @{
|
||||
LastAttemptedSync = $_.LastReplicationAttempt
|
||||
LastSuccessfulSync = $_.LastReplicationSuccess
|
||||
type = "ReplicationEvent"
|
||||
usn = $_.LastChangeUsn
|
||||
src_host = $src_host.dNSHostName
|
||||
Result = $_.LastReplicationResult
|
||||
transport = $_.IntersiteTransportType
|
||||
naming_context = $_.Partition
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,74 @@
|
||||
Import-Module ActiveDirectory -ErrorAction SilentlyContinue
|
||||
#
|
||||
# Get the Information about this site
|
||||
#
|
||||
$ServerName = $env:ComputerName
|
||||
|
||||
$DC = Get-ADDomainController -Identity $ServerName
|
||||
$Site = Get-ADReplicationSite -Identity $DC.Site
|
||||
$Object = Get-ADObject -Filter * -SearchScope base -Properties * `
|
||||
-SearchBase $Site.DistinguishedName
|
||||
|
||||
$Location = if ($Object.location -eq $null) { "" } else { $Object.location }
|
||||
$ISTG = Get-ADDomainController -Filter `
|
||||
'NTDSSettingsObjectDN -eq $Site.IntersiteTopologyGenerator'
|
||||
$SiteLinks = Get-ADReplicationSiteLink -Filter 'SitesIncluded -eq $Site' -Properties *
|
||||
$AdjacentSites = ($SiteLinks | Select -Expand SitesIncluded | `
|
||||
Where-Object { $_ -ne $Site.DistinguishedName } | `
|
||||
Sort-Object | Get-Unique | `
|
||||
Foreach-Object { Get-ADReplicationSite $_ } )
|
||||
$Subnets = Get-ADReplicationSubnet -Filter 'Site -eq $Site'
|
||||
|
||||
########################################################################
|
||||
#
|
||||
# SITE
|
||||
#
|
||||
$SiteInfo = @(
|
||||
"Type=`"Site`""
|
||||
"ForestName=`"$($DC.Forest)`""
|
||||
"Site=`"$($Object.CN)`""
|
||||
"Location=`"$Location`""
|
||||
"IntersiteTopologyGenerator=`"$($ISTG.HostName)`""
|
||||
)
|
||||
$AdjacentSites | %{ $SiteLink += "AdjacentSite=`"$($_.Name)`"" }
|
||||
$SiteLinks | %{ $SiteInfo += "SiteLink=`"$($_.Name)`"" }
|
||||
$Subnets | %{ $SiteInfo += "Subnet=`"$($_.Name)`"" }
|
||||
Write-Output ($SiteInfo -join " ")
|
||||
#
|
||||
########################################################################
|
||||
#
|
||||
# SITELINK
|
||||
#
|
||||
$SiteLinks | %{
|
||||
# These values are not stored in the object unless you change them
|
||||
$cost = if ($_.Cost -eq $null) { 100 } else { $_.Cost }
|
||||
$options = if ($_.options -eq $null) { 0 } else { $_.options }
|
||||
$replInterval = if ($_.replInterval -eq $null) { 180 * 60 } else { $_.replInterval * 60 }
|
||||
$notifications = if ($options -band 0x01) { "True" } else { "False" }
|
||||
$reciprocal = if ($options -band 0x02) { "True" } else { "False" }
|
||||
$compression = if ($options -band 0x04) { "False" } else { "True" }
|
||||
|
||||
$SiteLink = @(
|
||||
"Type=`"SiteLink`""
|
||||
"ForestName=`"$($DC.Forest)`""
|
||||
"Name=`"$($_.Name)`""
|
||||
"Cost=`"$($_.Cost)`""
|
||||
"DataCompressionEnabled=$compression"
|
||||
"NotificationEnabled=$notifications"
|
||||
"ReciprocalReplicationEnabled=$reciprocal"
|
||||
"TransportType=$($_.InterSiteTransportProtocol)"
|
||||
"ReplicationIntervalSecs=$replInterval"
|
||||
)
|
||||
Write-Output ($SiteLink -join " ")
|
||||
}
|
||||
|
||||
$Subnets | Foreach-Object {
|
||||
$Subnet = @(
|
||||
"Type=`"Subnet`""
|
||||
"ForestName=`"$($DC.Forest)`""
|
||||
"Name=`"$($_.Name)`""
|
||||
"Site=`"$($Site.Name)`""
|
||||
"Location=`"$($_.Location)`""
|
||||
)
|
||||
Write-Output ($Subnet -join " ")
|
||||
}
|
||||
@ -0,0 +1,114 @@
|
||||
#
|
||||
# Determine the health and statistics of this Microsoft DNS Server
|
||||
#
|
||||
$Output = New-Object System.Collections.ArrayList
|
||||
$Date = Get-Date -format 'yyyy-MM-ddTHH:mm:sszzz'
|
||||
write-host -NoNewline ""$Date
|
||||
|
||||
# Name of Server
|
||||
$ServerName = $env:ComputerName
|
||||
write-host -NoNewline ""Server=`"$ServerName`"
|
||||
|
||||
#
|
||||
# Windows Version and Build #
|
||||
#
|
||||
$WindowsInfo = Get-Item "HKLM:SOFTWARE\Microsoft\Windows NT\CurrentVersion"
|
||||
$OS = $WindowsInfo.GetValue("ProductName")
|
||||
$OSSP = $WindowsInfo.GetValue("CSDVersion")
|
||||
$WinVer = $WindowsInfo.GetValue("CurrentVersion")
|
||||
$WinBuild = $WindowsInfo.GetValue("CurrentBuildNumber")
|
||||
$OSVER = "$WinVer ($WinBuild)"
|
||||
|
||||
write-host -NoNewline ""OperatingSystem=`"$OS`"
|
||||
write-host -NoNewline ""ServicePack=`"$OSSP`"
|
||||
write-host -NoNewline ""OSVersion=`"$OSVER`"
|
||||
|
||||
#
|
||||
# Required Processes Running
|
||||
# DNS Dnscache w32time
|
||||
#
|
||||
$RequiredServices = @( "DNS", "Dnscache", "w32time" )
|
||||
$srvr = @()
|
||||
$srvnr = @()
|
||||
foreach ($srv in $RequiredServices) {
|
||||
$status = (Get-Service $srv).Status
|
||||
if ($status -eq "Running") {
|
||||
$srvr += $srv
|
||||
} else {
|
||||
$srvnr += $srv
|
||||
}
|
||||
}
|
||||
|
||||
$ProcsOK = "False"
|
||||
if ($srvnr.Count -eq 0) {
|
||||
$ProcsOK = "True"
|
||||
}
|
||||
|
||||
$ServicesRunning = [string]::join(',', $srvr)
|
||||
$ServicesNotRunning = [string]::join(',', $srvnr)
|
||||
write-host -NoNewline ""ServicesRunning=`"$ServicesRunning`" ServicesNotRunning=`"$ServicesNotRunning`" ProcsOK=`"$ProcsOK`"
|
||||
|
||||
#
|
||||
# Settings for this DNS Server
|
||||
#
|
||||
$dnsInfo = Get-WmiObject -Namespace "root\MicrosoftDNS" -Class MicrosoftDNS_Server -ComputerName $ServerName
|
||||
|
||||
# See http://msdn.microsoft.com/en-us/library/windows/desktop/ms682725(v=vs.85).aspx for details
|
||||
write-host -NoNewline "" Name=`"$($dnsInfo.Name)`"
|
||||
write-host -NoNewline "" Version=`"$($dnsInfo.Version)`"
|
||||
write-host -NoNewline "" LogLevel=`"$($dnsInfo.LogLevel)`"
|
||||
write-host -NoNewline "" LogFilePath=`"$($dnsInfo.LogFilePath)`"
|
||||
write-host -NoNewline "" LogFileMaxSize=`"$($dnsInfo.LogFileMaxSize)`"
|
||||
write-host -NoNewline "" LogIPFilterList=`"$($dnsInfo.LogIPFilterList)`"
|
||||
write-host -NoNewline "" EventLogLevel=`"$($dnsInfo.EventLogLevel)`"
|
||||
write-host -NoNewline "" RpcProtocol=`"$($dnsInfo.RpcProtocol)`"
|
||||
write-host -NoNewline "" NameCheckFlag=`"$NameCheckFlag`"
|
||||
write-host -NoNewline "" AddressAnswerLimit=`"$($dnsInfo.AddressAnswerLimit)`"
|
||||
write-host -NoNewline "" RecursionRetry=`"$($dnsInfo.RecursionRetry)`"
|
||||
write-host -NoNewline "" RecursionTimeout=`"$($dnsInfo.RecursionTimeout)`"
|
||||
write-host -NoNewline "" DsPollingInterval=`"$($dnsInfo.DsPollingInterval)`"
|
||||
write-host -NoNewline "" DsTombstoneInteval=`"$($dnsInfo.DsTombstoneInteval)`"
|
||||
write-host -NoNewline "" MaxCacheTTL=`"$($dnsInfo.MaxCacheTTL)`"
|
||||
write-host -NoNewline "" MaxNegativeCacheTTL=`"$($dnsInfo.MaxNegativeCacheTTL)`"
|
||||
write-host -NoNewline "" SendPort=`"$($dnsInfo.SendPort)`"
|
||||
write-host -NoNewline "" XfrConnectTimeout=`"$($dnsInfo.XfrConnectTimeout)`"
|
||||
write-host -NoNewline "" BootMethod=`"$($dnsInfo.BootMethod)`"
|
||||
write-host -NoNewline "" AllowUpdate=`"$($dnsInfo.AllowUpdate)`"
|
||||
write-host -NoNewline "" UpdateOptions=`"$($dnsInfo.UpdateOptions)`"
|
||||
write-host -NoNewline "" DsAvailable=`"$($dnsInfo.DsAvailable)`"
|
||||
write-host -NoNewline "" DisableAutoReverseZones=`"$($dnsInfo.DisableAutoReverseZones)`"
|
||||
write-host -NoNewline "" AutoCacheUpdate=`"$($dnsInfo.AutoCacheUpdate)`"
|
||||
write-host -NoNewline "" NoRecursion=`"$($dnsInfo.NoRecursion)`"
|
||||
write-host -NoNewline "" RoundRobin=`"$($dnsInfo.RoundRobin)`"
|
||||
write-host -NoNewline "" LocalNetPriority=`"$($dnsInfo.LocalNetPriority)`"
|
||||
write-host -NoNewline "" StrictFileParsing=`"$($dnsInfo.StrictFileParsing)`"
|
||||
write-host -NoNewline "" LooseWildcarding=`"$($dnsInfo.LooseWildcarding)`"
|
||||
write-host -NoNewline "" BindSecondaries=`"$($dnsInfo.BindSecondaries)`"
|
||||
write-host -NoNewline "" WriteAuthorityNS=`"$($dnsInfo.WriteAuthorityNS)`"
|
||||
write-host -NoNewline "" ForwardDelegations=`"$($dnsInfo.ForwardDelegations)`"
|
||||
write-host -NoNewline "" SecureResponses=`"$($dnsInfo.SecureResponses)`"
|
||||
write-host -NoNewline "" DisjointNets=`"$($dnsInfo.DisjointNets)`"
|
||||
write-host -NoNewline "" AutoConfigFileZones=`"$($dnsInfo.AutoConfigFileZones)`"
|
||||
write-host -NoNewline "" ScavengingInterval=`"$($dnsInfo.ScavengingInterval)`"
|
||||
write-host -NoNewline "" DefaultRefreshInterval=`"$($dnsInfo.DefaultRefreshInterval)`"
|
||||
write-host -NoNewline "" DefaultNoRefreshInterval=`"$($dnsInfo.DefaultNoRefreshInterval)`"
|
||||
write-host -NoNewline "" DefaultAgingState=`"$($dnsInfo.DefaultAgingState)`"
|
||||
write-host -NoNewline "" EDnsCacheTimeout=`"$($dnsInfo.EDnsCacheTimeout)`"
|
||||
write-host -NoNewline "" EnableEDnsProbes=`"$($dnsInfo.EnableEDnsProbes)`"
|
||||
write-host -NoNewline "" EnableDnsSec=`"$($dnsInfo.EnableDnsSec)`"
|
||||
write-host -NoNewline "" ForwardingTimeout=`"$($dnsInfo.ForwardingTimeout)`"
|
||||
write-host -NoNewline "" IsSlave=`"$($dnsInfo.IsSlave)`"
|
||||
write-host -NoNewline "" EnableDirectoryPartitions=`"$($dnsInfo.EnableDirectoryPartitions)`"
|
||||
write-host -NoNewline "" Started=`"$($dnsInfo.Started)`"
|
||||
write-host -NoNewline "" StartMode=`"$($dnsInfo.StartMode)`"
|
||||
write-host -NoNewline "" Status=`"$($dnsInfo.Status)`"
|
||||
|
||||
foreach ($ip in $dnsInfo.Forwarders) {
|
||||
write-host -NoNewline "" Forwarder=`"$ip`"
|
||||
}
|
||||
foreach ($ip in $dnsInfo.ServerAddresses) {
|
||||
write-host -NoNewline "" ServerAddress=`"$ip`"
|
||||
}
|
||||
foreach ($ip in $dnsInfo.ListenAddresses) {
|
||||
write-host "" ListenAddress=`"$ip`"
|
||||
}
|
||||
@ -0,0 +1,79 @@
|
||||
#
|
||||
# DNS Zone Information
|
||||
#
|
||||
function Get-WmiCount($a) {
|
||||
if ($a -eq $Null) {
|
||||
$cnt = 0
|
||||
} elseif ($a.GetType().Name -eq "ManagementObject") {
|
||||
$cnt = 1
|
||||
} else {
|
||||
$cnt = $a.Length
|
||||
}
|
||||
|
||||
$cnt
|
||||
}
|
||||
|
||||
function Output-Zoneinfo($Zone) {
|
||||
#$Output = New-Object System.Collections.ArrayList
|
||||
$Date = Get-Date -format 'yyyy-MM-ddTHH:mm:sszzz'
|
||||
write-host -NoNewline $Date Zone=`"$($Zone.Name)`" Aging=`"$($Zone.Aging)`" AllowUpdate=`"$($Zone.AllowUpdate)`" AutoCreated=`"$($Zone.AutoCreated)`" AvailForScavengeTime=`"$($Zone.AvailForScavengeTime)`" Caption=`"$($Zone.Caption)`" ContainerName=`"$($Zone.ContainerName)`" DataFile=`"$($Zone.DataFile)`" DnsServerName=`"$($Zone.DnsServerName)`" DsIntegrated=`"$($Zone.DsIntegrated)`" ForwarderSlave=`"$($Zone.ForwarderSlave)`" ForwarderTimeout=`"$($Zone.ForwarderTimeout)`" LastSuccessfulSoaCheck=`"$($Zone.LastSuccessfulSoaCheck)`" LastSuccessfulXfr=`"$($Zone.LastSuccessfulXfr)`" NoRefreshInterval=`"$($Zone.NoRefreshInterval)`" Notify=`"$($Zone.Notify)`" Paused=`"$($Zone.Paused)`" RefreshInterval=`"$($Zone.RefreshInterval)`" Reverse=`"$($Zone.Reverse)`" SecureSecondaries=`"$($Zone.SecureSecondaries)`" Shutdown=`"$($Zone.Shutdown)`" Status=`"$($Zone.Status)`" UseWins=`"$($Zone.UseWins)`" ZoneType=`"$($Zone.ZoneType)`"
|
||||
|
||||
# Some information on the zone itself - # record by type and total
|
||||
$ZoneName = $Zone.Name
|
||||
|
||||
$SOA = Get-WmiObject -namespace "root\MicrosoftDNS" -class MicrosoftDNS_SOAType -ComputerName $env:ComputerName -Filter "DomainName = '$ZoneName'"
|
||||
$SOAlen = Get-WmiCount($SOA)
|
||||
write-host -NoNewline ""SOA=$SOAlen
|
||||
|
||||
$NS = Get-WmiObject -namespace "root\MicrosoftDNS" -class MicrosoftDNS_NSType -ComputerName $env:ComputerName -Filter "DomainName = '$ZoneName'"
|
||||
$NSlen = Get-WmiCount($NS)
|
||||
write-host -NoNewline ""NS=$NSlen
|
||||
|
||||
$A = Get-WmiObject -namespace "root\MicrosoftDNS" -class MicrosoftDNS_AType -ComputerName $env:ComputerName -Filter "DomainName = '$ZoneName'"
|
||||
$Alen = Get-WmiCount($A)
|
||||
write-host -NoNewline ""A=$Alen
|
||||
|
||||
$AAAA = Get-WmiObject -namespace "root\MicrosoftDNS" -class MicrosoftDNS_AAAAType -ComputerName $env:ComputerName -Filter "DomainName = '$ZoneName'"
|
||||
$AAAAlen = Get-WmiCount($AAAA)
|
||||
write-host -NoNewline ""AAAA=$AAAAlen
|
||||
|
||||
$CNAME= Get-WmiObject -namespace "root\MicrosoftDNS" -class MicrosoftDNS_CNAMEType -ComputerName $env:ComputerName -Filter "DomainName = '$ZoneName'"
|
||||
$CNAMElen = Get-WmiCount($CNAME)
|
||||
write-host -NoNewline ""CNAME=$CNAMElen
|
||||
|
||||
$MX = Get-WmiObject -namespace "root\MicrosoftDNS" -class MicrosoftDNS_MXType -ComputerName $env:ComputerName -Filter "DomainName = '$ZoneName'"
|
||||
$MXlen = Get-WmiCount($MX)
|
||||
write-host -NoNewline ""MX=$MXlen
|
||||
|
||||
$SRV = Get-WmiObject -namespace "root\MicrosoftDNS" -class MicrosoftDNS_SRVType -ComputerName $env:ComputerName -Filter "DomainName = '$ZoneName'"
|
||||
$SRVlen = Get-WmiCount($SRV)
|
||||
write-host -NoNewline ""SRV=$SRVlen
|
||||
|
||||
$HINFO= Get-WmiObject -namespace "root\MicrosoftDNS" -class MicrosoftDNS_HINFOType -ComputerName $env:ComputerName -Filter "DomainName = '$ZoneName'"
|
||||
$HINFOlen = Get-WmiCount($HINFO)
|
||||
write-host -NoNewline ""HINFO=$HINFOlen
|
||||
|
||||
$TXT = Get-WmiObject -namespace "root\MicrosoftDNS" -class MicrosoftDNS_TXTType -ComputerName $env:ComputerName -Filter "DomainName = '$ZoneName'"
|
||||
$TXTlen = Get-WmiCount($TXT)
|
||||
write-host -NoNewline ""TXT=$TXTlen
|
||||
|
||||
$RR = Get-WmiObject -namespace "root\MicrosoftDNS" -class MicrosoftDNS_ResourceRecord -ComputerName $env:ComputerName -Filter "DomainName = '$ZoneName'"
|
||||
$TotalRecords = Get-WmiCount($RR)
|
||||
write-host ""TotalRecords=$TotalRecords
|
||||
|
||||
}
|
||||
|
||||
#
|
||||
# Main Program
|
||||
#
|
||||
$ServerName = $env:ComputerName
|
||||
$Scope = New-Object Management.ManagementScope("\\$ServerName\root\MicrosoftDNS")
|
||||
$Path = New-Object Management.ManagementPath("MicrosoftDNS_Zone")
|
||||
$Options = New-Object Management.ObjectGetOptions($Null, [System.TimeSpan]::MaxValue, $True)
|
||||
|
||||
$ZoneClass = New-Object Management.ManagementClass($Scope, $Path, $Options)
|
||||
$Zones = Get-WMIObject -Computer $ServerName -Namespace "root\MicrosoftDNS" -Class "MicrosoftDNS_Zone"
|
||||
$OutputEncoding = [Text.Encoding]::UTF8
|
||||
Foreach ($Zone in $Zones) {
|
||||
Output-ZoneInfo($Zone)
|
||||
}
|
||||
@ -0,0 +1,20 @@
|
||||
## This script generates WindowsUpdate.Log using Get-WindowsUpdateLog in $SplunkHome\var\log\Splunk_TA_windows\WindowsUpdate
|
||||
## It monitors the WindowsUpdate.log from $SplunkHome\var\log\Splunk_TA_windows\
|
||||
|
||||
Set-Variable -Name "LogFolder" -Value "$SplunkHome\var\log\Splunk_TA_windows\WindowsUpdate"
|
||||
Set-Variable -Name "MonitoredLogFile" -Value "$SplunkHome\var\log\Splunk_TA_windows\WindowsUpdate.log"
|
||||
|
||||
if (!(Test-Path -Path $LogFolder )) {
|
||||
New-Item -ItemType directory -Path $LogFolder
|
||||
}
|
||||
|
||||
Get-WindowsUpdateLog -LogPath $LogFolder\WindowsUpdate.log
|
||||
|
||||
if ([System.IO.File]::Exists("$MonitoredLogFile")) {
|
||||
Get-Content "$LogFolder\WindowsUpdate.log" | Set-Content -Path "$MonitoredLogFile"
|
||||
}
|
||||
else {
|
||||
Copy-Item -Path "$LogFolder\WindowsUpdate.log" -Destination "$MonitoredLogFile"
|
||||
}
|
||||
|
||||
exit
|
||||
@ -0,0 +1,170 @@
|
||||
#
|
||||
# Determine the health and statistics of this Active Directory Controller
|
||||
#
|
||||
$Output = New-Object System.Collections.ArrayList
|
||||
$Date = Get-Date -format 'yyyy-MM-ddTHH:mm:sszzz'
|
||||
[void]$Output.Add($Date)
|
||||
|
||||
# Name of Server
|
||||
$ServerName = $env:ComputerName
|
||||
[void]$Output.Add("Server=""$ServerName""")
|
||||
$BSSN = "\\" + $ServerName
|
||||
|
||||
# Domain Information
|
||||
|
||||
$S_DS_AD_DOM = [System.DirectoryServices.ActiveDirectory.Domain]::getComputerDomain()
|
||||
$WMI_CS = (Get-WmiObject Win32_ComputerSystem)
|
||||
$WMI_DOMAIN = Get-WmiObject Win32_NTDomain | Where-Object {$_.DomainControllerName -eq $BSSN}
|
||||
|
||||
$DomainDNSName = $WMI_CS.Domain
|
||||
$DomainNetBIOSName = $WMI_DOMAIN.DomainName
|
||||
$DomainLevel = $S_DS_AD_DOM.DomainMode
|
||||
[void]$Output.Add("DomainDNSName=`"$DomainDNSName`"");
|
||||
[void]$Output.Add("DomainNetBIOSName=`"$DomainNetBIOSName`"");
|
||||
[void]$Output.Add("DomainLevel=`"$DomainLevel`"");
|
||||
|
||||
# Site Information
|
||||
$SiteName = $WMI_DOMAIN.ClientSiteName
|
||||
[void]$Output.Add("Site=`"$SiteName`"");
|
||||
|
||||
# Forest Information
|
||||
$ForestName = $S_DS_AD_DOM.Forest.Name
|
||||
$ForestLevel = $S_DS_AD_DOM.Forest.ForestMode
|
||||
[void]$Output.Add("ForestName=`"$ForestName`"");
|
||||
[void]$Output.Add("ForestLevel=`"$ForestLevel`"");
|
||||
|
||||
# Domain Controller Flags
|
||||
$IsRO = "False"
|
||||
$IsEnabled = "False"
|
||||
$IsGC = "False"
|
||||
$USN = "Unknown"
|
||||
$MyName = ($env:ComputerName + "." + $DomainDNSName).ToLower()
|
||||
if ($WMI_DOMAIN.Status -eq "OK") {
|
||||
$MyDC = $S_DS_AD_DOM.DomainControllers | Where-Object { $_.Name.ToLower() -eq $MyName.ToLower() }
|
||||
if ($MyDC) {
|
||||
if ($MyDC.IsGlobalCatalog()) {
|
||||
$IsGC = "True"
|
||||
}
|
||||
$USN = $MyDC.HighestCommittedUsn
|
||||
$IsEnabled = "True"
|
||||
|
||||
$entry = $MyDC.getDirectoryEntry()
|
||||
[void]$Output.Add("Created=`"$($entry.whenCreated)`"")
|
||||
[void]$Output.Add("Changed=`"$($entry.whenChanged)`"")
|
||||
|
||||
$DN = $entry.Path
|
||||
$ServerEntry = [ADSI]"$DN"
|
||||
$ServerEntry.GetInfoEx(@("msDS-IsRODC"),0)
|
||||
$IsRO = $ServerEntry."msDS-IsRODC"
|
||||
}
|
||||
}
|
||||
[void]$Output.Add("GlobalCatalog=`"$IsGC`"")
|
||||
[void]$Output.Add("RODC=`"$IsRO`"")
|
||||
[void]$Output.Add("Enabled=`"$IsEnabled`"")
|
||||
[void]$Output.Add("HighestUSN=`"$USN`"")
|
||||
|
||||
$SchemaInfo = Get-Item "HKLM:System\CurrentControlSet\Services\NTDS\Parameters"
|
||||
$SchemaVersion = $SchemaInfo.GetValue("Schema Version")
|
||||
[void]$Output.Add("SchemaVersion=$SchemaVersion")
|
||||
|
||||
$NetLogonParams = Get-Item "HKLM:System\CurrentControlSet\Services\Netlogon\Parameters"
|
||||
$DCWeight = $NetLogonParams.GetValue("LdapSrvWeight", $null)
|
||||
if (!$DCWeight -or $DCWeight -eq $null -or $DCWeight -eq "") {
|
||||
$DCWeight = 100 # This is the default value
|
||||
}
|
||||
[void]$Output.Add("DCWeight=$DCWeight")
|
||||
|
||||
$SiteInfoObj = [System.DirectoryServices.ActiveDirectory.Forest]::getCurrentForest().Sites | Where-Object { $_.Name -eq $SiteName }
|
||||
|
||||
# Is this host a BridgeHead Server?
|
||||
# Field BridgeheadServer (Collection of DirectoryServer objects - check to see if we are listed and set IsBridgeHeadServer=True/False accordingly)
|
||||
|
||||
# Is this host a Intersite Topology Generator
|
||||
if ($SiteInfoObj.IntersiteTopologyGenerator.Name -and ($SiteInfoObj.IntersiteTopologyGenerator.Name -eq $ServerName -or $SiteInfoObj.IntersiteTopologyGenerator.Name.ToLower() -eq $MyName)) {
|
||||
[void]$Output.Add("IsIntersiteTopologyGenerator=`"True`"")
|
||||
} else {
|
||||
[void]$Output.Add("IsIntersiteTopologyGenerator=`"False`"")
|
||||
}
|
||||
|
||||
|
||||
#
|
||||
# Windows Version and Build #
|
||||
#
|
||||
$WindowsInfo = Get-Item "HKLM:SOFTWARE\Microsoft\Windows NT\CurrentVersion"
|
||||
$OS = $WindowsInfo.GetValue("ProductName")
|
||||
$OSSP = $WindowsInfo.GetValue("CSDVersion")
|
||||
$WinVer = $WindowsInfo.GetValue("CurrentVersion")
|
||||
$WinBuild = $WindowsInfo.GetValue("CurrentBuildNumber")
|
||||
$OSVER = "$WinVer ($WinBuild)"
|
||||
|
||||
[void]$Output.Add("OperatingSystem=""$OS""")
|
||||
[void]$Output.Add("ServicePack=""$OSSP""")
|
||||
[void]$Output.Add("OSVersion=""$OSVER""")
|
||||
|
||||
#
|
||||
# FSMO Roles (Schema, DomainNaming, Infrastructure, RIDMaster, PDC)
|
||||
#
|
||||
$aFSMO = @()
|
||||
if ($MyDC -and $MyDC.Roles) {
|
||||
foreach ($role in $MyDC.Roles) {
|
||||
switch ($role) {
|
||||
"SchemaRole" { $aFSMO += "Schema" }
|
||||
"NamingRole" { $aFSMO += "DomainNaming" }
|
||||
"InfrastructureRole" { $aFSMO += "Infrastructure" }
|
||||
"PdcRole" { $aFSMO += "PDCEmulator" }
|
||||
"RidRole" { $aFSMO += "RIDMaster" }
|
||||
}
|
||||
}
|
||||
}
|
||||
$FSMORoles = [string]::join(' ', $aFSMO)
|
||||
[void]$Output.Add("FSMORoles=""$FSMORoles""")
|
||||
|
||||
#
|
||||
# Required Processes Running
|
||||
# FRS, DFS-R, Net Logon, KDC, W32Time, ISMSERV
|
||||
#
|
||||
$RequiredServices = @( "ntfrs", "dfsr", "netlogon", "kdc", "w32time", "ismserv" )
|
||||
$srvr = @()
|
||||
$srvnr = @()
|
||||
foreach ($srv in $RequiredServices) {
|
||||
$status = (Get-Service $srv).Status
|
||||
if ($status -eq "Running") {
|
||||
$srvr += $srv
|
||||
} else {
|
||||
$srvnr += $srv
|
||||
}
|
||||
}
|
||||
# Note that the only case that ProcsOK == True is when there is ONE service
|
||||
# that isn't running - You need one replication services (ntfrs or dfsr) but
|
||||
# not both
|
||||
$ProcsOK = "False"
|
||||
if (($srvnr.Count -eq 0) -or ($srvnr.Count -eq 1 -and ($srvnr[0] -eq "ntfrs" -or $srvnr[0] -eq "dfsr"))) {
|
||||
$ProcsOK = "True"
|
||||
}
|
||||
$ServicesRunning = [string]::join(',', $srvr)
|
||||
$ServicesNotRunning = [string]::join(',', $srvnr)
|
||||
[void]$Output.Add("ServicesRunning=""$ServicesRunning""")
|
||||
[void]$Output.Add("ServicesNotRunning=""$ServicesNotRunning""")
|
||||
[void]$Output.Add("ProcsOK=""$ProcsOK""")
|
||||
|
||||
#
|
||||
# Look for Common Problems
|
||||
# SYSVOL is shared out
|
||||
# DC is registered in DNS
|
||||
#
|
||||
$SysvolShare = (Get-WmiObject Win32_Share|Where-Object { $_.Name -eq "SYSVOL" })
|
||||
if ($SysvolShare) {
|
||||
[void]$Output.Add("SYSVOLShare=""True""")
|
||||
} else {
|
||||
[void]$Output.Add("SYSVOLShare=""False""")
|
||||
}
|
||||
|
||||
$DNSEntry = ([System.Net.DNS]::GetHostEntry($ServerName))
|
||||
if ($DNSEntry) {
|
||||
[void]$Output.Add("DNSRegister=""True""")
|
||||
} else {
|
||||
[void]$Output.Add("DNSRegister=""False""")
|
||||
}
|
||||
|
||||
# Output the final string
|
||||
Write-Host ($output -join " ")
|
||||
@ -0,0 +1,41 @@
|
||||
#
|
||||
# Determine and output information about the Site the server is a member of
|
||||
#
|
||||
|
||||
$ServerName = $env:ComputerName
|
||||
$BSSN = "\\" + $ServerName
|
||||
$WMI_DOMAIN = Get-WmiObject Win32_NTDomain | Where-Object {$_.DomainControllerName -eq $BSSN}
|
||||
$SiteName = $WMI_DOMAIN.ClientSiteName
|
||||
$ForestName = [System.DirectoryServices.ActiveDirectory.Forest]::getCurrentForest().Name
|
||||
|
||||
$Date = Get-Date -format 'yyyy-MM-ddTHH:mm:sszzz'
|
||||
$SiteInfoObj = [System.DirectoryServices.ActiveDirectory.Forest]::getCurrentForest().Sites | Where-Object { $_.Name -eq $SiteName }
|
||||
$ISTG = $SiteInfoObj.IntersiteTopologyGenerator.Name
|
||||
|
||||
|
||||
write-host $Date Type=`"Site`" ForestName=`"$ForestName`" Site=`"$SiteName`" Location=`"$($SiteInfoObj.Location)`" -NoNewline
|
||||
$SiteInfoObj.AdjacentSites | Foreach-Object { write-host AdjacentSite=`"$($_.Name)`" -NoNewline }
|
||||
write-host IntersiteTopologyGenerator=`"$ISTG`" -NoNewline
|
||||
$SiteInfoObj.SiteLinks | Foreach-Object { write-host "" SiteLink=`"$($_.Name)`" -NoNewline }
|
||||
$SiteInfoObj.Subnets | Foreach-Object { write-host "" Subnet=`"$($_.Name)`" -nonewline }
|
||||
|
||||
write-host #Needed to print a newline for next object
|
||||
|
||||
#
|
||||
# Output Information about Site Links in this site
|
||||
#
|
||||
$SiteInfoObj.SiteLinks | Foreach-Object {
|
||||
write-host $Date Type=`"SiteLink`" ForestName=`"$ForestName`" Name=`"$($_.Name)`" Cost=$($_.Cost) DataCompressionEnabled=$($_.DataCompressionEnabled) NotificationEnabled=$($_.NotificationEnabled) ReciprocalReplicationEnabled=$($_.ReciprocalReplicationEnabled) TransportType=$($_.TransportType) ReplicationIntervalSecs=$($_.ReplicationInterval.TotalSeconds) -NoNewLine
|
||||
foreach ($site in $_.Sites) {
|
||||
write-host ""Site=`"$($site.Name)`" -NoNewLine
|
||||
}
|
||||
}
|
||||
Write-Host #similar to above
|
||||
|
||||
#
|
||||
# Output Information about Subnets in this site
|
||||
#
|
||||
|
||||
$SiteInfoObj.Subnets | Foreach-Object {
|
||||
write-Host $Date Type=`"Subnet`" ForestName=`"$ForestName`" Name=`"$($_.Name)`" Site=`"$SiteName`" Location=`"$($_.Location)`"
|
||||
}
|
||||
@ -0,0 +1,14 @@
|
||||
@ECHO OFF
|
||||
|
||||
:: ######################################################
|
||||
:: #
|
||||
:: # Splunk for Microsoft Windows
|
||||
:: #
|
||||
:: # Copyright (C) 2019 Splunk, Inc.
|
||||
:: # All Rights Reserved
|
||||
:: #
|
||||
:: ######################################################
|
||||
|
||||
set SplunkApp=Splunk_TA_windows
|
||||
|
||||
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -executionPolicy RemoteSigned -command ". '%SPLUNK_HOME%\etc\apps\%SplunkApp%\bin\powershell\%1'"
|
||||
@ -0,0 +1,94 @@
|
||||
import csv
|
||||
import sys
|
||||
import log
|
||||
import logging
|
||||
|
||||
# Map for possible property flags
|
||||
property_flags = {
|
||||
"1": "SCRIPT",
|
||||
"2": "ACCOUNTDISABLE",
|
||||
"8": "HOMEDIR_REQUIRED",
|
||||
"16": "LOCKOUT",
|
||||
"32": "PASSWD_NOTREQD",
|
||||
"64": "PASSWD_CANT_CHANGE",
|
||||
"128": "ENCRYPTED_TEXT_PWD_ALLOWED",
|
||||
"256": "TEMP_DUPLICATE_ACCOUNT",
|
||||
"512": "NORMAL_ACCOUNT",
|
||||
"2048": "INTERDOMAIN_TRUST_ACCOUNT",
|
||||
"4096": "WORKSTATION_TRUST_ACCOUNT",
|
||||
"8192": "SERVER_TRUST_ACCOUNT",
|
||||
"65536": "DONT_EXPIRE_PASSWORD",
|
||||
"131072": "MNS_LOGON_ACCOUNT",
|
||||
"262144": "SMARTCARD_REQUIRED",
|
||||
"524288": "TRUSTED_FOR_DELEGATION",
|
||||
"1048576": "NOT_DELEGATED",
|
||||
"2097152": "USE_DES_KEY_ONLY",
|
||||
"4194304": "DONT_REQ_PREAUTH",
|
||||
"8388608": "PASSWORD_EXPIRED",
|
||||
"16777216": "TRUSTED_TO_AUTH_FOR_DELEGATION",
|
||||
"67108864": "PARTIAL_SECRETS_ACCOUNT"
|
||||
}
|
||||
|
||||
def main():
|
||||
|
||||
logger = log.Log().get_logger("user_account_control_property")
|
||||
logger.info("Lookup script started executing..")
|
||||
|
||||
# prints usage of the lookup script if wrong number of arguments provided
|
||||
if len(sys.argv) != 3:
|
||||
logger.debug("Usage: python user_account_control_property.py [userAccountControl] [userAccountPropertyFlag]")
|
||||
logger.debug("Lookup script stopped..")
|
||||
sys.exit(1)
|
||||
|
||||
# Lookup Field names
|
||||
userAccountControl = sys.argv[1]
|
||||
userAccountPropertyFlag = sys.argv[2]
|
||||
|
||||
infile = sys.stdin
|
||||
outfile = sys.stdout
|
||||
|
||||
r = csv.DictReader(infile)
|
||||
|
||||
w = csv.DictWriter(outfile, fieldnames=r.fieldnames)
|
||||
|
||||
w.writeheader()
|
||||
|
||||
# Decode flags for every 'userAccountControl' attribute value present in a search result
|
||||
for result in r:
|
||||
try:
|
||||
if result[userAccountControl].isdigit():
|
||||
attribute_value = int(result[userAccountControl])
|
||||
bit_cnt = 0
|
||||
incorrect_result_flag = False
|
||||
flags = list()
|
||||
|
||||
# Prepare flag list by decoding 'userAccountcontrol' decimal value
|
||||
# As 'userAccountControl' is decimal value, For each bit set to '1' a property flag can be denoted by using 'property_flags' map given above
|
||||
while attribute_value != 0:
|
||||
if attribute_value & 1 == 1:
|
||||
flags.append(str(1 << bit_cnt))
|
||||
attribute_value = attribute_value >> 1
|
||||
bit_cnt += 1
|
||||
|
||||
# If flag not present in 'property_flags' map, The 'userAccountPropertyFlag' won't be populated in search result
|
||||
for flag in flags:
|
||||
if flag not in list(property_flags.keys()):
|
||||
logger.debug("'userAccountControl' attribute can not be decoded for value: {}".format(
|
||||
result[userAccountControl]))
|
||||
incorrect_result_flag = True
|
||||
break
|
||||
if incorrect_result_flag:
|
||||
continue
|
||||
else:
|
||||
for flag in flags:
|
||||
result[userAccountPropertyFlag] = property_flags[flag]
|
||||
w.writerow(result)
|
||||
else:
|
||||
logger.debug("'userAccountControl' attribute can not be decoded for value: {}".format(result[userAccountControl]))
|
||||
except:
|
||||
logger.debug(
|
||||
"No results for 'userAccountControl' attribute value :{}".format(result[userAccountControl]))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@ -0,0 +1,67 @@
|
||||
@echo off
|
||||
REM --------------------------------------------------------
|
||||
REM Copyright (C) 2020 Splunk Inc. All Rights Reserved.
|
||||
REM --------------------------------------------------------
|
||||
|
||||
setlocal EnableDelayedExpansion
|
||||
|
||||
REM For each app key, print out the name of the app and any parameters under the entry
|
||||
for /f "tokens=*" %%G in ('reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" ^| findstr "Uninstall\\"') do (call :output_reg "%%G" 72)
|
||||
|
||||
REM Do the same as above but with 32-bit apps, first checking if the key exists
|
||||
reg query "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" >nul 2>&1
|
||||
if %ERRORLEVEL% EQU 0 (
|
||||
for /f "tokens=*" %%G in ('reg query "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" ^| findstr "Uninstall\\"') do (call :output_reg "%%G" 84)
|
||||
)
|
||||
|
||||
goto :eof
|
||||
|
||||
:output_reg
|
||||
|
||||
|
||||
REM Echo an empty line to indicate that this is a new entry
|
||||
@echo.
|
||||
|
||||
REM Get the current date and time into into a variable
|
||||
for /f "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /value 2^>nul`) do if '.%%i.'=='.LocalDateTime.' set date_time=%%j
|
||||
set date_time=%date_time:~0,4%-%date_time:~4,2%-%date_time:~6,2% %date_time:~8,2%:%date_time:~10,2%:%date_time:~12,6%
|
||||
|
||||
REM Print out the date & time
|
||||
@echo %date_time%
|
||||
|
||||
REM Add the enumerated key
|
||||
@echo Installed application enumerated from %1
|
||||
|
||||
REM Get the name of the app from the last segment in the registry path
|
||||
set app_name=%1
|
||||
|
||||
REM Strips out the first x characters (from input) of the path in order to get just the app name
|
||||
set "app_name=!app_name:~%2%,150!"
|
||||
|
||||
REM Strip the last quote
|
||||
set "app_name=!app_name:~0,-1!"
|
||||
|
||||
REM Store a count value so that we can avoid printing the first entry
|
||||
set count=0
|
||||
|
||||
REM This variable determines if the display name was found
|
||||
set display_name_found=0
|
||||
|
||||
REM Now get the sub-keys
|
||||
for /F "tokens=1,2*" %%A in ('reg query %1') do (
|
||||
set /a count+=1
|
||||
|
||||
REM Skip the entry if it just repeats the name we are querying for or if it is blank or if is "<NO" (which indicates the item has no name)
|
||||
|
||||
REM Note that the display name was already found
|
||||
if %%A==DisplayName (
|
||||
set /a display_name_found=1
|
||||
echo %%A="%%C"
|
||||
) else (
|
||||
|
||||
REM Skip the entry if it just repeats the name we are querying for or if it is blank or if is "<NO" (which indicates the item has no name)
|
||||
if not "%%A" == %1 if not "%%A" == "" if not "%%A" == "<NO" if not "%%C" == "" if not %%A==DisplayName echo %%A=%%C
|
||||
)
|
||||
)
|
||||
REM If the display name was not found, then use the name of the registry path name instead
|
||||
if !display_name_found!==0 echo DisplayName="%app_name%"
|
||||
@ -0,0 +1,46 @@
|
||||
@echo off
|
||||
REM --------------------------------------------------------
|
||||
REM Copyright (C) 2020 Splunk Inc. All Rights Reserved.
|
||||
REM --------------------------------------------------------
|
||||
|
||||
setlocal EnableDelayedExpansion
|
||||
|
||||
REM Get the current date and time into a variable
|
||||
for /f "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /value 2^>nul`) do if '.%%i.'=='.LocalDateTime.' set date_time=%%j
|
||||
set date_time=%date_time:~0,4%-%date_time:~4,2%-%date_time:~6,2% %date_time:~8,2%:%date_time:~10,2%:%date_time:~12,6%
|
||||
|
||||
|
||||
REM Get the list of open ports by running netstat and filtering the results to those that contain actual ports (dropping the header)
|
||||
for /f "tokens=*" %%G in ('netstat -nao ^| findstr /r "LISTENING"') do (call :output_ports "%%G")
|
||||
goto :eof
|
||||
|
||||
:output_ports
|
||||
|
||||
REM Parse the ports list
|
||||
for /f "tokens=1,2,4,5 delims= " %%A in (%1) do (
|
||||
set protocol=%%A
|
||||
set dest=%%B
|
||||
set status=%%C
|
||||
set pid=%%D
|
||||
)
|
||||
|
||||
REM Skip the header
|
||||
if "!protocol!"=="Proto" goto :eof
|
||||
if "!protocol!"=="Active" goto :eof
|
||||
|
||||
REM Parse the each port
|
||||
for /f "tokens=1,2,3 delims=:" %%A in ("%dest%") do (
|
||||
set dest_ip=%%A
|
||||
set dest_port=%%B
|
||||
set alt_dest_port=%%C
|
||||
|
||||
REM Some entries will exist in the [::]:0 format and thus throw off the parsing. Correct for this:
|
||||
if "!dest_port!" == "]" set dest_port=!alt_dest_port!
|
||||
)
|
||||
|
||||
REM Replace the dest IP with the empty IP range if necessary
|
||||
if "!dest_ip!"=="[" set dest_ip=[::]
|
||||
|
||||
REM Print out the result
|
||||
echo %date_time% transport=%protocol% dest_ip=%dest_ip% dest_port=%dest_port% pid=!pid!
|
||||
|
||||
@ -0,0 +1,21 @@
|
||||
@echo off
|
||||
REM --------------------------------------------------------
|
||||
REM Copyright (C) 2020 Splunk Inc. All Rights Reserved.
|
||||
REM --------------------------------------------------------
|
||||
|
||||
setlocal EnableDelayedExpansion
|
||||
|
||||
REM Get the time service configuration and timezone.
|
||||
|
||||
REM Get the date & time
|
||||
for /f "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /value 2^>nul`) do if '.%%i.'=='.LocalDateTime.' set date_time=%%j
|
||||
set date_time=%date_time:~0,4%-%date_time:~4,2%-%date_time:~6,2% %date_time:~8,2%:%date_time:~10,2%:%date_time:~12,6%
|
||||
|
||||
REM Print the date and time. This will be the timestamp of the event.
|
||||
echo Current time: %date_time%
|
||||
|
||||
REM Print the Windows time service configuration
|
||||
w32tm /query /configuration /verbose
|
||||
|
||||
REM Print the Windows time zone information
|
||||
w32tm /tz
|
||||
@ -0,0 +1,28 @@
|
||||
@echo off
|
||||
REM --------------------------------------------------------
|
||||
REM Copyright (C) 2020 Splunk Inc. All Rights Reserved.
|
||||
REM --------------------------------------------------------
|
||||
|
||||
setlocal EnableDelayedExpansion
|
||||
|
||||
REM Get the last current time synchronization status
|
||||
REM
|
||||
REM Example:
|
||||
REM
|
||||
REM Successful sync:
|
||||
REM Last Successful Sync Time: 1/22/2014 12:06:43 PM
|
||||
REM Unsuccessful sync:
|
||||
REM Last Successful Sync Time: unspecified
|
||||
|
||||
REM Get the date & time
|
||||
for /f "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /value 2^>nul`) do if '.%%i.'=='.LocalDateTime.' set date_time=%%j
|
||||
set date_time=%date_time:~0,4%-%date_time:~4,2%-%date_time:~6,2% %date_time:~8,2%:%date_time:~10,2%:%date_time:~12,6%
|
||||
|
||||
REM Print the date and time. This will be the timestamp of the event.
|
||||
echo Current time: %date_time%
|
||||
|
||||
REM Print the Windows time service status
|
||||
w32tm /query /status /verbose
|
||||
|
||||
REM Print the time zone
|
||||
w32tm /tz
|
||||
@ -0,0 +1,29 @@
|
||||
######################################################
|
||||
#
|
||||
# Splunk_TA_windows_dc
|
||||
# Custom: This is a sub-TA from the Splunk_TA_windows
|
||||
# application, that includes on the Active Directory
|
||||
# inputs. These inputs include predefined settings
|
||||
# based off of best practices, but can be adjusted
|
||||
# as needed to fit your environment and needs. It
|
||||
# is provided by the MS Windows AD Objects application.
|
||||
# Copyright (C) 2020 Splunk Inc. All Rights Reserved.
|
||||
#
|
||||
######################################################
|
||||
|
||||
[install]
|
||||
is_configured = false
|
||||
state = enabled
|
||||
build = 1
|
||||
|
||||
[ui]
|
||||
is_visible = false
|
||||
label = Splunk Add-on for Microsoft Windows for AD Domain Controllers
|
||||
|
||||
[launcher]
|
||||
author = Splunk, Inc. Custom Steve Hogan
|
||||
version = 8.0.0
|
||||
description = Splunk Add-on for Microsoft Windows with specific predefined inputs for Active Directory Domain Controllers.
|
||||
|
||||
[package]
|
||||
id = Splunk_TA_windows_dc
|
||||
@ -0,0 +1,486 @@
|
||||
# Copyright (C) 2020 Splunk Inc. All Rights Reserved.
|
||||
# Custom TA Used by the MS Windows AD Objects application
|
||||
# Uses the Splunk_TA_windows TA
|
||||
# DO NOT EDIT THIS FILE!
|
||||
# Please make all changes to files in $SPLUNK_HOME/etc/apps/Splunk_TA_windows_dc/local.
|
||||
# To make changes, copy the section/stanza you want to change from $SPLUNK_HOME/etc/apps/Splunk_TA_windows_dc/default
|
||||
# into $SPLUNK_HOME/etc/apps/Splunk_TA_windows_dc/local and edit there.
|
||||
# *** Predefined Settings and Changes from the default\inputs.conf:
|
||||
# - Index Settings: All of the enabled inputs below have predefined indexes based off of standard
|
||||
# - Perfmon.. Inputs - mode Setting: The mode setting has been set to single, instead of multikv
|
||||
# - WinEventLogs - renderxml Setting: XML Rendering of the WinEventLogs... is set to false, instead of true.
|
||||
|
||||
###### OS Logs ######
|
||||
[WinEventLog://Application]
|
||||
disabled = 1
|
||||
start_from = oldest
|
||||
current_only = 0
|
||||
checkpointInterval = 5
|
||||
renderXml=false
|
||||
index=wineventlog
|
||||
|
||||
[WinEventLog://Security]
|
||||
disabled = 1
|
||||
start_from = oldest
|
||||
current_only = 0
|
||||
evt_resolve_ad_obj = 1
|
||||
checkpointInterval = 5
|
||||
blacklist1 = EventCode="4662" Message="Object Type:(?!\s*groupPolicyContainer)"
|
||||
blacklist2 = EventCode="566" Message="Object Type:(?!\s*groupPolicyContainer)"
|
||||
renderXml=false
|
||||
index=wineventlog
|
||||
|
||||
[WinEventLog://System]
|
||||
disabled = 1
|
||||
start_from = oldest
|
||||
current_only = 0
|
||||
checkpointInterval = 5
|
||||
renderXml=false
|
||||
index=wineventlog
|
||||
|
||||
|
||||
###### Forwarded WinEventLogs (WEF) ######
|
||||
[WinEventLog://ForwardedEvents]
|
||||
disabled = 1
|
||||
start_from = oldest
|
||||
current_only = 0
|
||||
checkpointInterval = 5
|
||||
## The addon supports only XML format for the collection of WinEventLogs using WEF, hence do not change the below renderXml parameter to false.
|
||||
renderXml=false
|
||||
host=WinEventLogForwardHost
|
||||
index=wineventlog
|
||||
|
||||
|
||||
###### WinEventLog Inputs for Active Directory ######
|
||||
|
||||
## Application and Services Logs - DFS Replication
|
||||
[WinEventLog://DFS Replication]
|
||||
disabled = 1
|
||||
renderXml=false
|
||||
index=wineventlog
|
||||
|
||||
## Application and Services Logs - Directory Service
|
||||
[WinEventLog://Directory Service]
|
||||
disabled = 1
|
||||
renderXml=false
|
||||
index=wineventlog
|
||||
|
||||
## Application and Services Logs - File Replication Service
|
||||
[WinEventLog://File Replication Service]
|
||||
disabled = 1
|
||||
renderXml=false
|
||||
index=wineventlog
|
||||
|
||||
## Application and Services Logs - Key Management Service
|
||||
[WinEventLog://Key Management Service]
|
||||
disabled = 1
|
||||
renderXml=false
|
||||
index=wineventlog
|
||||
|
||||
|
||||
###### WinEventLog Inputs for DNS ######
|
||||
[WinEventLog://DNS Server]
|
||||
disabled=1
|
||||
renderXml=false
|
||||
index=wineventlog
|
||||
|
||||
|
||||
###### DHCP ######
|
||||
[monitor://$WINDIR\System32\DHCP]
|
||||
disabled = 1
|
||||
whitelist = DhcpSrvLog*
|
||||
crcSalt = <SOURCE>
|
||||
sourcetype = DhcpSrvLog
|
||||
index=msad
|
||||
|
||||
|
||||
###### Windows Update Log ######
|
||||
## Enable below stanza to get WindowsUpdate.log for Windows 8, Windows 8.1, Server 2008R2, Server 2012 and Server 2012R2
|
||||
[monitor://$WINDIR\WindowsUpdate.log]
|
||||
disabled = 1
|
||||
sourcetype = WindowsUpdateLog
|
||||
index=windows
|
||||
|
||||
## Enable below powershell and monitor stanzas to get WindowsUpdate.log for Windows 10 and Server 2016
|
||||
## Below stanza will automatically generate WindowsUpdate.log daily
|
||||
[powershell://generate_windows_update_logs]
|
||||
script = ."$SplunkHome\etc\apps\Splunk_TA_windows\bin\powershell\generate_windows_update_logs.ps1"
|
||||
schedule = 0 */24 * * *
|
||||
disabled = 1
|
||||
index=windows
|
||||
|
||||
## Below stanza will monitor the generated WindowsUpdate.log in Windows 10 and Server 2016
|
||||
[monitor://$SPLUNK_HOME\var\log\Splunk_TA_windows\WindowsUpdate.log]
|
||||
disabled = 1
|
||||
sourcetype = WindowsUpdateLog
|
||||
index=windows
|
||||
|
||||
|
||||
###### Monitor Inputs for Active Directory ######
|
||||
[monitor://$WINDIR\debug\netlogon.log]
|
||||
sourcetype=MSAD:NT6:Netlogon
|
||||
disabled=1
|
||||
index=msad
|
||||
|
||||
###### Monitor Inputs for DNS ######
|
||||
[MonitorNoHandle://$WINDIR\System32\Dns\dns.log]
|
||||
sourcetype=MSAD:NT6:DNS
|
||||
disabled=1
|
||||
index=msad
|
||||
|
||||
|
||||
###### Scripted Input (See also wmi.conf)
|
||||
[script://.\bin\win_listening_ports.bat]
|
||||
disabled = 1
|
||||
## Run once per hour
|
||||
interval = 3600
|
||||
sourcetype = Script:ListeningPorts
|
||||
index=windows
|
||||
|
||||
[script://.\bin\win_installed_apps.bat]
|
||||
disabled = 1
|
||||
## Run once per day
|
||||
interval = 86400
|
||||
sourcetype = Script:InstalledApps
|
||||
index=windows
|
||||
|
||||
[script://.\bin\win_timesync_status.bat]
|
||||
disabled = 1
|
||||
## Run once per hour
|
||||
interval = 3600
|
||||
sourcetype = Script:TimesyncStatus
|
||||
index=windows
|
||||
|
||||
[script://.\bin\win_timesync_configuration.bat]
|
||||
disabled = 1
|
||||
## Run once per hour
|
||||
interval = 3600
|
||||
sourcetype = Script:TimesyncConfiguration
|
||||
index=windows
|
||||
|
||||
[script://.\bin\netsh_address.bat]
|
||||
disabled = 1
|
||||
## Run once per day
|
||||
interval = 86400
|
||||
sourcetype = Script:NetworkConfiguration
|
||||
index=windows
|
||||
|
||||
###### Scripted/Powershell Mod inputs Active Directory ######
|
||||
|
||||
## Replication Information NT6
|
||||
[script://.\bin\runpowershell.cmd nt6-repl-stat.ps1]
|
||||
source=Powershell
|
||||
sourcetype=MSAD:NT6:Replication
|
||||
interval=300
|
||||
disabled=1
|
||||
index=msad
|
||||
|
||||
## Replication Information 2012r2 and 2016
|
||||
[powershell://Replication-Stats]
|
||||
script = & "$SplunkHome\etc\apps\Splunk_TA_windows\bin\Invoke-MonitoredScript.ps1" -Command ".\powershell\2012r2-repl-stats.ps1"
|
||||
schedule = 0 */5 * ? * *
|
||||
source = Powershell
|
||||
sourcetype=MSAD:NT6:Replication
|
||||
disabled=1
|
||||
index=msad
|
||||
|
||||
## Health and Topology Information NT6
|
||||
[script://.\bin\runpowershell.cmd nt6-health.ps1]
|
||||
source=Powershell
|
||||
sourcetype=MSAD:NT6:Health
|
||||
interval=300
|
||||
disabled=1
|
||||
index=msad
|
||||
|
||||
## Health and Topology Information 2012r2 and 2016
|
||||
[powershell://AD-Health]
|
||||
script = & "$SplunkHome\etc\apps\Splunk_TA_windows\bin\Invoke-MonitoredScript.ps1" -Command ".\powershell\2012r2-health.ps1"
|
||||
schedule = 0 */5 * ? * *
|
||||
source=Powershell
|
||||
sourcetype=MSAD:NT6:Health
|
||||
disabled=1
|
||||
index=msad
|
||||
|
||||
|
||||
## Site, Site Link and Subnet Information NT6
|
||||
[script://.\bin\runpowershell.cmd nt6-siteinfo.ps1]
|
||||
source=Powershell
|
||||
sourcetype=MSAD:NT6:SiteInfo
|
||||
interval=3600
|
||||
disabled=1
|
||||
index=msad
|
||||
|
||||
## Site, Site Link and Subnet Information 2012r2 and 2016
|
||||
[powershell://Siteinfo]
|
||||
script = & "$SplunkHome\etc\apps\Splunk_TA_windows\bin\Invoke-MonitoredScript.ps1" -Command ".\powershell\2012r2-siteinfo.ps1"
|
||||
schedule = 0 15 * ? * *
|
||||
source = Powershell
|
||||
sourcetype=MSAD:NT6:SiteInfo
|
||||
disabled=1
|
||||
index=msad
|
||||
|
||||
|
||||
##### Scripted Inputs for DNS #####
|
||||
|
||||
## DNS Zone Information Collection
|
||||
[script://.\bin\runpowershell.cmd dns-zoneinfo.ps1]
|
||||
source=Powershell
|
||||
sourcetype=MSAD:NT6:DNS-Zone-Information
|
||||
interval=3600
|
||||
disabled=1
|
||||
index=msad
|
||||
|
||||
## DNS Health Information Collection
|
||||
[script://.\bin\runpowershell.cmd dns-health.ps1]
|
||||
source=Powershell
|
||||
sourcetype=MSAD:NT6:DNS-Health
|
||||
interval=3600
|
||||
disabled=1
|
||||
index=msad
|
||||
|
||||
|
||||
###### Host monitoring ######
|
||||
[WinHostMon://Computer]
|
||||
interval = 600
|
||||
disabled = 1
|
||||
type = Computer
|
||||
index=windows
|
||||
|
||||
[WinHostMon://Process]
|
||||
interval = 600
|
||||
disabled = 1
|
||||
type = Process
|
||||
index=windows
|
||||
|
||||
[WinHostMon://Processor]
|
||||
interval = 600
|
||||
disabled = 1
|
||||
type = Processor
|
||||
index=windows
|
||||
|
||||
[WinHostMon://NetworkAdapter]
|
||||
interval = 600
|
||||
disabled = 1
|
||||
type = NetworkAdapter
|
||||
index=windows
|
||||
|
||||
[WinHostMon://Service]
|
||||
interval = 600
|
||||
disabled = 1
|
||||
type = Service
|
||||
index=windows
|
||||
|
||||
[WinHostMon://OperatingSystem]
|
||||
interval = 600
|
||||
disabled = 1
|
||||
type = OperatingSystem
|
||||
index=windows
|
||||
|
||||
[WinHostMon://Disk]
|
||||
interval = 600
|
||||
disabled = 1
|
||||
type = Disk
|
||||
index=windows
|
||||
|
||||
[WinHostMon://Driver]
|
||||
interval = 600
|
||||
disabled = 1
|
||||
type = Driver
|
||||
index=windows
|
||||
|
||||
[WinHostMon://Roles]
|
||||
interval = 600
|
||||
disabled = 1
|
||||
type = Roles
|
||||
index=windows
|
||||
|
||||
###### Print monitoring ######
|
||||
[WinPrintMon://printer]
|
||||
type = printer
|
||||
interval = 600
|
||||
baseline = 1
|
||||
disabled = 1
|
||||
index=windows
|
||||
|
||||
[WinPrintMon://driver]
|
||||
type = driver
|
||||
interval = 600
|
||||
baseline = 1
|
||||
disabled = 1
|
||||
index=windows
|
||||
|
||||
[WinPrintMon://port]
|
||||
type = port
|
||||
interval = 600
|
||||
baseline = 1
|
||||
disabled = 1
|
||||
index=windows
|
||||
|
||||
###### Network monitoring ######
|
||||
[WinNetMon://inbound]
|
||||
direction = inbound
|
||||
disabled = 1
|
||||
index=windows
|
||||
|
||||
[WinNetMon://outbound]
|
||||
direction = outbound
|
||||
disabled = 1
|
||||
index=windows
|
||||
|
||||
###### Splunk 5.0+ Performance Counters ######
|
||||
## CPU
|
||||
[perfmon://CPU]
|
||||
counters = % Processor Time; % User Time; % Privileged Time; Interrupts/sec; % DPC Time; % Interrupt Time; DPCs Queued/sec; DPC Rate; % Idle Time; % C1 Time; % C2 Time; % C3 Time; C1 Transitions/sec; C2 Transitions/sec; C3 Transitions/sec
|
||||
disabled = 1
|
||||
instances = *
|
||||
interval = 10
|
||||
mode = single
|
||||
object = Processor
|
||||
useEnglishOnly=true
|
||||
index=perfmon
|
||||
|
||||
## Logical Disk
|
||||
[perfmon://LogicalDisk]
|
||||
counters = % Free Space; Free Megabytes; Current Disk Queue Length; % Disk Time; Avg. Disk Queue Length; % Disk Read Time; Avg. Disk Read Queue Length; % Disk Write Time; Avg. Disk Write Queue Length; Avg. Disk sec/Transfer; Avg. Disk sec/Read; Avg. Disk sec/Write; Disk Transfers/sec; Disk Reads/sec; Disk Writes/sec; Disk Bytes/sec; Disk Read Bytes/sec; Disk Write Bytes/sec; Avg. Disk Bytes/Transfer; Avg. Disk Bytes/Read; Avg. Disk Bytes/Write; % Idle Time; Split IO/Sec
|
||||
disabled = 1
|
||||
instances = *
|
||||
interval = 10
|
||||
mode = single
|
||||
object = LogicalDisk
|
||||
useEnglishOnly=true
|
||||
index=perfmon
|
||||
|
||||
## Physical Disk
|
||||
[perfmon://PhysicalDisk]
|
||||
counters = Current Disk Queue Length; % Disk Time; Avg. Disk Queue Length; % Disk Read Time; Avg. Disk Read Queue Length; % Disk Write Time; Avg. Disk Write Queue Length; Avg. Disk sec/Transfer; Avg. Disk sec/Read; Avg. Disk sec/Write; Disk Transfers/sec; Disk Reads/sec; Disk Writes/sec; Disk Bytes/sec; Disk Read Bytes/sec; Disk Write Bytes/sec; Avg. Disk Bytes/Transfer; Avg. Disk Bytes/Read; Avg. Disk Bytes/Write; % Idle Time; Split IO/Sec
|
||||
disabled = 1
|
||||
instances = *
|
||||
interval = 10
|
||||
mode = single
|
||||
object = PhysicalDisk
|
||||
useEnglishOnly=true
|
||||
index=perfmon
|
||||
|
||||
## Memory
|
||||
[perfmon://Memory]
|
||||
counters = Page Faults/sec; Available Bytes; Committed Bytes; Commit Limit; Write Copies/sec; Transition Faults/sec; Cache Faults/sec; Demand Zero Faults/sec; Pages/sec; Pages Input/sec; Page Reads/sec; Pages Output/sec; Pool Paged Bytes; Pool Nonpaged Bytes; Page Writes/sec; Pool Paged Allocs; Pool Nonpaged Allocs; Free System Page Table Entries; Cache Bytes; Cache Bytes Peak; Pool Paged Resident Bytes; System Code Total Bytes; System Code Resident Bytes; System Driver Total Bytes; System Driver Resident Bytes; System Cache Resident Bytes; % Committed Bytes In Use; Available KBytes; Available MBytes; Transition Pages RePurposed/sec; Free & Zero Page List Bytes; Modified Page List Bytes; Standby Cache Reserve Bytes; Standby Cache Normal Priority Bytes; Standby Cache Core Bytes; Long-Term Average Standby Cache Lifetime (s)
|
||||
disabled = 1
|
||||
interval = 10
|
||||
mode = single
|
||||
object = Memory
|
||||
useEnglishOnly=true
|
||||
index=perfmon
|
||||
|
||||
## Network
|
||||
[perfmon://Network]
|
||||
counters = Bytes Total/sec; Packets/sec; Packets Received/sec; Packets Sent/sec; Current Bandwidth; Bytes Received/sec; Packets Received Unicast/sec; Packets Received Non-Unicast/sec; Packets Received Discarded; Packets Received Errors; Packets Received Unknown; Bytes Sent/sec; Packets Sent Unicast/sec; Packets Sent Non-Unicast/sec; Packets Outbound Discarded; Packets Outbound Errors; Output Queue Length; Offloaded Connections; TCP Active RSC Connections; TCP RSC Coalesced Packets/sec; TCP RSC Exceptions/sec; TCP RSC Average Packet Size
|
||||
disabled = 1
|
||||
instances = *
|
||||
interval = 10
|
||||
mode = single
|
||||
object = Network Interface
|
||||
useEnglishOnly=true
|
||||
index=perfmon
|
||||
|
||||
## Process
|
||||
[perfmon://Process]
|
||||
counters = % Processor Time; % User Time; % Privileged Time; Virtual Bytes Peak; Virtual Bytes; Page Faults/sec; Working Set Peak; Working Set; Page File Bytes Peak; Page File Bytes; Private Bytes; Thread Count; Priority Base; Elapsed Time; ID Process; Creating Process ID; Pool Paged Bytes; Pool Nonpaged Bytes; Handle Count; IO Read Operations/sec; IO Write Operations/sec; IO Data Operations/sec; IO Other Operations/sec; IO Read Bytes/sec; IO Write Bytes/sec; IO Data Bytes/sec; IO Other Bytes/sec; Working Set - Private
|
||||
disabled = 1
|
||||
instances = *
|
||||
interval = 10
|
||||
mode = single
|
||||
object = Process
|
||||
useEnglishOnly=true
|
||||
index=perfmon
|
||||
|
||||
## ProcessInformation
|
||||
[perfmon://ProcessorInformation]
|
||||
counters = % Processor Time; Processor Frequency
|
||||
disabled = 1
|
||||
instances = *
|
||||
interval = 10
|
||||
mode = single
|
||||
object = Processor Information
|
||||
useEnglishOnly=true
|
||||
index=perfmon
|
||||
|
||||
## System
|
||||
[perfmon://System]
|
||||
counters = File Read Operations/sec; File Write Operations/sec; File Control Operations/sec; File Read Bytes/sec; File Write Bytes/sec; File Control Bytes/sec; Context Switches/sec; System Calls/sec; File Data Operations/sec; System Up Time; Processor Queue Length; Processes; Threads; Alignment Fixups/sec; Exception Dispatches/sec; Floating Emulations/sec; % Registry Quota In Use
|
||||
disabled = 1
|
||||
instances = *
|
||||
interval = 10
|
||||
mode = single
|
||||
object = System
|
||||
useEnglishOnly=true
|
||||
index=perfmon
|
||||
|
||||
###### Perfmon Inputs from TA-AD/TA-DNS ######
|
||||
[perfmon://Processor]
|
||||
object = Processor
|
||||
counters = % Processor Time; % User Time; % Privileged Time; Interrupts/sec; % DPC Time; % Interrupt Time; DPCs Queued/sec; DPC Rate; % Idle Time; % C1 Time; % C2 Time; % C3 Time; C1 Transitions/sec; C2 Transitions/sec; C3 Transitions/sec
|
||||
instances = *
|
||||
interval = 10
|
||||
disabled = 1
|
||||
mode = single
|
||||
useEnglishOnly=true
|
||||
index=perfmon
|
||||
|
||||
[perfmon://Network_Interface]
|
||||
object = Network Interface
|
||||
counters = Bytes Total/sec; Packets/sec; Packets Received/sec; Packets Sent/sec; Current Bandwidth; Bytes Received/sec; Packets Received Unicast/sec; Packets Received Non-Unicast/sec; Packets Received Discarded; Packets Received Errors; Packets Received Unknown; Bytes Sent/sec; Packets Sent Unicast/sec; Packets Sent Non-Unicast/sec; Packets Outbound Discarded; Packets Outbound Errors; Output Queue Length; Offloaded Connections; TCP Active RSC Connections; TCP RSC Coalesced Packets/sec; TCP RSC Exceptions/sec; TCP RSC Average Packet Size
|
||||
instances = *
|
||||
interval = 10
|
||||
disabled = 1
|
||||
mode = single
|
||||
useEnglishOnly=true
|
||||
index=perfmon
|
||||
|
||||
[perfmon://DFS_Replicated_Folders]
|
||||
object = DFS Replicated Folders
|
||||
counters = Bandwidth Savings Using DFS Replication; RDC Bytes Received; RDC Compressed Size of Files Received; RDC Size of Files Received; RDC Number of Files Received; Compressed Size of Files Received; Size of Files Received; Total Files Received; Deleted Space In Use; Deleted Bytes Cleaned up; Deleted Files Cleaned up; Deleted Bytes Generated; Deleted Files Generated; Updates Dropped; File Installs Retried; File Installs Succeeded; Conflict Folder Cleanups Completed; Conflict Space In Use; Conflict Bytes Cleaned up; Conflict Files Cleaned up; Conflict Bytes Generated; Conflict Files Generated; Staging Space In Use; Staging Bytes Cleaned up; Staging Files Cleaned up; Staging Bytes Generated; Staging Files Generated
|
||||
instances = *
|
||||
interval = 30
|
||||
disabled = 1
|
||||
mode = single
|
||||
useEnglishOnly=true
|
||||
index=perfmon
|
||||
|
||||
[perfmon://NTDS]
|
||||
object = NTDS
|
||||
counters = DRA Inbound Properties Total/sec; AB Browses/sec; DRA Inbound Objects Applied/sec; DS Threads in Use; AB Client Sessions; DRA Pending Replication Synchronizations; DRA Inbound Object Updates Remaining in Packet; DS Security Descriptor sub-operations/sec; DS Security Descriptor Propagations Events; LDAP Client Sessions; LDAP Active Threads; LDAP Writes/sec; LDAP Searches/sec; DRA Outbound Objects/sec; DRA Outbound Properties/sec; DRA Inbound Values Total/sec; DRA Sync Requests Made; DRA Sync Requests Successful; DRA Sync Failures on Schema Mismatch; DRA Inbound Objects/sec; DRA Inbound Properties Applied/sec; DRA Inbound Properties Filtered/sec; DS Monitor List Size; DS Notify Queue Size; LDAP UDP operations/sec; DS Search sub-operations/sec; DS Name Cache hit rate; DRA Highest USN Issued (Low part); DRA Highest USN Issued (High part); DRA Highest USN Committed (Low part); DRA Highest USN Committed (High part); DS % Writes from SAM; DS % Writes from DRA; DS % Writes from LDAP; DS % Writes from LSA; DS % Writes from KCC; DS % Writes from NSPI; DS % Writes Other; DS Directory Writes/sec; DS % Searches from SAM; DS % Searches from DRA; DS % Searches from LDAP; DS % Searches from LSA; DS % Searches from KCC; DS % Searches from NSPI; DS % Searches Other; DS Directory Searches/sec; DS % Reads from SAM; DS % Reads from DRA; DRA Inbound Values (DNs only)/sec; DRA Inbound Objects Filtered/sec; DS % Reads from LSA; DS % Reads from KCC; DS % Reads from NSPI; DS % Reads Other; DS Directory Reads/sec; LDAP Successful Binds/sec; LDAP Bind Time; SAM Successful Computer Creations/sec: Includes all requests; SAM Machine Creation Attempts/sec; SAM Successful User Creations/sec; SAM User Creation Attempts/sec; SAM Password Changes/sec; SAM Membership Changes/sec; SAM Display Information Queries/sec; SAM Enumerations/sec; SAM Transitive Membership Evaluations/sec; SAM Non-Transitive Membership Evaluations/sec; SAM Domain Local Group Membership Evaluations/sec; SAM Universal Group Membership Evaluations/sec; SAM Global Group Membership Evaluations/sec; SAM GC Evaluations/sec; DRA Inbound Full Sync Objects Remaining; DRA Inbound Bytes Total/sec; DRA Inbound Bytes Not Compressed (Within Site)/sec; DRA Inbound Bytes Compressed (Between Sites, Before Compression)/sec; DRA Inbound Bytes Compressed (Between Sites, After Compression)/sec; DRA Outbound Bytes Total/sec; DRA Outbound Bytes Not Compressed (Within Site)/sec; DRA Outbound Bytes Compressed (Between Sites, Before Compression)/sec; DRA Outbound Bytes Compressed (Between Sites, After Compression)/sec; DS Client Binds/sec; DS Server Binds/sec; DS Client Name Translations/sec; DS Server Name Translations/sec; DS Security Descriptor Propagator Runtime Queue; DS Security Descriptor Propagator Average Exclusion Time; DRA Outbound Objects Filtered/sec; DRA Outbound Values Total/sec; DRA Outbound Values (DNs only)/sec; AB ANR/sec; AB Property Reads/sec; AB Searches/sec; AB Matches/sec; AB Proxy Lookups/sec; ATQ Threads Total; ATQ Threads LDAP; ATQ Threads Other; DRA Inbound Bytes Total Since Boot; DRA Inbound Bytes Not Compressed (Within Site) Since Boot; DRA Inbound Bytes Compressed (Between Sites, Before Compression) Since Boot; DRA Inbound Bytes Compressed (Between Sites, After Compression) Since Boot; DRA Outbound Bytes Total Since Boot; DRA Outbound Bytes Not Compressed (Within Site) Since Boot; DRA Outbound Bytes Compressed (Between Sites, Before Compression) Since Boot; DRA Outbound Bytes Compressed (Between Sites, After Compression) Since Boot; LDAP New Connections/sec; LDAP Closed Connections/sec; LDAP New SSL Connections/sec; DRA Pending Replication Operations; DRA Threads Getting NC Changes; DRA Threads Getting NC Changes Holding Semaphore; DRA Inbound Link Value Updates Remaining in Packet; DRA Inbound Total Updates Remaining in Packet; DS % Writes from NTDSAPI; DS % Searches from NTDSAPI; DS % Reads from NTDSAPI; SAM Account Group Evaluation Latency; SAM Resource Group Evaluation Latency; ATQ Outstanding Queued Requests; ATQ Request Latency; ATQ Estimated Queue Delay; Tombstones Garbage Collected/sec; Phantoms Cleaned/sec; Link Values Cleaned/sec; Tombstones Visited/sec; Phantoms Visited/sec; NTLM Binds/sec; Negotiated Binds/sec; Digest Binds/sec; Simple Binds/sec; External Binds/sec; Fast Binds/sec; Base searches/sec; Subtree searches/sec; Onelevel searches/sec; Database adds/sec; Database modifys/sec; Database deletes/sec; Database recycles/sec; Approximate highest DNT; Transitive operations/sec; Transitive suboperations/sec; Transitive operations milliseconds run
|
||||
interval = 10
|
||||
disabled = 1
|
||||
mode = single
|
||||
useEnglishOnly=true
|
||||
index=perfmon
|
||||
|
||||
[perfmon://DNS]
|
||||
object = DNS
|
||||
counters = Total Query Received; Total Query Received/sec; UDP Query Received; UDP Query Received/sec; TCP Query Received; TCP Query Received/sec; Total Response Sent; Total Response Sent/sec; UDP Response Sent; UDP Response Sent/sec; TCP Response Sent; TCP Response Sent/sec; Recursive Queries; Recursive Queries/sec; Recursive Send TimeOuts; Recursive TimeOut/sec; Recursive Query Failure; Recursive Query Failure/sec; Notify Sent; Zone Transfer Request Received; Zone Transfer Success; Zone Transfer Failure; AXFR Request Received; AXFR Success Sent; IXFR Request Received; IXFR Success Sent; Notify Received; Zone Transfer SOA Request Sent; AXFR Request Sent; AXFR Response Received; AXFR Success Received; IXFR Request Sent; IXFR Response Received; IXFR Success Received; IXFR UDP Success Received; IXFR TCP Success Received; WINS Lookup Received; WINS Lookup Received/sec; WINS Response Sent; WINS Response Sent/sec; WINS Reverse Lookup Received; WINS Reverse Lookup Received/sec; WINS Reverse Response Sent; WINS Reverse Response Sent/sec; Dynamic Update Received; Dynamic Update Received/sec; Dynamic Update NoOperation; Dynamic Update NoOperation/sec; Dynamic Update Written to Database; Dynamic Update Written to Database/sec; Dynamic Update Rejected; Dynamic Update TimeOuts; Dynamic Update Queued; Secure Update Received; Secure Update Received/sec; Secure Update Failure; Database Node Memory; Record Flow Memory; Caching Memory; UDP Message Memory; TCP Message Memory; Nbstat Memory; Unmatched Responses Received
|
||||
interval = 10
|
||||
disabled = 1
|
||||
mode = single
|
||||
useEnglishOnly=true
|
||||
index=perfmon
|
||||
|
||||
[WinRegMon://default]
|
||||
disabled = 1
|
||||
hive = .*
|
||||
proc = .*
|
||||
type = rename|set|delete|create
|
||||
index = windows
|
||||
|
||||
[WinRegMon://hkcu_run]
|
||||
disabled = 1
|
||||
hive = \\REGISTRY\\USER\\.*\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\.*
|
||||
proc = .*
|
||||
type = set|create|delete|rename
|
||||
index = windows
|
||||
|
||||
[WinRegMon://hklm_run]
|
||||
disabled = 1
|
||||
hive = \\REGISTRY\\MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\.*
|
||||
proc = .*
|
||||
type = set|create|delete|rename
|
||||
index = windows
|
||||
@ -0,0 +1,213 @@
|
||||
# MS Windows AD Objects provided pre-defined - AD Domain Controller inputs
|
||||
# - Custom Input Settings from the Splunk_TA_windows TA
|
||||
#
|
||||
# ---------------------------------------------------------------------------------------
|
||||
# NOTE:
|
||||
# *** This inputs.conf only contains pre-defined and enabled inputs for only
|
||||
# Active Directory Domain Controllers. The inputs enabled are set with the
|
||||
# disabled = 0 setting and can be adjusted for your required needs.
|
||||
# *** IMPORTANT: It is important that you also have the MS Windows AD Objects pre-defined
|
||||
# base OS enabled inputs that are available with the MS Windows AD Objects application.
|
||||
# Special Notes:
|
||||
# *** Recommended Input for MS Windows AD Objects application:
|
||||
# - To ensure the smoothest configuration of the MS Windows AD Objects
|
||||
# application, it is highly recommended to have the following input enabled,
|
||||
# which collects the Active Directory Domain details used to build the
|
||||
# AD_Obj_Domain lookup. This lookup is critical for the other leveraged lookups.
|
||||
# *** Predefined Settings and Changes from the default\inputs.conf:
|
||||
# - Index Settings: All of the enabled inputs below have predefined indexes based off of standard
|
||||
# - Perfmon.. Inputs - mode Setting: The mode setting has been set to single, instead of multikv
|
||||
# - WinEventLogs - renderxml Setting: XML Rendering of the WinEventLogs... is set to false, instead of true.
|
||||
# recommendations. You can adjust these to match your requirements and created indexes.
|
||||
# *** Renaming the applications folder, from Splunk_TA_windows_dc:
|
||||
# - If you want to use a different name than Splunk_TA_windows_dc then
|
||||
# you will need to update script setting in the following inputs:
|
||||
# - [powershell://Replication-Stats]
|
||||
# - [powershell://AD-Health]
|
||||
# - [powershell://Siteinfo]
|
||||
# - [powershell://generate_windows_update_logs]
|
||||
# - [monitor://$SPLUNK_HOME\var\log\Splunk_TA_windows\WindowsUpdate.log]
|
||||
# - Windows Version Considerations:
|
||||
# - A couple of the inputs are dependent on the OS Versions. Below
|
||||
# is an input section to possibly update depending on the
|
||||
# OS Version you are deploying these inputs too:
|
||||
# - ## Replication Information ... sections
|
||||
# - ## Health and Topology ... sections
|
||||
# - ## Site, Site Link and Subnet Information ... sections
|
||||
# - This example input has the Windows 8,8.1, Server 2008R2, 2012 and 2012R2 enabled.
|
||||
# - If target version is Windows 10 and Server 2016 you will need to update it this section.
|
||||
# ---------------------------------------------------------------------------------------
|
||||
|
||||
###### WinEventLog Inputs for Active Directory ######
|
||||
|
||||
## Application and Services Logs - DFS Replication
|
||||
[WinEventLog://DFS Replication]
|
||||
disabled = 0
|
||||
renderXml=false
|
||||
index=wineventlog
|
||||
|
||||
## Application and Services Logs - Directory Service
|
||||
[WinEventLog://Directory Service]
|
||||
disabled = 0
|
||||
renderXml=false
|
||||
index=wineventlog
|
||||
|
||||
## Application and Services Logs - File Replication Service
|
||||
[WinEventLog://File Replication Service]
|
||||
disabled = 0
|
||||
renderXml=false
|
||||
index = wineventlog
|
||||
|
||||
## Application and Services Logs - Key Management Service
|
||||
[WinEventLog://Key Management Service]
|
||||
disabled = 0
|
||||
renderXml=false
|
||||
index = wineventlog
|
||||
|
||||
###### WinEventLog Inputs for DNS ######
|
||||
[WinEventLog://DNS Server]
|
||||
disabled=0
|
||||
renderXml=false
|
||||
index = wineventlog
|
||||
|
||||
###### DHCP ######
|
||||
[monitor://$WINDIR\System32\DHCP]
|
||||
disabled = 0
|
||||
whitelist = DhcpSrvLog*
|
||||
crcSalt = <SOURCE>
|
||||
sourcetype = DhcpSrvLog
|
||||
index = msad
|
||||
|
||||
###### Monitor Inputs for Active Directory ######
|
||||
[monitor://$WINDIR\debug\netlogon.log]
|
||||
sourcetype=MSAD:NT6:Netlogon
|
||||
disabled=0
|
||||
index=msad
|
||||
|
||||
###### Monitor Inputs for DNS ######
|
||||
[MonitorNoHandle://$WINDIR\System32\Dns\dns.log]
|
||||
sourcetype=MSAD:NT6:DNS
|
||||
disabled=0
|
||||
index=msad
|
||||
|
||||
###### Scripted/Powershell Mod inputs Active Directory ######
|
||||
|
||||
## Replication Information NT6
|
||||
[script://.\bin\runpowershell.cmd nt6-repl-stat.ps1]
|
||||
source=Powershell
|
||||
sourcetype=MSAD:NT6:Replication
|
||||
interval=300
|
||||
disabled=1
|
||||
index=msad
|
||||
|
||||
## Replication Information 2012r2 and 2016
|
||||
[powershell://Replication-Stats]
|
||||
script = & "$SplunkHome\etc\apps\Splunk_TA_windows_dc\bin\Invoke-MonitoredScript.ps1" -Command ".\powershell\2012r2-repl-stats.ps1"
|
||||
schedule = 0 */5 * ? * *
|
||||
source = Powershell
|
||||
sourcetype=MSAD:NT6:Replication
|
||||
disabled=0
|
||||
index=msad
|
||||
|
||||
## Health and Topology Information Windows (Version 2008) - ** Either this input or [powershell://AD-Health] is needed for the MS Windows AD Objects application
|
||||
[script://.\bin\runpowershell.cmd nt6-health.ps1]
|
||||
source=Powershell
|
||||
sourcetype=MSAD:NT6:Health
|
||||
interval=300
|
||||
disabled=1
|
||||
index=msad
|
||||
|
||||
## Health and Topology Information Windows (Version 2012r2 and 2016) - ** Either this input or [script://.\bin\runpowershell.cmd nt6-health.ps1] is needed for the MS Windows AD Objects application
|
||||
[powershell://AD-Health]
|
||||
script = & "$SplunkHome\etc\apps\Splunk_TA_windows_dc\bin\Invoke-MonitoredScript.ps1" -Command ".\powershell\2012r2-health.ps1"
|
||||
schedule = 0 */5 * ? * *
|
||||
source=Powershell
|
||||
sourcetype=MSAD:NT6:Health
|
||||
disabled=0
|
||||
index=msad
|
||||
|
||||
|
||||
## Site, Site Link and Subnet Information NT6
|
||||
[script://.\bin\runpowershell.cmd nt6-siteinfo.ps1]
|
||||
source=Powershell
|
||||
sourcetype=MSAD:NT6:SiteInfo
|
||||
interval=3600
|
||||
disabled=1
|
||||
index=msad
|
||||
|
||||
## Site, Site Link and Subnet Information 2012r2 and 2016
|
||||
[powershell://Siteinfo]
|
||||
script = & "$SplunkHome\etc\apps\Splunk_TA_windows_dc\bin\Invoke-MonitoredScript.ps1" -Command ".\powershell\2012r2-siteinfo.ps1"
|
||||
schedule = 0 15 * ? * *
|
||||
source = Powershell
|
||||
sourcetype=MSAD:NT6:SiteInfo
|
||||
disabled=0
|
||||
index=msad
|
||||
|
||||
|
||||
##### Scripted Inputs for DNS #####
|
||||
|
||||
## DNS Zone Information Collection
|
||||
[script://.\bin\runpowershell.cmd dns-zoneinfo.ps1]
|
||||
source=Powershell
|
||||
sourcetype=MSAD:NT6:DNS-Zone-Information
|
||||
interval=3600
|
||||
disabled=0
|
||||
index=msad
|
||||
|
||||
## DNS Health Information Collection
|
||||
[script://.\bin\runpowershell.cmd dns-health.ps1]
|
||||
source=Powershell
|
||||
sourcetype=MSAD:NT6:DNS-Health
|
||||
interval=3600
|
||||
disabled=0
|
||||
index=msad
|
||||
|
||||
###### Perfmon Inputs from TA-AD/TA-DNS ######
|
||||
[perfmon://Processor]
|
||||
object = Processor
|
||||
counters = % Processor Time; % User Time; % Privileged Time; Interrupts/sec; % DPC Time; % Interrupt Time; DPCs Queued/sec; DPC Rate; % Idle Time; % C1 Time; % C2 Time; % C3 Time; C1 Transitions/sec; C2 Transitions/sec; C3 Transitions/sec
|
||||
instances = *
|
||||
interval = 60
|
||||
disabled = 0
|
||||
mode = single
|
||||
useEnglishOnly=true
|
||||
index=perfmon
|
||||
|
||||
[perfmon://Network_Interface]
|
||||
object = Network Interface
|
||||
counters = Bytes Total/sec; Packets/sec; Packets Received/sec; Packets Sent/sec; Current Bandwidth; Bytes Received/sec; Packets Received Unicast/sec; Packets Received Non-Unicast/sec; Packets Received Discarded; Packets Received Errors; Packets Received Unknown; Bytes Sent/sec; Packets Sent Unicast/sec; Packets Sent Non-Unicast/sec; Packets Outbound Discarded; Packets Outbound Errors; Output Queue Length; Offloaded Connections; TCP Active RSC Connections; TCP RSC Coalesced Packets/sec; TCP RSC Exceptions/sec; TCP RSC Average Packet Size
|
||||
instances = *
|
||||
interval = 60
|
||||
disabled = 0
|
||||
mode = single
|
||||
useEnglishOnly=true
|
||||
index=perfmon
|
||||
|
||||
[perfmon://DFS_Replicated_Folders]
|
||||
object = DFS Replicated Folders
|
||||
counters = Bandwidth Savings Using DFS Replication; RDC Bytes Received; RDC Compressed Size of Files Received; RDC Size of Files Received; RDC Number of Files Received; Compressed Size of Files Received; Size of Files Received; Total Files Received; Deleted Space In Use; Deleted Bytes Cleaned up; Deleted Files Cleaned up; Deleted Bytes Generated; Deleted Files Generated; Updates Dropped; File Installs Retried; File Installs Succeeded; Conflict Folder Cleanups Completed; Conflict Space In Use; Conflict Bytes Cleaned up; Conflict Files Cleaned up; Conflict Bytes Generated; Conflict Files Generated; Staging Space In Use; Staging Bytes Cleaned up; Staging Files Cleaned up; Staging Bytes Generated; Staging Files Generated
|
||||
instances = *
|
||||
interval = 30
|
||||
disabled = 0
|
||||
mode = single
|
||||
useEnglishOnly=true
|
||||
index=perfmon
|
||||
|
||||
[perfmon://NTDS]
|
||||
object = NTDS
|
||||
counters = DRA Inbound Properties Total/sec; AB Browses/sec; DRA Inbound Objects Applied/sec; DS Threads in Use; AB Client Sessions; DRA Pending Replication Synchronizations; DRA Inbound Object Updates Remaining in Packet; DS Security Descriptor sub-operations/sec; DS Security Descriptor Propagations Events; LDAP Client Sessions; LDAP Active Threads; LDAP Writes/sec; LDAP Searches/sec; DRA Outbound Objects/sec; DRA Outbound Properties/sec; DRA Inbound Values Total/sec; DRA Sync Requests Made; DRA Sync Requests Successful; DRA Sync Failures on Schema Mismatch; DRA Inbound Objects/sec; DRA Inbound Properties Applied/sec; DRA Inbound Properties Filtered/sec; DS Monitor List Size; DS Notify Queue Size; LDAP UDP operations/sec; DS Search sub-operations/sec; DS Name Cache hit rate; DRA Highest USN Issued (Low part); DRA Highest USN Issued (High part); DRA Highest USN Committed (Low part); DRA Highest USN Committed (High part); DS % Writes from SAM; DS % Writes from DRA; DS % Writes from LDAP; DS % Writes from LSA; DS % Writes from KCC; DS % Writes from NSPI; DS % Writes Other; DS Directory Writes/sec; DS % Searches from SAM; DS % Searches from DRA; DS % Searches from LDAP; DS % Searches from LSA; DS % Searches from KCC; DS % Searches from NSPI; DS % Searches Other; DS Directory Searches/sec; DS % Reads from SAM; DS % Reads from DRA; DRA Inbound Values (DNs only)/sec; DRA Inbound Objects Filtered/sec; DS % Reads from LSA; DS % Reads from KCC; DS % Reads from NSPI; DS % Reads Other; DS Directory Reads/sec; LDAP Successful Binds/sec; LDAP Bind Time; SAM Successful Computer Creations/sec: Includes all requests; SAM Machine Creation Attempts/sec; SAM Successful User Creations/sec; SAM User Creation Attempts/sec; SAM Password Changes/sec; SAM Membership Changes/sec; SAM Display Information Queries/sec; SAM Enumerations/sec; SAM Transitive Membership Evaluations/sec; SAM Non-Transitive Membership Evaluations/sec; SAM Domain Local Group Membership Evaluations/sec; SAM Universal Group Membership Evaluations/sec; SAM Global Group Membership Evaluations/sec; SAM GC Evaluations/sec; DRA Inbound Full Sync Objects Remaining; DRA Inbound Bytes Total/sec; DRA Inbound Bytes Not Compressed (Within Site)/sec; DRA Inbound Bytes Compressed (Between Sites, Before Compression)/sec; DRA Inbound Bytes Compressed (Between Sites, After Compression)/sec; DRA Outbound Bytes Total/sec; DRA Outbound Bytes Not Compressed (Within Site)/sec; DRA Outbound Bytes Compressed (Between Sites, Before Compression)/sec; DRA Outbound Bytes Compressed (Between Sites, After Compression)/sec; DS Client Binds/sec; DS Server Binds/sec; DS Client Name Translations/sec; DS Server Name Translations/sec; DS Security Descriptor Propagator Runtime Queue; DS Security Descriptor Propagator Average Exclusion Time; DRA Outbound Objects Filtered/sec; DRA Outbound Values Total/sec; DRA Outbound Values (DNs only)/sec; AB ANR/sec; AB Property Reads/sec; AB Searches/sec; AB Matches/sec; AB Proxy Lookups/sec; ATQ Threads Total; ATQ Threads LDAP; ATQ Threads Other; DRA Inbound Bytes Total Since Boot; DRA Inbound Bytes Not Compressed (Within Site) Since Boot; DRA Inbound Bytes Compressed (Between Sites, Before Compression) Since Boot; DRA Inbound Bytes Compressed (Between Sites, After Compression) Since Boot; DRA Outbound Bytes Total Since Boot; DRA Outbound Bytes Not Compressed (Within Site) Since Boot; DRA Outbound Bytes Compressed (Between Sites, Before Compression) Since Boot; DRA Outbound Bytes Compressed (Between Sites, After Compression) Since Boot; LDAP New Connections/sec; LDAP Closed Connections/sec; LDAP New SSL Connections/sec; DRA Pending Replication Operations; DRA Threads Getting NC Changes; DRA Threads Getting NC Changes Holding Semaphore; DRA Inbound Link Value Updates Remaining in Packet; DRA Inbound Total Updates Remaining in Packet; DS % Writes from NTDSAPI; DS % Searches from NTDSAPI; DS % Reads from NTDSAPI; SAM Account Group Evaluation Latency; SAM Resource Group Evaluation Latency; ATQ Outstanding Queued Requests; ATQ Request Latency; ATQ Estimated Queue Delay; Tombstones Garbage Collected/sec; Phantoms Cleaned/sec; Link Values Cleaned/sec; Tombstones Visited/sec; Phantoms Visited/sec; NTLM Binds/sec; Negotiated Binds/sec; Digest Binds/sec; Simple Binds/sec; External Binds/sec; Fast Binds/sec; Base searches/sec; Subtree searches/sec; Onelevel searches/sec; Database adds/sec; Database modifys/sec; Database deletes/sec; Database recycles/sec; Approximate highest DNT; Transitive operations/sec; Transitive suboperations/sec; Transitive operations milliseconds run
|
||||
interval = 60
|
||||
disabled = 0
|
||||
mode = single
|
||||
useEnglishOnly=true
|
||||
index=perfmon
|
||||
|
||||
[perfmon://DNS]
|
||||
object = DNS
|
||||
counters = Total Query Received; Total Query Received/sec; UDP Query Received; UDP Query Received/sec; TCP Query Received; TCP Query Received/sec; Total Response Sent; Total Response Sent/sec; UDP Response Sent; UDP Response Sent/sec; TCP Response Sent; TCP Response Sent/sec; Recursive Queries; Recursive Queries/sec; Recursive Send TimeOuts; Recursive TimeOut/sec; Recursive Query Failure; Recursive Query Failure/sec; Notify Sent; Zone Transfer Request Received; Zone Transfer Success; Zone Transfer Failure; AXFR Request Received; AXFR Success Sent; IXFR Request Received; IXFR Success Sent; Notify Received; Zone Transfer SOA Request Sent; AXFR Request Sent; AXFR Response Received; AXFR Success Received; IXFR Request Sent; IXFR Response Received; IXFR Success Received; IXFR UDP Success Received; IXFR TCP Success Received; WINS Lookup Received; WINS Lookup Received/sec; WINS Response Sent; WINS Response Sent/sec; WINS Reverse Lookup Received; WINS Reverse Lookup Received/sec; WINS Reverse Response Sent; WINS Reverse Response Sent/sec; Dynamic Update Received; Dynamic Update Received/sec; Dynamic Update NoOperation; Dynamic Update NoOperation/sec; Dynamic Update Written to Database; Dynamic Update Written to Database/sec; Dynamic Update Rejected; Dynamic Update TimeOuts; Dynamic Update Queued; Secure Update Received; Secure Update Received/sec; Secure Update Failure; Database Node Memory; Record Flow Memory; Caching Memory; UDP Message Memory; TCP Message Memory; Nbstat Memory; Unmatched Responses Received
|
||||
interval = 60
|
||||
disabled = 0
|
||||
mode = single
|
||||
useEnglishOnly=true
|
||||
index=perfmon
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 25 KiB |
@ -0,0 +1,10 @@
|
||||
[<stanza name>]
|
||||
title = <string>
|
||||
type = <string>
|
||||
stacks = <string>
|
||||
description = <string>
|
||||
repo = <string>
|
||||
branch = <string>
|
||||
tags = <string>
|
||||
apps = <string>
|
||||
path = <string>
|
||||
@ -0,0 +1,8 @@
|
||||
[<stanza name>]
|
||||
blacklisted_apps = <string>
|
||||
blacklisted_conffiles = <string>
|
||||
blacklisted_stanzas = <string>
|
||||
blacklisted_roles = <string>
|
||||
blacklisted_users = <string>
|
||||
theme = <string>
|
||||
is_configured = <boolean>
|
||||
@ -0,0 +1,8 @@
|
||||
[<stanza name>]
|
||||
title = <string>
|
||||
author = <string>
|
||||
sharing = <string>
|
||||
roles = <string>
|
||||
description = <string>
|
||||
actions = <string>
|
||||
modified = <string>
|
||||
@ -0,0 +1,10 @@
|
||||
[<stanza name>]
|
||||
title = <string>
|
||||
type = <string>
|
||||
stacks = <string>
|
||||
description = <string>
|
||||
repo = <string>
|
||||
branch = <string>
|
||||
tags = <string>
|
||||
apps = <string>
|
||||
path = <string>
|
||||
@ -0,0 +1,6 @@
|
||||
# this file is generated by @splunk/create automatically
|
||||
# please do not edit it
|
||||
|
||||
[base]
|
||||
splunk_create_version = <string>
|
||||
splunk_create_type = <string>
|
||||
@ -0,0 +1,8 @@
|
||||
[<stanza name>]
|
||||
apav = <boolean>
|
||||
experience = <string>
|
||||
version = <string>
|
||||
owner = <string>
|
||||
sharing = <string>
|
||||
tags = <string>
|
||||
roles = <string>
|
||||
@ -0,0 +1,8 @@
|
||||
[<stanza name>]
|
||||
title = <string>
|
||||
author = <string>
|
||||
sharing = <string>
|
||||
roles = <string>
|
||||
description = <string>
|
||||
actions = <string>
|
||||
modified = <string>
|
||||
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 91 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 141 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 939 B |
|
After Width: | Height: | Size: 939 B |
|
After Width: | Height: | Size: 96 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 4.5 KiB |
|
After Width: | Height: | Size: 939 B |
|
After Width: | Height: | Size: 755 B |
|
After Width: | Height: | Size: 939 B |
|
After Width: | Height: | Size: 4.5 KiB |
|
After Width: | Height: | Size: 14 KiB |
@ -0,0 +1,105 @@
|
||||
export const ExportAllIcon = () =>{
|
||||
return (<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
|
||||
<defs>
|
||||
<style>
|
||||
.cls-1, .cls-2 {
|
||||
fill: #ffe9f2;
|
||||
}
|
||||
|
||||
.cls-3 {
|
||||
stroke: #b23a60;
|
||||
}
|
||||
|
||||
.cls-3, .cls-4 {
|
||||
stroke-width: 3.16px;
|
||||
}
|
||||
|
||||
.cls-3, .cls-4, .cls-2, .cls-5, .cls-6, .cls-7, .cls-8 {
|
||||
stroke-linecap: round;
|
||||
stroke-linejoin: round;
|
||||
}
|
||||
|
||||
.cls-3, .cls-4, .cls-7 {
|
||||
fill: none;
|
||||
}
|
||||
|
||||
.cls-4, .cls-2, .cls-5, .cls-6, .cls-7, .cls-8 {
|
||||
stroke: #471726;
|
||||
}
|
||||
|
||||
.cls-2, .cls-5, .cls-6, .cls-7, .cls-8 {
|
||||
stroke-width: 4.74px;
|
||||
}
|
||||
|
||||
.cls-5 {
|
||||
fill: #e693ae;
|
||||
}
|
||||
|
||||
.cls-6 {
|
||||
fill: #b23a60;
|
||||
}
|
||||
|
||||
.cls-8 {
|
||||
fill: #faa0bd;
|
||||
}
|
||||
</style>
|
||||
</defs>
|
||||
<g>
|
||||
<g>
|
||||
<path class="cls-1" d="M450.41,430.3s-14.68-61.66,8.81-93.96c23.49-32.3,1.26-78.53-32.97-91.28,0,0-36.58-8.39-55.71-31.21-19.13-22.82-16.78-98.33-97.32-92.62-80.54,5.7-86.24,76.51-113.43,86.58-27.18,10.07-98.66,1.01-107.39,43.63-8.73,42.62,30.87,41.61,22.82,74.5-8.05,32.89-28.19,68.79-19.46,104.37H450.41Z"/>
|
||||
<line class="cls-7" x1="462.94" y1="430.3" x2="37.42" y2="430.3"/>
|
||||
<line class="cls-7" x1="474.58" y1="430.3" x2="489.51" y2="430.3"/>
|
||||
</g>
|
||||
<g>
|
||||
<line class="cls-4" x1="54.97" y1="234.28" x2="75.23" y2="234.28"/>
|
||||
<line class="cls-4" x1="65.1" y1="224.15" x2="65.1" y2="244.41"/>
|
||||
</g>
|
||||
<g>
|
||||
<line class="cls-3" x1="128.3" y1="155.82" x2="148.57" y2="155.82"/>
|
||||
<line class="cls-3" x1="138.44" y1="145.68" x2="138.44" y2="165.95"/>
|
||||
</g>
|
||||
<g>
|
||||
<line class="cls-4" x1="410.78" y1="180.48" x2="431.04" y2="180.48"/>
|
||||
<line class="cls-4" x1="420.91" y1="170.35" x2="420.91" y2="190.61"/>
|
||||
</g>
|
||||
<g>
|
||||
<line class="cls-4" x1="464.44" y1="388.73" x2="484.71" y2="388.73"/>
|
||||
<line class="cls-4" x1="474.58" y1="378.6" x2="474.58" y2="398.87"/>
|
||||
</g>
|
||||
<g>
|
||||
<line class="cls-3" x1="474.58" y1="295.46" x2="494.84" y2="295.46"/>
|
||||
<line class="cls-3" x1="484.71" y1="285.32" x2="484.71" y2="305.59"/>
|
||||
</g>
|
||||
<g>
|
||||
<line class="cls-3" x1="266.17" y1="91.83" x2="286.44" y2="91.83"/>
|
||||
<line class="cls-3" x1="276.31" y1="81.7" x2="276.31" y2="101.96"/>
|
||||
</g>
|
||||
<g>
|
||||
<line class="cls-4" x1="17.16" y1="398.87" x2="37.42" y2="398.87"/>
|
||||
<line class="cls-4" x1="27.29" y1="388.73" x2="27.29" y2="409"/>
|
||||
</g>
|
||||
<g>
|
||||
<line class="cls-3" x1="65.1" y1="315.8" x2="85.37" y2="315.8"/>
|
||||
<line class="cls-3" x1="75.23" y1="305.67" x2="75.23" y2="325.94"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<path class="cls-8" d="M317.16,218.36l22.66,77.05c.25,.84,.37,1.72,.37,2.6v132.29h-73.72V218.36h50.68Z"/>
|
||||
<path class="cls-6" d="M294.12,430.3H132.85v-131.35c0-1.51,.18-3.01,.55-4.47l22.49-76.13h161.26l-22.49,76.13c-.37,1.46-.55,2.96-.55,4.47v131.35Z"/>
|
||||
<path class="cls-5" d="M151.28,190.71c-5.09,0-9.22,6.19-9.22,13.82s4.13,13.82,9.22,13.82h165.87v-27.65H151.28Z"/>
|
||||
<path class="cls-8" d="M344.8,202.68c0,11.2-9.08,20.29-20.29,20.29h-11.33c-.41,0-.81,.14-1.14,.39l-28.75,22.37c-6.77,5.27-16.51,4.12-21.87-2.58-4.99-6.24-4.49-15.23,1.16-20.88l28.37-28.37c.73-.73,.73-1.9,0-2.63-.35-.35-.82-.54-1.32-.54h-83.06l46.14-25.17c2.98-1.63,6.32-2.48,9.72-2.48h117.37c1.03,0,1.86,.83,1.86,1.86v33.14c0,1.03-.83,1.86-1.86,1.86h-32.25c-1.52,0-2.75,1.23-2.75,2.75h0Z"/>
|
||||
<path class="cls-6" d="M363.23,153.85h36.86v59.9h-36.86v-59.9Z"/>
|
||||
<path class="cls-8" d="M294.12,430.3l23.04-23.04,23.04,23.04h-46.08Z"/>
|
||||
<line class="cls-8" x1="317.16" y1="407.27" x2="317.16" y2="324.75"/>
|
||||
<g>
|
||||
<path class="cls-2" d="M190.09,398.05h-8.38c-5.43,0-9.84-4.4-9.84-9.84,0-.23,0-.47,.03-.7l10.95-58.33h6.12l10.95,58.33c.39,5.42-3.69,10.13-9.11,10.51-.23,.02-.47,.03-.7,.03Z"/>
|
||||
<path class="cls-2" d="M245.22,398.05h-7.95c-5.56,0-10.06-4.51-10.06-10.06,0-.33,.02-.67,.05-1l3.93-39.26h20.13l3.93,39.26c.55,5.53-3.48,10.46-9.01,11.02-.33,.03-.67,.05-1,.05Z"/>
|
||||
<path class="cls-2" d="M231.18,347.73v-5.03l-10.06-5.03s3.77-50.32,30.19-50.32v60.39h-20.13Z"/>
|
||||
<path class="cls-2" d="M169.81,312.84h32.17v6.78c0,8.88-7.21,16.09-16.09,16.09h0c-8.88,0-16.09-7.21-16.09-16.09v-6.78h0Z"/>
|
||||
<line class="cls-6" x1="169.81" y1="312.84" x2="169.81" y2="287.34"/>
|
||||
<line class="cls-6" x1="185.89" y1="312.84" x2="185.89" y2="291.75"/>
|
||||
<line class="cls-6" x1="201.98" y1="312.84" x2="201.98" y2="287.34"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>)
|
||||
}
|
||||
@ -0,0 +1,939 @@
|
||||
<!DOCTYPE html>
|
||||
<html class="no-js" lang="">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="x-ua-compatible" content="ie=edge" />
|
||||
<title>App Content Manager</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<link rel="apple-touch-icon" href="apple-touch-icon.png" />
|
||||
<style>
|
||||
.workflowcardaction {
|
||||
cursor: default !important;
|
||||
background: transparent !important;
|
||||
}
|
||||
|
||||
.workflowcardaction:hover {
|
||||
cursor: default !important;
|
||||
background: transparent !important;
|
||||
}
|
||||
|
||||
.workflowrows {
|
||||
background: transparent !important;
|
||||
}
|
||||
|
||||
.workflowrows:hover {
|
||||
background: transparent !important;
|
||||
}
|
||||
|
||||
.notallowedoption {
|
||||
cursor: 'not-allowed';
|
||||
}
|
||||
|
||||
.sbversion {
|
||||
line-height: 40px !important;
|
||||
font-weight: bold !important;
|
||||
}
|
||||
|
||||
.documentation_dark > p {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.documentation_light > p {
|
||||
color: #2c2c2c;
|
||||
}
|
||||
|
||||
.partitionButton[disabled] {
|
||||
background: #feedf3 !important;
|
||||
color: #dad8d8 !important;
|
||||
}
|
||||
|
||||
.partitionButton {
|
||||
background: #bd456a !important;
|
||||
color: #ffffff !important;
|
||||
}
|
||||
|
||||
.workflowcard {
|
||||
max-width: 600px;
|
||||
width: 18%;
|
||||
min-width: 260px;
|
||||
max-height: 275px;
|
||||
min-height: 275px;
|
||||
background-size: cover !important;
|
||||
background-repeat: no-repeat !important;
|
||||
background-position: -130px 42px !important;
|
||||
}
|
||||
|
||||
.servercard {
|
||||
max-width: 600px;
|
||||
width: 18%;
|
||||
min-width: 260px;
|
||||
max-height: 275px;
|
||||
min-height: 275px;
|
||||
background-size: contain !important;
|
||||
background-repeat: no-repeat !important;
|
||||
background-position: 200px 25px !important;
|
||||
}
|
||||
|
||||
.elemBorder {
|
||||
background: linear-gradient(
|
||||
-30deg,
|
||||
#f99d1c 8.98%,
|
||||
#f99c1c 9.4%,
|
||||
#f4781f 21.71%,
|
||||
#f16221 31.74%,
|
||||
#f05a22 38.17%,
|
||||
#ee1d62 64.89%,
|
||||
#ce0070 76.39%
|
||||
);
|
||||
}
|
||||
.bottomBorder {
|
||||
background: linear-gradient(
|
||||
-30deg,
|
||||
#f99d1c 8.98%,
|
||||
#f99c1c 9.4%,
|
||||
#f4781f 21.71%,
|
||||
#f16221 31.74%,
|
||||
#f05a22 38.17%,
|
||||
#ee1d62 64.89%,
|
||||
#ce0070 76.39%
|
||||
);
|
||||
position: relative;
|
||||
bottom: 0px;
|
||||
height: 4px;
|
||||
width: 100%;
|
||||
display: block;
|
||||
border-bottom-right-radius: 10px;
|
||||
border-bottom-left-radius: 10px;
|
||||
}
|
||||
.download-image .download-btn {
|
||||
border: 1px solid #eee;
|
||||
background: #ebf8ff;
|
||||
padding: 10px 20px;
|
||||
border-radius: 5px;
|
||||
font-weight: 700;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.download-image .download-btn:hover {
|
||||
opacity: 0.9;
|
||||
}
|
||||
|
||||
.text-updater-node {
|
||||
height: fit-content;
|
||||
width: fit-content;
|
||||
border: 1px solid #eee;
|
||||
padding: 5px;
|
||||
border-radius: 5px;
|
||||
color: white;
|
||||
}
|
||||
|
||||
span:has(
|
||||
div[class^='SwitchStyles__StyledSome'],
|
||||
div[class*=' SwitchStyles__StyledSome']
|
||||
):not([disabled]) {
|
||||
border-color: #bd456a !important;
|
||||
background-color: #bd456a !important;
|
||||
border-radius: 9px !important;
|
||||
}
|
||||
|
||||
*[class^='SwitchStyles__StyledCheckboxClickable']:has(svg):not([disabled]),
|
||||
*[class*=' SwitchStyles__StyledCheckboxClickable']:has(svg):not([disabled]) {
|
||||
border-color: #bd456a !important;
|
||||
background-color: #bd456a !important;
|
||||
border-radius: 9px !important;
|
||||
}
|
||||
|
||||
*[class^='SwitchStyles__StyledCheckboxClickable'],
|
||||
*[class*=' SwitchStyles__StyledCheckboxClickable'] {
|
||||
border-radius: 9px !important;
|
||||
}
|
||||
|
||||
.imgmode:hover {
|
||||
/* Start the shake animation and make the animation last for 0.5 seconds */
|
||||
animation: shake 2s, 0.5s, 1s;
|
||||
|
||||
/* When the animation is finished, start again */
|
||||
animation-iteration-count: infinite;
|
||||
}
|
||||
|
||||
@keyframes shake {
|
||||
0% {
|
||||
transform: translate(1px, 1px) rotate(0deg);
|
||||
}
|
||||
10% {
|
||||
transform: translate(-1px, -2px) rotate(-1deg);
|
||||
}
|
||||
20% {
|
||||
transform: translate(-3px, 0px) rotate(1deg);
|
||||
}
|
||||
30% {
|
||||
transform: translate(3px, 2px) rotate(0deg);
|
||||
}
|
||||
40% {
|
||||
transform: translate(1px, -1px) rotate(1deg);
|
||||
}
|
||||
50% {
|
||||
transform: translate(-1px, 2px) rotate(-1deg);
|
||||
}
|
||||
60% {
|
||||
transform: translate(-3px, 1px) rotate(0deg);
|
||||
}
|
||||
70% {
|
||||
transform: translate(3px, 1px) rotate(-1deg);
|
||||
}
|
||||
80% {
|
||||
transform: translate(-1px, -1px) rotate(1deg);
|
||||
}
|
||||
90% {
|
||||
transform: translate(1px, 2px) rotate(0deg);
|
||||
}
|
||||
100% {
|
||||
transform: translate(1px, -2px) rotate(-1deg);
|
||||
}
|
||||
}
|
||||
|
||||
div[class^='HeaderStyles__StyledSubtitle'],
|
||||
div[class*=' HeaderStyles__StyledSubtitle'] {
|
||||
text-wrap: wrap !important;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
[aria-selected='true'] > div[class^='TabStyles__StyledUnderline'],
|
||||
[aria-selected='true'] > div[class*=' TabStyles__StyledUnderline'] {
|
||||
background-color: #bd456a !important;
|
||||
width: 3px !important;
|
||||
}
|
||||
|
||||
button[class^='TabStyles__StyledClickable'][disabled],
|
||||
button[class*='TabStyles__StyledClickable'][disabled] {
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
*:not(
|
||||
div[class^='PopoverStyles__Styled'],
|
||||
div[class*=' PopoverStyles__Styled'],
|
||||
div[class^='CardStyles__Styled'],
|
||||
div[class*=' CardStyles__Styled'],
|
||||
*[class^='keepshadow'],
|
||||
*[class*=' keepshadow']
|
||||
) {
|
||||
box-shadow: none !important;
|
||||
}
|
||||
|
||||
div[role='main'] > div {
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
div[data-view='views/shared/appbar/Master'] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
div[role='main'] > div > div {
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
.clickedcard {
|
||||
border: 3px #bd456a solid !important;
|
||||
box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
}
|
||||
|
||||
.maintabimg {
|
||||
width: 27px;
|
||||
height: 27px;
|
||||
}
|
||||
|
||||
#maintab > div > button {
|
||||
width: 140px;
|
||||
font-size: 14px;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.maintabmenu_light[aria-selected='true'] {
|
||||
border-bottom: 5px #b23a60 solid;
|
||||
}
|
||||
|
||||
.maintabmenu_dark[aria-selected='true'] {
|
||||
border-bottom: 5px #feedf3 solid;
|
||||
}
|
||||
|
||||
.react-slideshow-container {
|
||||
display: -webkit-box;
|
||||
display: -ms-flexbox;
|
||||
display: flex;
|
||||
-webkit-box-align: center;
|
||||
-ms-flex-align: center;
|
||||
align-items: center;
|
||||
position: relative;
|
||||
}
|
||||
.react-slideshow-container .nav {
|
||||
z-index: 10;
|
||||
position: absolute;
|
||||
cursor: pointer;
|
||||
}
|
||||
.react-slideshow-container .nav:first-of-type {
|
||||
left: 0;
|
||||
}
|
||||
.react-slideshow-container .nav:last-of-type {
|
||||
right: 0;
|
||||
}
|
||||
.react-slideshow-container .default-nav {
|
||||
height: 30px;
|
||||
background: rgba(255, 255, 255, 0.6);
|
||||
width: 30px;
|
||||
border: 0;
|
||||
text-align: center;
|
||||
color: #fff;
|
||||
border-radius: 50%;
|
||||
display: -webkit-box;
|
||||
display: -ms-flexbox;
|
||||
display: flex;
|
||||
-webkit-box-align: center;
|
||||
-ms-flex-align: center;
|
||||
align-items: center;
|
||||
-webkit-box-pack: center;
|
||||
-ms-flex-pack: center;
|
||||
justify-content: center;
|
||||
}
|
||||
.react-slideshow-container .default-nav:hover,
|
||||
.react-slideshow-container .default-nav:focus {
|
||||
background: #fff;
|
||||
color: #666;
|
||||
outline: 0;
|
||||
}
|
||||
.react-slideshow-container .default-nav.disabled:hover {
|
||||
cursor: not-allowed;
|
||||
}
|
||||
.react-slideshow-container .default-nav:first-of-type {
|
||||
margin-right: -30px;
|
||||
border-right: 0;
|
||||
border-top: 0;
|
||||
}
|
||||
.react-slideshow-container .default-nav:last-of-type {
|
||||
margin-left: -30px;
|
||||
}
|
||||
.react-slideshow-container + ul.indicators {
|
||||
display: -webkit-box;
|
||||
display: -ms-flexbox;
|
||||
display: flex;
|
||||
-ms-flex-wrap: wrap;
|
||||
flex-wrap: wrap;
|
||||
-webkit-box-pack: center;
|
||||
-ms-flex-pack: center;
|
||||
justify-content: center;
|
||||
margin-top: 20px;
|
||||
}
|
||||
.react-slideshow-container + ul.indicators li {
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
width: 7px;
|
||||
height: 7px;
|
||||
padding: 5px;
|
||||
margin: 0;
|
||||
}
|
||||
.react-slideshow-container + ul.indicators .each-slideshow-indicator {
|
||||
border: 0;
|
||||
opacity: 0.25;
|
||||
cursor: pointer;
|
||||
background: transparent;
|
||||
color: transparent;
|
||||
}
|
||||
.react-slideshow-container + ul.indicators .each-slideshow-indicator:before {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 7px;
|
||||
height: 7px;
|
||||
border-radius: 50%;
|
||||
content: '';
|
||||
background: #000;
|
||||
text-align: center;
|
||||
}
|
||||
.react-slideshow-container + ul.indicators .each-slideshow-indicator:hover,
|
||||
.react-slideshow-container + ul.indicators .each-slideshow-indicator.active {
|
||||
opacity: 0.75;
|
||||
outline: 0;
|
||||
}
|
||||
.react-slideshow-fadezoom-wrapper {
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
}
|
||||
.react-slideshow-fadezoom-wrapper .react-slideshow-fadezoom-images-wrap {
|
||||
display: -webkit-box;
|
||||
display: -ms-flexbox;
|
||||
display: flex;
|
||||
-ms-flex-wrap: wrap;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.react-slideshow-fadezoom-wrapper .react-slideshow-fadezoom-images-wrap > div {
|
||||
position: relative;
|
||||
opacity: 0;
|
||||
}
|
||||
.react-slideshow-wrapper .react-slideshow-fade-images-wrap > div[aria-hidden='true'] {
|
||||
display: none;
|
||||
}
|
||||
.react-slideshow-wrapper.slide {
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
}
|
||||
.react-slideshow-wrapper .images-wrap {
|
||||
display: -webkit-box;
|
||||
display: -ms-flexbox;
|
||||
display: flex;
|
||||
-ms-flex-wrap: wrap;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.react-slideshow-wrapper .images-wrap > div[aria-hidden='true'] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/*REACT FLOW*/
|
||||
/* this gets exported as style.css and can be used for the default theming */
|
||||
/* these are the necessary styles for React Flow, they get used by base.css and style.css */
|
||||
.react-flow__container {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
top: 0;
|
||||
left: 0;
|
||||
}
|
||||
.react-flow__pane {
|
||||
z-index: 1;
|
||||
cursor: -webkit-grab;
|
||||
cursor: grab;
|
||||
}
|
||||
.react-flow__pane.selection {
|
||||
cursor: pointer;
|
||||
}
|
||||
.react-flow__pane.dragging {
|
||||
cursor: -webkit-grabbing;
|
||||
cursor: grabbing;
|
||||
}
|
||||
.react-flow__viewport {
|
||||
transform-origin: 0 0;
|
||||
z-index: 2;
|
||||
pointer-events: none;
|
||||
}
|
||||
.react-flow__renderer {
|
||||
z-index: 4;
|
||||
}
|
||||
.react-flow__selection {
|
||||
z-index: 6;
|
||||
}
|
||||
.react-flow__nodesselection-rect:focus,
|
||||
.react-flow__nodesselection-rect:focus-visible {
|
||||
outline: none;
|
||||
}
|
||||
.react-flow .react-flow__edges {
|
||||
pointer-events: none;
|
||||
overflow: visible;
|
||||
}
|
||||
.react-flow__edge-path,
|
||||
.react-flow__connection-path {
|
||||
stroke: #b1b1b7;
|
||||
stroke-width: 1;
|
||||
fill: none;
|
||||
}
|
||||
.react-flow__edge {
|
||||
pointer-events: visibleStroke;
|
||||
cursor: pointer;
|
||||
}
|
||||
.react-flow__edge.animated path {
|
||||
stroke-dasharray: 5;
|
||||
-webkit-animation: dashdraw 0.5s linear infinite;
|
||||
animation: dashdraw 0.5s linear infinite;
|
||||
}
|
||||
.react-flow__edge.animated path.react-flow__edge-interaction {
|
||||
stroke-dasharray: none;
|
||||
-webkit-animation: none;
|
||||
animation: none;
|
||||
}
|
||||
.react-flow__edge.inactive {
|
||||
pointer-events: none;
|
||||
}
|
||||
.react-flow__edge.selected,
|
||||
.react-flow__edge:focus,
|
||||
.react-flow__edge:focus-visible {
|
||||
outline: none;
|
||||
}
|
||||
.react-flow__edge.selected .react-flow__edge-path,
|
||||
.react-flow__edge:focus .react-flow__edge-path,
|
||||
.react-flow__edge:focus-visible .react-flow__edge-path {
|
||||
stroke: #555;
|
||||
}
|
||||
.react-flow__edge-textwrapper {
|
||||
pointer-events: all;
|
||||
}
|
||||
.react-flow__edge-textbg {
|
||||
fill: white;
|
||||
}
|
||||
.react-flow__edge .react-flow__edge-text {
|
||||
pointer-events: none;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
.react-flow__connection {
|
||||
pointer-events: none;
|
||||
}
|
||||
.react-flow__connection .animated {
|
||||
stroke-dasharray: 5;
|
||||
-webkit-animation: dashdraw 0.5s linear infinite;
|
||||
animation: dashdraw 0.5s linear infinite;
|
||||
}
|
||||
.react-flow__connectionline {
|
||||
z-index: 1001;
|
||||
}
|
||||
.react-flow__nodes {
|
||||
pointer-events: none;
|
||||
transform-origin: 0 0;
|
||||
}
|
||||
.react-flow__node {
|
||||
position: absolute;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
user-select: none;
|
||||
pointer-events: all;
|
||||
transform-origin: 0 0;
|
||||
box-sizing: border-box;
|
||||
cursor: -webkit-grab;
|
||||
cursor: grab;
|
||||
}
|
||||
.react-flow__node.dragging {
|
||||
cursor: -webkit-grabbing;
|
||||
cursor: grabbing;
|
||||
}
|
||||
.react-flow__nodesselection {
|
||||
z-index: 3;
|
||||
transform-origin: left top;
|
||||
pointer-events: none;
|
||||
}
|
||||
.react-flow__nodesselection-rect {
|
||||
position: absolute;
|
||||
pointer-events: all;
|
||||
cursor: -webkit-grab;
|
||||
cursor: grab;
|
||||
}
|
||||
.react-flow__handle {
|
||||
position: absolute;
|
||||
pointer-events: none;
|
||||
min-width: 5px;
|
||||
min-height: 5px;
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
background: #1a192b;
|
||||
border: 1px solid white;
|
||||
border-radius: 100%;
|
||||
}
|
||||
.react-flow__handle.connectionindicator {
|
||||
pointer-events: all;
|
||||
cursor: crosshair;
|
||||
}
|
||||
.react-flow__handle-bottom {
|
||||
top: auto;
|
||||
left: 50%;
|
||||
bottom: -4px;
|
||||
transform: translate(-50%, 0);
|
||||
}
|
||||
.react-flow__handle-top {
|
||||
left: 50%;
|
||||
top: -4px;
|
||||
transform: translate(-50%, 0);
|
||||
}
|
||||
.react-flow__handle-left {
|
||||
top: 50%;
|
||||
left: -4px;
|
||||
transform: translate(0, -50%);
|
||||
}
|
||||
.react-flow__handle-right {
|
||||
right: -4px;
|
||||
top: 50%;
|
||||
transform: translate(0, -50%);
|
||||
}
|
||||
.react-flow__edgeupdater {
|
||||
cursor: move;
|
||||
pointer-events: all;
|
||||
}
|
||||
.react-flow__panel {
|
||||
position: absolute;
|
||||
z-index: 5;
|
||||
margin: 15px;
|
||||
}
|
||||
.react-flow__panel.top {
|
||||
top: 0;
|
||||
}
|
||||
.react-flow__panel.bottom {
|
||||
bottom: 0;
|
||||
}
|
||||
.react-flow__panel.left {
|
||||
left: 0;
|
||||
}
|
||||
.react-flow__panel.right {
|
||||
right: 0;
|
||||
}
|
||||
.react-flow__panel.center {
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
}
|
||||
.react-flow__attribution {
|
||||
font-size: 10px;
|
||||
background: rgba(255, 255, 255, 0.5);
|
||||
padding: 2px 3px;
|
||||
margin: 0;
|
||||
}
|
||||
.react-flow__attribution a {
|
||||
text-decoration: none;
|
||||
color: #999;
|
||||
}
|
||||
@-webkit-keyframes dashdraw {
|
||||
from {
|
||||
stroke-dashoffset: 10;
|
||||
}
|
||||
}
|
||||
@keyframes dashdraw {
|
||||
from {
|
||||
stroke-dashoffset: 10;
|
||||
}
|
||||
}
|
||||
.react-flow__edgelabel-renderer {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
pointer-events: none;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
.react-flow__edge.updating .react-flow__edge-path {
|
||||
stroke: #777;
|
||||
}
|
||||
.react-flow__edge-text {
|
||||
font-size: 10px;
|
||||
}
|
||||
.react-flow__node.selectable:focus,
|
||||
.react-flow__node.selectable:focus-visible {
|
||||
outline: none;
|
||||
}
|
||||
.react-flow__node-default,
|
||||
.react-flow__node-input,
|
||||
.react-flow__node-output,
|
||||
.react-flow__node-group {
|
||||
padding: 10px;
|
||||
border-radius: 3px;
|
||||
width: 150px;
|
||||
font-size: 12px;
|
||||
color: #222;
|
||||
text-align: center;
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-color: #1a192b;
|
||||
background-color: white;
|
||||
}
|
||||
.react-flow__node-default.selectable:hover,
|
||||
.react-flow__node-input.selectable:hover,
|
||||
.react-flow__node-output.selectable:hover,
|
||||
.react-flow__node-group.selectable:hover {
|
||||
box-shadow: 0 1px 4px 1px rgba(0, 0, 0, 0.08);
|
||||
}
|
||||
.react-flow__node-default.selectable.selected,
|
||||
.react-flow__node-default.selectable:focus,
|
||||
.react-flow__node-default.selectable:focus-visible,
|
||||
.react-flow__node-input.selectable.selected,
|
||||
.react-flow__node-input.selectable:focus,
|
||||
.react-flow__node-input.selectable:focus-visible,
|
||||
.react-flow__node-output.selectable.selected,
|
||||
.react-flow__node-output.selectable:focus,
|
||||
.react-flow__node-output.selectable:focus-visible,
|
||||
.react-flow__node-group.selectable.selected,
|
||||
.react-flow__node-group.selectable:focus,
|
||||
.react-flow__node-group.selectable:focus-visible {
|
||||
box-shadow: 0 0 0 0.5px #1a192b;
|
||||
}
|
||||
.react-flow__node-group {
|
||||
background-color: rgba(240, 240, 240, 0.25);
|
||||
}
|
||||
.react-flow__nodesselection-rect,
|
||||
.react-flow__selection {
|
||||
background: rgba(0, 89, 220, 0.08);
|
||||
border: 1px dotted rgba(0, 89, 220, 0.8);
|
||||
}
|
||||
.react-flow__nodesselection-rect:focus,
|
||||
.react-flow__nodesselection-rect:focus-visible,
|
||||
.react-flow__selection:focus,
|
||||
.react-flow__selection:focus-visible {
|
||||
outline: none;
|
||||
}
|
||||
.react-flow__controls {
|
||||
box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.08);
|
||||
}
|
||||
.react-flow__controls-button {
|
||||
border: none;
|
||||
background: #fefefe;
|
||||
border-bottom: 1px solid #eee;
|
||||
box-sizing: content-box;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
cursor: pointer;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
user-select: none;
|
||||
padding: 5px;
|
||||
}
|
||||
.react-flow__controls-button:hover {
|
||||
background: #f4f4f4;
|
||||
}
|
||||
.react-flow__controls-button svg {
|
||||
width: 100%;
|
||||
max-width: 12px;
|
||||
max-height: 12px;
|
||||
}
|
||||
.react-flow__controls-button:disabled {
|
||||
pointer-events: none;
|
||||
}
|
||||
.react-flow__controls-button:disabled svg {
|
||||
fill-opacity: 0.4;
|
||||
}
|
||||
.react-flow__minimap {
|
||||
background-color: #fff;
|
||||
}
|
||||
.react-flow__resize-control {
|
||||
position: absolute;
|
||||
}
|
||||
.react-flow__resize-control.left,
|
||||
.react-flow__resize-control.right {
|
||||
cursor: ew-resize;
|
||||
}
|
||||
.react-flow__resize-control.top,
|
||||
.react-flow__resize-control.bottom {
|
||||
cursor: ns-resize;
|
||||
}
|
||||
.react-flow__resize-control.top.left,
|
||||
.react-flow__resize-control.bottom.right {
|
||||
cursor: nwse-resize;
|
||||
}
|
||||
.react-flow__resize-control.bottom.left,
|
||||
.react-flow__resize-control.top.right {
|
||||
cursor: nesw-resize;
|
||||
}
|
||||
/* handle styles */
|
||||
.react-flow__resize-control.handle {
|
||||
width: 4px;
|
||||
height: 4px;
|
||||
border: 1px solid #fff;
|
||||
border-radius: 1px;
|
||||
background-color: #3367d9;
|
||||
transform: translate(-50%, -50%);
|
||||
}
|
||||
.react-flow__resize-control.handle.left {
|
||||
left: 0;
|
||||
top: 50%;
|
||||
}
|
||||
.react-flow__resize-control.handle.right {
|
||||
left: 100%;
|
||||
top: 50%;
|
||||
}
|
||||
.react-flow__resize-control.handle.top {
|
||||
left: 50%;
|
||||
top: 0;
|
||||
}
|
||||
.react-flow__resize-control.handle.bottom {
|
||||
left: 50%;
|
||||
top: 100%;
|
||||
}
|
||||
.react-flow__resize-control.handle.top.left {
|
||||
left: 0;
|
||||
}
|
||||
.react-flow__resize-control.handle.bottom.left {
|
||||
left: 0;
|
||||
}
|
||||
.react-flow__resize-control.handle.top.right {
|
||||
left: 100%;
|
||||
}
|
||||
.react-flow__resize-control.handle.bottom.right {
|
||||
left: 100%;
|
||||
}
|
||||
/* line styles */
|
||||
.react-flow__resize-control.line {
|
||||
border-color: #3367d9;
|
||||
border-width: 0;
|
||||
border-style: solid;
|
||||
}
|
||||
.react-flow__resize-control.line.left,
|
||||
.react-flow__resize-control.line.right {
|
||||
width: 1px;
|
||||
transform: translate(-50%, 0);
|
||||
top: 0;
|
||||
height: 100%;
|
||||
}
|
||||
.react-flow__resize-control.line.left {
|
||||
left: 0;
|
||||
border-left-width: 1px;
|
||||
}
|
||||
.react-flow__resize-control.line.right {
|
||||
left: 100%;
|
||||
border-right-width: 1px;
|
||||
}
|
||||
.react-flow__resize-control.line.top,
|
||||
.react-flow__resize-control.line.bottom {
|
||||
height: 1px;
|
||||
transform: translate(0, -50%);
|
||||
left: 0;
|
||||
width: 100%;
|
||||
}
|
||||
.react-flow__resize-control.line.top {
|
||||
top: 0;
|
||||
border-top-width: 1px;
|
||||
}
|
||||
.react-flow__resize-control.line.bottom {
|
||||
border-bottom-width: 1px;
|
||||
top: 100%;
|
||||
}
|
||||
|
||||
.react-js-cron {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.react-js-cron > div,
|
||||
.react-js-cron-field {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
.react-js-cron-field {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.react-js-cron-field > span {
|
||||
margin-left: 5px;
|
||||
}
|
||||
div.react-js-cron-select {
|
||||
margin-left: 5px;
|
||||
}
|
||||
.react-js-cron-select.react-js-cron-select-no-prefix {
|
||||
margin-left: 0;
|
||||
}
|
||||
div.react-js-cron-error .react-js-cron-select .ant-select-selector {
|
||||
border-color: #ff4d4f;
|
||||
background: #fff6f6;
|
||||
}
|
||||
div.react-js-cron-custom-select {
|
||||
min-width: 70px;
|
||||
z-index: 1;
|
||||
}
|
||||
div.react-js-cron-error div.react-js-cron-custom-select {
|
||||
background: #fff6f6;
|
||||
}
|
||||
div.react-js-cron-select.react-js-cron-custom-select.ant-select
|
||||
div.ant-select-selector {
|
||||
padding-left: 11px;
|
||||
padding-right: 30px;
|
||||
}
|
||||
.react-js-cron-read-only
|
||||
div.react-js-cron-select.react-js-cron-custom-select.ant-select
|
||||
div.ant-select-selector {
|
||||
padding-right: 11px;
|
||||
}
|
||||
div.react-js-cron-custom-select .ant-select-selection-search {
|
||||
width: 0 !important;
|
||||
margin: 0 !important;
|
||||
}
|
||||
div.react-js-cron-custom-select .ant-select-selection-placeholder {
|
||||
position: static;
|
||||
top: 50%;
|
||||
right: auto;
|
||||
left: auto;
|
||||
transform: none;
|
||||
transition: none;
|
||||
opacity: 1;
|
||||
color: inherit;
|
||||
}
|
||||
.react-js-cron-week-days-placeholder
|
||||
.react-js-cron-custom-select
|
||||
.ant-select-selection-placeholder,
|
||||
.react-js-cron-month-days-placeholder
|
||||
.react-js-cron-custom-select
|
||||
.ant-select-selection-placeholder {
|
||||
opacity: 0.4;
|
||||
}
|
||||
.react-js-cron-custom-select-dropdown {
|
||||
min-width: 0 !important;
|
||||
width: 174px !important;
|
||||
}
|
||||
.react-js-cron-custom-select-dropdown .rc-virtual-list {
|
||||
max-height: none !important;
|
||||
}
|
||||
.react-js-cron-custom-select-dropdown-grid .rc-virtual-list-holder {
|
||||
max-height: initial !important;
|
||||
}
|
||||
.react-js-cron-custom-select-dropdown-grid .rc-virtual-list-holder-inner {
|
||||
display: grid !important;
|
||||
grid-template-columns: repeat(4, 1fr);
|
||||
}
|
||||
.react-js-cron-custom-select-dropdown-grid
|
||||
.rc-virtual-list-holder-inner
|
||||
.ant-select-item-option-content {
|
||||
text-align: center;
|
||||
}
|
||||
.react-js-cron-custom-select-dropdown-hours-twelve-hour-clock {
|
||||
width: 260px !important;
|
||||
}
|
||||
.react-js-cron-custom-select-dropdown-minutes-large {
|
||||
width: 300px !important;
|
||||
}
|
||||
.react-js-cron-custom-select-dropdown-minutes-large .rc-virtual-list-holder-inner {
|
||||
grid-template-columns: repeat(6, 1fr);
|
||||
}
|
||||
.react-js-cron-custom-select-dropdown-minutes-medium {
|
||||
width: 220px !important;
|
||||
}
|
||||
.react-js-cron-custom-select-dropdown-minutes-medium .rc-virtual-list-holder-inner {
|
||||
grid-template-columns: repeat(5, 1fr);
|
||||
}
|
||||
.react-js-cron-period > span:first-child {
|
||||
margin-left: 0 !important;
|
||||
}
|
||||
.react-js-cron-period
|
||||
.react-js-cron-select.ant-select-single.ant-select-open
|
||||
.ant-select-selection-item {
|
||||
opacity: 1;
|
||||
}
|
||||
.react-js-cron-select-dropdown-period {
|
||||
min-width: 0 !important;
|
||||
width: auto !important;
|
||||
}
|
||||
.react-js-cron-clear-button {
|
||||
margin-left: 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.react-js-cron-disabled .react-js-cron-select.ant-select-disabled {
|
||||
background: #f5f5f5;
|
||||
}
|
||||
div.react-js-cron-select.react-js-cron-custom-select.ant-select
|
||||
div.ant-select-selector
|
||||
> .ant-select-selection-overflow {
|
||||
align-items: center;
|
||||
flex: initial;
|
||||
}
|
||||
|
||||
.ant-btn-dangerous {
|
||||
background: #3d3f44 !important;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<script src="${make_url('/config?autoload=1')}" crossorigin="use-credentials"></script>
|
||||
<script src="${make_url('/static/js/i18n.js')}"></script>
|
||||
<script src="${make_url('/i18ncatalog?autoload=1')}"></script>
|
||||
<script>
|
||||
__splunkd_partials__ = ${json_decode(splunkd)};
|
||||
</script>
|
||||
|
||||
<% page_path = "/static/app/appcontentmanager/pages/start.js" %>
|
||||
|
||||
<script src="${make_url(page_path)}"></script>
|
||||
</body>
|
||||
</html>
|
||||
@ -0,0 +1,158 @@
|
||||
import requests
|
||||
import logging
|
||||
import os
|
||||
import json
|
||||
import sys
|
||||
import logging.handlers
|
||||
|
||||
from splunk.persistconn.application import PersistentServerConnectionApplication
|
||||
import signal
|
||||
import subprocess
|
||||
|
||||
'''
|
||||
# !!!!! DEBUG !!!!
|
||||
sys.path.append(os.path.join(os.environ['SPLUNK_HOME'],'etc','apps','SA-VSCode','bin'))
|
||||
import splunk_debug as dbg
|
||||
dbg.enable_debugging(timeout=25)
|
||||
#################
|
||||
'''
|
||||
|
||||
splunk_home = os.environ['SPLUNK_HOME']
|
||||
LOG_LEVEL = logging.INFO
|
||||
LOG_FILE_NAME = "acms.log"
|
||||
|
||||
def setup_logger(): # setup logging
|
||||
global SPLUNK_HOME, LOG_LEVEL, LOG_FILE_NAME
|
||||
if 'SPLUNK_HOME' in os.environ:
|
||||
SPLUNK_HOME = os.environ['SPLUNK_HOME']
|
||||
|
||||
log_format = "%(asctime)s %(levelname)-s\t%(module)s[%(process)d]:%(lineno)d - %(message)s"
|
||||
logger = logging.getLogger('v')
|
||||
logger.setLevel(LOG_LEVEL)
|
||||
|
||||
l = logging.handlers.RotatingFileHandler(os.path.join(SPLUNK_HOME, 'var', 'log', 'splunk', LOG_FILE_NAME), mode='a', maxBytes=1000000, backupCount=2)
|
||||
l.setFormatter(logging.Formatter(log_format))
|
||||
logger.addHandler(l)
|
||||
|
||||
# ..and (optionally) output to console
|
||||
logH = logging.StreamHandler()
|
||||
logH.setFormatter(logging.Formatter(fmt=log_format))
|
||||
# logger.addHandler(logH)
|
||||
|
||||
logger.propagate = False
|
||||
return logger
|
||||
|
||||
logger = setup_logger()
|
||||
|
||||
|
||||
class Stack_Connect(PersistentServerConnectionApplication):
|
||||
def __init__(self, _command_line, _command_arg):
|
||||
super(PersistentServerConnectionApplication, self).__init__()
|
||||
|
||||
# Handle a syncronous from splunkd.
|
||||
def handle(self, in_string):
|
||||
"""
|
||||
Called for a simple synchronous request.
|
||||
@param in_string: request data passed in
|
||||
@rtype: string or dict
|
||||
@return: String to return in response. If a dict was passed in,
|
||||
it will automatically be JSON encoded before being returned.
|
||||
"""
|
||||
|
||||
#dbg.set_breakpoint()
|
||||
|
||||
acs_url = "https://admin.splunk.com/"
|
||||
|
||||
# Parse the arguments
|
||||
args = self.parse_in_string(in_string)
|
||||
|
||||
global user
|
||||
user = args['session']['user']
|
||||
|
||||
token = ""
|
||||
if "token" in args['form_parameters'] :
|
||||
token = args['form_parameters']['token']
|
||||
|
||||
stackname = ""
|
||||
if "stackname" in args['form_parameters'] :
|
||||
stackname = args['form_parameters']['stackname']
|
||||
if "stg-" in stackname :
|
||||
acs_url = "https://staging.admin.splunk.com/"
|
||||
|
||||
if "-shw" in stackname :
|
||||
acs_url = "https://staging.admin.splunk.com/"
|
||||
|
||||
if ".stg" in stackname :
|
||||
acs_url = "https://staging.admin.splunk.com/"
|
||||
stackname = stackname.replace(".stg","")
|
||||
|
||||
headers = {
|
||||
'Authorization': 'Bearer '+ token,
|
||||
'User-Agent': 'ACS-Helper'
|
||||
}
|
||||
|
||||
response = requests.get(acs_url+stackname+'/adminconfig/v2/status', headers=headers)
|
||||
|
||||
if response.status_code == 404 :
|
||||
return {'payload': "", 'status': 404}
|
||||
elif response.status_code == 401 :
|
||||
return {'payload': "", 'status': 401}
|
||||
|
||||
elif response.status_code == 200 :
|
||||
payload = json.loads(response.text)
|
||||
payload["infrastructure"]["APAV"] = "1"
|
||||
|
||||
return {'payload': payload, 'status': 200}
|
||||
|
||||
return {'payload': "", 'status': response.status_code}
|
||||
|
||||
def handleStream(self, handle, in_string):
|
||||
"""
|
||||
For future use
|
||||
"""
|
||||
raise NotImplementedError(
|
||||
"PersistentServerConnectionApplication.handleStream")
|
||||
|
||||
def done(self):
|
||||
"""
|
||||
Virtual method which can be optionally overridden to receive a
|
||||
callback after the request completes.
|
||||
"""
|
||||
pass
|
||||
|
||||
def convert_to_dict(self, query):
|
||||
"""
|
||||
Create a dictionary containing the parameters.
|
||||
"""
|
||||
parameters = {}
|
||||
|
||||
for key, val in query:
|
||||
|
||||
# If the key is already in the list, but the existing entry isn't a list then make the
|
||||
# existing entry a list and add thi one
|
||||
if key in parameters and not isinstance(parameters[key], list):
|
||||
parameters[key] = [parameters[key], val]
|
||||
|
||||
# If the entry is already included as a list, then just add the entry
|
||||
elif key in parameters:
|
||||
parameters[key].append(val)
|
||||
|
||||
# Otherwise, just add the entry
|
||||
else:
|
||||
parameters[key] = val
|
||||
|
||||
return parameters
|
||||
|
||||
def parse_in_string(self, in_string):
|
||||
"""
|
||||
Parse the in_string
|
||||
"""
|
||||
|
||||
params = json.loads(in_string)
|
||||
|
||||
params['method'] = params['method'].lower()
|
||||
|
||||
params['form_parameters'] = self.convert_to_dict(params.get('form', []))
|
||||
params['query_parameters'] = self.convert_to_dict(params.get('query', []))
|
||||
|
||||
return params
|
||||
@ -0,0 +1,337 @@
|
||||
import requests
|
||||
import logging
|
||||
import os
|
||||
import json
|
||||
import sys
|
||||
import logging.handlers
|
||||
|
||||
from splunk.persistconn.application import PersistentServerConnectionApplication
|
||||
import signal
|
||||
import subprocess
|
||||
import tempfile
|
||||
import tarfile
|
||||
import re
|
||||
import splunk.clilib.cli_common
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "lib"))
|
||||
|
||||
'''
|
||||
# !!!!! DEBUG !!!!
|
||||
sys.path.append(os.path.join(os.environ['SPLUNK_HOME'],'etc','apps','SA-VSCode','bin'))
|
||||
import splunk_debug as dbg
|
||||
dbg.enable_debugging(timeout=25)
|
||||
#################
|
||||
'''
|
||||
|
||||
splunk_home = os.environ['SPLUNK_HOME']
|
||||
LOG_LEVEL = logging.INFO
|
||||
LOG_FILE_NAME = "acms.log"
|
||||
|
||||
def result_errors(msg):
|
||||
return (msg["level"] == "ERROR" or msg["level"] == "CRITICAL")
|
||||
|
||||
def convertResponse_to_json(response,stackname):
|
||||
|
||||
resp = {}
|
||||
resp["stack"] = stackname
|
||||
resp["user"] = user
|
||||
resp["response"] = {}
|
||||
resp["response"]["status_code"] = response.status_code
|
||||
resp["response"]["text"] = response.text
|
||||
|
||||
resp["request"] = {}
|
||||
resp["request"]["headers"] = response.request.headers.__dict__['_store']
|
||||
resp["request"]["headers"]["authorization"] = list(["Authorization","xxxxx xxxxxxx"])
|
||||
if response.request.body != None :
|
||||
resp["request"]["body"] = response.request.body
|
||||
else :
|
||||
resp["request"]["body"] = ""
|
||||
resp["request"]["method"] = response.request.method
|
||||
resp["request"]["url"] = response.request.url
|
||||
|
||||
return resp
|
||||
|
||||
def setup_logger(): # setup logging
|
||||
global SPLUNK_HOME, LOG_LEVEL, LOG_FILE_NAME
|
||||
if 'SPLUNK_HOME' in os.environ:
|
||||
SPLUNK_HOME = os.environ['SPLUNK_HOME']
|
||||
|
||||
log_format = "%(asctime)s %(levelname)-s\t%(module)s[%(process)d]:%(lineno)d - %(message)s"
|
||||
logger = logging.getLogger('v')
|
||||
logger.setLevel(LOG_LEVEL)
|
||||
|
||||
l = logging.handlers.RotatingFileHandler(os.path.join(SPLUNK_HOME, 'var', 'log', 'splunk', LOG_FILE_NAME), mode='a', maxBytes=1000000, backupCount=2)
|
||||
l.setFormatter(logging.Formatter(log_format))
|
||||
logger.addHandler(l)
|
||||
|
||||
# ..and (optionally) output to console
|
||||
logH = logging.StreamHandler()
|
||||
logH.setFormatter(logging.Formatter(fmt=log_format))
|
||||
# logger.addHandler(logH)
|
||||
|
||||
logger.propagate = False
|
||||
return logger
|
||||
|
||||
logger = setup_logger()
|
||||
|
||||
|
||||
def list_apps(acs_url,stackname,headers,experience,logger):
|
||||
returnVal = {}
|
||||
apps_url = acs_url+stackname+"/adminconfig/v2/apps"
|
||||
if experience in ["victoria"] :
|
||||
apps_url = apps_url+"/victoria"
|
||||
|
||||
apps_url = apps_url + "?count=0"
|
||||
response = requests.get(apps_url, headers=headers)
|
||||
if response.status_code == 200 :
|
||||
resp = json.loads(response.text)
|
||||
returnVal["Private"] = resp
|
||||
|
||||
logger.info(json.dumps(convertResponse_to_json(response, stackname)))
|
||||
return {'payload': returnVal, 'status': response.status_code}
|
||||
|
||||
|
||||
def list_files(rest_url,stackname,headers,app, logger):
|
||||
returnVal = {}
|
||||
response = requests.get("https://"+stackname+rest_url+"/servicesNS/-/"+app+"/properties?output_mode=json&count=0",headers=headers, verify=False)
|
||||
if response.status_code == 200 :
|
||||
returnVal = json.loads(response.text)
|
||||
|
||||
logger.info(json.dumps(convertResponse_to_json(response, stackname)))
|
||||
return {'payload': returnVal, 'status': response.status_code}
|
||||
|
||||
def list_content(rest_url,stackname,headers,app,file, logger):
|
||||
returnVal = {}
|
||||
response = requests.get("https://"+stackname+rest_url+"/servicesNS/-/"+app+"/configs/conf-"+file+"?output_mode=json&count=0",headers=headers, verify=False)
|
||||
if response.status_code == 200 :
|
||||
returnVal = [d for d in json.loads(response.text)['entry'] if d['content']['eai:appName']== app]
|
||||
|
||||
logger.info(json.dumps(convertResponse_to_json(response, stackname)))
|
||||
return {'payload': returnVal, 'status': response.status_code}
|
||||
|
||||
|
||||
class Stack_Helper(PersistentServerConnectionApplication):
|
||||
def __init__(self, _command_line, _command_arg):
|
||||
super(PersistentServerConnectionApplication, self).__init__()
|
||||
|
||||
# Handle a syncronous from splunkd.
|
||||
def handle(self, in_string):
|
||||
"""
|
||||
Called for a simple synchronous request.
|
||||
@param in_string: request data passed in
|
||||
@rtype: string or dict
|
||||
@return: String to return in response. If a dict was passed in,
|
||||
it will automatically be JSON encoded before being returned.
|
||||
"""
|
||||
|
||||
#dbg.set_breakpoint()
|
||||
|
||||
if 'slim.__main__' in sys.modules.keys() :
|
||||
sys.modules.pop('slim.__main__')
|
||||
sys.modules.pop('slim.partition')
|
||||
sys.modules.pop('slim.package')
|
||||
sys.modules.pop('slim.validate')
|
||||
|
||||
import slim.__main__
|
||||
slimmain = slim.__main__.main
|
||||
|
||||
acs_url = "https://admin.splunk.com/"
|
||||
rest_url = ".splunkcloud.com:8089"
|
||||
|
||||
# Parse the arguments
|
||||
args = self.parse_in_string(in_string)
|
||||
|
||||
global user
|
||||
user = args['session']['user']
|
||||
|
||||
token = ""
|
||||
if "token" in args['form_parameters'] :
|
||||
token = args['form_parameters']['token']
|
||||
|
||||
app = ""
|
||||
if "app" in args['form_parameters'] :
|
||||
app = args['form_parameters']['app']
|
||||
|
||||
experience = ""
|
||||
if "experience" in args['form_parameters'] :
|
||||
experience = args['form_parameters']['experience']
|
||||
|
||||
action = ""
|
||||
if "action" in args['form_parameters'] :
|
||||
action = args['form_parameters']['action']
|
||||
|
||||
file = ""
|
||||
if "file" in args['form_parameters'] :
|
||||
file = args['form_parameters']['file']
|
||||
|
||||
stackname = ""
|
||||
if "stackname" in args['form_parameters'] :
|
||||
stackname = args['form_parameters']['stackname']
|
||||
if "stg-" in stackname :
|
||||
acs_url = "https://staging.admin.splunk.com/"
|
||||
rest_url = ".stg.splunkcloud.com:8089"
|
||||
|
||||
if "-shw" in stackname :
|
||||
acs_url = "https://staging.admin.splunk.com/"
|
||||
rest_url = ".stg.splunkcloud.com:8089"
|
||||
|
||||
if ".stg" in stackname :
|
||||
acs_url = "https://staging.admin.splunk.com/"
|
||||
stackname = stackname.replace(".stg","")
|
||||
rest_url = ".stg.splunkcloud.com:8089"
|
||||
|
||||
headers = {
|
||||
'Authorization': 'Bearer '+ token,
|
||||
'User-Agent': 'ACS-Helper'
|
||||
}
|
||||
|
||||
packages_folder = os.path.join(os.environ['SPLUNK_HOME'],'etc','apps','appcontentmanager','appserver','static','packages')
|
||||
|
||||
if action == "list_apps" :
|
||||
return list_apps(acs_url,stackname,headers, experience,logger)
|
||||
elif action == "list_files" :
|
||||
return list_files(rest_url,stackname,headers,app,logger)
|
||||
elif action == "list_content" :
|
||||
return list_content(rest_url,stackname,headers,app,file,logger)
|
||||
elif action == "download_app" :
|
||||
res = list_files(rest_url,stackname,headers,app,logger)
|
||||
if res['status'] == 200 :
|
||||
with tempfile.TemporaryDirectory() as tempdir:
|
||||
os.mkdir(os.path.join(tempdir,app))
|
||||
os.mkdir(os.path.join(tempdir,app,"default"))
|
||||
os.mkdir(os.path.join(tempdir,app,"metadata"))
|
||||
data_folder_created = False
|
||||
|
||||
files = res['payload']['entry']
|
||||
for file in files :
|
||||
if file['name'] == 'views' :
|
||||
if not data_folder_created :
|
||||
os.mkdir(os.path.join(tempdir,app,"default","data"))
|
||||
os.mkdir(os.path.join(tempdir,app,"default","data","ui"))
|
||||
os.mkdir(os.path.join(tempdir,app,"default","data","ui","views"))
|
||||
os.mkdir(os.path.join(tempdir,app,"default","data","ui","nav"))
|
||||
data_folder_created = True
|
||||
|
||||
res = list_content(rest_url,stackname,headers,app,file['name'],logger)
|
||||
if res['status'] == 200 :
|
||||
confs = res['payload']
|
||||
for confFile in confs :
|
||||
# get dashboard difinition
|
||||
response = requests.get("https://"+stackname+rest_url+"/servicesNS/-/"+app+"/data/ui/views/"+confFile["name"]+"?output_mode=json",headers=headers, verify=False)
|
||||
if response.status_code == 200 :
|
||||
with open(os.path.join(tempdir,app,"default","data","ui","views",confFile["name"]+".xml"), "w+") as dash:
|
||||
r = json.loads(response.text)
|
||||
for d in r['entry'] :
|
||||
if d['acl']['app'] == app :
|
||||
dash.write(d['content']['eai:data'])
|
||||
|
||||
elif file['name'] == 'nav' :
|
||||
if not data_folder_created :
|
||||
os.mkdir(os.path.join(tempdir,app,"default","data"))
|
||||
os.mkdir(os.path.join(tempdir,app,"default","data","ui"))
|
||||
os.mkdir(os.path.join(tempdir,app,"default","data","ui","views"))
|
||||
os.mkdir(os.path.join(tempdir,app,"default","data","ui","nav"))
|
||||
data_folder_created = True
|
||||
|
||||
else :
|
||||
res = list_content(rest_url,stackname,headers,app,file['name'],logger)
|
||||
if res['status'] == 200 :
|
||||
confs = res['payload']
|
||||
c = {}
|
||||
for confFile in confs :
|
||||
#c[confFile['name']] = confFile['content']
|
||||
c[confFile['name']] = {k: v for k, v in confFile['content'].items() if not k.startswith('eai:') and k != "install_source_checksum"}
|
||||
splunk.clilib.cli_common.writeConfFile(os.path.join(tempdir,app,"default",file['name']+".conf"),c)
|
||||
|
||||
# generate nav
|
||||
if not data_folder_created :
|
||||
os.mkdir(os.path.join(tempdir,app,"default","data"))
|
||||
os.mkdir(os.path.join(tempdir,app,"default","data","ui"))
|
||||
os.mkdir(os.path.join(tempdir,app,"default","data","ui","views"))
|
||||
os.mkdir(os.path.join(tempdir,app,"default","data","ui","nav"))
|
||||
data_folder_created = True
|
||||
|
||||
response = requests.get("https://"+stackname+rest_url+"/servicesNS/-/"+app+"/data/ui/nav?output_mode=json",headers=headers, verify=False)
|
||||
if response.status_code == 200 :
|
||||
with open(os.path.join(tempdir,app,"default","data","ui","nav","default.xml"), "w+") as nav:
|
||||
r = json.loads(response.text)
|
||||
for n in r['entry'] :
|
||||
if n['acl']['app'] == app :
|
||||
nav.write(n['content']['eai:data'])
|
||||
|
||||
# generate a default.meta conf file
|
||||
meta = {}
|
||||
meta[''] = {}
|
||||
meta['']["access"] = 'read : [ * ], write : [ admin ]'
|
||||
meta['']["export"] = 'system'
|
||||
splunk.clilib.cli_common.writeConfFile(os.path.join(tempdir,app,"metadata","default.meta"),meta)
|
||||
|
||||
# package the app to appserver/static/packages folder
|
||||
|
||||
argv = []
|
||||
argv.append(re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]))
|
||||
argv.append("package")
|
||||
|
||||
argv.append(os.path.join(tempdir,app))
|
||||
argv.append("-o")
|
||||
argv.append(packages_folder)
|
||||
results = slimmain(argv)
|
||||
|
||||
apppath = ""
|
||||
apppath = results[-1]["msg"].replace('Source package exported to "','').replace('"','')
|
||||
os.rename(apppath,apppath.replace("tar.gz","spl"))
|
||||
return {'payload': {'path' : apppath.replace("tar.gz","spl")}, 'status': 200}
|
||||
|
||||
|
||||
|
||||
return {'payload': "", 'status': 200}
|
||||
|
||||
def handleStream(self, handle, in_string):
|
||||
"""
|
||||
For future use
|
||||
"""
|
||||
raise NotImplementedError(
|
||||
"PersistentServerConnectionApplication.handleStream")
|
||||
|
||||
def done(self):
|
||||
"""
|
||||
Virtual method which can be optionally overridden to receive a
|
||||
callback after the request completes.
|
||||
"""
|
||||
pass
|
||||
|
||||
def convert_to_dict(self, query):
|
||||
"""
|
||||
Create a dictionary containing the parameters.
|
||||
"""
|
||||
parameters = {}
|
||||
|
||||
for key, val in query:
|
||||
|
||||
# If the key is already in the list, but the existing entry isn't a list then make the
|
||||
# existing entry a list and add thi one
|
||||
if key in parameters and not isinstance(parameters[key], list):
|
||||
parameters[key] = [parameters[key], val]
|
||||
|
||||
# If the entry is already included as a list, then just add the entry
|
||||
elif key in parameters:
|
||||
parameters[key].append(val)
|
||||
|
||||
# Otherwise, just add the entry
|
||||
else:
|
||||
parameters[key] = val
|
||||
|
||||
return parameters
|
||||
|
||||
def parse_in_string(self, in_string):
|
||||
"""
|
||||
Parse the in_string
|
||||
"""
|
||||
|
||||
params = json.loads(in_string)
|
||||
|
||||
params['method'] = params['method'].lower()
|
||||
|
||||
params['form_parameters'] = self.convert_to_dict(params.get('form', []))
|
||||
params['query_parameters'] = self.convert_to_dict(params.get('query', []))
|
||||
|
||||
return params
|
||||
@ -0,0 +1,381 @@
|
||||
import requests
|
||||
import logging
|
||||
import os
|
||||
import json
|
||||
import sys
|
||||
import logging.handlers
|
||||
import time
|
||||
from splunk.persistconn.application import PersistentServerConnectionApplication
|
||||
import signal
|
||||
import subprocess
|
||||
import tempfile
|
||||
import tarfile
|
||||
import re
|
||||
import splunk.clilib.cli_common
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "lib"))
|
||||
|
||||
'''
|
||||
# !!!!! DEBUG !!!!
|
||||
sys.path.append(os.path.join(os.environ['SPLUNK_HOME'],'etc','apps','SA-VSCode','bin'))
|
||||
import splunk_debug as dbg
|
||||
dbg.enable_debugging(timeout=25)
|
||||
#################
|
||||
'''
|
||||
|
||||
splunk_home = os.environ['SPLUNK_HOME']
|
||||
LOG_LEVEL = logging.INFO
|
||||
LOG_FILE_NAME = "acms.log"
|
||||
|
||||
def result_errors(msg):
|
||||
return (msg["level"] == "ERROR" or msg["level"] == "CRITICAL")
|
||||
|
||||
def convertResponse_to_json(response,stackname):
|
||||
|
||||
resp = {}
|
||||
resp["stack"] = stackname
|
||||
resp["user"] = user
|
||||
resp["response"] = {}
|
||||
resp["response"]["status_code"] = response.status_code
|
||||
resp["response"]["text"] = response.text
|
||||
|
||||
resp["request"] = {}
|
||||
resp["request"]["headers"] = response.request.headers.__dict__['_store']
|
||||
resp["request"]["headers"]["authorization"] = list(["Authorization","xxxxx xxxxxxx"])
|
||||
if response.request.body != None :
|
||||
resp["request"]["body"] = response.request.body
|
||||
else :
|
||||
resp["request"]["body"] = ""
|
||||
resp["request"]["method"] = response.request.method
|
||||
resp["request"]["url"] = response.request.url
|
||||
|
||||
return resp
|
||||
|
||||
def setup_logger(): # setup logging
|
||||
global SPLUNK_HOME, LOG_LEVEL, LOG_FILE_NAME
|
||||
if 'SPLUNK_HOME' in os.environ:
|
||||
SPLUNK_HOME = os.environ['SPLUNK_HOME']
|
||||
|
||||
log_format = "%(asctime)s %(levelname)-s\t%(module)s[%(process)d]:%(lineno)d - %(message)s"
|
||||
logger = logging.getLogger('v')
|
||||
logger.setLevel(LOG_LEVEL)
|
||||
|
||||
l = logging.handlers.RotatingFileHandler(os.path.join(SPLUNK_HOME, 'var', 'log', 'splunk', LOG_FILE_NAME), mode='a', maxBytes=1000000, backupCount=2)
|
||||
l.setFormatter(logging.Formatter(log_format))
|
||||
logger.addHandler(l)
|
||||
|
||||
# ..and (optionally) output to console
|
||||
logH = logging.StreamHandler()
|
||||
logH.setFormatter(logging.Formatter(fmt=log_format))
|
||||
# logger.addHandler(logH)
|
||||
|
||||
logger.propagate = False
|
||||
return logger
|
||||
|
||||
logger = setup_logger()
|
||||
|
||||
|
||||
def list_apps(acs_url,stackname,headers,experience,logger):
|
||||
returnVal = {}
|
||||
apps_url = acs_url+stackname+"/adminconfig/v2/apps"
|
||||
if experience in ["victoria"] :
|
||||
apps_url = apps_url+"/victoria"
|
||||
|
||||
apps_url = apps_url + "?count=0"
|
||||
response = requests.get(apps_url, headers=headers)
|
||||
if response.status_code == 200 :
|
||||
resp = json.loads(response.text)
|
||||
returnVal["Private"] = resp
|
||||
|
||||
logger.info(json.dumps(convertResponse_to_json(response, stackname)))
|
||||
return {'payload': returnVal, 'status': response.status_code}
|
||||
|
||||
def delete_app(acs_url,stackname,headers,experience,app,logger):
|
||||
returnVal = {}
|
||||
apps_url = acs_url+stackname+"/adminconfig/v2/apps"
|
||||
if experience in ["victoria"] :
|
||||
apps_url = apps_url+"/victoria"
|
||||
|
||||
apps_url = apps_url+"/"+app
|
||||
response = requests.delete(apps_url, headers=headers)
|
||||
|
||||
while True:
|
||||
if response.status_code == 424 :
|
||||
# retry ..
|
||||
time.sleep(10)
|
||||
response = requests.delete(apps_url, headers=headers)
|
||||
else :
|
||||
break
|
||||
|
||||
logger.info(json.dumps(convertResponse_to_json(response, stackname)))
|
||||
|
||||
return {'payload': {"message":response.text, "delete_status":response.status_code}, 'status': 200}
|
||||
|
||||
def list_files(rest_url,stackname,headers,app, logger):
|
||||
returnVal = {}
|
||||
response = requests.get("https://"+stackname+rest_url+"/servicesNS/-/"+app+"/properties?output_mode=json&count=0",headers=headers, verify=False)
|
||||
if response.status_code == 200 :
|
||||
returnVal = json.loads(response.text)
|
||||
for file in returnVal['entry'] :
|
||||
if file['name'] == 'views' :
|
||||
response = requests.get("https://"+stackname+rest_url+"/servicesNS/-/"+app+"/configs/conf-views?output_mode=json&count=0",headers=headers, verify=False)
|
||||
file['dashboards'] = [d for d in json.loads(response.text)['entry'] if d['content']['eai:appName']== app]
|
||||
|
||||
logger.info(json.dumps(convertResponse_to_json(response, stackname)))
|
||||
return {'payload': returnVal, 'status': response.status_code}
|
||||
|
||||
def list_content(rest_url,stackname,headers,app,file, logger):
|
||||
returnVal = {}
|
||||
if ".xml" in file :
|
||||
response = requests.get("https://"+stackname+rest_url+"/servicesNS/-/"+app+"/data/ui/views/"+file.replace(".xml","")+"?output_mode=json",headers=headers, verify=False)
|
||||
if response.status_code == 200 :
|
||||
r = json.loads(response.text)
|
||||
for d in r['entry'] :
|
||||
if d['acl']['app'] == app :
|
||||
returnVal = {"content": d['content']['eai:data']}
|
||||
|
||||
elif 'nav.' in file :
|
||||
response = requests.get("https://"+stackname+rest_url+"/servicesNS/-/"+app+"/data/ui/nav?output_mode=json",headers=headers, verify=False)
|
||||
if response.status_code == 200 :
|
||||
r = json.loads(response.text)
|
||||
for n in r['entry'] :
|
||||
if n['acl']['app'] == app :
|
||||
returnVal = {"content" : d['content']['eai:data']}
|
||||
|
||||
else :
|
||||
response = requests.get("https://"+stackname+rest_url+"/servicesNS/-/"+app+"/configs/conf-"+file+"?output_mode=json&count=0",headers=headers, verify=False)
|
||||
if response.status_code == 200 :
|
||||
returnVal = [d for d in json.loads(response.text)['entry'] if d['content']['eai:appName']== app]
|
||||
|
||||
|
||||
|
||||
logger.info(json.dumps(convertResponse_to_json(response, stackname)))
|
||||
return {'payload': returnVal, 'status': response.status_code}
|
||||
|
||||
|
||||
class Stack_Helper(PersistentServerConnectionApplication):
|
||||
def __init__(self, _command_line, _command_arg):
|
||||
super(PersistentServerConnectionApplication, self).__init__()
|
||||
|
||||
# Handle a syncronous from splunkd.
|
||||
def handle(self, in_string):
|
||||
"""
|
||||
Called for a simple synchronous request.
|
||||
@param in_string: request data passed in
|
||||
@rtype: string or dict
|
||||
@return: String to return in response. If a dict was passed in,
|
||||
it will automatically be JSON encoded before being returned.
|
||||
"""
|
||||
#dbg.set_breakpoint()
|
||||
|
||||
if 'slim.__main__' in sys.modules.keys() :
|
||||
sys.modules.pop('slim.__main__')
|
||||
sys.modules.pop('slim.partition')
|
||||
sys.modules.pop('slim.package')
|
||||
sys.modules.pop('slim.validate')
|
||||
|
||||
import slim.__main__
|
||||
slimmain = slim.__main__.main
|
||||
|
||||
acs_url = "https://admin.splunk.com/"
|
||||
rest_url = ".splunkcloud.com:8089"
|
||||
|
||||
# Parse the arguments
|
||||
args = self.parse_in_string(in_string)
|
||||
|
||||
global user
|
||||
user = args['session']['user']
|
||||
|
||||
token = ""
|
||||
if "token" in args['form_parameters'] :
|
||||
token = args['form_parameters']['token']
|
||||
|
||||
app = ""
|
||||
if "app" in args['form_parameters'] :
|
||||
app = args['form_parameters']['app']
|
||||
|
||||
experience = ""
|
||||
if "experience" in args['form_parameters'] :
|
||||
experience = args['form_parameters']['experience']
|
||||
|
||||
action = ""
|
||||
if "action" in args['form_parameters'] :
|
||||
action = args['form_parameters']['action']
|
||||
|
||||
file = ""
|
||||
if "file" in args['form_parameters'] :
|
||||
file = args['form_parameters']['file']
|
||||
|
||||
stackname = ""
|
||||
if "stackname" in args['form_parameters'] :
|
||||
stackname = args['form_parameters']['stackname']
|
||||
if "stg-" in stackname :
|
||||
acs_url = "https://staging.admin.splunk.com/"
|
||||
rest_url = ".stg.splunkcloud.com:8089"
|
||||
|
||||
if "-shw" in stackname :
|
||||
acs_url = "https://staging.admin.splunk.com/"
|
||||
rest_url = ".stg.splunkcloud.com:8089"
|
||||
|
||||
if ".stg" in stackname :
|
||||
acs_url = "https://staging.admin.splunk.com/"
|
||||
stackname = stackname.replace(".stg","")
|
||||
rest_url = ".stg.splunkcloud.com:8089"
|
||||
|
||||
headers = {
|
||||
'Authorization': 'Bearer '+ token,
|
||||
'User-Agent': 'ACS-Helper'
|
||||
}
|
||||
|
||||
packages_folder = os.path.join(os.environ['SPLUNK_HOME'],'etc','apps','appcontentmanager','appserver','static','packages')
|
||||
|
||||
if action == "list_apps" :
|
||||
return list_apps(acs_url,stackname,headers, experience,logger)
|
||||
elif action == "list_files" :
|
||||
return list_files(rest_url,stackname,headers,app,logger)
|
||||
elif action == "list_content" :
|
||||
return list_content(rest_url,stackname,headers,app,file,logger)
|
||||
elif action == "delete_app" :
|
||||
return delete_app(acs_url,stackname,headers, experience,app,logger)
|
||||
elif action == "download_app" :
|
||||
res = list_files(rest_url,stackname,headers,app,logger)
|
||||
if res['status'] == 200 :
|
||||
with tempfile.TemporaryDirectory() as tempdir:
|
||||
os.mkdir(os.path.join(tempdir,app))
|
||||
os.mkdir(os.path.join(tempdir,app,"default"))
|
||||
os.mkdir(os.path.join(tempdir,app,"metadata"))
|
||||
data_folder_created = False
|
||||
|
||||
files = res['payload']['entry']
|
||||
for file in files :
|
||||
if file['name'] == 'views' :
|
||||
if not data_folder_created :
|
||||
os.mkdir(os.path.join(tempdir,app,"default","data"))
|
||||
os.mkdir(os.path.join(tempdir,app,"default","data","ui"))
|
||||
os.mkdir(os.path.join(tempdir,app,"default","data","ui","views"))
|
||||
os.mkdir(os.path.join(tempdir,app,"default","data","ui","nav"))
|
||||
data_folder_created = True
|
||||
|
||||
res = list_content(rest_url,stackname,headers,app,file['name'],logger)
|
||||
if res['status'] == 200 :
|
||||
confs = res['payload']
|
||||
for confFile in confs :
|
||||
# get dashboard difinition
|
||||
response = requests.get("https://"+stackname+rest_url+"/servicesNS/-/"+app+"/data/ui/views/"+confFile["name"]+"?output_mode=json",headers=headers, verify=False)
|
||||
if response.status_code == 200 :
|
||||
with open(os.path.join(tempdir,app,"default","data","ui","views",confFile["name"]+".xml"), "w+") as dash:
|
||||
r = json.loads(response.text)
|
||||
for d in r['entry'] :
|
||||
if d['acl']['app'] == app :
|
||||
dash.write(d['content']['eai:data'])
|
||||
|
||||
elif file['name'] == 'nav' :
|
||||
if not data_folder_created :
|
||||
os.mkdir(os.path.join(tempdir,app,"default","data"))
|
||||
os.mkdir(os.path.join(tempdir,app,"default","data","ui"))
|
||||
os.mkdir(os.path.join(tempdir,app,"default","data","ui","views"))
|
||||
os.mkdir(os.path.join(tempdir,app,"default","data","ui","nav"))
|
||||
data_folder_created = True
|
||||
|
||||
else :
|
||||
res = list_content(rest_url,stackname,headers,app,file['name'],logger)
|
||||
if res['status'] == 200 :
|
||||
confs = res['payload']
|
||||
c = {}
|
||||
for confFile in confs :
|
||||
#c[confFile['name']] = confFile['content']
|
||||
c[confFile['name']] = {k: v for k, v in confFile['content'].items() if not k.startswith('eai:') and k != "install_source_checksum"}
|
||||
splunk.clilib.cli_common.writeConfFile(os.path.join(tempdir,app,"default",file['name']+".conf"),c)
|
||||
|
||||
# generate nav
|
||||
if not data_folder_created :
|
||||
os.mkdir(os.path.join(tempdir,app,"default","data"))
|
||||
os.mkdir(os.path.join(tempdir,app,"default","data","ui"))
|
||||
os.mkdir(os.path.join(tempdir,app,"default","data","ui","views"))
|
||||
os.mkdir(os.path.join(tempdir,app,"default","data","ui","nav"))
|
||||
data_folder_created = True
|
||||
|
||||
response = requests.get("https://"+stackname+rest_url+"/servicesNS/-/"+app+"/data/ui/nav?output_mode=json",headers=headers, verify=False)
|
||||
if response.status_code == 200 :
|
||||
with open(os.path.join(tempdir,app,"default","data","ui","nav","default.xml"), "w+") as nav:
|
||||
r = json.loads(response.text)
|
||||
for n in r['entry'] :
|
||||
if n['acl']['app'] == app :
|
||||
nav.write(n['content']['eai:data'])
|
||||
|
||||
# generate a default.meta conf file
|
||||
meta = {}
|
||||
meta[''] = {}
|
||||
meta['']["access"] = 'read : [ * ], write : [ admin ]'
|
||||
meta['']["export"] = 'system'
|
||||
splunk.clilib.cli_common.writeConfFile(os.path.join(tempdir,app,"metadata","default.meta"),meta)
|
||||
|
||||
# package the app to appserver/static/packages folder
|
||||
|
||||
argv = []
|
||||
argv.append(re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]))
|
||||
argv.append("package")
|
||||
|
||||
argv.append(os.path.join(tempdir,app))
|
||||
argv.append("-o")
|
||||
argv.append(packages_folder)
|
||||
results = slimmain(argv)
|
||||
|
||||
apppath = ""
|
||||
apppath = results[-1]["msg"].replace('Source package exported to "','').replace('"','')
|
||||
os.rename(apppath,apppath.replace("tar.gz","spl"))
|
||||
return {'payload': {'path' : apppath.replace("tar.gz","spl")}, 'status': 200}
|
||||
|
||||
|
||||
|
||||
return {'payload': "", 'status': 200}
|
||||
|
||||
def handleStream(self, handle, in_string):
|
||||
"""
|
||||
For future use
|
||||
"""
|
||||
raise NotImplementedError(
|
||||
"PersistentServerConnectionApplication.handleStream")
|
||||
|
||||
def done(self):
|
||||
"""
|
||||
Virtual method which can be optionally overridden to receive a
|
||||
callback after the request completes.
|
||||
"""
|
||||
pass
|
||||
|
||||
def convert_to_dict(self, query):
|
||||
"""
|
||||
Create a dictionary containing the parameters.
|
||||
"""
|
||||
parameters = {}
|
||||
|
||||
for key, val in query:
|
||||
|
||||
# If the key is already in the list, but the existing entry isn't a list then make the
|
||||
# existing entry a list and add thi one
|
||||
if key in parameters and not isinstance(parameters[key], list):
|
||||
parameters[key] = [parameters[key], val]
|
||||
|
||||
# If the entry is already included as a list, then just add the entry
|
||||
elif key in parameters:
|
||||
parameters[key].append(val)
|
||||
|
||||
# Otherwise, just add the entry
|
||||
else:
|
||||
parameters[key] = val
|
||||
|
||||
return parameters
|
||||
|
||||
def parse_in_string(self, in_string):
|
||||
"""
|
||||
Parse the in_string
|
||||
"""
|
||||
|
||||
params = json.loads(in_string)
|
||||
|
||||
params['method'] = params['method'].lower()
|
||||
|
||||
params['form_parameters'] = self.convert_to_dict(params.get('form', []))
|
||||
params['query_parameters'] = self.convert_to_dict(params.get('query', []))
|
||||
|
||||
return params
|
||||
@ -0,0 +1,155 @@
|
||||
import requests
|
||||
import logging
|
||||
import os
|
||||
import json
|
||||
import sys
|
||||
import logging.handlers
|
||||
|
||||
from splunk.persistconn.application import PersistentServerConnectionApplication
|
||||
import signal
|
||||
import subprocess
|
||||
import tempfile
|
||||
import tarfile
|
||||
import re
|
||||
import splunk.clilib.cli_common
|
||||
import csv
|
||||
import re
|
||||
import boto3
|
||||
import gzip
|
||||
|
||||
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "lib"))
|
||||
|
||||
'''
|
||||
# !!!!! DEBUG !!!!
|
||||
sys.path.append(os.path.join(os.environ['SPLUNK_HOME'],'etc','apps','SA-VSCode','bin'))
|
||||
import splunk_debug as dbg
|
||||
dbg.enable_debugging(timeout=25)
|
||||
#################
|
||||
'''
|
||||
|
||||
try: #python3
|
||||
from urllib.request import urlopen
|
||||
except: #python2
|
||||
from urllib2 import urlopen
|
||||
|
||||
splunk_home = os.environ['SPLUNK_HOME']
|
||||
LOG_LEVEL = logging.INFO
|
||||
LOG_FILE_NAME = "acms.log"
|
||||
|
||||
|
||||
def setup_logger(): # setup logging
|
||||
global SPLUNK_HOME, LOG_LEVEL, LOG_FILE_NAME
|
||||
if 'SPLUNK_HOME' in os.environ:
|
||||
SPLUNK_HOME = os.environ['SPLUNK_HOME']
|
||||
|
||||
log_format = "%(asctime)s %(levelname)-s\t%(module)s[%(process)d]:%(lineno)d - %(message)s"
|
||||
logger = logging.getLogger('v')
|
||||
logger.setLevel(LOG_LEVEL)
|
||||
|
||||
l = logging.handlers.RotatingFileHandler(os.path.join(SPLUNK_HOME, 'var', 'log', 'splunk', LOG_FILE_NAME), mode='a', maxBytes=1000000, backupCount=2)
|
||||
l.setFormatter(logging.Formatter(log_format))
|
||||
logger.addHandler(l)
|
||||
|
||||
# ..and (optionally) output to console
|
||||
logH = logging.StreamHandler()
|
||||
logH.setFormatter(logging.Formatter(fmt=log_format))
|
||||
# logger.addHandler(logH)
|
||||
|
||||
logger.propagate = False
|
||||
return logger
|
||||
|
||||
logger = setup_logger()
|
||||
|
||||
|
||||
class Update_SbApps(PersistentServerConnectionApplication):
|
||||
def __init__(self, _command_line, _command_arg):
|
||||
super(PersistentServerConnectionApplication, self).__init__()
|
||||
|
||||
# Handle a syncronous from splunkd.
|
||||
def handle(self, in_string):
|
||||
"""
|
||||
Called for a simple synchronous request.
|
||||
@param in_string: request data passed in
|
||||
@rtype: string or dict
|
||||
@return: String to return in response. If a dict was passed in,
|
||||
it will automatically be JSON encoded before being returned.
|
||||
"""
|
||||
|
||||
#dbg.set_breakpoint()
|
||||
try :
|
||||
bucket_name = "splunkbaseassets"
|
||||
file_name = "splunkbase_apps.csv"
|
||||
s3_path = "splunkbase_apps/" + file_name
|
||||
|
||||
s3 = boto3.client("s3", aws_access_key_id='AKIAWFRE2V5CBQOFF632',
|
||||
aws_secret_access_key='t+spDCPrTBQDQV1ZI5JAbmpor+D0AROnLZ4en+aQ',
|
||||
region_name='us-east-1')
|
||||
|
||||
obj = s3.get_object(Bucket=bucket_name, Key=s3_path)
|
||||
|
||||
with gzip.open(os.path.join(splunk_home,"etc","apps","appcontentmanager",'lookups','acms_splunkbase_apps.csv.gz'), 'wb') as gz_out_csv:
|
||||
gz_out_csv.write(obj['Body'].read())
|
||||
gz_out_csv.close()
|
||||
|
||||
return {'payload': {'status':'success'}, 'status': 200}
|
||||
|
||||
except:
|
||||
return {'payload': {'status':'Error'}, 'status': 400}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def handleStream(self, handle, in_string):
|
||||
"""
|
||||
For future use
|
||||
"""
|
||||
raise NotImplementedError(
|
||||
"PersistentServerConnectionApplication.handleStream")
|
||||
|
||||
def done(self):
|
||||
"""
|
||||
Virtual method which can be optionally overridden to receive a
|
||||
callback after the request completes.
|
||||
"""
|
||||
pass
|
||||
|
||||
def convert_to_dict(self, query):
|
||||
"""
|
||||
Create a dictionary containing the parameters.
|
||||
"""
|
||||
parameters = {}
|
||||
|
||||
for key, val in query:
|
||||
|
||||
# If the key is already in the list, but the existing entry isn't a list then make the
|
||||
# existing entry a list and add thi one
|
||||
if key in parameters and not isinstance(parameters[key], list):
|
||||
parameters[key] = [parameters[key], val]
|
||||
|
||||
# If the entry is already included as a list, then just add the entry
|
||||
elif key in parameters:
|
||||
parameters[key].append(val)
|
||||
|
||||
# Otherwise, just add the entry
|
||||
else:
|
||||
parameters[key] = val
|
||||
|
||||
return parameters
|
||||
|
||||
def parse_in_string(self, in_string):
|
||||
"""
|
||||
Parse the in_string
|
||||
"""
|
||||
|
||||
params = json.loads(in_string)
|
||||
|
||||
params['method'] = params['method'].lower()
|
||||
|
||||
params['form_parameters'] = self.convert_to_dict(params.get('form', []))
|
||||
params['query_parameters'] = self.convert_to_dict(params.get('query', []))
|
||||
|
||||
return params
|
||||
@ -0,0 +1,9 @@
|
||||
[settings]
|
||||
blacklisted_apps = alert_logevent,alert_webhook,appsbrowser,introspection_generator_addon,launcher,learned,legacy,logd_input,python_upgrade_readiness_app,sample_app,splunk_assist,splunk_gdi,splunk_httpinput,splunk_ingest_actions,splunk_instrumentation,splunk_internal_metrics,splunk_metrics_workspace,splunk_monitoring_console,splunk_secure_gateway,SplunkForwarder,SplunkLightForwarder,splunk-dashboard-studio
|
||||
blacklisted_conffiles = server,limits,app,passwords
|
||||
blacklisted_stanzas =
|
||||
blacklisted_roles = user
|
||||
blacklisted_users =
|
||||
theme = light
|
||||
is_configured = 0
|
||||
default_owner = nobody
|
||||
@ -0,0 +1,24 @@
|
||||
[id]
|
||||
name = appcontentmanager
|
||||
version = 0.5.983beta
|
||||
|
||||
[ui]
|
||||
is_visible = 1
|
||||
label = App Content Manager
|
||||
supported_themes = light,dark
|
||||
|
||||
[launcher]
|
||||
author = Splunk
|
||||
description = The Splunk App Content Manager is an applicationdesigned to simplify the management and deployment of content across various Splunk Cloud stacks. It conceals the intricacies of this process and guides administrators through a user-friendly wizard, making it easy to achieve the intended goal.
|
||||
version = 0.5.983beta
|
||||
|
||||
[package]
|
||||
check_for_updates = 1
|
||||
id = appcontentmanager
|
||||
|
||||
[install]
|
||||
is_configured = 1
|
||||
build = 1
|
||||
|
||||
[triggers]
|
||||
reload.splunk_create = simple
|
||||
@ -0,0 +1,10 @@
|
||||
[acms_updatesplunkbaseapps]
|
||||
filename = update_splunkbase_lookup.py
|
||||
generating = false
|
||||
maxinputs = 0
|
||||
supports_rawargs = false
|
||||
retainsevents = false
|
||||
streaming = false
|
||||
supports_getinfo=false
|
||||
local = true
|
||||
python.version = python3
|
||||
@ -0,0 +1,3 @@
|
||||
<nav>
|
||||
<view name="deploy" default="true"/>
|
||||
</nav>
|
||||
@ -0,0 +1,4 @@
|
||||
<?xml version="1.0"?>
|
||||
<view template="appcontentmanager:/templates/start.html" type="html">
|
||||
<label>Activity</label>
|
||||
</view>
|
||||
@ -0,0 +1,4 @@
|
||||
<?xml version="1.0"?>
|
||||
<view template="appcontentmanager:/templates/start.html" type="html">
|
||||
<label>Content Manager</label>
|
||||
</view>
|
||||
@ -0,0 +1,4 @@
|
||||
<?xml version="1.0"?>
|
||||
<view template="appcontentmanager:/templates/start.html" type="html">
|
||||
<label>Deploy!</label>
|
||||
</view>
|
||||