[Freeipa-devel] [PATCH] 0748 Handle encoding for ipautil.run

Jan Cholasta jcholast at redhat.com
Mon Dec 14 09:29:07 UTC 2015


On 9.12.2015 12:04, Petr Viktorin wrote:
> On 12/04/2015 12:49 PM, Jan Cholasta wrote:
>> On 4.12.2015 12:43, Petr Viktorin wrote:
>>> On 12/04/2015 12:15 PM, Jan Cholasta wrote:
>>>> On 4.12.2015 10:53, Petr Viktorin wrote:
>>>>> On 12/04/2015 08:51 AM, Jan Cholasta wrote:
>>>>>> On 3.12.2015 15:42, Petr Viktorin wrote:
>>>>>>> On 12/03/2015 10:55 AM, Jan Cholasta wrote:
>>> [...]
>>>>>>>> If we do encode/decode in run(), I think there should be a way to
>>>>>>>> override the default encoding. My idea was to either accept/return
>>>>>>>> only
>>>>>>>> bytes and let the caller handle encoding themselves, or to handle
>>>>>>>> encoding in run(), but be able to override the defaults.
>>>>>>>>
>>>>>>>> Given we handle encoding in run(), I would imagine it like this:
>>>>>>>>
>>>>>>>>         def run(args, stdin=None, raiseonerr=True, nolog=(),
>>>>>>>> env=None,
>>>>>>>>                 capture_stdout=False, skip_output=False, cwd=None,
>>>>>>>>                 runas=None, timeout=None, suplementary_groups=[],
>>>>>>>>                 capture_stderr=False, encode_stdout=False,
>>>>>>>>                 encode_stderr=False, encoding=None):
>>>>>>>>
>>>>>>>> i.e. nothing is captured by default, when stdout or stderr are
>>>>>>>> captured
>>>>>>>> they are returned as bytes by default, when stdout or stderr are
>>>>>>>> returned as text they are decoded using the locale encoding by
>>>>>>>> default,
>>>>>>>> or the encoding can be explicitly specified.
>>>>>>>>
>>>>>>>> Do you think this is feasible?
>>>>>>>
>>>>>>> Feasible, yes.
>>>>>>> In the majority of cases where the output is needed, we want text
>>>>>>> encoded with locale.getpreferredencoding(), so I'd rather make
>>>>>>> that the
>>>>>>> default rather than bytes.
>>>>>>>
>>>>>>> Or we could make "encode_stdout" imply "capture_stdout", so you
>>>>>>> wouldn't
>>>>>>> have to always specify both. (It would be better named
>>>>>>> "encoded_stdout"
>>>>>>> in that case.)
>>>>>>
>>>>>> I think it should be OK to decode by default. (IMO it would be best to
>>>>>> reverse the logic and name it "raw_stdout", with False default. Do we
>>>>>> need "raw_stderr" at all? I don't think we do.)
>>>>>
>>>>> Actually, now that I think about it: if the result was a namedtuple
>>>>> subclass, we can always set extra raw_stdout/raw_stderr attributes on
>>>>> it. (Unless skip_output=True, of course.)
>>>>>
>>>>>       result = run(['generate_binary_data'])
>>>>>       use(result.raw_stdout)
>>>>>
>>>>>       # and for backcompat,
>>>>>       rc, _out, _err = result
>>>>
>>>> Good idea.
>>>>
>>>> Perhaps we should use the same names as CalledProcessError for the
>>>> attributes, i.e. "returncode", "output", and "error_output",
>>>> "raw_output", "raw_error_output" for the new attributes?
>>
>> (Actually, since "returncode" is not "return_code", it should probably
>> be "returncode", "output", "erroroutput", "raw_output", "raw_erroroutput".)
>>
>>>
>>> OK. It's also good to use different names than Popen's stdout/stderr,
>>> which are file-like objects rather than strings. But then,
>>> capture_stdout/capture_stderr should be
>>> capture_output/capture_error_output.
>
> Here is the new patch.
> I also added output_log and error_log to the result to abstract the
> following common pattern:
>
>      result = run([...])
>      if result.returncode != 0:
>          stderr = result.error_output
>          if six.PY3:
>              error = stderr.encode(locale.getpreferredencoding(), 'replace')
>          self.log.critical('...: %s', stderr)

1) certutil -L -r outputs raw DER cert, so this will explode in Python 3 
when pem == False:

          else:
              args.append('-r')
          try:
-            cert, err, returncode = self.run_certutil(args)
+            result = self.run_certutil(args, capture_output=True)
          except ipautil.CalledProcessError:
              raise RuntimeError("Failed to get %s" % nickname)
-        return cert
+        return result.output

      def has_nickname(self, nickname):
          try:


2) There are some PEP8 transgressions:

$ git show -U0 | pep8 --diff
./ipaplatform/base/services.py:297:22: E127 continuation line 
over-indented for visual indent
./ipapython/ipautil.py:279:1: E302 expected 2 blank lines, found 1
./ipapython/ipautil.py:280:40: E128 continuation line under-indented for 
visual indent
./ipapython/ipautil.py:283:1: E302 expected 2 blank lines, found 1
./ipapython/ipautil.py:330:80: E501 line too long (80 > 79 characters)
./ipapython/ipautil.py:437:43: E127 continuation line over-indented for 
visual indent
./ipapython/ipautil.py:442:43: E127 continuation line over-indented for 
visual indent
./ipapython/kernel_keyring.py:57:11: E225 missing whitespace around operator
./ipaserver/install/cainstance.py:626:80: E501 line too long (80 > 79 
characters)
./ipaserver/install/ipa_backup.py:498:17: E128 continuation line 
under-indented for visual indent
./ipaserver/install/ipa_backup.py:521:21: E122 continuation line missing 
indentation or outdented
./ipaserver/install/ipa_backup.py:530:17: E122 continuation line missing 
indentation or outdented
./ipaserver/install/ipa_backup.py:605:52: E225 missing whitespace around 
operator
./ipaserver/install/ipa_backup.py:606:17: E122 continuation line missing 
indentation or outdented
./ipaserver/install/krbinstance.py:303:80: E501 line too long (84 > 79 
characters)
./ipatests/test_ipapython/test_keyring.py:97:33: E222 multiple spaces 
after operator


3) The patch needs a rebase.


I took the liberty of fixing all of the above, see the attached patch.

ACK from me. If you are OK with the changes, I will push the patch.

-- 
Jan Cholasta
-------------- next part --------------
A non-text attachment was scrubbed...
Name: freeipa-pviktori-0748.5-Refactor-ipautil.run.patch
Type: text/x-patch
Size: 69718 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/freeipa-devel/attachments/20151214/2de28e7d/attachment.bin>


More information about the Freeipa-devel mailing list