2010-06-24 08:33:58 +04:00
#!/usr/bin/env python
2007-11-21 15:07:16 +03:00
# Samba-specific bits for optparse
# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007
2009-12-28 18:05:04 +03:00
#
2007-11-21 15:07:16 +03:00
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
2009-12-28 18:05:04 +03:00
#
2007-11-21 15:07:16 +03:00
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
2009-12-28 18:05:04 +03:00
#
2007-11-21 15:07:16 +03:00
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
2008-05-22 20:47:32 +04:00
""" Support for parsing Samba-related command-line options. """
2010-11-28 15:37:31 +03:00
__docformat__ = " restructuredText "
2011-09-13 03:27:50 +04:00
import optparse
import os
2010-11-28 15:37:31 +03:00
from samba . credentials import (
Credentials ,
DONT_USE_KERBEROS ,
MUST_USE_KERBEROS ,
)
from samba . hostconfig import Hostconfig
import sys
2007-11-21 15:07:16 +03:00
2008-05-22 20:47:32 +04:00
2007-11-21 15:07:16 +03:00
class SambaOptions ( optparse . OptionGroup ) :
2008-05-22 20:47:32 +04:00
""" General Samba-related command line options. """
2010-11-28 15:37:31 +03:00
2007-11-21 15:07:16 +03:00
def __init__ ( self , parser ) :
2010-11-28 15:37:31 +03:00
from samba . param import LoadParm
2007-11-21 15:07:16 +03:00
optparse . OptionGroup . __init__ ( self , parser , " Samba Common Options " )
2008-01-24 01:33:36 +03:00
self . add_option ( " -s " , " --configfile " , action = " callback " ,
2009-12-28 18:05:04 +03:00
type = str , metavar = " FILE " , help = " Configuration file " ,
2008-01-24 01:33:36 +03:00
callback = self . _load_configfile )
2010-04-02 11:31:30 +04:00
self . add_option ( " -d " , " --debuglevel " , action = " callback " ,
type = int , metavar = " DEBUGLEVEL " , help = " debug level " ,
callback = self . _set_debuglevel )
2010-04-21 05:33:43 +04:00
self . add_option ( " --option " , action = " callback " ,
2011-09-13 03:27:50 +04:00
type = str , metavar = " OPTION " ,
help = " set smb.conf option from command line " ,
2010-04-21 05:33:43 +04:00
callback = self . _set_option )
2010-04-21 06:01:47 +04:00
self . add_option ( " --realm " , action = " callback " ,
type = str , metavar = " REALM " , help = " set the realm name " ,
callback = self . _set_realm )
2008-01-24 01:33:36 +03:00
self . _configfile = None
2010-11-28 15:37:31 +03:00
self . _lp = LoadParm ( )
2011-09-13 15:02:43 +04:00
self . realm = None
2007-11-21 15:07:16 +03:00
2008-01-24 01:33:36 +03:00
def get_loadparm_path ( self ) :
2011-09-13 03:27:50 +04:00
""" Return path to the smb.conf file specified on the command line. """
2008-01-24 01:33:36 +03:00
return self . _configfile
def _load_configfile ( self , option , opt_str , arg , parser ) :
self . _configfile = arg
2010-04-02 11:31:30 +04:00
def _set_debuglevel ( self , option , opt_str , arg , parser ) :
2010-04-21 05:33:43 +04:00
self . _lp . set ( ' debug level ' , str ( arg ) )
2010-04-21 06:01:47 +04:00
def _set_realm ( self , option , opt_str , arg , parser ) :
self . _lp . set ( ' realm ' , arg )
2011-09-13 15:02:43 +04:00
self . realm = arg
2010-04-21 06:01:47 +04:00
2010-04-21 05:33:43 +04:00
def _set_option ( self , option , opt_str , arg , parser ) :
if arg . find ( ' = ' ) == - 1 :
print ( " --option takes a ' a=b ' argument " )
sys . exit ( 1 )
a = arg . split ( ' = ' )
self . _lp . set ( a [ 0 ] , a [ 1 ] )
2010-04-02 11:31:30 +04:00
2008-01-24 01:33:36 +03:00
def get_loadparm ( self ) :
2011-09-13 03:27:50 +04:00
""" Return loadparm object with data specified on the command line. """
2008-04-14 21:01:32 +04:00
if self . _configfile is not None :
2010-04-21 05:33:43 +04:00
self . _lp . load ( self . _configfile )
2008-04-14 21:01:32 +04:00
elif os . getenv ( " SMB_CONF_PATH " ) is not None :
2010-04-21 05:33:43 +04:00
self . _lp . load ( os . getenv ( " SMB_CONF_PATH " ) )
2008-04-14 21:01:32 +04:00
else :
2010-04-21 05:33:43 +04:00
self . _lp . load_default ( )
return self . _lp
2007-11-21 15:07:16 +03:00
2008-08-01 23:12:37 +04:00
def get_hostconfig ( self ) :
return Hostconfig ( self . get_loadparm ( ) )
2008-05-22 20:47:32 +04:00
2007-11-21 15:07:16 +03:00
class VersionOptions ( optparse . OptionGroup ) :
2008-05-22 20:47:32 +04:00
""" Command line option for printing Samba version. """
2007-11-21 15:07:16 +03:00
def __init__ ( self , parser ) :
optparse . OptionGroup . __init__ ( self , parser , " Version Options " )
2010-04-09 04:30:48 +04:00
self . add_option ( " --version " , action = " callback " ,
2010-11-28 15:37:31 +03:00
callback = self . _display_version ,
2010-04-09 04:30:48 +04:00
help = " Display version number " )
def _display_version ( self , option , opt_str , arg , parser ) :
2010-11-28 15:37:31 +03:00
import samba
2010-04-09 04:30:48 +04:00
print samba . version
sys . exit ( 0 )
2007-11-21 15:07:16 +03:00
class CredentialsOptions ( optparse . OptionGroup ) :
2008-05-22 20:47:32 +04:00
""" Command line options for specifying credentials. """
2007-11-21 15:07:16 +03:00
def __init__ ( self , parser ) :
2010-02-12 15:55:14 +03:00
self . no_pass = True
2010-09-24 06:51:36 +04:00
self . ipaddress = None
2007-11-21 15:07:16 +03:00
optparse . OptionGroup . __init__ ( self , parser , " Credentials Options " )
2007-12-28 08:31:42 +03:00
self . add_option ( " --simple-bind-dn " , metavar = " DN " , action = " callback " ,
2007-12-30 03:14:18 +03:00
callback = self . _set_simple_bind_dn , type = str ,
2007-11-21 15:07:16 +03:00
help = " DN to use for a simple bind " )
2007-12-28 08:31:42 +03:00
self . add_option ( " --password " , metavar = " PASSWORD " , action = " callback " ,
2007-12-30 03:14:18 +03:00
help = " Password " , type = str , callback = self . _set_password )
2009-12-28 18:05:04 +03:00
self . add_option ( " -U " , " --username " , metavar = " USERNAME " ,
2007-12-28 08:31:42 +03:00
action = " callback " , type = str ,
2007-12-30 03:14:18 +03:00
help = " Username " , callback = self . _parse_username )
2009-12-28 18:05:04 +03:00
self . add_option ( " -W " , " --workgroup " , metavar = " WORKGROUP " ,
2007-12-29 00:36:55 +03:00
action = " callback " , type = str ,
2007-12-30 03:14:18 +03:00
help = " Workgroup " , callback = self . _parse_workgroup )
2008-01-24 03:05:57 +03:00
self . add_option ( " -N " , " --no-pass " , action = " store_true " ,
help = " Don ' t ask for a password " )
2009-12-28 18:05:04 +03:00
self . add_option ( " -k " , " --kerberos " , metavar = " KERBEROS " ,
2008-03-28 13:57:15 +03:00
action = " callback " , type = str ,
help = " Use Kerberos " , callback = self . _set_kerberos )
2010-09-24 06:51:36 +04:00
self . add_option ( " " , " --ipaddress " , metavar = " IPADDRESS " ,
action = " callback " , type = str ,
2011-09-13 03:27:50 +04:00
help = " IP address of server " ,
callback = self . _set_ipaddress )
2007-12-28 08:31:42 +03:00
self . creds = Credentials ( )
2007-12-30 03:14:18 +03:00
def _parse_username ( self , option , opt_str , arg , parser ) :
2007-12-28 08:31:42 +03:00
self . creds . parse_string ( arg )
2007-12-30 03:14:18 +03:00
def _parse_workgroup ( self , option , opt_str , arg , parser ) :
2007-12-29 00:36:55 +03:00
self . creds . set_domain ( arg )
2007-12-30 03:14:18 +03:00
def _set_password ( self , option , opt_str , arg , parser ) :
2007-12-28 08:31:42 +03:00
self . creds . set_password ( arg )
2010-02-12 15:55:14 +03:00
self . no_pass = False
2007-12-28 08:31:42 +03:00
2010-09-24 06:51:36 +04:00
def _set_ipaddress ( self , option , opt_str , arg , parser ) :
self . ipaddress = arg
2008-03-28 13:57:15 +03:00
def _set_kerberos ( self , option , opt_str , arg , parser ) :
2010-11-27 14:03:07 +03:00
if arg . lower ( ) in [ " yes " , ' true ' , ' 1 ' ] :
2008-03-28 13:57:15 +03:00
self . creds . set_kerberos_state ( MUST_USE_KERBEROS )
2010-11-27 14:03:07 +03:00
elif arg . lower ( ) in [ " no " , ' false ' , ' 0 ' ] :
2008-03-28 13:57:15 +03:00
self . creds . set_kerberos_state ( DONT_USE_KERBEROS )
2010-11-27 14:03:07 +03:00
else :
raise optparse . BadOptionErr ( " invalid kerberos option: %s " % arg )
2008-03-28 13:57:15 +03:00
2007-12-30 03:14:18 +03:00
def _set_simple_bind_dn ( self , option , opt_str , arg , parser ) :
2007-12-30 03:14:15 +03:00
self . creds . set_bind_dn ( arg )
2007-11-21 15:07:16 +03:00
2010-12-08 00:20:54 +03:00
def get_credentials ( self , lp , fallback_machine = False ) :
2008-05-22 20:47:32 +04:00
""" Obtain the credentials set on the command-line.
: param lp : Loadparm object to use .
: return : Credentials object
"""
2008-03-28 13:57:15 +03:00
self . creds . guess ( lp )
2010-02-12 15:55:14 +03:00
if self . no_pass :
2008-01-24 03:05:57 +03:00
self . creds . set_cmdline_callbacks ( )
2010-12-08 00:20:54 +03:00
# possibly fallback to using the machine account, if we have
# access to the secrets db
if fallback_machine and not self . creds . authentication_requested ( ) :
try :
self . creds . set_machine_account ( lp )
except Exception :
pass
2007-12-28 08:31:42 +03:00
return self . creds
2010-01-13 11:41:56 +03:00
2011-09-13 03:27:50 +04:00
2010-01-13 11:41:56 +03:00
class CredentialsOptionsDouble ( CredentialsOptions ) :
""" Command line options for specifying credentials of two servers. """
def __init__ ( self , parser ) :
CredentialsOptions . __init__ ( self , parser )
2010-02-12 15:55:14 +03:00
self . no_pass2 = True
2010-01-13 11:41:56 +03:00
self . add_option ( " --simple-bind-dn2 " , metavar = " DN2 " , action = " callback " ,
callback = self . _set_simple_bind_dn2 , type = str ,
help = " DN to use for a simple bind " )
self . add_option ( " --password2 " , metavar = " PASSWORD2 " , action = " callback " ,
2011-09-13 03:27:50 +04:00
help = " Password " , type = str ,
callback = self . _set_password2 )
2010-01-13 11:41:56 +03:00
self . add_option ( " --username2 " , metavar = " USERNAME2 " ,
action = " callback " , type = str ,
2011-09-13 03:27:50 +04:00
help = " Username for second server " ,
callback = self . _parse_username2 )
2010-01-13 11:41:56 +03:00
self . add_option ( " --workgroup2 " , metavar = " WORKGROUP2 " ,
action = " callback " , type = str ,
2011-09-13 03:27:50 +04:00
help = " Workgroup for second server " ,
callback = self . _parse_workgroup2 )
2010-01-13 11:41:56 +03:00
self . add_option ( " --no-pass2 " , action = " store_true " ,
help = " Don ' t ask for a password for the second server " )
self . add_option ( " --kerberos2 " , metavar = " KERBEROS2 " ,
action = " callback " , type = str ,
help = " Use Kerberos " , callback = self . _set_kerberos2 )
self . creds2 = Credentials ( )
def _parse_username2 ( self , option , opt_str , arg , parser ) :
self . creds2 . parse_string ( arg )
def _parse_workgroup2 ( self , option , opt_str , arg , parser ) :
self . creds2 . set_domain ( arg )
def _set_password2 ( self , option , opt_str , arg , parser ) :
self . creds2 . set_password ( arg )
2010-02-12 15:55:14 +03:00
self . no_pass2 = False
2010-01-13 11:41:56 +03:00
def _set_kerberos2 ( self , option , opt_str , arg , parser ) :
if bool ( arg ) or arg . lower ( ) == " yes " :
self . creds2 . set_kerberos_state ( MUST_USE_KERBEROS )
else :
self . creds2 . set_kerberos_state ( DONT_USE_KERBEROS )
def _set_simple_bind_dn2 ( self , option , opt_str , arg , parser ) :
self . creds2 . set_bind_dn ( arg )
2010-10-01 04:29:33 +04:00
def get_credentials2 ( self , lp , guess = True ) :
2010-01-13 11:41:56 +03:00
""" Obtain the credentials set on the command-line.
: param lp : Loadparm object to use .
2010-10-01 04:29:33 +04:00
: param guess : Try guess Credentials from environment
2010-01-13 11:41:56 +03:00
: return : Credentials object
"""
2010-10-01 04:29:33 +04:00
if guess :
self . creds2 . guess ( lp )
elif not self . creds2 . get_username ( ) :
self . creds2 . set_anonymous ( )
2010-02-12 15:55:14 +03:00
if self . no_pass2 :
2010-01-13 11:41:56 +03:00
self . creds2 . set_cmdline_callbacks ( )
return self . creds2