Checks whether Pylint detects incorrect use of len(sequence) inside conditions.
1 | # -*- coding: utf-8 -*- |
||
2 | # |
||
3 | # This file is part of Glances. |
||
4 | # |
||
5 | # Copyright (C) 2019 Nicolargo <[email protected]> |
||
6 | # |
||
7 | # Glances is free software; you can redistribute it and/or modify |
||
8 | # it under the terms of the GNU Lesser General Public License as published by |
||
9 | # the Free Software Foundation, either version 3 of the License, or |
||
10 | # (at your option) any later version. |
||
11 | # |
||
12 | # Glances is distributed in the hope that it will be useful, |
||
13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
15 | # GNU Lesser General Public License for more details. |
||
16 | # |
||
17 | # You should have received a copy of the GNU Lesser General Public License |
||
18 | # along with this program. If not, see <http://www.gnu.org/licenses/>. |
||
19 | |||
20 | """Manage the folder list.""" |
||
21 | from __future__ import unicode_literals |
||
22 | |||
23 | import os |
||
24 | |||
25 | from glances.timer import Timer |
||
26 | from glances.compat import range, nativestr |
||
27 | from glances.logger import logger |
||
28 | |||
29 | # Use the built-in version of scandir/walk if possible, otherwise |
||
30 | # use the scandir module version |
||
31 | scandir_tag = True |
||
32 | try: |
||
33 | # For Python 3.5 or higher |
||
34 | from os import scandir |
||
35 | except ImportError: |
||
36 | # For others... |
||
37 | try: |
||
38 | from scandir import scandir |
||
39 | except ImportError: |
||
40 | scandir_tag = False |
||
41 | |||
42 | |||
43 | class FolderList(object): |
||
44 | |||
45 | """This class describes the optional monitored folder list. |
||
46 | |||
47 | The folder list is a list of 'important' folder to monitor. |
||
48 | |||
49 | The list (Python list) is composed of items (Python dict). |
||
50 | An item is defined (dict keys): |
||
51 | * path: Path to the folder |
||
52 | * careful: optional careful threshold (in MB) |
||
53 | * warning: optional warning threshold (in MB) |
||
54 | * critical: optional critical threshold (in MB) |
||
55 | """ |
||
56 | |||
57 | # Maximum number of items in the list |
||
58 | __folder_list_max_size = 10 |
||
59 | # The folder list |
||
60 | __folder_list = [] |
||
61 | # Default refresh time is 30 seconds for this plugins |
||
62 | __default_refresh = 30 |
||
63 | |||
64 | def __init__(self, config): |
||
65 | """Init the folder list from the configuration file, if it exists.""" |
||
66 | self.config = config |
||
67 | |||
68 | # A list of Timer |
||
69 | # One timer per folder |
||
70 | # default timer is __default_refresh, can be overwrite by folder_1_refresh=600 |
||
71 | self.timer_folders = [] |
||
72 | self.first_grab = True |
||
73 | |||
74 | if self.config is not None and self.config.has_section('folders'): |
||
75 | if scandir_tag: |
||
76 | # Process monitoring list |
||
77 | logger.debug("Folder list configuration detected") |
||
78 | self.__set_folder_list('folders') |
||
79 | else: |
||
80 | logger.error('Scandir not found. Please use Python 3.5+ or install the scandir lib') |
||
81 | else: |
||
82 | self.__folder_list = [] |
||
83 | |||
84 | def __set_folder_list(self, section): |
||
85 | """Init the monitored folder list. |
||
86 | |||
87 | The list is defined in the Glances configuration file. |
||
88 | """ |
||
89 | for l in range(1, self.__folder_list_max_size + 1): |
||
90 | value = {} |
||
91 | key = 'folder_' + str(l) + '_' |
||
92 | |||
93 | # Path is mandatory |
||
94 | value['indice'] = str(l) |
||
95 | value['path'] = self.config.get_value(section, key + 'path') |
||
96 | if value['path'] is None: |
||
97 | continue |
||
98 | else: |
||
99 | value['path'] = nativestr(value['path']) |
||
100 | |||
101 | # Optional conf keys |
||
102 | # Refresh time |
||
103 | value['refresh'] = int(self.config.get_value(section, |
||
104 | key + 'refresh', |
||
105 | default=self.__default_refresh)) |
||
106 | self.timer_folders.append(Timer(value['refresh'])) |
||
107 | # Thesholds |
||
108 | for i in ['careful', 'warning', 'critical']: |
||
109 | # Read threshold |
||
110 | value[i] = self.config.get_value(section, key + i) |
||
111 | if value[i] is not None: |
||
112 | logger.debug("{} threshold for folder {} is {}".format(i, value["path"], value[i])) |
||
113 | # Read action |
||
114 | action = self.config.get_value(section, key + i + '_action') |
||
115 | if action is not None: |
||
116 | value[i + '_action'] = action |
||
117 | logger.debug("{} action for folder {} is {}".format(i, value["path"], value[i + '_action'])) |
||
118 | |||
119 | # Add the item to the list |
||
120 | self.__folder_list.append(value) |
||
121 | |||
122 | def __str__(self): |
||
123 | return str(self.__folder_list) |
||
124 | |||
125 | def __repr__(self): |
||
126 | return self.__folder_list |
||
127 | |||
128 | def __getitem__(self, item): |
||
129 | return self.__folder_list[item] |
||
130 | |||
131 | def __len__(self): |
||
132 | return len(self.__folder_list) |
||
133 | |||
134 | def __get__(self, item, key): |
||
135 | """Meta function to return key value of item. |
||
136 | |||
137 | Return None if not defined or item > len(list) |
||
138 | """ |
||
139 | if item < len(self.__folder_list): |
||
140 | try: |
||
141 | return self.__folder_list[item][key] |
||
142 | except Exception: |
||
143 | return None |
||
144 | else: |
||
145 | return None |
||
146 | |||
147 | def __folder_size(self, path): |
||
148 | """Return the size of the directory given by path |
||
149 | |||
150 | path: <string>""" |
||
151 | |||
152 | ret = 0 |
||
153 | for f in scandir(path): |
||
154 | if f.is_dir() and (f.name != '.' or f.name != '..'): |
||
155 | ret += self.__folder_size(os.path.join(path, f.name)) |
||
156 | else: |
||
157 | try: |
||
158 | ret += f.stat().st_size |
||
159 | except OSError: |
||
160 | pass |
||
161 | |||
162 | return ret |
||
163 | |||
164 | def update(self): |
||
165 | """Update the command result attributed.""" |
||
166 | # Only continue if monitor list is not empty |
||
167 | if len(self.__folder_list) == 0: |
||
0 ignored issues
–
show
Unused Code
introduced
by
Loading history...
|
|||
168 | return self.__folder_list |
||
169 | |||
170 | # Iter upon the folder list |
||
171 | for i in range(len(self.get())): |
||
172 | # Update folder size |
||
173 | if not self.first_grab and not self.timer_folders[i].finished(): |
||
174 | continue |
||
175 | # Get folder size |
||
176 | try: |
||
177 | self.__folder_list[i]['size'] = self.__folder_size(self.path(i)) |
||
178 | except OSError as e: |
||
179 | logger.debug('Cannot get folder size ({}). Error: {}'.format(self.path(i), e)) |
||
180 | if e.errno == 13: |
||
181 | # Permission denied |
||
182 | self.__folder_list[i]['size'] = '!' |
||
183 | else: |
||
184 | self.__folder_list[i]['size'] = '?' |
||
185 | # Reset the timer |
||
186 | self.timer_folders[i].reset() |
||
187 | |||
188 | # It is no more the first time... |
||
189 | self.first_grab = False |
||
190 | |||
191 | return self.__folder_list |
||
192 | |||
193 | def get(self): |
||
194 | """Return the monitored list (list of dict).""" |
||
195 | return self.__folder_list |
||
196 | |||
197 | def set(self, newlist): |
||
198 | """Set the monitored list (list of dict).""" |
||
199 | self.__folder_list = newlist |
||
200 | |||
201 | def getAll(self): |
||
202 | # Deprecated: use get() |
||
203 | return self.get() |
||
204 | |||
205 | def setAll(self, newlist): |
||
206 | # Deprecated: use set() |
||
207 | self.set(newlist) |
||
208 | |||
209 | def path(self, item): |
||
210 | """Return the path of the item number (item).""" |
||
211 | return self.__get__(item, "path") |
||
212 | |||
213 | def careful(self, item): |
||
214 | """Return the careful threshold of the item number (item).""" |
||
215 | return self.__get__(item, "careful") |
||
216 | |||
217 | def warning(self, item): |
||
218 | """Return the warning threshold of the item number (item).""" |
||
219 | return self.__get__(item, "warning") |
||
220 | |||
221 | def critical(self, item): |
||
222 | """Return the critical threshold of the item number (item).""" |
||
223 | return self.__get__(item, "critical") |
||
224 |