Using Negate with check_ncpa.py error after 5.7 Upgrade

This support forum board is for support questions relating to Nagios XI, our flagship commercial network monitoring solution.
Locked
shoreypu
Posts: 134
Joined: Wed Mar 13, 2019 2:06 pm

Using Negate with check_ncpa.py error after 5.7 Upgrade

Post by shoreypu »

I upgraded Nagios XI to version 5.7.5 this morning and I'm running a negate check that is now reporting the following error:
File "/usr/local/nagios/libexec/check_ncpa.py", line 353, in <module>
print(stdout.encode('utf-8', 'replace').decode('utf-8'))
UnicodeEncodeError: 'ascii' codec can't encode character u'\\u2019' in position 220: ordinal not in range(128)

Here is the command:
$USER1$/negate -u OK -o WARNING -s $USER1$/check_ncpa.py -H SELENIUM_HOST -t "$_HOSTNCPA_TOKEN$" -P $_HOSTNCPA_PORT$ -M 'plugins/p3ui' -a "fed 'config/iam-cas.json' --starturl 'https://$HOSTNAME$' --logname $USER13$ --password '$USER12$'"

To summarize, Nagios XI is calling a Selenium check (via NCPA) that is running from our Selenium server and reporting the results back to Nagios XI. In this case, the check is attempting to run against a failover system, so by default, the result would be unknown, so we change that result using negate so that the Unknown reports as OK.

The upgrade was installed via command line as root using the manual download instructions in https://assets.nagios.com/downloads/nag ... ctions.pdf

Also, from /var/log/yum.log
Jan 05 06:24:06 Installed: perl-TermReadKey-2.30-20.el7.x86_64
Jan 05 06:24:06 Installed: perl-Git-1.8.3.1-23.el7_8.noarch
Jan 05 06:24:07 Installed: git-1.8.3.1-23.el7_8.x86_64
Jan 05 06:24:07 Updated: nagiosxi-deps-el7-5.7.5-1.noarch

Any assistance is greatly appreciated.
User avatar
vtrac
Posts: 903
Joined: Tue Oct 27, 2020 1:35 pm

Re: Using Negate with check_ncpa.py error after 5.7 Upgrade

Post by vtrac »

Hi shoreypu,
Sorry, but I need to ask you a few questions so that I can understand the situation better ... :-)
Did you upgrade your OS and python?
What is your OS and Python version now?
Did you move to a new server with a new name?
Were this check_ncpa.py command works before the upgrade?

Line 353 in check_ncpa.py is:

Code: Select all

print(stdout.encode('utf-8', 'replace').decode('utf-8'))
Based on the error provide, it can't encode character u'\\u2019' in position 220.
The "\u2019" is the "RIGHT SINGLE QUOTATION MARK" in the "stdout" returned from the "main()" function.

Here is the "main()" function called by line 353 (below):

Code: Select all

    312 def main():
    313     options = parse_args()
    314
    315     # We need to ensure that we will only execute for a certain amount of
    316     # seconds.
    317     signal.signal(signal.SIGALRM, timeout_handler(options.timeout))
    318     signal.alarm(options.timeout)
    319
    320     try:
    321         if options.version:
    322             stdout = 'The version of this plugin is %s' % __VERSION__
    323             return stdout, 0
    324
    325         info_json = get_json(options)
    326
    327         if options.list:
    328             return show_list(info_json)
    329         else:
    330             stdout, returncode = run_check(info_json)
    331
    332             if options.performance and stdout.find("|") == -1:
    333                 stdout = "{0} | 'status'={1};1;2;;".format(stdout, returncode)
    334             return stdout, returncode
    335     except (HTTPError, URLError) as e:
    336         if options.debug:
    337             return 'The stack trace:\n' + traceback.format_exc(), 3
    338         elif options.verbose:
    339             return 'An error occurred:\n' + str(e.error_message), 3
    340         else:
    341             return e.error_message, 3
    342     except Exception as e:
    343         if options.debug:
    344             return 'The stack trace:\n' + traceback.format_exc(), 3
    345         elif options.verbose:
    346             return 'An error occurred:\n' + str(e), 3
    347         else:
    348             return 'UNKNOWN: Error occurred while running the plugin. Use the verbose flag for more details.', 3
    349
    350
    351 if __name__ == "__main__":
    352     stdout, returncode = main()
    353     print(stdout.encode('utf-8', 'replace').decode('utf-8'))
    354     sys.exit(returncode)
