samba-tool drs showrepl: add a --color flag
[bbaumbach/samba-autobuild/.git] / python / samba / netcmd / drs.py
index 9b3c6050af911162ddbe333fa8575aeffaa55c7d..254122a292499e853908f28fbbb27e2a30c76681 100644 (file)
@@ -23,6 +23,7 @@ import samba.getopt as options
 import ldb
 import logging
 import common
+import json
 
 from samba.auth import system_session
 from samba.netcmd import (
@@ -37,6 +38,9 @@ from samba.dcerpc import drsuapi, misc
 from samba.join import join_clone
 from samba.ndr import ndr_unpack
 from samba.dcerpc import drsblobs
+from samba import colour
+import logging
+
 
 def drsuapi_connect(ctx):
     '''make a DRSUAPI connection to the server'''
@@ -81,8 +85,7 @@ def drs_parse_ntds_dn(ntds_dn):
     return (site, server)
 
 
-
-
+DEFAULT_SHOWREPL_FORMAT = 'classic'
 
 class cmd_drs_showrepl(Command):
     """Show replication status."""
@@ -96,7 +99,14 @@ class cmd_drs_showrepl(Command):
     }
 
     takes_options = [
-        Option("--json", help="output in JSON format", action='store_true'),
+        Option("--json", help="replication details in JSON format",
+               dest='format', action='store_const', const='json'),
+        Option("--classic", help="print local replication details",
+               dest='format', action='store_const', const='classic',
+               default=DEFAULT_SHOWREPL_FORMAT),
+        Option("-v", "--verbose", help="Be verbose", action="store_true"),
+        Option("--color", help="Use colour output (yes|no|auto)",
+               default='no'),
     ]
 
     takes_args = ["DC?"]
@@ -148,14 +158,33 @@ class cmd_drs_showrepl(Command):
         return (info_type, info)
 
     def run(self, DC=None, sambaopts=None,
-            credopts=None, versionopts=None, json=False):
-
+            credopts=None, versionopts=None,
+            format=DEFAULT_SHOWREPL_FORMAT,
+            verbose=False, color='no'):
+        self.apply_colour_choice(color)
         self.lp = sambaopts.get_loadparm()
         if DC is None:
             DC = common.netcmd_dnsname(self.lp)
         self.server = DC
         self.creds = credopts.get_credentials(self.lp, fallback_machine=True)
+        self.verbose = verbose
+
+        output_function = {
+            'json': self.json_output,
+            'classic': self.classic_output,
+        }.get(format)
+        if output_function is None:
+            raise CommandError("unknown showrepl format %s" % format)
 
+        return output_function()
+
+    def json_output(self):
+        data = self.get_local_repl_data()
+        del data['site']
+        del data['server']
+        json.dump(data, self.outf, indent=2)
+
+    def get_local_repl_data(self):
         drsuapi_connect(self)
         samdb_connect(self)
 
@@ -213,16 +242,23 @@ class cmd_drs_showrepl(Command):
                 a = str(r).split(':')
                 d['replicates NC'].append((a[3], int(a[2])))
 
-        if json:
-            import json as json_mod
-            data = {
-                'dsa': dsa_details,
-                'repsFrom': repsfrom,
-                'repsTo': repsto,
-                'NTDSConnections': conn_details
-            }
-            json_mod.dump(data, self.outf, indent=2)
-            return
+        return {
+            'dsa': dsa_details,
+            'repsFrom': repsfrom,
+            'repsTo': repsto,
+            'NTDSConnections': conn_details,
+            'site': site,
+            'server': server
+        }
+
+    def classic_output(self):
+        data = self.get_local_repl_data()
+        dsa_details = data['dsa']
+        repsfrom = data['repsFrom']
+        repsto = data['repsTo']
+        conn_details = data['NTDSConnections']
+        site = data['site']
+        server = data['server']
 
         self.message("%s\\%s" % (site, server))
         self.message("DSA Options: 0x%08x" % dsa_details["options"])