Passed
Pull Request — master (#118)
by Juan José
03:37
created

_GmpCommandFactory.modify_schedule_command()   B

Complexity

Conditions 8

Size

Total Lines 45
Code Lines 36

Duplication

Lines 45
Ratio 100 %

Importance

Changes 0
Metric Value
cc 8
eloc 36
nop 3
dl 45
loc 45
rs 7.1493
c 0
b 0
f 0
1
# -*- coding: utf-8 -*-
0 ignored issues
show
Coding Style introduced by
This module should have a docstring.

The coding style of this project requires that you add a docstring to this code element. Below, you find an example for methods:

class SomeClass:
    def some_method(self):
        """Do x and return foo."""

If you would like to know more about docstrings, we recommend to read PEP-257: Docstring Conventions.

Loading history...
coding-style introduced by
Too many lines in module (1513/1000)
Loading history...
2
# Copyright (C) 2018 Greenbone Networks GmbH
3
#
4
# SPDX-License-Identifier: GPL-3.0-or-later
5
#
6
# This program is free software: you can redistribute it and/or modify
7
# it under the terms of the GNU General Public License as published by
8
# the Free Software Foundation, either version 3 of the License, or
9
# (at your option) any later version.
10
#
11
# This program is distributed in the hope that it will be useful,
12
# but WITHOUT ANY WARRANTY; without even the implied warranty of
13
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
# GNU General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License
17
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
18
19
import defusedxml.lxml as secET
20
21
from lxml import etree
22
23
FILTER_NAMES = [
24
    'Agent',
25
    'Alert',
26
    'Asset',
27
    'Config',
28
    'Credential',
29
    'Filter',
30
    'Group',
31
    'Note',
32
    'Override',
33
    'Permission',
34
    'Port List',
35
    'Report',
36
    'Report Format',
37
    'Result',
38
    'Role',
39
    'Schedule',
40
    'SecInfo',
41
    'Tag',
42
    'Target',
43
    'Task',
44
    'User',
45
]
46
47
class XmlCommandElement:
0 ignored issues
show
Coding Style introduced by
This class should have a docstring.

The coding style of this project requires that you add a docstring to this code element. Below, you find an example for methods:

class SomeClass:
    def some_method(self):
        """Do x and return foo."""

If you would like to know more about docstrings, we recommend to read PEP-257: Docstring Conventions.

Loading history...
Unused Code introduced by
The variable __class__ seems to be unused.
Loading history...
48
49
    def __init__(self, element):
50
        self._element = element
51
52
    def add_element(self, name, text=None, attrs=None):
0 ignored issues
show
Coding Style introduced by
This method should have a docstring.

The coding style of this project requires that you add a docstring to this code element. Below, you find an example for methods:

class SomeClass:
    def some_method(self):
        """Do x and return foo."""

If you would like to know more about docstrings, we recommend to read PEP-257: Docstring Conventions.

Loading history...
53
        node = etree.SubElement(self._element, name, attrib=attrs)
0 ignored issues
show
Bug introduced by
The Module lxml.etree does not seem to have a member named SubElement.

This check looks for calls to members that are non-existent. These calls will fail.

The member could have been renamed or removed.

Loading history...
54
        node.text = text
55
        return XmlCommandElement(node)
56
57
    def set_attribute(self, name, value):
0 ignored issues
show
Coding Style introduced by
This method should have a docstring.

The coding style of this project requires that you add a docstring to this code element. Below, you find an example for methods:

class SomeClass:
    def some_method(self):
        """Do x and return foo."""

If you would like to know more about docstrings, we recommend to read PEP-257: Docstring Conventions.

Loading history...
58
        self._element.set(name, value)
59
60
    def append_xml_str(self, xml_text):
61
        """Append a xml element in string format."""
62
        node = secET.fromstring(xml_text)
63
        self._element.append(node)
64
65
    def to_string(self):
0 ignored issues
show
Coding Style introduced by
This method should have a docstring.

The coding style of this project requires that you add a docstring to this code element. Below, you find an example for methods:

class SomeClass:
    def some_method(self):
        """Do x and return foo."""

If you would like to know more about docstrings, we recommend to read PEP-257: Docstring Conventions.

Loading history...
66
        return etree.tostring(self._element).decode('utf-8')
0 ignored issues
show
Bug introduced by
The Module lxml.etree does not seem to have a member named tostring.

This check looks for calls to members that are non-existent. These calls will fail.

The member could have been renamed or removed.

Loading history...
67
68
    def __str__(self):
69
        return self.to_string()
70
71
72
class XmlCommand(XmlCommandElement):
0 ignored issues
show
Coding Style introduced by
This class should have a docstring.

The coding style of this project requires that you add a docstring to this code element. Below, you find an example for methods:

class SomeClass:
    def some_method(self):
        """Do x and return foo."""

If you would like to know more about docstrings, we recommend to read PEP-257: Docstring Conventions.

Loading history...
Unused Code introduced by
The variable __class__ seems to be unused.
Loading history...
73
74
    def __init__(self, name):
75
        super().__init__(etree.Element(name))
0 ignored issues
show
Bug introduced by
The Module lxml.etree does not seem to have a member named Element.

This check looks for calls to members that are non-existent. These calls will fail.

The member could have been renamed or removed.

Loading history...
76
77
78
class _GmpCommandFactory:
0 ignored issues
show
Unused Code introduced by
The variable __class__ seems to be unused.
Loading history...
best-practice introduced by
Too many public methods (40/20)
Loading history...
79
80
    """Factory to create gmp - Greenbone Manangement Protocol - commands
81
    """
82
83
    def create_agent_command(self, installer, signature, name, comment='',
0 ignored issues
show
Coding Style introduced by
This method should have a docstring.

The coding style of this project requires that you add a docstring to this code element. Below, you find an example for methods:

class SomeClass:
    def some_method(self):
        """Do x and return foo."""

If you would like to know more about docstrings, we recommend to read PEP-257: Docstring Conventions.

Loading history...
best-practice introduced by
Too many arguments (8/5)
Loading history...
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
84
                             copy='', howto_install='', howto_use=''):
85
86
        cmd = XmlCommand('create_agent')
87
        cmd.add_element('installer', installer)
88
        cmd.add_element('signature', signature)
89
        cmd.add_element('name', name)
90
91
        if comment:
92
            cmd.add_element('comment', comment)
93
94
        if copy:
95
            cmd.add_element('copy', copy)
96
97
        if howto_install:
98
            cmd.add_element('howto_install', howto_install)
99
100
        if howto_use:
101
            cmd.add_element('howto_use', howto_use)
102
103
        return cmd.to_string()
104
105
    def create_alert_command(self, name, condition, event, method, filter_id='',
0 ignored issues
show
Coding Style introduced by
This method should have a docstring.

The coding style of this project requires that you add a docstring to this code element. Below, you find an example for methods:

class SomeClass:
    def some_method(self):
        """Do x and return foo."""

If you would like to know more about docstrings, we recommend to read PEP-257: Docstring Conventions.

Loading history...
best-practice introduced by
Too many arguments (8/5)
Loading history...
Comprehensibility introduced by
This function exceeds the maximum number of variables (16/15).
Loading history...
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
106
                             copy='', comment=''):
107
108
        cmd = XmlCommand('create_alert')
109
        cmd.add_element('name', name)
110
111
        if len(condition) > 1:
112
            conditions = cmd.add_element('condition', condition[0])
113
            for value, key in condition[1].items():
114
                _data = conditions.add_element('data', value)
115
                _data.add_element('name', key)
116
117
        elif condition[0] == "Always":
118
            conditions = cmd.add_element('condition', condition[0])
119
120
        if len(event) > 1:
121
            events = cmd.add_element('event', event[0])
122
            for value, key in event[1].items():
123
                _data = events.add_element('data', value)
124
                _data.add_element('name', key)
125
126
        if len(method) > 1:
127
            methods = cmd.add_element('method', method[0])
128
            for value, key in method[1].items():
129
                _data = methods.add_element('data', value)
130
                _data.add_element('name', key)
131
132
        if filter_id:
133
            cmd.add_element('filter', attrs={'id': filter_id})
134
135
        if copy:
136
            cmd.add_element('copy', copy)
137
138
        if comment:
139
            cmd.add_element('comment', comment)
140
141
        return cmd.to_string()
142
143
    def create_asset_command(self, name, asset_type, comment=''):
0 ignored issues
show
Coding Style introduced by
This method should have a docstring.

The coding style of this project requires that you add a docstring to this code element. Below, you find an example for methods:

class SomeClass:
    def some_method(self):
        """Do x and return foo."""

If you would like to know more about docstrings, we recommend to read PEP-257: Docstring Conventions.

Loading history...
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
144
        if asset_type not in ('host', 'os'):
145
            raise ValueError('create_asset requires asset_type to be either '
146
                             'host or os')
147
        cmd = XmlCommand('create_asset')
148
        asset = cmd.add_element('asset')
149
        asset.add_element('type', asset_type)
150
        asset.add_element('name', name)
151
152
        if comment:
153
            asset.add_element('comment', comment)
154
155
        return cmd.to_string()
156
157
    def create_authenticate_command(self, username, password):
0 ignored issues
show
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
158
        """Generates string for authentification on gvmd
159
160
        Creates the gmp authentication xml string.
161
        Inserts the username and password into it.
162
163
        Keyword Arguments:
164
            username {str} -- Username for GVM User
165
            password {str} -- Password for GVM User
166
        """
167
        cmd = XmlCommand('authenticate')
168
169
        credentials = cmd.add_element('credentials')
170
        credentials.add_element('username', username)
171
        credentials.add_element('password', password)
172
173
        return cmd.to_string()
174
175
    def create_config_command(self, copy_id, name):
0 ignored issues
show
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
176
        """Generates xml string for create config on gvmd."""
177
        cmd = XmlCommand('create_config')
178
        cmd.add_element('copy', copy_id)
179
        cmd.add_element('name', name)
180
181
        return cmd.to_string()
182
183 View Code Duplication
    def create_credential_command(self, name, kwargs):
0 ignored issues
show
Comprehensibility introduced by
This function exceeds the maximum number of variables (22/15).
Loading history...
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
184
        """Generates xml string for create credential on gvmd."""
185
        cmd = XmlCommand('create_credential')
186
        cmd.add_element('name', name)
187
188
        comment = kwargs.get('comment', '')
189
        if comment:
190
            cmd.add_element('comment', comment)
191
192
        copy = kwargs.get('copy', '')
193
        if copy:
194
            cmd.add_element('copy', copy)
195
196
        allow_insecure = kwargs.get('allow_insecure', '')
197
        if allow_insecure:
198
            cmd.add_element('allow_insecure', allow_insecure)
199
200
        certificate = kwargs.get('certificate', '')
201
        if certificate:
202
            cmd.add_element('certificate', certificate)
203
204
        key = kwargs.get('key', '')
205
        if key:
206
            phrase = key['phrase']
207
            private = key['private']
208
            if not phrase:
209
                raise ValueError('create_credential requires a phrase element')
210
            if not private:
211
                raise ValueError('create_credential requires a '
212
                                 'private element')
213
214
            _xmlkey = cmd.add_element('key')
215
            _xmlkey.add_element('phrase', phrase)
216
            _xmlkey.add_element('private', private)
217
218
        login = kwargs.get('login', '')
219
        if login:
220
            cmd.add_element('login', login)
221
222
        password = kwargs.get('password', '')
223
        if password:
224
            cmd.add_element('password', password)
225
226
        auth_algorithm = kwargs.get('auth_algorithm', '')
227
        if auth_algorithm:
228
            if auth_algorithm not in ('md5', 'sha1'):
229
                raise ValueError('create_credential requires auth_algorithm '
230
                                 'to be either md5 or sha1')
231
            cmd.add_element('auth_algorithm', auth_algorithm)
232
233
        community = kwargs.get('community', '')
234
        if community:
235
            cmd.add_element('community', community)
236
237
        privacy = kwargs.get('privacy', '')
238
        if privacy:
239
            algorithm = privacy.algorithm
240
            if algorithm not in ('aes', 'des'):
241
                raise ValueError('create_credential requires algorithm '
242
                                 'to be either aes or des')
243
            p_password = privacy.password
244
            _xmlprivacy = cmd.add_element('privacy')
245
            _xmlprivacy.add_element('algorithm', algorithm)
246
            _xmlprivacy.add_element('password', p_password)
247
248
        cred_type = kwargs.get('type', '')
249
        if cred_type:
250
            if cred_type not in ('cc', 'snmp', 'up', 'usk'):
251
                raise ValueError('create_credential requires type '
252
                                 'to be either cc, snmp, up or usk')
253
            cmd.add_element('type', cred_type)
254
255
        return cmd.to_string()
256
257
    def create_filter_command(self, name, make_unique, kwargs):
0 ignored issues
show
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
258
        """Generates xml string for create filter on gvmd."""
259
260
        cmd = XmlCommand('create_filter')
261
        _xmlname = cmd.add_element('name', name)
262
        if make_unique:
263
            _xmlname.add_element('make_unique', '1')
264
        else:
265
            _xmlname.add_element('make_unique', '0')
266
267
        comment = kwargs.get('comment', '')
268
        if comment:
269
            cmd.add_element('comment', comment)
270
271
        copy = kwargs.get('copy', '')
272
        if copy:
273
            cmd.add_element('copy', copy)
274
275
        term = kwargs.get('term', '')
276
        if term:
277
            cmd.add_element('term', term)
278
279
        filter_type = kwargs.get('type', '')
280
        if filter_type:
281
            if filter_type not in FILTER_NAMES:
282
                raise ValueError('create_filter requires type '
283
                                 'to be either cc, snmp, up or usk')
284
            cmd.add_element('type', filter_type)
285
286
        return cmd.to_string()
287
288
    def create_group_command(self, name, kwargs):
0 ignored issues
show
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
289
        """Generates xml string for create group on gvmd."""
290
291
        cmd = XmlCommand('create_group')
292
        cmd.add_element('name', name)
293
294
        comment = kwargs.get('comment', '')
295
        if comment:
296
            cmd.add_element('comment', comment)
297
298
        copy = kwargs.get('copy', '')
299
        if copy:
300
            cmd.add_element('copy', copy)
301
302
        special = kwargs.get('special', '')
303
        if special:
304
            _xmlspecial = cmd.add_element('specials')
305
            _xmlspecial.add_element('full')
306
307
        users = kwargs.get('users', '')
308
        if users:
309
            cmd.add_element('users', users)
310
311
        return cmd.to_string()
312
313
    def create_note_command(self, text, nvt_oid, kwargs):
0 ignored issues
show
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
314
        """Generates xml string for create note on gvmd."""
315
316
        cmd = XmlCommand('create_note')
317
        cmd.add_element('text', text)
318
        cmd.add_element('nvt', attrs={"oid": nvt_oid})
319
320
        active = kwargs.get('active', '')
321
        if active:
322
            cmd.add_element('active', active)
323
324
        comment = kwargs.get('comment', '')
325
        if comment:
326
            cmd.add_element('comment', comment)
327
328
        copy = kwargs.get('copy', '')
329
        if copy:
330
            cmd.add_element('copy', copy)
331
332
        hosts = kwargs.get('hosts', '')
333
        if hosts:
334
            cmd.add_element('hosts', hosts)
335
336
        port = kwargs.get('port', '')
337
        if port:
338
            cmd.add_element('port', port)
339
340
        result_id = kwargs.get('result_id', '')
341
        if result_id:
342
            cmd.add_element('result', attrs={'id': result_id})
343
344
        severity = kwargs.get('severity', '')
345
        if severity:
346
            cmd.add_element('severity', severity)
347
348
        task_id = kwargs.get('task_id', '')
349
        if task_id:
350
            cmd.add_element('task', attrs={'id': task_id})
351
352
        threat = kwargs.get('threat', '')
353
        if threat:
354
            cmd.add_element('threat', threat)
355
356
        return cmd.to_string()
357
358
    def create_override_command(self, text, nvt_oid, kwargs):
0 ignored issues
show
Comprehensibility introduced by
This function exceeds the maximum number of variables (17/15).
Loading history...
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
359
        """Generates xml string for create override on gvmd."""
360
361
        cmd = XmlCommand('create_override')
362
        cmd.add_element('text', text)
363
        cmd.add_element('nvt', attrs={'oid': nvt_oid})
364
365
        active = kwargs.get('active', '')
366
        if active:
367
            cmd.add_element('active', active)
368
369
        comment = kwargs.get('comment', '')
370
        if comment:
371
            cmd.add_element('comment', comment)
372
373
        copy = kwargs.get('copy', '')
374
        if copy:
375
            cmd.add_element('copy', copy)
376
377
        hosts = kwargs.get('hosts', '')
378
        if hosts:
379
            cmd.add_element('hosts', hosts)
380
381
        port = kwargs.get('port', '')
382
        if port:
383
            cmd.add_element('port', port)
384
385
        result_id = kwargs.get('result_id', '')
386
        if result_id:
387
            cmd.add_element('result', attrs={'id': result_id})
388
389
        severity = kwargs.get('severity', '')
390
        if severity:
391
            cmd.add_element('severity', severity)
392
393
        new_severity = kwargs.get('new_severity', '')
394
        if new_severity:
395
            cmd.add_element('new_severity', new_severity)
396
397
        task_id = kwargs.get('task_id', '')
398
        if task_id:
399
            cmd.add_element('task', attrs={'id': task_id})
400
401
        threat = kwargs.get('threat', '')
402
        if threat:
403
            cmd.add_element('threat', threat)
404
405
        new_threat = kwargs.get('new_threat', '')
406
        if new_threat:
407
            cmd.add_element('new_threat', new_threat)
408
409
        return cmd.to_string()
410
411
    def create_permission_command(self, name, subject_id, type, kwargs):
0 ignored issues
show
Coding Style introduced by
This method should have a docstring.

The coding style of this project requires that you add a docstring to this code element. Below, you find an example for methods:

class SomeClass:
    def some_method(self):
        """Do x and return foo."""

If you would like to know more about docstrings, we recommend to read PEP-257: Docstring Conventions.

Loading history...
Bug Best Practice introduced by
This seems to re-define the built-in type.

It is generally discouraged to redefine built-ins as this makes code very hard to read.

Loading history...
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
412
        # pretty(gmp.create_permission('get_version',
413
        # 'cc9cac5e-39a3-11e4-abae-406186ea4fc5', 'role'))
414
        # libs.gvm_connection.GMPError: Error in NAME
415
        # TODO: Research why!!
0 ignored issues
show
Coding Style introduced by
TODO and FIXME comments should generally be avoided.
Loading history...
416
417
        if not name:
418
            raise ValueError('create_permission requires a name element')
419
        if not subject_id:
420
            raise ValueError('create_permission requires a subject_id element')
421
        if type not in ('user', 'group', 'role'):
422
            raise ValueError('create_permission requires type '
423
                             'to be either user, group or role')
424
425
        cmd = XmlCommand('create_permission')
426
        cmd.add_element('name', name)
427
        _xmlsubject = cmd.add_element('subject', attrs={'id': subject_id})
428
        _xmlsubject.add_element('type', type)
429
430
        comment = kwargs.get('comment', '')
431
        if comment:
432
            cmd.add_element('comment', comment)
433
434
        copy = kwargs.get('copy', '')
435
        if copy:
436
            cmd.add_element('copy', copy)
437
438
        resource = kwargs.get('resource', '')
439
        if resource:
440
            resource_id = resource.id
441
            resource_type = resource.type
442
            _xmlresource = cmd.add_element('resource',
443
                                           attrs={'id': resource_id})
444
            _xmlresource.add_element('type', resource_type)
445
446
        return cmd.to_string()
447
448
    def create_port_list_command(self, name, port_range, kwargs):
0 ignored issues
show
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
449
        """Generates xml string for create port list on gvmd."""
450
        if not name:
451
            raise ValueError('create_port_list requires a name element')
452
        if not port_range:
453
            raise ValueError('create_port_list requires a port_range element')
454
455
        cmd = XmlCommand('create_port_list')
456
        cmd.add_element('name', name)
457
        cmd.add_element('port_range', port_range)
458
459
        comment = kwargs.get('comment', '')
460
        if comment:
461
            cmd.add_element('comment', comment)
462
463
        copy = kwargs.get('copy', '')
464
        if copy:
465
            cmd.add_element('copy', copy)
466
467
        return cmd.to_string()
468
469
    def create_port_range_command(self, port_list_id, start, end, type,
0 ignored issues
show
Bug Best Practice introduced by
This seems to re-define the built-in type.

It is generally discouraged to redefine built-ins as this makes code very hard to read.

Loading history...
best-practice introduced by
Too many arguments (6/5)
Loading history...
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
470
                                  comment=''):
471
        """Generates xml string for create port range on gvmd."""
472
473
        if not port_list_id:
474
            raise ValueError('create_port_range requires '
475
                             'a port_list_id element')
476
        if not type:
477
            raise ValueError('create_port_range requires a type element')
478
479
        cmd = XmlCommand('create_port_range')
480
        cmd.add_element('port_list', attrs={'id': port_list_id})
481
        cmd.add_element('start', start)
482
        cmd.add_element('end', end)
483
        cmd.add_element('type', type)
484
485
        if comment:
486
            cmd.add_element('comment', comment)
487
488
        return cmd.to_string()
489
490
    def create_report_command(self, report_xml_string, kwargs):
0 ignored issues
show
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
491
        """Generates xml string for create report on gvmd."""
492
493
        if not report_xml_string:
494
            raise ValueError('create_report requires a report')
495
496
        task_id = kwargs.get('task_id', '')
497
        task_name = kwargs.get('task_name', '')
498
499
        cmd = XmlCommand('create_report')
500
        comment = kwargs.get('comment', '')
501
        if task_id:
502
            cmd.add_element('task', attrs={'id': task_id})
503
        elif task_name:
504
            _xmltask = cmd.add_element('task')
505
            _xmltask.add_element('name', task_name)
506
            if comment:
507
                _xmltask.add_element('comment', comment)
508
        else:
509
            raise ValueError('create_report requires an id or name for a task')
510
511
        in_assets = kwargs.get('in_assets', '')
512
        if in_assets:
513
            cmd.add_element('in_assets', in_assets)
514
515
        cmd.append_xml_str(report_xml_string)
516
517
        return cmd.to_string()
518
519
    def create_role_command(self, name, kwargs):
0 ignored issues
show
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
520
        """Generates xml string for create role on gvmd."""
521
522
        if not name:
523
            raise ValueError('create_role requires a name element')
524
525
        cmd = XmlCommand('create_role')
526
        cmd.add_element('name', name)
527
528
        comment = kwargs.get('comment', '')
529
        if comment:
530
            cmd.add_element('comment', comment)
531
532
        copy = kwargs.get('copy', '')
533
        if copy:
534
            cmd.add_element('copy', copy)
535
536
        users = kwargs.get('users', '')
537
        if users:
538
            cmd.add_element('users', users)
539
540
        return cmd.to_string()
541
542
    def create_scanner_command(self, name, host, port, type, ca_pub,
0 ignored issues
show
Bug Best Practice introduced by
This seems to re-define the built-in type.

It is generally discouraged to redefine built-ins as this makes code very hard to read.

Loading history...
best-practice introduced by
Too many arguments (8/5)
Loading history...
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
543
                               credential_id, kwargs):
544
        """Generates xml string for create scanner on gvmd."""
545
        if not name:
546
            raise ValueError('create_scanner requires a name element')
547
        if not host:
548
            raise ValueError('create_scanner requires a host element')
549
        if not port:
550
            raise ValueError('create_scanner requires a port element')
551
        if not type:
552
            raise ValueError('create_scanner requires a type element')
553
        if not ca_pub:
554
            raise ValueError('create_scanner requires a ca_pub element')
555
        if not credential_id:
556
            raise ValueError('create_scanner requires a credential_id element')
557
558
        cmd = XmlCommand('create_scanner')
559
        cmd.add_element('name', name)
560
        cmd.add_element('host', host)
561
        cmd.add_element('port', port)
562
        cmd.add_element('type', type)
563
        cmd.add_element('ca_pub', ca_pub)
564
        cmd.add_element('credential', attrs={'id': str(credential_id)})
565
566
        comment = kwargs.get('comment', '')
567
        if comment:
568
            cmd.add_element('comment', comment)
569
570
        copy = kwargs.get('copy', '')
571
        if copy:
572
            cmd.add_element('copy', copy)
573
574
        return cmd.to_string()
575
576 View Code Duplication
    def create_schedule_command(self, name, kwargs):
0 ignored issues
show
Comprehensibility introduced by
This function exceeds the maximum number of variables (19/15).
Loading history...
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
577
        """Generates xml string for create schedule on gvmd."""
578
        if not name:
579
            raise ValueError('create_schedule requires a name element')
580
581
        cmd = XmlCommand('create_schedule')
582
        cmd.add_element('name', name)
583
584
        comment = kwargs.get('comment', '')
585
        if comment:
586
            cmd.add_element('comment', comment)
587
588
        copy = kwargs.get('copy', '')
589
        if copy:
590
            cmd.add_element('copy', copy)
591
592
        first_time = kwargs.get('first_time', '')
593
        if first_time:
594
            first_time_minute = first_time['minute']
595
            first_time_hour = first_time['hour']
596
            first_time_day_of_month = first_time['day_of_month']
597
            first_time_month = first_time['month']
598
            first_time_year = first_time['year']
599
600
            _xmlftime = cmd.add_element('first_time')
601
            _xmlftime.add_element('minute', first_time_minute)
602
            _xmlftime.add_element('hour', str(first_time_hour))
603
            _xmlftime.add_element('day_of_month', str(first_time_day_of_month))
604
            _xmlftime.add_element('month', str(first_time_month))
605
            _xmlftime.add_element('year', str(first_time_year))
606
607
        duration = kwargs.get('duration', '')
608
        if len(duration) > 1:
609
            _xmlduration = cmd.add_element('duration', str(duration[0]))
610
            _xmlduration.add_element('unit', str(duration[1]))
611
612
        period = kwargs.get('period', '')
613
        if len(period) > 1:
614
            _xmlperiod = cmd.add_element('period', str(period[0]))
615
            _xmlperiod.add_element('unit', str(period[1]))
616
617
        timezone = kwargs.get('timezone', '')
618
        if timezone:
619
            cmd.add_element('timezone', str(timezone))
620
621
        return cmd.to_string()
622
623
    def create_tag_command(self, name, resource_id, resource_type, kwargs):
0 ignored issues
show
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
624
        """Generates xml string for create tag on gvmd."""
625
626
        cmd = XmlCommand('create_tag')
627
        cmd.add_element('name', name)
628
        _xmlresource = cmd.add_element('resource',
629
                                       attrs={'id': str(resource_id)})
630
        _xmlresource.add_element('type', resource_type)
631
632
        comment = kwargs.get('comment', '')
633
        if comment:
634
            cmd.add_element('comment', comment)
635
636
        copy = kwargs.get('copy', '')
637
        if copy:
638
            cmd.add_element('copy', copy)
639
640
        value = kwargs.get('value', '')
641
        if value:
642
            cmd.add_element('value', value)
643
644
        active = kwargs.get('active', '')
645
        if active:
646
            cmd.add_element('active', active)
647
648
        return cmd.to_string()
649
650
    def create_target_command(self, name, make_unique, kwargs):
0 ignored issues
show
Comprehensibility introduced by
This function exceeds the maximum number of variables (17/15).
Loading history...
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
651
        """Generates xml string for create target on gvmd."""
652
        if not name:
653
            raise ValueError('create_target requires a name element')
654
655
        cmd = XmlCommand('create_target')
656
        _xmlname = cmd.add_element('name', name)
657
        if make_unique:
658
            _xmlname.add_element('make_unique', '1')
659
        else:
660
            _xmlname.add_element('make_unique', '0')
661
662
        if 'asset_hosts' in kwargs:
663
            hosts = kwargs.get('asset_hosts')
664
            filter = hosts['filter']
0 ignored issues
show
Bug Best Practice introduced by
This seems to re-define the built-in filter.

It is generally discouraged to redefine built-ins as this makes code very hard to read.

Loading history...
665
            cmd.add_element('asset_hosts', attrs={'filter': str(filter)})
666
        elif 'hosts' in kwargs:
667
            hosts = kwargs.get('hosts')
668
            cmd.add_element('hosts', hosts)
669
        else:
670
            raise ValueError('create_target requires either a hosts or '
671
                             'an asset_hosts element')
672
673
        if 'comment' in kwargs:
674
            cmd.add_element('comment', kwargs.get('comment'))
675
676
        if 'copy' in kwargs:
677
            # NOTE: It seems that hosts/asset_hosts is silently ignored by the
678
            # server when copy is supplied. But for specification conformance
679
            # we raise the ValueError above and consider copy optional.
680
            cmd.add_element('copy', kwargs.get('copy'))
681
682
        if 'exclude_hosts' in kwargs:
683
            cmd.add_element('exclude_hosts', kwargs.get('exclude_hosts'))
684
685
        if 'ssh_credential' in kwargs:
686
            ssh_credential = kwargs.get('ssh_credential')
687
            if 'id' in ssh_credential:
688
                _xmlssh = cmd.add_element('ssh_credential', '',
689
                                          attrs={'id': ssh_credential['id']})
690
                if 'port' in ssh_credential:
691
                    _xmlssh.add_element('port', ssh_credential['port'])
692
            else:
693
                raise ValueError('ssh_credential requires an id attribute')
694
695
        if 'smb_credential' in kwargs:
696
            smb_credential = kwargs.get('smb_credential')
697
            if 'id' in smb_credential:
698
                cmd.add_element('smb_credential',
699
                                attrs={'id': smb_credential['id']})
700
            else:
701
                raise ValueError('smb_credential requires an id attribute')
702
703
        if 'esxi_credential' in kwargs:
704
            esxi_credential = kwargs.get('esxi_credential')
705
            if 'id' in esxi_credential:
706
                cmd.add_element('esxi_credential',
707
                                attrs={'id': esxi_credential['id']})
708
            else:
709
                raise ValueError('esxi_credential requires an id attribute')
710
711
        if 'snmp_credential' in kwargs:
712
            snmp_credential = kwargs.get('snmp_credential')
713
            if 'id' in snmp_credential:
714
                cmd.add_element('snmp_credential',
715
                                attrs={'id': snmp_credential['id']})
716
            else:
717
                raise ValueError('snmp_credential requires an id attribute')
718
719
        if 'alive_tests' in kwargs:
720
            # NOTE: As the alive_tests are referenced by their name and some
721
            # names contain ampersand ('&') characters it should be considered
722
            # replacing any characters special to XML in the variable with
723
            # their corresponding entities.
724
            cmd.add_element('alive_tests', kwargs.get('alive_tests'))
725
726
        if 'reverse_lookup_only' in kwargs:
727
            reverse_lookup_only = kwargs.get('reverse_lookup_only')
728
            if reverse_lookup_only:
729
                cmd.add_element('reverse_lookup_only', '1')
730
            else:
731
                cmd.add_element('reverse_lookup_only', '0')
732
733
        if 'reverse_lookup_unify' in kwargs:
734
            reverse_lookup_unify = kwargs.get('reverse_lookup_unify')
735
            if reverse_lookup_unify:
736
                cmd.add_element('reverse_lookup_unify', '1')
737
            else:
738
                cmd.add_element('reverse_lookup_unify', '0')
739
740
        if 'port_range' in kwargs:
741
            cmd.add_element('port_range', kwargs.get('port_range'))
742
743
        if 'port_list' in kwargs:
744
            port_list = kwargs.get('port_list')
745
            if 'id' in port_list:
746
                cmd.add_element('port_list',
747
                                attrs={'id': str(port_list['id'])})
748
            else:
749
                raise ValueError('port_list requires an id attribute')
750
751
        return cmd.to_string()
752
753
    def create_task_command(self, name, config_id, target_id, scanner_id,
0 ignored issues
show
best-practice introduced by
Too many arguments (7/5)
Loading history...
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
754
                            alert_ids=None, comment=''):
755
        """Generates xml string for create task on gvmd."""
756
757
        if alert_ids is None:
758
            alert_ids = []
759
        cmd = XmlCommand('create_task')
760
        cmd.add_element('name', name)
761
        cmd.add_element('comment', comment)
762
        cmd.add_element('config', attrs={'id': config_id})
763
        cmd.add_element('target', attrs={'id': target_id})
764
        cmd.add_element('scanner', attrs={'id': scanner_id})
765
766
        #if given the alert_id is wrapped and integrated suitably as xml
767
        if len(alert_ids) > 0:
0 ignored issues
show
Unused Code introduced by
Do not use len(SEQUENCE) as condition value
Loading history...
768
            if isinstance(alert_ids, str):
769
                #if a single id is given as a string wrap it into a list
770
                alert_ids = [alert_ids]
771
            if isinstance(alert_ids, list):
772
                #parse all given alert id's
773
                for alert in alert_ids:
774
                    cmd.add_element('alert', attrs={'id': str(alert)})
775
776
        return cmd.to_string()
777
778
    def create_user_command(self, name, password, copy='', hosts_allow='0',
0 ignored issues
show
best-practice introduced by
Too many arguments (9/5)
Loading history...
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
779
                            ifaces_allow='0', role_ids=(), hosts=None,
780
                            ifaces=None):
781
        """Generates xml string for create user on gvmd."""
782
        cmd = XmlCommand('create_user')
783
        cmd.add_element('name', name)
784
785
        if copy:
786
            cmd.add_element('copy', copy)
787
788
        if password:
789
            cmd.add_element('password', password)
790
791
        if hosts is not None:
792
            cmd.add_element('hosts', hosts, attrs={'allow': str(hosts_allow)})
793
794
        if ifaces is not None:
795
            cmd.add_element('ifaces', ifaces,
796
                            attrs={'allow': str(ifaces_allow)})
797
798
        if len(role_ids) > 0:
0 ignored issues
show
Unused Code introduced by
Do not use len(SEQUENCE) as condition value
Loading history...
799
            for role in role_ids:
800
                cmd.add_element('role', attrs={'allow': str(role)})
801
802
        return cmd.to_string()
803
804
    def modify_agent_command(self, agent_id, name='', comment=''):
0 ignored issues
show
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
805
        """Generates xml string for modify agent on gvmd."""
806
        if not agent_id:
807
            raise ValueError('modify_agent requires an agent_id element')
808
809
        cmd = XmlCommand('modify_agent')
810
        cmd.set_attribute('agent_id', str(agent_id))
811
        if name:
812
            cmd.add_element('name', name)
813
        if comment:
814
            cmd.add_element('comment', comment)
815
816
        return cmd.to_string()
817
818
    def modify_alert_command(self, alert_id, kwargs):
0 ignored issues
show
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
Comprehensibility introduced by
This function exceeds the maximum number of variables (17/15).
Loading history...
819
        """Generates xml string for modify alert on gvmd."""
820
821
        if not alert_id:
822
            raise ValueError('modify_alert requires an agent_id element')
823
824
        cmd = XmlCommand('modify_alert')
825
        cmd.set_attribute('alert_id', str(alert_id))
826
827
        name = kwargs.get('name', '')
828
        if name:
829
            cmd.add_element('name', name)
830
831
        comment = kwargs.get('comment', '')
832
        if comment:
833
            cmd.add_element('comment', comment)
834
835
        filter_id = kwargs.get('filter_id', '')
836
        if filter_id:
837
            cmd.add_element('filter', attrs={'id': filter_id})
838
839
        event = kwargs.get('event', '')
840
        if len(event) > 1:
841
            _xmlevent = cmd.add_element('event', event[0])
842
            for value, key in event[1].items():
843
                _xmldata = _xmlevent.add_element('data', value)
844
                _xmldata.add_element('name', key)
845
846
        condition = kwargs.get('condition', '')
847
        if len(condition) > 1:
848
            _xmlcond = cmd.add_element('condition', condition[0])
849
            for value, key in condition[1].items():
850
                _xmldata = _xmlcond.add_element('data', value)
851
                _xmldata.add_element('name', key)
852
853
        method = kwargs.get('method', '')
854
        if len(method) > 1:
855
            _xmlmethod = cmd.add_element('method', method[0])
856
            for value, key in method[1].items():
857
                _xmldata = _xmlmethod.add_element('data', value)
858
                _xmldata.add_element('name', key)
859
860
        return cmd.to_string()
861
862
    def modify_auth_command(self, group_name, auth_conf_settings):
0 ignored issues
show
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
863
        """Generates xml string for modify auth on gvmd."""
864
        if not group_name:
865
            raise ValueError('modify_auth requires a group element '
866
                             'with a name attribute')
867
        if not auth_conf_settings:
868
            raise ValueError('modify_auth requires '
869
                             'an auth_conf_settings element')
870
        cmd = XmlCommand('modify_auth')
871
        _xmlgroup = cmd.add_element('group', attrs={'name': str(group_name)})
872
873
        for key, value in auth_conf_settings.items():
874
            _xmlauthconf = _xmlgroup.add_element('auth_conf_setting')
875
            _xmlauthconf.add_element('key', key)
876
            _xmlauthconf.add_element('value', value)
877
878
        return cmd.to_string()
879
880
    def modify_config_command(self, selection, kwargs):
0 ignored issues
show
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
881
        """Generates xml string for modify config on gvmd."""
882
        if selection not in ('nvt_pref', 'sca_pref',
883
                             'family_selection', 'nvt_selection'):
884
            raise ValueError('selection must be one of nvt_pref, sca_pref, '
885
                             'family_selection or nvt_selection')
886
        config_id = kwargs.get('config_id')
887
888
        cmd = XmlCommand('modify_config')
889
        cmd.set_attribute('config_id', str(config_id))
890
891
        if selection in 'nvt_pref':
892
            nvt_oid = kwargs.get('nvt_oid')
893
            name = kwargs.get('name')
894
            value = kwargs.get('value')
895
            _xmlpref = cmd.add_element('preference')
896
            _xmlpref.add_element('nvt', attrs={'oid': nvt_oid})
897
            _xmlpref.add_element('name', name)
898
            _xmlpref.add_element('value', value)
899
900
        elif selection in 'nvt_selection':
901
            nvt_oid = kwargs.get('nvt_oid')
902
            family = kwargs.get('family')
903
            _xmlnvtsel = cmd.add_element('nvt_selection')
904
            _xmlnvtsel.add_element('family', family)
905
906
            if isinstance(nvt_oid, list):
907
                for nvt in nvt_oid:
908
                    _xmlnvtsel.add_element('nvt', attrs={'oid': nvt})
909
            else:
910
                _xmlnvtsel.add_element('nvt', attrs={'oid': nvt})
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable nvt does not seem to be defined.
Loading history...
911
912
        elif selection in 'family_selection':
913
            family = kwargs.get('family')
914
            _xmlfamsel = cmd.add_element('family_selection')
915
            _xmlfamsel.add_element('growing', '1')
916
            _xmlfamily = _xmlfamsel.add_element('family')
917
            _xmlfamily.add_element('name', family)
918
            _xmlfamily.add_element('all', '1')
919
            _xmlfamily.add_element('growing', '1')
920
        else:
921
            raise NotImplementedError
922
923
        return cmd.to_string()
924
925 View Code Duplication
    def modify_credential_command(self, credential_id, kwargs):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
Comprehensibility introduced by
This function exceeds the maximum number of variables (22/15).
Loading history...
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
926
        """Generates xml string for modify credential on gvmd."""
927
        if not credential_id:
928
            raise ValueError('modify_credential requires '
929
                             'a credential_id attribute')
930
931
        cmd = XmlCommand('modify_credential')
932
        cmd.set_attribute('credential_id', credential_id)
933
934
        comment = kwargs.get('comment', '')
935
        if comment:
936
            cmd.add_element('comment', comment)
937
938
        name = kwargs.get('name', '')
939
        if name:
940
            cmd.add_element('name', name)
941
942
        allow_insecure = kwargs.get('allow_insecure', '')
943
        if allow_insecure:
944
            cmd.add_element('allow_insecure', allow_insecure)
945
946
        certificate = kwargs.get('certificate', '')
947
        if certificate:
948
            cmd.add_element('certificate', certificate)
949
950
        key = kwargs.get('key', '')
951
        if key:
952
            phrase = key['phrase']
953
            private = key['private']
954
            if not phrase:
955
                raise ValueError('modify_credential requires a phrase element')
956
            if not private:
957
                raise ValueError('modify_credential requires '
958
                                 'a private element')
959
            _xmlkey = cmd.add_element('key')
960
            _xmlkey.add_element('phrase', phrase)
961
            _xmlkey.add_element('private', private)
962
963
        login = kwargs.get('login', '')
964
        if login:
965
            cmd.add_element('login', login)
966
967
        password = kwargs.get('password', '')
968
        if password:
969
            cmd.add_element('password', password)
970
971
        auth_algorithm = kwargs.get('auth_algorithm', '')
972
        if auth_algorithm:
973
            if auth_algorithm not in ('md5', 'sha1'):
974
                raise ValueError('modify_credential requires auth_algorithm '
975
                                 'to be either md5 or sha1')
976
            cmd.add_element('auth_algorithm', auth_algorithm)
977
978
        community = kwargs.get('community', '')
979
        if community:
980
            cmd.add_element('community', community)
981
982
        privacy = kwargs.get('privacy', '')
983
        if privacy:
984
            algorithm = privacy.algorithm
985
            if algorithm not in ('aes', 'des'):
986
                raise ValueError('modify_credential requires algorithm '
987
                                 'to be either aes or des')
988
            p_password = privacy.password
989
            _xmlprivacy = cmd.add_element('privacy')
990
            _xmlprivacy.add_element('algorithm', algorithm)
991
            _xmlprivacy.add_element('password', p_password)
992
993
        cred_type = kwargs.get('type', '')
994
        if cred_type:
995
            if cred_type not in ('cc', 'snmp', 'up', 'usk'):
996
                raise ValueError('modify_credential requires type '
997
                                 'to be either cc, snmp, up or usk')
998
            cmd.add_element('type', cred_type)
999
1000
        return cmd.to_string()
1001
1002
    def modify_filter_command(self, filter_id, kwargs):
0 ignored issues
show
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
1003
        """Generates xml string for modify filter on gvmd."""
1004
        if not filter_id:
1005
            raise ValueError('modify_filter requires a filter_id attribute')
1006
1007
        cmd = XmlCommand('modify_filter')
1008
        cmd.set_attribute('filter_id', filter_id)
1009
1010
        comment = kwargs.get('comment', '')
1011
        if comment:
1012
            cmd.add_element('comment', comment)
1013
1014
        name = kwargs.get('name', '')
1015
        if name:
1016
            cmd.add_element('name', name)
1017
1018
        copy = kwargs.get('copy', '')
1019
        if copy:
1020
            cmd.add_element('copy', copy)
1021
1022
        term = kwargs.get('term', '')
1023
        if term:
1024
            cmd.add_element('term', term)
1025
1026
        filter_type = kwargs.get('type', '')
1027
        if filter_type:
1028
            if filter_type not in ('cc', 'snmp', 'up', 'usk'):
1029
                raise ValueError('modify_filter requires type '
1030
                                 'to be either cc, snmp, up or usk')
1031
            cmd.add_element('type', filter_type)
1032
1033
        return cmd.to_string()
1034
1035 View Code Duplication
    def modify_group_command(self, group_id, kwargs):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
1036
        """Generates xml string for modify group on gvmd."""
1037
        if not group_id:
1038
            raise ValueError('modify_group requires a group_id attribute')
1039
1040
        cmd = XmlCommand('modify_group')
1041
        cmd.set_attribute('group_id', group_id)
1042
1043
        comment = kwargs.get('comment', '')
1044
        if comment:
1045
            cmd.add_element('comment', comment)
1046
1047
        name = kwargs.get('name', '')
1048
        if name:
1049
            cmd.add_element('name', name)
1050
1051
        users = kwargs.get('users', '')
1052
        if users:
1053
            cmd.add_element('users', users)
1054
1055
        return cmd.to_string()
1056
1057
    def modify_note_command(self, note_id, text, kwargs):
0 ignored issues
show
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
1058
        """Generates xml string for modify note on gvmd."""
1059
        if not note_id:
1060
            raise ValueError('modify_note requires a note_id attribute')
1061
        if not text:
1062
            raise ValueError('modify_note requires a text element')
1063
1064
        cmd = XmlCommand('modify_note')
1065
        cmd.set_attribute('note_id', note_id)
1066
        cmd.add_element('text', text)
1067
1068
        active = kwargs.get('active', '')
1069
        if active:
1070
            cmd.add_element('active', active)
1071
1072
        hosts = kwargs.get('hosts', '')
1073
        if hosts:
1074
            cmd.add_element('hosts', hosts)
1075
1076
        port = kwargs.get('port', '')
1077
        if port:
1078
            cmd.add_element('port', port)
1079
1080
        result_id = kwargs.get('result_id', '')
1081
        if result_id:
1082
            cmd.add_element('result', attrs={'id': result_id})
1083
1084
        severity = kwargs.get('severity', '')
1085
        if severity:
1086
            cmd.add_element('severity', severity)
1087
1088
        task_id = kwargs.get('task_id', '')
1089
        if task_id:
1090
            cmd.add_element('task', attrs={'id': task_id})
1091
1092
        threat = kwargs.get('threat', '')
1093
        if threat:
1094
            cmd.add_element('threat', threat)
1095
1096
        return cmd.to_string()
1097
1098
    def modify_override_command(self, override_id, text, kwargs):
0 ignored issues
show
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
1099
        """Generates xml string for modify override on gvmd."""
1100
        cmd = XmlCommand('modify_override')
1101
        cmd.set_attribute('override_id', override_id)
1102
        cmd.add_element('text', text)
1103
1104
        active = kwargs.get('active', '')
1105
        if active:
1106
            cmd.add_element('active', active)
1107
1108
        hosts = kwargs.get('hosts', '')
1109
        if hosts:
1110
            cmd.add_element('hosts', hosts)
1111
1112
        port = kwargs.get('port', '')
1113
        if port:
1114
            cmd.add_element('port', port)
1115
1116
        result_id = kwargs.get('result_id', '')
1117
        if result_id:
1118
            cmd.add_element('result', attrs={'id': result_id})
1119
1120
        severity = kwargs.get('severity', '')
1121
        if severity:
1122
            cmd.add_element('severity', severity)
1123
1124
        new_severity = kwargs.get('new_severity', '')
1125
        if new_severity:
1126
            cmd.add_element('new_severity', new_severity)
1127
1128
        task_id = kwargs.get('task_id', '')
1129
        if task_id:
1130
            cmd.add_element('task', attrs={'id': task_id})
1131
1132
        threat = kwargs.get('threat', '')
1133
        if threat:
1134
            cmd.add_element('threat', threat)
1135
1136
        new_threat = kwargs.get('new_threat', '')
1137
        if new_threat:
1138
            cmd.add_element('new_threat', new_threat)
1139
1140
        return cmd.to_string()
1141
1142
    def modify_permission_command(self, permission_id, kwargs):
0 ignored issues
show
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
1143
        """Generates xml string for modify permission on gvmd."""
1144
        if not permission_id:
1145
            raise ValueError('modify_permission requires '
1146
                             'a permission_id element')
1147
1148
        cmd = XmlCommand('modify_permission')
1149
        cmd.set_attribute('permission_id', permission_id)
1150
1151
        comment = kwargs.get('comment', '')
1152
        if comment:
1153
            cmd.add_element('comment', comment)
1154
1155
        name = kwargs.get('name', '')
1156
        if name:
1157
            cmd.add_element('name', name)
1158
1159
        resource = kwargs.get('resource', '')
1160
        if resource:
1161
            resource_id = resource['id']
1162
            resource_type = resource['type']
1163
            _xmlresource = cmd.add_element('resource',
1164
                                           attrs={'id': resource_id})
1165
            _xmlresource.add_element('type', resource_type)
1166
1167
        subject = kwargs.get('subject', '')
1168
        if subject:
1169
            subject_id = subject['id']
1170
            subject_type = subject['type']
1171
            _xmlsubject = cmd.add_element('subject', attrs={'id': subject_id})
1172
            _xmlsubject.add_element('type', subject_type)
1173
1174
        return cmd.to_string()
1175
1176
    def modify_port_list_command(self, port_list_id, kwargs):
0 ignored issues
show
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
1177
        """Generates xml string for modify port list on gvmd."""
1178
        if not port_list_id:
1179
            raise ValueError('modify_port_list requires '
1180
                             'a port_list_id attribute')
1181
        cmd = XmlCommand('modify_port_list')
1182
        cmd.set_attribute('port_list_id', port_list_id)
1183
1184
        comment = kwargs.get('comment', '')
1185
        if comment:
1186
            cmd.add_element('comment', comment)
1187
1188
        name = kwargs.get('name', '')
1189
        if name:
1190
            cmd.add_element('name', name)
1191
1192
        return cmd.to_string()
1193
1194
    def modify_report_format_command(self, report_format_id, kwargs):
0 ignored issues
show
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
1195
        """Generates xml string for modify report format on gvmd."""
1196
        if len(kwargs) < 1:
1197
            raise Exception('modify_report_format: Missing parameter')
1198
1199
        cmd = XmlCommand('modify_report_format')
1200
        cmd.set_attribute('report_format_id', report_format_id)
1201
1202
        active = kwargs.get('active', '')
1203
        if active:
1204
            cmd.add_element('active', active)
1205
1206
        name = kwargs.get('name', '')
1207
        if name:
1208
            cmd.add_element('name', name)
1209
1210
            summary = kwargs.get('summary', '')
1211
        if summary:
0 ignored issues
show
introduced by
The variable summary does not seem to be defined in case name on line 1207 is False. Are you sure this can never be the case?
Loading history...
1212
            cmd.add_element('summary', summary)
1213
1214
        param = kwargs.get('param', '')
1215
        if param:
1216
            p_name = param[0]
1217
            p_value = param[1]
1218
            _xmlparam = cmd.add_element('param')
1219
            _xmlparam.add_element('name', p_name)
1220
            _xmlparam.add_element('value', p_value)
1221
1222
        return cmd.to_string()
1223
1224 View Code Duplication
    def modify_role_command(self, role_id, kwargs):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
1225
        """Generates xml string for modify role on gvmd."""
1226
        if not role_id:
1227
            raise ValueError('modify_role requires a role_id element')
1228
1229
        cmd = XmlCommand('modify_role')
1230
        cmd.set_attribute('role_id', role_id)
1231
1232
        comment = kwargs.get('comment', '')
1233
        if comment:
1234
            cmd.add_element('comment', comment)
1235
1236
        name = kwargs.get('name', '')
1237
        if name:
1238
            cmd.add_element('name', name)
1239
1240
        users = kwargs.get('users', '')
1241
        if users:
1242
            cmd.add_element('users', users)
1243
1244
        return cmd.to_string()
1245
1246
    def modify_scanner_command(self, scanner_id, host, port, scanner_type,
0 ignored issues
show
best-practice introduced by
Too many arguments (6/5)
Loading history...
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
1247
                               kwargs):
1248
        """Generates xml string for modify scanner on gvmd."""
1249
        if not scanner_id:
1250
            raise ValueError('modify_scanner requires a scanner_id element')
1251
        if not host:
1252
            raise ValueError('modify_scanner requires a host element')
1253
        if not port:
1254
            raise ValueError('modify_scanner requires a port element')
1255
        if not scanner_type:
1256
            raise ValueError('modify_scanner requires a type element')
1257
1258
        cmd = XmlCommand('modify_scanner')
1259
        cmd.set_attribute('scanner_id', scanner_id)
1260
        cmd.add_element('host', host)
1261
        cmd.add_element('port', port)
1262
        cmd.add_element('type', scanner_type)
1263
1264
        comment = kwargs.get('comment', '')
1265
        if comment:
1266
            cmd.add_element('comment', comment)
1267
1268
        name = kwargs.get('name', '')
1269
        if name:
1270
            cmd.add_element('name', name)
1271
1272
        ca_pub = kwargs.get('ca_pub', '')
1273
        if ca_pub:
1274
            cmd.add_element('ca_pub', ca_pub)
1275
1276
        credential_id = kwargs.get('credential_id', '')
1277
        if credential_id:
1278
            cmd.add_element('credential', attrs={'id': str(credential_id)})
1279
1280
        return cmd.to_string()
1281
1282 View Code Duplication
    def modify_schedule_command(self, schedule_id, kwargs):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
Comprehensibility introduced by
This function exceeds the maximum number of variables (19/15).
Loading history...
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
1283
        """Generates xml string for modify schedule on gvmd."""
1284
        if not schedule_id:
1285
            raise ValueError('modify_schedule requires a schedule_id element')
1286
1287
        cmd = XmlCommand('modify_schedule')
1288
        cmd.set_attribute('schedule_id', schedule_id)
1289
        comment = kwargs.get('comment', '')
1290
        if comment:
1291
            cmd.add_element('comment', comment)
1292
1293
        name = kwargs.get('name', '')
1294
        if name:
1295
            cmd.add_element('name', name)
1296
1297
        first_time = kwargs.get('first_time', '')
1298
        if first_time:
1299
            first_time_minute = first_time['minute']
1300
            first_time_hour = first_time['hour']
1301
            first_time_day_of_month = first_time['day_of_month']
1302
            first_time_month = first_time['month']
1303
            first_time_year = first_time['year']
1304
1305
            _xmlftime = cmd.add_element('first_time')
1306
            _xmlftime.add_element('minute', str(first_time_minute))
1307
            _xmlftime.add_element('hour', str(first_time_hour))
1308
            _xmlftime.add_element('day_of_month', str(first_time_day_of_month))
1309
            _xmlftime.add_element('month', str(first_time_month))
1310
            _xmlftime.add_element('year', str(first_time_year))
1311
1312
        duration = kwargs.get('duration', '')
1313
        if len(duration) > 1:
1314
            _xmlduration = cmd.add_element('duration', str(duration[0]))
1315
            _xmlduration.add_element('unit', str(duration[1]))
1316
1317
        period = kwargs.get('period', '')
1318
        if len(period) > 1:
1319
            _xmlperiod = cmd.add_element('period', str(period[0]))
1320
            _xmlperiod.add_element('unit', str(period[1]))
1321
1322
        timezone = kwargs.get('timezone', '')
1323
        if timezone:
1324
            cmd.add_element('timezone', str(timezone))
1325
1326
        return cmd.to_string()
1327
1328
    def modify_tag_command(self, tag_id, kwargs):
0 ignored issues
show
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
1329
        """Generates xml string for modify tag on gvmd."""
1330
        if not tag_id:
1331
            raise ValueError('modify_tag requires a tag_id element')
1332
1333
        cmd = XmlCommand('modify_tag')
1334
        cmd.set_attribute('tag_id', str(tag_id))
1335
1336
        comment = kwargs.get('comment', '')
1337
        if comment:
1338
            cmd.add_element('comment', comment)
1339
1340
        name = kwargs.get('name', '')
1341
        if name:
1342
            cmd.add_element('name', name)
1343
1344
        value = kwargs.get('value', '')
1345
        if value:
1346
            cmd.add_element('value', value)
1347
1348
        active = kwargs.get('active', '')
1349
        if active:
1350
            cmd.add_element('active', value)
1351
1352
        resource = kwargs.get('resource', '')
1353
        if resource:
1354
            resource_id = resource['id']
1355
            resource_type = resource['type']
1356
            _xmlresource = cmd.add_element('resource',
1357
                                           attrs={'resource_id': resource_id})
1358
            _xmlresource.add_element('type', resource_type)
1359
1360
        return cmd.to_string()
1361
1362
    def modify_target_command(self, target_id, kwargs):
0 ignored issues
show
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
1363
        """Generates xml string for modify target on gvmd."""
1364
        if not target_id:
1365
            raise ValueError('modify_target requires a target_id element')
1366
1367
        cmd = XmlCommand('modify_target')
1368
        cmd.set_attribute('target_id', target_id)
1369
1370
        comment = kwargs.get('comment', '')
1371
        if comment:
1372
            cmd.add_element('comment', comment)
1373
1374
        name = kwargs.get('name', '')
1375
        if name:
1376
            cmd.add_element('name', name)
1377
1378
        hosts = kwargs.get('hosts', '')
1379
        if hosts:
1380
            cmd.add_element('hosts', hosts)
1381
1382
        copy = kwargs.get('copy', '')
1383
        if copy:
1384
            cmd.add_element('copy', copy)
1385
1386
        exclude_hosts = kwargs.get('exclude_hosts', '')
1387
        if exclude_hosts:
1388
            cmd.add_element('exclude_hosts', exclude_hosts)
1389
1390
        alive_tests = kwargs.get('alive_tests', '')
1391
        if alive_tests:
1392
            cmd.add_element('alive_tests', alive_tests)
1393
1394
        reverse_lookup_only = kwargs.get('reverse_lookup_only', '')
1395
        if reverse_lookup_only:
1396
            cmd.add_element('reverse_lookup_only', reverse_lookup_only)
1397
1398
        reverse_lookup_unify = kwargs.get('reverse_lookup_unify', '')
1399
        if reverse_lookup_unify:
1400
            cmd.add_element('reverse_lookup_unify', reverse_lookup_unify)
1401
1402
        port_range = kwargs.get('port_range', '')
1403
        if port_range:
1404
            cmd.add_element('port_range', port_range)
1405
1406
        port_list = kwargs.get('port_list', '')
1407
        if port_list:
1408
            cmd.add_element('port_list', attrs={'id': str(port_list)})
1409
1410
        return cmd.to_string()
1411
1412
    def modify_task_command(self, task_id, kwargs):
0 ignored issues
show
Comprehensibility introduced by
This function exceeds the maximum number of variables (22/15).
Loading history...
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
1413
        """Generates xml string for modify task on gvmd."""
1414
        if not task_id:
1415
            raise ValueError('modify_task requires a task_id element')
1416
1417
        cmd = XmlCommand('modify_task')
1418
        cmd.set_attribute('task_id', task_id)
1419
1420
        name = kwargs.get('name', '')
1421
        if name:
1422
            cmd.add_element('name', name)
1423
1424
        comment = kwargs.get('comment', '')
1425
        if comment:
1426
            cmd.add_element('comment', comment)
1427
1428
        target_id = kwargs.get('target_id', '')
1429
        if target_id:
1430
            cmd.add_element('target', attrs={'id': target_id})
1431
1432
        scanner = kwargs.get('scanner', '')
1433
        if scanner:
1434
            cmd.add_element('scanner', attrs={'id': scanner})
1435
1436
        schedule_periods = kwargs.get('schedule_periods', '')
1437
        if schedule_periods:
1438
            cmd.add_element('schedule_periods', str(schedule_periods))
1439
1440
        schedule = kwargs.get('schedule', '')
1441
        if schedule:
1442
            cmd.add_element('schedule', attrs={'id': str(schedule)})
1443
1444
        alert = kwargs.get('alert', '')
1445
        if alert:
1446
            cmd.add_element('alert', attrs={'id': str(alert)})
1447
1448
        observers = kwargs.get('observers', '')
1449
        if observers:
1450
            cmd.add_element('observers', str(observers))
1451
1452
        preferences = kwargs.get('preferences', '')
1453
        if preferences:
1454
            _xmlprefs = cmd.add_element('preferences')
1455
            for n in range(len(preferences["scanner_name"])):
0 ignored issues
show
Coding Style Naming introduced by
The name n does not conform to the variable naming conventions ((([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$).

This check looks for invalid names for a range of different identifiers.

You can set regular expressions to which the identifiers must conform if the defaults do not match your requirements.

If your project includes a Pylint configuration file, the settings contained in that file take precedence.

To find out more about Pylint, please refer to their site.

Loading history...
1456
                preferences_scanner_name = preferences["scanner_name"][n]
1457
                preferences_value = preferences["value"][n]
1458
                _xmlpref = _xmlprefs.add_element('preference')
1459
                _xmlpref.add_element('scanner_name', preferences_scanner_name)
1460
                _xmlpref.add_element('value', preferences_value)
1461
1462
        file = kwargs.get('file', '')
1463
        if file:
1464
            file_name = file['name']
1465
            file_action = file['action']
1466
            if file_action != "update" and file_action != "remove":
1467
                raise ValueError('action can only be "update" or "remove"!')
1468
            cmd.add_element('file', attrs={'name': file_name,
1469
                                           'action': file_action})
1470
1471
        return cmd.to_string()
1472
1473
    def modify_user_command(self, kwargs):
0 ignored issues
show
Coding Style introduced by
This method could be written as a function/class method.

If a method does not access any attributes of the class, it could also be implemented as a function or static method. This can help improve readability. For example

class Foo:
    def some_method(self, x, y):
        return x + y;

could be written as

class Foo:
    @classmethod
    def some_method(cls, x, y):
        return x + y;
Loading history...
1474
        """Generates xml string for modify user on gvmd."""
1475
        user_id = kwargs.get('user_id', '')
1476
        name = kwargs.get('name', '')
1477
1478
        if not user_id and not name:
1479
            raise ValueError('modify_user requires '
1480
                             'either a user_id or a name element')
1481
1482
        cmd = XmlCommand('modify_user')
1483
        cmd.set_attribute('user_id', str(user_id))
1484
1485
        new_name = kwargs.get('new_name', '')
1486
        if new_name:
1487
            cmd.add_element('new_name', new_name)
1488
1489
        password = kwargs.get('password', '')
1490
        if password:
1491
            cmd.add_element('password', password)
1492
1493
        role_ids = kwargs.get('role_ids', '')
1494
        if len(role_ids) > 0:
0 ignored issues
show
Unused Code introduced by
Do not use len(SEQUENCE) as condition value
Loading history...
1495
            for role in role_ids:
1496
                cmd.add_element('role', attrs={'id': str(role)})
1497
1498
        hosts = kwargs.get('hosts', '')
1499
        hosts_allow = kwargs.get('hosts_allow', '')
1500
        if hosts or hosts_allow:
1501
            cmd.add_element('hosts', hosts, attrs={'allow': str(hosts_allow)})
1502
1503
        ifaces = kwargs.get('ifaces', '')
1504
        ifaces_allow = kwargs.get('ifaces_allow', '')
1505
        if ifaces or ifaces_allow:
1506
            cmd.add_element('ifaces', ifaces,
1507
                            attrs={'allow': str(ifaces_allow)})
1508
1509
        sources = kwargs.get('sources', '')
1510
        if sources:
1511
            cmd.add_element('sources', sources)
1512
1513
        return cmd.to_string()
1514