This file is indexed.

/usr/lib/python3/dist-packages/glances/plugins/glances_alert.py is in glances 2.7.1.1-2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# -*- coding: utf-8 -*-
#
# This file is part of Glances.
#
# Copyright (C) 2015 Nicolargo <nicolas@nicolargo.com>
#
# Glances is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Glances is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.

"""Alert plugin."""

from datetime import datetime

from glances.logs import glances_logs
from glances.plugins.glances_plugin import GlancesPlugin


class Plugin(GlancesPlugin):

    """Glances alert plugin.

    Only for display.
    """

    def __init__(self, args=None):
        """Init the plugin."""
        super(Plugin, self).__init__(args=args)

        # We want to display the stat in the curse interface
        self.display_curse = True

        # Set the message position
        self.align = 'bottom'

        # Init the stats
        self.reset()

    def reset(self):
        """Reset/init the stats."""
        self.stats = []

    def update(self):
        """Nothing to do here. Just return the global glances_log."""
        # Set the stats to the glances_logs
        self.stats = glances_logs.get()

    def msg_curse(self, args=None):
        """Return the dict to display in the curse interface."""
        # Init the return message
        ret = []

        # Only process if display plugin enable...
        if args.disable_log:
            return ret

        # Build the string message
        # Header
        if not self.stats:
            msg = 'No warning or critical alert detected'
            ret.append(self.curse_add_line(msg, "TITLE"))
        else:
            # Header
            msg = 'Warning or critical alerts'
            ret.append(self.curse_add_line(msg, "TITLE"))
            logs_len = glances_logs.len()
            if logs_len > 1:
                msg = ' (last {} entries)'.format(logs_len)
            else:
                msg = ' (one entry)'
            ret.append(self.curse_add_line(msg, "TITLE"))
            # Loop over alerts
            for alert in self.stats:
                # New line
                ret.append(self.curse_new_line())
                # Start
                msg = str(datetime.fromtimestamp(alert[0]))
                ret.append(self.curse_add_line(msg))
                # Duration
                if alert[1] > 0:
                    # If finished display duration
                    msg = ' ({})'.format(datetime.fromtimestamp(alert[1]) -
                                         datetime.fromtimestamp(alert[0]))
                else:
                    msg = ' (ongoing)'
                ret.append(self.curse_add_line(msg))
                ret.append(self.curse_add_line(" - "))
                # Infos
                if alert[1] > 0:
                    # If finished do not display status
                    msg = '{} on {}'.format(alert[2], alert[3])
                    ret.append(self.curse_add_line(msg))
                else:
                    msg = str(alert[3])
                    ret.append(self.curse_add_line(msg, decoration=alert[2]))
                # Min / Mean / Max
                if self.approx_equal(alert[6], alert[4], tolerance=0.1):
                    msg = ' ({:.1f})'.format(alert[5])
                else:
                    msg = ' (Min:{:.1f} Mean:{:.1f} Max:{:.1f})'.format(
                        alert[6], alert[5], alert[4])
                ret.append(self.curse_add_line(msg))
                # Top processes
                top_process = ', '.join([p['name'] for p in alert[9]])
                if top_process != '':
                    msg = ': {}'.format(top_process)
                    ret.append(self.curse_add_line(msg))

        return ret

    def approx_equal(self, a, b, tolerance=0.0):
        """Compare a with b using the tolerance (if numerical)."""
        if str(int(a)).isdigit() and str(int(b)).isdigit():
            return abs(a - b) <= max(abs(a), abs(b)) * tolerance
        else:
            return a == b