Can you please add the below line above line 353 in the check_ncpa.py script?
I would like to know what is returning from the "main()" function and the position 220.

Code: Select all

print(stdout)
Once you have added the print statement above, please manually run the below command on your Nagios XI command line (xterm) and update the results:

Code: Select all

cd /usr/local/nagios/libexec
./check_ncpa.py -H SELENIUM_HOST -t "$_HOSTNCPA_TOKEN$" -P $_HOSTNCPA_PORT$ -M 'plugins/p3ui' -a "fed 'config/iam-cas.json' --starturl 'https://$HOSTNAME$' --logname $USER13$ --password '$USER12$'
Regards,
Vinh
shoreypu
Posts: 134
Joined: Wed Mar 13, 2019 2:06 pm

Re: Using Negate with check_ncpa.py error after 5.7 Upgrade

Post by shoreypu »

Vinh,

Did you upgrade your OS and python?
- No, we only upgraded Nagios XI
What is your OS and Python version now?
- Python Version is 2.7.5. OS is Oracle Linux Server release 7.9
Did you move to a new server with a new name?
- No
Were this check_ncpa.py command works before the upgrade?
- Yes

Here is the output after modifying (a copy of) check_ncpa.py:
Error output from command:
Traceback (most recent call last):
File "/usr/local/nagios/libexec/check_ncpa_test.py", line 353, in <module>
print(stdout)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 220: ordinal not in range(128)
User avatar
vtrac
Posts: 903
Joined: Tue Oct 27, 2020 1:35 pm

Re: Using Negate with check_ncpa.py error after 5.7 Upgrade

Post by vtrac »

Hi shoreypu,
Could you please try commented out the original line (353), then add the below line:

Code: Select all

print(stdout.encode('ascii', 'replace').decode('utf-8'))
Here's an example:

Code: Select all

if __name__ == "__main__":
    stdout, returncode = main()
    print(stdout.encode('ascii', 'replace').decode('utf-8'))
    #print(stdout.encode('utf-8', 'replace').decode('utf-8'))
    sys.exit(returncode)
Regards,
Vinh
User avatar
vtrac
Posts: 903
Joined: Tue Oct 27, 2020 1:35 pm

Re: Using Negate with check_ncpa.py error after 5.7 Upgrade

Post by vtrac »

Hi shoreypu,
Just got a message from one of my teammate that said our developers will update the fix as follows:

Code: Select all

    if sys.version_info[0] < 3:
        print(unicode(stdout).encode('utf-8'))
    else:
        print(stdout.encode().decode('utf-8'))
So, could you please update your "check_ncpa.py" as below:

Code: Select all

if __name__ == "__main__":
    stdout, returncode = main()
    if sys.version_info[0] < 3:
        print(unicode(stdout).encode('utf-8'))
    else:
        print(stdout.encode().decode('utf-8'))
    sys.exit(returncode)
Best Regards,
Vinh
shoreypu
Posts: 134
Joined: Wed Mar 13, 2019 2:06 pm

Re: Using Negate with check_ncpa.py error after 5.7 Upgrade

Post by shoreypu »

Updating the check_ncpa.py with the code you provided resolved our issue.

This topic can be closed. Thanks.
scottwilkerson
DevOps Engineer
Posts: 19396
Joined: Tue Nov 15, 2011 3:11 pm
Location: Nagios Enterprises
Contact:

Re: Using Negate with check_ncpa.py error after 5.7 Upgrade

Post by scottwilkerson »

shoreypu wrote:Updating the check_ncpa.py with the code you provided resolved our issue.

This topic can be closed. Thanks.
Locking thread
Former Nagios employee
Creator:
Human Design Website
Get Your Human Design Chart
Locked