sarugaku / shellingham

Tool to Detect Surrounding Shell

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Solaris failures from pipenv

philkav opened this issue · comments

Hi, I've hit an issue on Solaris 11.4 when trying to invoke a shell using pipenv version 2018.11.26 (python3.7)

Similar to:
detect_shell fails on IBM i / AIX #21

The messages I would see were like so:

host# pipenv shell
Traceback (most recent call last):
  File "/usr/local/bin/pipenv", line 6, in <module>
    from pipenv import cli
  File "/usr/local/lib/python3.7/site-packages/pipenv/__init__.py", line 47, in <module>
    from .cli import cli
  File "/usr/local/lib/python3.7/site-packages/pipenv/cli/__init__.py", line 3, in <module>
    from .command import cli
  File "/usr/local/lib/python3.7/site-packages/pipenv/cli/command.py", line 7, in <module>
    import crayons
  File "/usr/local/lib/python3.7/site-packages/pipenv/patched/crayons.py", line 49, in <module>
    is_powershell = "powershell" in shellingham.detect_shell()[0]
  File "/usr/local/lib/python3.7/site-packages/pipenv/vendor/shellingham/__init__.py", line 22, in detect_shell
    shell = get_shell(pid, max_depth=max_depth)
  File "/usr/local/lib/python3.7/site-packages/pipenv/vendor/shellingham/posix/__init__.py", line 54, in get_shell
    mapping = _get_process_mapping()
  File "/usr/local/lib/python3.7/site-packages/pipenv/vendor/shellingham/posix/__init__.py", line 15, in _get_process_mapping
    mapping = impl.get_process_mapping()
  File "/usr/local/lib/python3.7/site-packages/pipenv/vendor/shellingham/posix/proc.py", line 64, in get_process_mapping
    tty, ppid = _get_stat(pid, stat_name)
  File "/usr/local/lib/python3.7/site-packages/pipenv/vendor/shellingham/posix/proc.py", line 36, in _get_stat
    return parts[STAT_TTY], parts[STAT_PPID]
IndexError: list index out of range

The real issue here is that when shellingham tries to split the data it reads from /proc/PID/status, it fails, because the formatting is not as it expected.

In order to get around this, I modified posix/proc.py like so:

--- proc.py     Mon Sep  9 17:31:45 2019
+++ /usr/local/lib/python3.7/site-packages/pipenv/vendor/shellingham/posix/proc.py      Mon Sep  9 17:25:12 2019
@@ -4,6 +4,7 @@
 import sys
 
 from ._core import Process
+from .._core import ShellDetectionFailure
 
 
 STAT_PPID = 3
@@ -33,7 +34,10 @@
     with io.open(path, encoding='ascii', errors='replace') as f:
         # We only care about TTY and PPID -- all numbers.
         parts = STAT_PATTERN.findall(f.read())
-        return parts[STAT_TTY], parts[STAT_PPID]
+        try:
+            return parts[STAT_TTY], parts[STAT_PPID]
+        except IndexError:
+            raise ShellDetectionFailure
 

This solved the failures on my end.

Perhaps this is already fixed by 'Switch to parse 'ps wwl' for better compatibility #23'.
I can test this if necessary.

Is there documentation what format Solaris uses for its proc? And more importantly, why is it in a different format? Is it following a different spec?

Yes, the documentation for the format of proc(4) can be found here:
https://docs.oracle.com/cd/E19455-01/816-3327/6m9k7qvih/index.html#psinfo

It appears that /proc/pid/psinfo would be the right place to get the tty and ppid.

I've seen an implementation of this in python here:
https://github.com/oracle/solaris-ips/blob/master/src/modules/misc.py#L813

I'm not sure about the reasoning for the formatting/spec

Might be easier to get this info from 'ps'

commented

I just ran into this too on SmartOS (Solaris...). I guess pipenv is a NOOP for me now because of this unless I do that hack above.

@anilj If Pipenv is your main concern Id suggest filing a PR to catch this error at the call site.