[PATCH] CSV output for "samba-tool drs showrepl"

Flavio Stanchina flavio.stanchina at ies.it
Wed Oct 24 15:20:10 UTC 2018


This patch adds CSV output (option --csv) to "samba-tool drs showrepl".

The output is meant to be equivalent to:
   repadmin /showrepl /csv

We use this to monitor our Samba DCs with Check_MK; the AD replication 
plugin for Windows ("ad_replication.bat") sends CSV output and it was 
easy to add it to "drs showrepl".

For those interested, the Check_MK plugin for the Linux agent is simply:
   #!/bin/sh
   # ad_replication.sh
   # Needs patched samba-tool!
   echo '<<<ad_replication>>>'
   samba-tool drs showrepl --csv 2>/dev/null

The patch is against Samba version 4.6.7, currently used by Zentyal 5.1 
and Ubuntu artful. I know it's not the latest version; I can reapply it 
on a more recent version if needed, but you're probably better equipped 
than me to do that.

Hope you find it useful.

-- 
Flavio Stanchina
Informatica e Servizi
Trento - Italy


-------------- next part --------------
diff --git a/python/samba/netcmd/drs.py b/python/samba/netcmd/drs.py
index 67733ac..df793a4 100644
--- a/python/samba/netcmd/drs.py
+++ b/python/samba/netcmd/drs.py
@@ -21,6 +21,7 @@
 import samba.getopt as options
 import ldb
 import logging
+import time
 
 from samba.auth import system_session
 from samba.netcmd import (
@@ -30,7 +31,7 @@ from samba.netcmd import (
     SuperCommand,
     )
 from samba.samdb import SamDB
-from samba import drs_utils, nttime2string, dsdb
+from samba import drs_utils, nttime2string, nttime2unix, dsdb
 from samba.dcerpc import drsuapi, misc
 import common
 from samba.join import join_clone
@@ -94,6 +95,10 @@ class cmd_drs_showrepl(Command):
 
     takes_args = ["DC?"]
 
+    takes_options = [
+        Option("--csv", help="output CSV (compatible with repadmin /showrepl /csv)", action="store_true"),
+        ]
+
     def print_neighbour(self, n):
         '''print one set of neighbour information'''
         self.message("%s" % n.naming_context_dn)
@@ -120,7 +125,7 @@ class cmd_drs_showrepl(Command):
             raise CommandError("DsReplicaGetInfo of type %u failed" % info_type, e)
         return (info_type, info)
 
-    def run(self, DC=None, sambaopts=None,
+    def run(self, DC=None, csv=None, sambaopts=None,
             credopts=None, versionopts=None, server=None):
 
         self.lp = sambaopts.get_loadparm()
@@ -143,6 +148,28 @@ class cmd_drs_showrepl(Command):
             raise CommandError("Failed to search NTDS DN %s" % ntds_dn)
         conn = self.samdb.search(base=ntds_dn, expression="(objectClass=nTDSConnection)")
 
+        if csv:
+            self.show_repl_csv(DC, site, server, ntds, conn)
+        else:
+            self.show_repl(DC, site, server, ntds, conn)
+
+    def show_repl_csv(self, DC, site, server, ntds, conn):
+
+        self.message('showrepl_COLUMNS,Destination DSA Site,Destination DSA,Naming Context,Source DSA Site,Source DSA,Transport Type,Number of Failures,Last Failure Time,Last Success Time,Last Failure Status')
+
+        (info_type, info) = self.drsuapi_ReplicaInfo(drsuapi.DRSUAPI_DS_REPLICA_INFO_NEIGHBORS)
+        for n in info.array:
+            (src_site, src_server) = drs_parse_ntds_dn(n.source_dsa_obj_dn)
+            (ecode, estring) = n.result_last_attempt
+            if ecode == 0:
+                last_attempt_time = "0"
+            else:
+                last_attempt_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(nttime2unix(n.last_attempt)))
+            last_success_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(nttime2unix(n.last_success)))
+            self.message("showrepl_INFO,%s,%s,\"%s\",%s,%s,RPC,%u,%s,%s,%u" % (site, server, n.naming_context_dn, src_site, src_server, n.consecutive_sync_failures, last_attempt_time, last_success_time, ecode))
+
+    def show_repl(self, DC, site, server, ntds, conn):
+
         self.message("%s\\%s" % (site, server))
         self.message("DSA Options: 0x%08x" % int(attr_default(ntds[0], "options", 0)))
         self.message("DSA object GUID: %s" % self.samdb.schema_format_value("objectGUID", ntds[0]["objectGUID"][0]))


More information about the samba-technical mailing list