3 # Samba4 AD database checker
5 # Copyright (C) Andrew Tridgell 2011
7 # This program is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3 of the License, or
10 # (at your option) any later version.
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
22 import samba
.getopt
as options
23 from samba
.auth
import system_session
24 from samba
.samdb
import SamDB
25 from samba
.netcmd
import (
30 from samba
.dbchecker
import dbcheck
33 class cmd_dbcheck(Command
):
34 """check local AD database for errors"""
35 synopsis
= "dbcheck <DN> [options]"
37 takes_optiongroups
= {
38 "sambaopts": options
.SambaOptions
,
39 "versionopts": options
.VersionOptions
,
40 "credopts": options
.CredentialsOptionsDouble
,
46 Option("--scope", dest
="scope", default
="SUB",
47 help="Pass search scope that builds DN list. Options: SUB, ONE, BASE"),
48 Option("--fix", dest
="fix", default
=False, action
='store_true',
49 help='Fix any errors found'),
50 Option("--yes", dest
="yes", default
=False, action
='store_true',
51 help="don't confirm changes, just do them all as a single transaction"),
52 Option("--cross-ncs", dest
="cross_ncs", default
=False, action
='store_true',
53 help="cross naming context boundaries"),
54 Option("-v", "--verbose", dest
="verbose", action
="store_true", default
=False,
55 help="Print more details of checking"),
56 Option("--quiet", dest
="quiet", action
="store_true", default
=False,
57 help="don't print details of checking"),
58 Option("--attrs", dest
="attrs", default
=None, help="list of attributes to check (space separated)"),
59 Option("-H", help="LDB URL for database or target server (defaults to local SAM database)", type=str),
62 def run(self
, H
=None, DN
=None, verbose
=False, fix
=False, yes
=False, cross_ncs
=False, quiet
=False,
63 scope
="SUB", credopts
=None, sambaopts
=None, versionopts
=None, attrs
=None):
65 lp
= sambaopts
.get_loadparm()
66 creds
= credopts
.get_credentials(lp
, fallback_machine
=True)
68 samdb
= SamDB(session_info
=system_session(), url
=H
,
69 credentials
=creds
, lp
=lp
)
73 samdb_schema
= SamDB(session_info
=system_session(), url
=None,
74 credentials
=creds
, lp
=lp
)
76 scope_map
= { "SUB": ldb
.SCOPE_SUBTREE
, "BASE":ldb
.SCOPE_BASE
, "ONE":ldb
.SCOPE_ONELEVEL
}
78 if not scope
in scope_map
:
79 raise CommandError("Unknown scope %s" % scope
)
80 search_scope
= scope_map
[scope
]
84 controls
.append('paged_results:1:1000')
86 controls
.append("search_options:1:2")
94 samdb
.transaction_start()
96 chk
= dbcheck(samdb
, samdb_schema
=samdb_schema
, verbose
=verbose
, fix
=fix
, yes
=yes
, quiet
=quiet
)
97 error_count
= chk
.check_database(DN
=DN
, scope
=search_scope
, controls
=controls
, attrs
=attrs
)
100 samdb
.transaction_commit()