Decode script arguments using file system encoding

This mimics Python 3's behavior, where sys.argv is automatically decoded
using file system encoding, as returned by sys.getfilesystemencoding(). This
includes reimplementation of os.fsdecode() from Python 3.

Reviewed-By: Petr Viktorin <pviktori@redhat.com>
This commit is contained in:
Jan Cholasta 2015-08-31 09:08:38 +02:00
parent cf9bf9dcaf
commit cc53526fd2
5 changed files with 23 additions and 4 deletions

View File

@ -63,7 +63,7 @@ if len(args) != 1:
# LSB status code 2: invalid or excess argument(s)
raise ScriptError("You must specify trusted domain name", 2)
trusted_domain = unicode(args[0].lower())
trusted_domain = ipautil.fsdecode(args[0]).lower()
env = Env()
env._bootstrap(context='server', debug=options.debug, log=None)

View File

@ -707,7 +707,7 @@ def del_master_managed(realm, hostname, options):
Removing of master in managed_topology
"""
hostname_u = unicode(hostname)
hostname_u = ipautil.fsdecode(hostname)
if hostname == options.host:
print("Can't remove itself: %s" % (options.host))
sys.exit(1)

View File

@ -447,7 +447,7 @@ def main():
# Use the RPC directly so older servers are supported
result = api.Backend.rpcclient.forward(
'automountlocation_show',
unicode(options.location),
ipautil.fsdecode(options.location),
version=u'2.0',
)
except errors.VersionError as e:

View File

@ -1811,7 +1811,7 @@ def update_ssh_keys(server, hostname, ssh_dir, create_sshfp):
# Use the RPC directly so older servers are supported
api.Backend.rpcclient.forward(
'host_mod',
unicode(hostname),
ipautil.fsdecode(hostname),
ipasshpubkey=[pk.openssh() for pk in pubkeys],
updatedns=False,
version=u'2.26', # this version adds support for SSH public keys

View File

@ -1352,3 +1352,22 @@ def private_ccache(path=None):
if os.path.exists(path):
os.remove(path)
if six.PY2:
def fsdecode(value):
"""
Decode argument using the file system encoding, as returned by
`sys.getfilesystemencoding()`.
"""
if isinstance(value, six.binary_type):
return value.decode(sys.getfilesystemencoding())
elif isinstance(value, six.text_type):
return value
else:
raise TypeError("expect {0} or {1}, not {2}".format(
six.binary_type.__name__,
six.text_type.__name__,
type(value).__name__))
else:
fsdecode = os.fsdecode #pylint: disable=no-member