Keith,
Thanks again. Still learning stuff about Python from you.
I've implemented the suggestions and updated the webrev:
http://cr.opensolaris.org/~johnfisc/13123-tftpboot
Thanks,
John
Keith Mitchell wrote:
> Hi John,
>
> I have some additional comments based on the updated webrev and now that
> I have a better understanding of what this code is doing.
>
> 898: Nit: shell defaults to False, so it's not strictly necessary to
> pass in this parameter, though it doesn't hurt.
>
> 901: For readability, can we call this variable something like "output"?
> Or, even better, assign to two separate variables, such as: "stdout,
> stderr = pipe.communicate()"
>
> 909: To simplify this line, and conform to general PEP 8 guidelines,
> this can be replaced with "if tup[1]:" (or "if stderr:" if following my
> above recommended name change)
>
> 916-924: I think this could be simplified to be more 'self-reading':
>
> svcprop_out = stdout.partition(" -s ") # This returns a tuple of length
> 3, splitting the output around the " -s "
> basedir = svcprop_out[2].rstrip("\n")
> if not basedir: # In case the result was empty
> basedir = defaultbasedir
>
> (Additional advantage of using the 'partition' function - even if stdout
> doesn't have a " -s " anywhere in it (unlike 'split' which returns a
> variable length tuple. However, if there's worry about the " -s "
> appearing earlier, for example in the tftpd command somehow, 'split'
> could be used, and then the length of the resulting tuple examined
> before taking the last item in the tuple as the basedir.)
>
> Thanks!
> - Keith
>
>
> John Fischer wrote:
>> Keith,
>>
>> Thanks for the review.
>>
>> I missed the comment on Pipe.wait():
>>
>> This will deadlock if the child process generates enough
>> output to a stdout or stderr pipe such that it blocks waiting
>> for the OS pipe buffer to accept more data. Use communicate()
>> to avoid that.
>>
>> The output from the svcprop command is either (stdout):
>>
>> /usr/sbin/in.tftpd -s /tftpboot
>>
>> Or (stderr):
>>
>> svcprop: Pattern 'tftp/udp6' doesn't match any entities
>>
>> Or (stderr);
>>
>> svcprop: Couldn't find property group 'inetd_start/exec' for
>> instance 'tftp/udp6'.
>>
>> communicate returns a tuple of (stdout, stderr) where as
>> the read returns a string or -1. The values within the tuple
>> are both strings. The strings (for communicate and read) are
>> identical so the processing would be/is similar. I'll use
>> communicate.
>>
>> I have updated the webrev.
>>
>> http://cr.opensolaris.org/~johnfisc/13123-tftpboot
>>
>> Thanks,
>>
>> John
>>
>>
>>
>> On 01/26/10 11:57 AM, Keith Mitchell wrote:
>>> Hi John,
>>>
>>> I have a few comments about the code. Looks like everything does what's
>>> needed, but I have some suggestions and thoughts for making the final
>>> function more legible.
>>>
>>> installadm_common.py:
>>>
>>> 867: Nit: Despite Pylint's complaints to the contrary, it is acceptable
>>> (and expected) by PEP 8 standards to capitalize acronyms (in this case,
>>> TFTP) for readability purposes. It's completely up to you if you want to
>>> change it, however.
>>
>> OK. Makes for less changes. ;-)
>>
>>> 888: For commands with low amounts of output (i.e., output which would
>>> all fit within memory for all reasonable scenarios), use of the
>>> 'communicate()' function of the subprocess.Popen object generally leads
>>> to cleaner, simpler and more legible code. I can provide an example if
>>> you'd like.
>>
>> I will use communicate instead.
>>
>>> 888: stderr isn't redirected, which means the file descriptor will be
>>> inherited from this process. Is that intended?
>>
>> Will redirect the stderr output so that we can echo out the error with
>> something more understandable.
>>
>>> 892-901: What exactly is this code doing? That is, what's the expected
>>> output from svcprop that is being parsed? I suspect there's a better way
>>> to parse this output in Python that lends itself to more legibility (and
>>> if not, comments would help)
>>
>> Will comment.
>>
>>> 867-904: There doesn't appear to be any exception handling here - what
>>> happens if the Popen(...) or wait() calls fail?
>>
>> Will wrap around popen and communicate.
>>
>>> Thanks,
>>> Keith
>>>
>>> John Fischer wrote:
>>>> All,
>>>>
>>>> Can I get a couple of folks to look at the webrev:
>>>>
>>>> http://cr.opensolaris.org/~johnfisc/13123-tftpboot
>>>>
>>>> for:
>>>>
>>>> 13123 installadm needs to reference SMF for tftp's
>>>> base directory, not inetd.conf
>>>>
>>>> http://defect.opensolaris.org/bz/show_bug.cgi?id=13123
>>>>
>>>> The fix is to use /usr/bin/svcprop to get the entry from SMF
>>>> via a pipe. If there is a problem then it falls back to /tftpboot.
>>>>
>>>> I've tested it with installadm list and installadm delete-service
>>>> which are the consumers of the interface.
>>>>
>>>> Thanks,
>>>>
>>>> John
>>>> _______________________________________________
>>>> caiman-discuss mailing list
>>>> caiman-discuss at opensolaris.org
>>>> http://mail.opensolaris.org/mailman/listinfo/caiman-discuss