Check pager's executable before subprocess.Popen

Get the value of `PAGER` environment variable in case it's defined, check the executable, if it exists - use a pager, otherwise - print function.

Fixes: https://pagure.io/freeipa/issue/7746
Reviewed-By: Christian Heimes <cheimes@redhat.com>
Reviewed-By: Rob Crittenden <rcritten@redhat.com>
This commit is contained in:
Oleg Kozlov 2018-12-05 14:54:29 +01:00
parent 03edd82d1a
commit a0e09526b3
3 changed files with 43 additions and 5 deletions

View File

@ -49,7 +49,7 @@ import six
from six.moves import input
from ipalib.util import (
check_client_configuration, get_terminal_height, open_in_pager
check_client_configuration, get_pager, get_terminal_height, open_in_pager
)
if six.PY3:
@ -721,9 +721,11 @@ class help(frontend.Local):
self.buffer.append(unicode(string))
def write(self):
if self.buffer_length > get_terminal_height():
pager = get_pager()
if pager and self.buffer_length > get_terminal_height():
data = "\n".join(self.buffer).encode("utf-8")
open_in_pager(data)
open_in_pager(data, pager)
else:
try:
for line in self.buffer:

View File

@ -37,6 +37,7 @@ import sys
import ssl
import termios
import fcntl
import shutil
import struct
import subprocess
@ -1203,17 +1204,27 @@ def get_terminal_height(fd=1):
return os.environ.get("LINES", 25)
def open_in_pager(data):
def get_pager():
""" Get path to a pager
:return: path to the file if it exists otherwise None
:rtype: str or None
"""
pager = os.environ.get('PAGER', 'less')
return shutil.which(pager)
def open_in_pager(data, pager):
"""
Open text data in pager
Args:
data (bytes): data to view in pager
pager (str): path to the pager
Returns:
None
"""
pager = os.environ.get("PAGER", "less")
pager_process = subprocess.Popen([pager], stdin=subprocess.PIPE)
try:

View File

@ -0,0 +1,25 @@
#
# Copyright (C) 2018 FreeIPA Contributors see COPYING for license
#
"""Tests for ipalib.util module
"""
import os
from unittest import mock
import pytest
from ipalib.util import get_pager
@pytest.mark.parametrize('pager,expected_result', [
# Valid values
('cat', '/usr/bin/cat'),
('/usr/bin/cat', '/usr/bin/cat'),
# Invalid values (wrong command, package is not installed, etc)
('cat_', None),
('', None)
])
def test_get_pager(pager, expected_result):
with mock.patch.dict(os.environ, {'PAGER': pager}):
assert get_pager() == expected_result