[ SEA-GHOST MINI SHELL]
#!/usr/bin/python3
import pymssql
import json
import sys
import datetime
#DBHOST = "10.21.24.167"
#DBUSER = "INTERNAL\monitoring-ldap-read"
#DBPASS = "asd@#4sd3S#s3S!d56"
#DBNAME = "master"
#DB = "SUSDB"
#TODO = "base_in_cluster_replica_state"
DBHOST = sys.argv[1]
DBUSER = sys.argv[2]
DBPASS = sys.argv[3]
DB = sys.argv[4]
TODO = sys.argv[5]
conn = pymssql.connect(server=DBHOST, user=DBUSER, password=DBPASS)
cursor = conn.cursor()
if TODO == "clusterstate":
cursor.execute("""
SELECT ag.name as group_name,
ISNULL(ags.primary_recovery_health, 2) as primary_recovery_health,
ISNULL(ags.primary_replica, 'Unknown') as primary_replica,
ISNULL(ags.secondary_recovery_health, 2) as secondary_recovery_health,
ags.synchronization_health as synchronization_health
FROM sys.dm_hadr_availability_group_states ags JOIN sys.availability_groups ag ON ag.group_id = ags.group_id
FOR JSON AUTO;
""")
rows = cursor.fetchall()
print(rows)
elif TODO == "state":
cursor.execute(f"""
SELECT state FROM sys.databases where name = '{DB}'
""")
rows = cursor.fetchall()
print(rows)
elif TODO == "base_in_cluster_replica_state":
cursor.execute(f"""
SELECT
dbcs.database_name AS [DatabaseName],
ISNULL(dbrs.synchronization_state, 0) AS [SynchronizationState],
ISNULL(dbrs.is_suspended, 0) AS [IsSuspended],
ISNULL(dbcs.is_database_joined, 0) AS [IsJoined]
FROM master.sys.availability_groups AS AG
LEFT OUTER JOIN master.sys.dm_hadr_availability_group_states as agstates
ON AG.group_id = agstates.group_id
INNER JOIN master.sys.availability_replicas AS AR
ON AG.group_id = AR.group_id
INNER JOIN master.sys.dm_hadr_availability_replica_states AS arstates
ON AR.replica_id = arstates.replica_id AND arstates.is_local = 1
INNER JOIN master.sys.dm_hadr_database_replica_cluster_states AS dbcs
ON arstates.replica_id = dbcs.replica_id
LEFT OUTER JOIN master.sys.dm_hadr_database_replica_states AS dbrs
ON dbcs.replica_id = dbrs.replica_id AND dbcs.group_database_id = dbrs.group_database_id
ORDER BY AG.name ASC, dbcs.database_name
FOR JSON AUTO;
""")
rows = cursor.fetchall()
print(rows)
#
# State of replication database
elif TODO == "replication_state":
cursor.execute(f"""
Select SynchronizationState from
(SELECT
dbcs.database_name AS [DatabaseName],
ISNULL(dbrs.synchronization_state, 0) AS [SynchronizationState],
ISNULL(dbrs.is_suspended, 0) AS [IsSuspended],
ISNULL(dbcs.is_database_joined, 0) AS [IsJoined]
FROM master.sys.availability_groups AS AG
LEFT OUTER JOIN master.sys.dm_hadr_availability_group_states as agstates
ON AG.group_id = agstates.group_id
INNER JOIN master.sys.availability_replicas AS AR
ON AG.group_id = AR.group_id
INNER JOIN master.sys.dm_hadr_availability_replica_states AS arstates
ON AR.replica_id = arstates.replica_id AND arstates.is_local = 1
INNER JOIN master.sys.dm_hadr_database_replica_cluster_states AS dbcs
ON arstates.replica_id = dbcs.replica_id
LEFT OUTER JOIN master.sys.dm_hadr_database_replica_states AS dbrs
ON dbcs.replica_id = dbrs.replica_id AND dbcs.group_database_id = dbrs.group_database_id
WHERE dbcs.database_name = '{DB}' ) AS SUBQUERY
""")
rows = cursor.fetchall()
print(rows)
# Role of node LocalReplicaRole (1=primary,2=secondary,3=none)
elif TODO == "roleofnode":
cursor.execute("""
SELECT LocalReplicaRole from
(SELECT
AG.name AS [Name],
ISNULL(agstates.primary_replica, '') AS [PrimaryReplicaServerName],
ISNULL(arstates.role, 3) AS [LocalReplicaRole]
FROM master.sys.availability_groups AS AG
LEFT OUTER JOIN master.sys.dm_hadr_availability_group_states as agstates
ON AG.group_id = agstates.group_id
INNER JOIN master.sys.availability_replicas AS AR
ON AG.group_id = AR.group_id
INNER JOIN master.sys.dm_hadr_availability_replica_states AS arstates
ON AR.replica_id = arstates.replica_id AND arstates.is_local = 1
) AS SUBQUERY
""")
rows = cursor.fetchall()
print(rows)
else:
print("ZBX UNSUPPORTED")
SEA-GHOST - SHELL CODING BY SEA-GHOST