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 ,
2011-10-12 01:56:15 +04:00
AUTO_USE_KERBEROS ,
2010-11-28 15:37:31 +03:00
DONT_USE_KERBEROS ,
MUST_USE_KERBEROS ,
)
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 ) :
2011-10-17 23:22:01 +04:00
if arg < 0 :
raise optparse . OptionValueError ( " invalid %s option value: %s " %
( opt_str , arg ) )
2010-04-21 05:33:43 +04:00
self . _lp . set ( ' debug level ' , str ( arg ) )
2017-04-12 03:34:49 +03:00
parser . values . debuglevel = int ( arg )
2010-04-21 05:33:43 +04:00
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 :
2011-10-19 03:30:40 +04:00
raise optparse . OptionValueError (
" --option option takes a ' a=b ' argument " )
2010-04-21 05:33:43 +04:00
a = arg . split ( ' = ' )
2011-10-17 23:31:30 +04:00
try :
self . _lp . set ( a [ 0 ] , a [ 1 ] )
2017-01-17 13:03:17 +03:00
except Exception as e :
2011-10-19 03:30:40 +04:00
raise optparse . OptionValueError (
" invalid --option option value %r : %s " % ( arg , e ) )
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-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 " )
2012-10-08 14:50:52 +04:00
self . add_option ( " -V " , " --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
2017-01-17 13:03:17 +03:00
print ( samba . version )
2010-04-09 04:30:48 +04:00
sys . exit ( 0 )
2007-11-21 15:07:16 +03:00
2011-10-17 23:34:47 +04:00
def parse_kerberos_arg ( arg , opt_str ) :
2011-10-13 01:45:52 +04:00
if arg . lower ( ) in [ " yes " , ' true ' , ' 1 ' ] :
return MUST_USE_KERBEROS
elif arg . lower ( ) in [ " no " , ' false ' , ' 0 ' ] :
return DONT_USE_KERBEROS
elif arg . lower ( ) in [ " auto " ] :
return AUTO_USE_KERBEROS
else :
2011-10-17 23:34:47 +04:00
raise optparse . OptionValueError ( " invalid %s option value: %s " %
( opt_str , arg ) )
2011-10-13 01:45:52 +04:00
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. """
2011-10-13 01:45:52 +04:00
2015-01-28 00:45:47 +03:00
def __init__ ( self , parser , special_name = None ) :
self . special_name = special_name
if special_name is not None :
self . section = " Credentials Options ( %s ) " % special_name
else :
self . section = " Credentials Options "
2015-02-26 02:23:55 +03:00
self . ask_for_password = True
2010-09-24 06:51:36 +04:00
self . ipaddress = None
2015-02-26 02:23:55 +03:00
self . machine_pass = False
2015-01-28 00:45:47 +03:00
optparse . OptionGroup . __init__ ( self , parser , self . section )
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 " )
2015-01-28 00:45:47 +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 )
2015-01-28 00:45:47 +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 )
2015-01-28 00:45:47 +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 )
2015-01-28 00:45:47 +03:00
self . _add_option ( " -N " , " --no-pass " , action = " callback " ,
2015-02-26 02:23:55 +03:00
help = " Don ' t ask for a password " ,
callback = self . _set_no_password )
2015-01-28 00:45:47 +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 )
2015-01-28 00:45:47 +03:00
self . _add_option ( " " , " --ipaddress " , metavar = " IPADDRESS " ,
2010-09-24 06:51:36 +04:00
action = " callback " , type = str ,
2011-09-13 03:27:50 +04:00
help = " IP address of server " ,
callback = self . _set_ipaddress )
2015-01-28 00:45:47 +03:00
self . _add_option ( " -P " , " --machine-pass " ,
2015-02-26 02:23:55 +03:00
action = " callback " ,
help = " Use stored machine account password " ,
callback = self . _set_machine_pass )
2017-07-06 05:52:39 +03:00
self . _add_option ( " --krb5-ccache " , metavar = " KRB5CCNAME " ,
action = " callback " , type = str ,
help = " Kerberos Credentials cache " ,
callback = self . _set_krb5_ccache )
2007-12-28 08:31:42 +03:00
self . creds = Credentials ( )
2015-01-28 00:45:47 +03:00
def _add_option ( self , * args1 , * * kwargs ) :
if self . special_name is None :
return self . add_option ( * args1 , * * kwargs )
args2 = ( )
for a in args1 :
if not a . startswith ( " -- " ) :
continue
args2 + = ( a . replace ( " -- " , " -- %s - " % self . special_name ) , )
self . add_option ( * args2 , * * kwargs )
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 )
2015-02-26 02:23:55 +03:00
self . machine_pass = False
2007-12-28 08:31:42 +03:00
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 )
2015-02-26 02:23:55 +03:00
self . ask_for_password = False
self . machine_pass = False
def _set_no_password ( self , option , opt_str , arg , parser ) :
self . ask_for_password = False
def _set_machine_pass ( self , option , opt_str , arg , parser ) :
self . machine_pass = True
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 ) :
2011-10-17 23:34:47 +04:00
self . creds . set_kerberos_state ( parse_kerberos_arg ( arg , opt_str ) )
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
2017-07-06 05:52:39 +03:00
def _set_krb5_ccache ( self , option , opt_str , arg , parser ) :
self . creds . set_named_ccache ( arg )
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 )
2015-02-26 02:23:55 +03:00
if self . machine_pass :
self . creds . set_machine_account ( lp )
elif self . ask_for_password :
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. """
2011-10-13 01:45:52 +04:00
2010-01-13 11:41:56 +03:00
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 ) :
2011-10-17 23:34:47 +04:00
self . creds2 . set_kerberos_state ( parse_kerberos_arg ( arg , opt_str ) )
2010-01-13 11:41:56 +03:00
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 ( ) :
2011-10-13 01:45:52 +04:00
self . creds2 . set_anonymous ( )
2010-10-01 04:29:33 +04:00
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