Passed
Push — master ( bd8417...61b038 )
by
unknown
03:43 queued 01:23
created

gvm.protocols.gmpv7.Gmp.create_target()   F

Complexity

Conditions 20

Size

Total Lines 108
Code Lines 51

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 20
eloc 51
nop 18
dl 0
loc 108
rs 0
c 0
b 0
f 0

How to fix   Long Method    Complexity    Many Parameters   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

Complexity

Complex classes like gvm.protocols.gmpv7.Gmp.create_target() often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
# -*- coding: utf-8 -*-
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
Module for communication with gvmd in Greenbone Management Protocol version 7
20
"""
21
import logging
22
23
from lxml import etree
24
25
from gvm.errors import InvalidArgument, RequiredArgument
26
from gvm.utils import get_version_string
27
from gvm.xml import _GmpCommandFactory as GmpCommandFactory, XmlCommand
28
29
from .base import GvmProtocol
30
31
logger = logging.getLogger(__name__)
32
33
PROTOCOL_VERSION = (7,)
34
35
FILTER_TYPES = [
36
    'agent',
37
    'alert',
38
    'asset',
39
    'config',
40
    'credential',
41
    'filter',
42
    'group',
43
    'note',
44
    'override',
45
    'permission',
46
    'port_list',
47
    'report',
48
    'report_format',
49
    'result',
50
    'role',
51
    'schedule',
52
    'secinfo',
53
    'tag',
54
    'target',
55
    'task',
56
    'user',
57
]
58
59
60
def _check_command_status(xml):
61
    """Check gmp response
62
63
    Look into the gmp response and check for the status in the root element
64
65
    Arguments:
66
        xml {string} -- XML-Source
67
68
    Returns:
69
        bool -- True if valid, otherwise False
70
    """
71
72
    if xml is 0 or xml is None:
73
        logger.error('XML Command is empty')
74
        return False
75
76
    try:
77
        parser = etree.XMLParser(encoding='utf-8', recover=True)
78
79
        root = etree.XML(xml, parser=parser)
80
        status = root.attrib['status']
81
        return status is not None and status[0] == '2'
82
83
    except etree.Error as e:
84
        logger.error('etree.XML(xml): %s', e)
85
        return False
86
87
88
class Gmp(GvmProtocol):
0 ignored issues
show
best-practice introduced by
Too many public methods (112/30)
Loading history...
89
    """Python interface for Greenbone Management Protocol
90
91
    This class implements the `Greenbone Management Protocol version 7`_
92
93
    Attributes:
94
        connection (:class:`gvm.connections.GvmConnection`): Connection to use
95
            to talk with the gvmd daemon. See :mod:`gvm.connections` for
96
            possible connection types.
97
        transform (`callable`_, optional): Optional transform callable to
98
            convert response data. After each request the callable gets passed
99
            the plain response data which can be used to check the data and/or
100
            conversion into different representaitions like a xml dom.
101
102
            See :mod:`gvm.transforms` for existing transforms.
103
104
    .. _Greenbone Management Protocol version 7:
105
        https://docs.greenbone.net/API/GMP/gmp-7.0.html
106
    .. _callable:
107
        https://docs.python.org/3.6/library/functions.html#callable
108
    """
109
110
    def __init__(self, connection, transform=None):
111
        super().__init__(connection, transform)
112
113
        # Is authenticated on gvmd
114
        self._authenticated = False
115
116
        # GMP Message Creator
117
        self._generator = GmpCommandFactory()
118
119
    @staticmethod
120
    def get_protocol_version():
121
        """Allow to determine the Greenbone Management Protocol version.
122
123
            Returns:
124
                str: Implemented version of the Greenbone Management Protocol
125
        """
126
        return get_version_string(PROTOCOL_VERSION)
127
128
    def is_authenticated(self):
129
        """Checks if the user is authenticated
130
131
        If the user is authenticated privilged GMP commands like get_tasks
132
        may be send to gvmd.
133
134
        Returns:
135
            bool: True if an authenticated connection to gvmd has been
136
            established.
137
        """
138
        return self._authenticated
139
140
    def authenticate(self, username, password):
141
        """Authenticate to gvmd.
142
143
        The generated authenticate command will be send to server.
144
        Afterwards the response is read, transformed and returned.
145
146
        Arguments:
147
            username (str): Username
148
            password (str): Password
149
150
        Returns:
151
            any, str by default: Transformed response from server.
152
        """
153
        cmd = self._generator.create_authenticate_command(
154
            username=username, password=password)
155
156
        self._send(cmd)
157
        response = self._read()
158
159
        if _check_command_status(response):
160
            self._authenticated = True
161
162
        return self._transform(response)
163
164
    def create_agent(self, installer, signature, name, comment='', copy='',
165
                     howto_install='', howto_use=''):
166
        cmd = self._generator.create_agent_command(
167
            installer, signature, name, comment, copy, howto_install,
168
            howto_use)
169
        return self.send_command(cmd)
170
171
    def create_alert(self, name, condition, event, method, filter_id='',
172
                     copy='', comment=''):
173
        cmd = self._generator.create_alert_command(name, condition, event,
174
                                                   method, filter_id, copy,
175
                                                   comment)
176
        return self.send_command(cmd)
177
178
    def create_asset(self, name, asset_type, comment=''):
179
        # TODO: Add the missing second method. Also the docs are not complete!
0 ignored issues
show
Coding Style introduced by
TODO and FIXME comments should generally be avoided.
Loading history...
180
        cmd = self._generator.create_asset_command(name, asset_type, comment)
181
        return self.send_command(cmd)
182
183
    def create_config(self, copy_id, name):
184
        cmd = self._generator.create_config_command(copy_id, name)
185
        return self.send_command(cmd)
186
187
    def create_credential(self, name, **kwargs):
188
        cmd = self._generator.create_credential_command(name, kwargs)
189
        return self.send_command(cmd)
190
191
    def create_filter(self, name, make_unique=False, filter_type=None,
192
                      comment=None, term=None, copy=None):
193
        """Create a new filter
194
195
        Arguments:
196
            name (str): Name of the new filter
197
            make_unique (boolean, optional):
198
            filter_type (str, optional): Filter for entity type
199
            comment (str, optional): Comment for the filter
200
            term (str, optional): Filter term e.g. 'name=foo'
201
            copy (str, optional): UUID of an existing filter
202
203
        Returns:
204
            The response. See :py:meth:`send_command` for details.
205
        """
206
        if not name:
207
            raise RequiredArgument('create_filter requires a name argument')
208
209
        cmd = XmlCommand('create_filter')
210
        _xmlname = cmd.add_element('name', name)
211
        if make_unique:
212
            _xmlname.add_element('make_unique', '1')
213
214
        if comment:
215
            cmd.add_element('comment', comment)
216
217
        # TODO: Move copy into an extra method
0 ignored issues
show
Coding Style introduced by
TODO and FIXME comments should generally be avoided.
Loading history...
218
        if copy:
219
            cmd.add_element('copy', copy)
220
221
        if term:
222
            cmd.add_element('term', term)
223
224
        if filter_type:
225
            filter_type = filter_type.lower()
226
            if filter_type not in FILTER_TYPES:
227
                raise InvalidArgument(
228
                    'create_filter requires type to be one of {0} but '
229
                    'was {1}'.format(', '.join(FILTER_TYPES), filter_type))
230
            cmd.add_element('type', filter_type)
231
232
        return self._send_xml_command(cmd)
233
234
    def create_group(self, name, **kwargs):
235
        cmd = self._generator.create_group_command(name, kwargs)
236
        return self.send_command(cmd)
237
238
    # TODO: Create notes with comment returns bogus element. Research
0 ignored issues
show
Coding Style introduced by
TODO and FIXME comments should generally be avoided.
Loading history...
239
    def create_note(self, text, nvt_oid, **kwargs):
240
        cmd = self._generator.create_note_command(text, nvt_oid, kwargs)
241
        return self.send_command(cmd)
242
243
    def create_override(self, text, nvt_oid, **kwargs):
244
        cmd = self._generator.create_override_command(text, nvt_oid, kwargs)
245
        return self.send_command(cmd)
246
247
    def create_permission(self, name, subject_id, permission_type, **kwargs):
248
        cmd = self._generator.create_permission_command(
249
            name, subject_id, permission_type, kwargs)
250
        return self.send_command(cmd)
251
252
    def create_port_list(self, name, port_range, **kwargs):
253
        cmd = self._generator.create_port_list_command(name, port_range, kwargs)
254
        return self.send_command(cmd)
255
256
    def create_port_range(self, port_list_id, start, end, port_range_type,
257
                          comment=''):
258
        cmd = self._generator.create_port_range_command(
259
            port_list_id, start, end, port_range_type, comment)
260
        return self.send_command(cmd)
261
262
    def create_report(self, report_xml_string, **kwargs):
263
        cmd = self._generator.create_report_command(report_xml_string, kwargs)
264
        return self.send_command(cmd)
265
266
    def create_role(self, name, **kwargs):
267
        cmd = self._generator.create_role_command(name, kwargs)
268
        return self.send_command(cmd)
269
270
    def create_scanner(self, name, host, port, scanner_type, ca_pub,
271
                       credential_id, **kwargs):
272
        cmd = self._generator.create_scanner_command(name, host, port,
273
                                                     scanner_type, ca_pub,
274
                                                     credential_id, kwargs)
275
        return self.send_command(cmd)
276
277
    def create_schedule(self, name, **kwargs):
278
        cmd = self._generator.create_schedule_command(name, kwargs)
279
        return self.send_command(cmd)
280
281
    def create_tag(self, name, resource_id, resource_type, **kwargs):
282
        cmd = self._generator.create_tag_command(name, resource_id,
283
                                                 resource_type, kwargs)
284
        return self.send_command(cmd)
285
286
    def create_target(self, name, make_unique=False, asset_hosts_filter=None,
0 ignored issues
show
best-practice introduced by
Too many arguments (18/15)
Loading history...
Comprehensibility introduced by
This function exceeds the maximum number of variables (22/15).
Loading history...
287
                      hosts=None, comment=None, copy=None, exclude_hosts=None,
288
                      ssh_credential_id=None, ssh_credential_port=None,
289
                      smb_credential_id=None, esxi_credential_id=None,
290
                      snmp_credential_id=None, alive_tests=None,
291
                      reverse_lookup_only=None, reverse_lookup_unify=None,
292
                      port_range=None, port_list_id=None):
293
        """Create a new target
294
295
        Arguments:
296
            name (str): Name of the target
297
            make_unique (boolean, optional): Append a unique suffix if the name
298
                already exists
299
            asset_hosts_filter (str, optional): Filter to select target host
300
                from assets hosts
301
            hosts (str, optional): Hosts to scan
302
            exclude_hosts (str, optional): Hosts to exclude from scan
303
            comment (str, optional): Comment for the target
304
            copy (str, optional): UUID of an existing target to clone from
305
            ssh_credential_id (str, optional): UUID of a ssh credential to use
306
                on target
307
            ssh_credential_port (str, optional): The port to use for ssh
308
                credential
309
            smb_credential_id (str, optional): UUID of a smb credential to use
310
                on target
311
            snmp_credential_id (str, optional): UUID of a snmp credential to use
312
                on target
313
            esxi_credential_id (str, optional): UUID of a esxi credential to use
314
                on target
315
            alive_tests (str, optional): Which alive tests to use
316
            reverse_lookup_only (boolean, optional): Whether to scan only hosts
317
                that have names
318
            reverse_lookup_unify (boolean, optional): Whether to scan only one
319
                IP when multiple IPs have the same name.
320
            port_range (str, optional): Port range for the target
321
            port_list_id (str, optional): UUID of the port list to use on target
322
323
        Returns:
324
            The response. See :py:meth:`send_command` for details.
325
        """
326
        if not name:
327
            raise RequiredArgument('create_target requires a name argument')
328
329
        cmd = XmlCommand('create_target')
330
        _xmlname = cmd.add_element('name', name)
331
        if make_unique:
332
            _xmlname.add_element('make_unique', '1')
333
334
        if asset_hosts_filter:
335
            cmd.add_element('asset_hosts',
336
                            attrs={'filter': str(asset_hosts_filter)})
337
        elif hosts:
338
            cmd.add_element('hosts', hosts)
339
        else:
340
            raise RequiredArgument('create_target requires either a hosts or '
341
                                   'an asset_hosts_filter argument')
342
343
        if comment:
344
            cmd.add_element('comment', comment)
345
346
        if copy:
347
            # TODO move copy case into clone_target method
0 ignored issues
show
Coding Style introduced by
TODO and FIXME comments should generally be avoided.
Loading history...
348
349
            # NOTE: It seems that hosts/asset_hosts is silently ignored by the
350
            # server when copy is supplied. But for specification conformance
351
            # we raise the ValueError above and consider copy optional.
352
            cmd.add_element('copy', copy)
353
354
        if exclude_hosts:
355
            cmd.add_element('exclude_hosts', exclude_hosts)
356
357
        if ssh_credential_id:
358
            _xmlssh = cmd.add_element('ssh_credential',
359
                                      attrs={'id': ssh_credential_id})
360
            if ssh_credential_port:
361
                _xmlssh.add_element('port', ssh_credential_port)
362
363
        if smb_credential_id:
364
            cmd.add_element('smb_credential', attrs={'id': smb_credential_id})
365
366
        if esxi_credential_id:
367
            cmd.add_element('esxi_credential', attrs={'id': esxi_credential_id})
368
369
        if snmp_credential_id:
370
            cmd.add_element('snmp_credential', attrs={'id': snmp_credential_id})
371
372
        if alive_tests:
373
            cmd.add_element('alive_tests', alive_tests)
374
375
        if not reverse_lookup_only is None:
376
            if reverse_lookup_only:
377
                cmd.add_element('reverse_lookup_only', '1')
378
            else:
379
                cmd.add_element('reverse_lookup_only', '0')
380
381
        if not reverse_lookup_unify is None:
382
            if reverse_lookup_unify:
383
                cmd.add_element('reverse_lookup_unify', '1')
384
            else:
385
                cmd.add_element('reverse_lookup_unify', '0')
386
387
        if port_range:
388
            cmd.add_element('port_range', port_range)
389
390
        if port_list_id:
391
            cmd.add_element('port_list', attrs={'id': port_list_id})
392
393
        return self._send_xml_command(cmd)
394
395
    def create_task(self, name, config_id, target_id, scanner_id,
396
                    alert_ids=None, comment=''):
397
        if alert_ids is None:
398
            alert_ids = []
399
        cmd = self._generator.create_task_command(
400
            name, config_id, target_id, scanner_id, alert_ids, comment)
401
        return self.send_command(cmd)
402
403
    def create_user(self, name, password, copy='', hosts_allow='0',
404
                    ifaces_allow='0', role_ids=(), hosts=None, ifaces=None):
405
        cmd = self._generator.create_user_command(
406
            name, password, copy, hosts_allow, ifaces_allow, role_ids, hosts,
407
            ifaces)
408
        return self.send_command(cmd)
409
410
    def delete_agent(self, **kwargs):
411
        cmd = self._generator.delete_agent_command(kwargs)
412
        return self.send_command(cmd)
413
414
    def delete_alert(self, **kwargs):
415
        cmd = self._generator.delete_alert_command(kwargs)
416
        return self.send_command(cmd)
417
418
    def delete_asset(self, asset_id, ultimate=0):
419
        cmd = self._generator.delete_asset_command(asset_id, ultimate)
420
        return self.send_command(cmd)
421
422
    def delete_config(self, config_id, ultimate=0):
423
        cmd = self._generator.delete_config_command(config_id, ultimate)
424
        return self.send_command(cmd)
425
426
    def delete_credential(self, credential_id, ultimate=0):
427
        cmd = self._generator.delete_credential_command(credential_id, ultimate)
428
        return self.send_command(cmd)
429
430
    def delete_filter(self, filter_id, ultimate=0):
431
        cmd = self._generator.delete_filter_command(filter_id, ultimate)
432
        return self.send_command(cmd)
433
434
    def delete_group(self, group_id, ultimate=0):
435
        cmd = self._generator.delete_group_command(group_id, ultimate)
436
        return self.send_command(cmd)
437
438
    def delete_note(self, note_id, ultimate=0):
439
        cmd = self._generator.delete_note_command(note_id, ultimate)
440
        return self.send_command(cmd)
441
442
    def delete_override(self, override_id, ultimate=0):
443
        cmd = self._generator.delete_override_command(override_id, ultimate)
444
        return self.send_command(cmd)
445
446
    def delete_permission(self, permission_id, ultimate=0):
447
        cmd = self._generator.delete_permission_command(permission_id, ultimate)
448
        return self.send_command(cmd)
449
450
    def delete_port_list(self, port_list_id, ultimate=0):
451
        cmd = self._generator.delete_port_list_command(port_list_id, ultimate)
452
        return self.send_command(cmd)
453
454
    def delete_port_range(self, port_range_id):
455
        cmd = self._generator.delete_port_range_command(port_range_id)
456
        return self.send_command(cmd)
457
458
    def delete_report(self, report_id):
459
        cmd = self._generator.delete_report_command(report_id)
460
        return self.send_command(cmd)
461
462
    def delete_report_format(self, report_format_id, ultimate=0):
463
        cmd = self._generator.delete_report_format_command(
464
            report_format_id, ultimate)
465
        return self.send_command(cmd)
466
467
    def delete_role(self, role_id, ultimate=0):
468
        cmd = self._generator.delete_role_command(role_id, ultimate)
469
        return self.send_command(cmd)
470
471
    def delete_scanner(self, scanner_id, ultimate=0):
472
        cmd = self._generator.delete_scanner_command(scanner_id, ultimate)
473
        return self.send_command(cmd)
474
475
    def delete_schedule(self, schedule_id, ultimate=0):
476
        cmd = self._generator.delete_schedule_command(schedule_id, ultimate)
477
        return self.send_command(cmd)
478
479
    def delete_tag(self, tag_id, ultimate=0):
480
        cmd = self._generator.delete_tag_command(tag_id, ultimate)
481
        return self.send_command(cmd)
482
483
    def delete_target(self, target_id, ultimate=0):
484
        cmd = self._generator.delete_target_command(target_id, ultimate)
485
        return self.send_command(cmd)
486
487
    def delete_task(self, task_id, ultimate=0):
488
        cmd = self._generator.delete_task_command(task_id, ultimate)
489
        return self.send_command(cmd)
490
491
    def delete_user(self, **kwargs):
492
        cmd = self._generator.delete_user_command(kwargs)
493
        return self.send_command(cmd)
494
495
    def describe_auth(self):
496
        cmd = self._generator.describe_auth_command()
497
        return self.send_command(cmd)
498
499
    def empty_trashcan(self):
500
        cmd = self._generator.empty_trashcan_command()
501
        return self.send_command(cmd)
502
503
    def get_agents(self, **kwargs):
504
        cmd = self._generator.get_agents_command(kwargs)
505
        return self.send_command(cmd)
506
507
    def get_aggregates(self, **kwargs):
508
        cmd = self._generator.get_aggregates_command(kwargs)
509
        return self.send_command(cmd)
510
511
    def get_alerts(self, **kwargs):
512
        cmd = self._generator.get_alerts_command(kwargs)
513
        return self.send_command(cmd)
514
515
    def get_assets(self, **kwargs):
516
        cmd = self._generator.get_assets_command(kwargs)
517
        return self.send_command(cmd)
518
519
    def get_credentials(self, **kwargs):
520
        cmd = self._generator.get_credentials_command(kwargs)
521
        return self.send_command(cmd)
522
523
    def get_configs(self, **kwargs):
524
        cmd = self._generator.get_configs_command(kwargs)
525
        return self.send_command(cmd)
526
527
    def get_feeds(self, **kwargs):
528
        cmd = self._generator.get_feeds_command(kwargs)
529
        return self.send_command(cmd)
530
531
    def get_filters(self, **kwargs):
532
        cmd = self._generator.get_filters_command(kwargs)
533
        return self.send_command(cmd)
534
535
    def get_groups(self, **kwargs):
536
        cmd = self._generator.get_groups_command(kwargs)
537
        return self.send_command(cmd)
538
539
    def get_info(self, **kwargs):
540
        cmd = self._generator.get_info_command(kwargs)
541
        return self.send_command(cmd)
542
543
    def get_notes(self, **kwargs):
544
        cmd = self._generator.get_notes_command(kwargs)
545
        return self.send_command(cmd)
546
547
    def get_nvts(self, **kwargs):
548
        cmd = self._generator.get_nvts_command(kwargs)
549
        return self.send_command(cmd)
550
551
    def get_nvt_families(self, **kwargs):
552
        cmd = self._generator.get_nvt_families_command(kwargs)
553
        return self.send_command(cmd)
554
555
    def get_overrides(self, **kwargs):
556
        cmd = self._generator.get_overrides_command(kwargs)
557
        return self.send_command(cmd)
558
559
    def get_permissions(self, **kwargs):
560
        cmd = self._generator.get_permissions_command(kwargs)
561
        return self.send_command(cmd)
562
563
    def get_port_lists(self, **kwargs):
564
        cmd = self._generator.get_port_lists_command(kwargs)
565
        return self.send_command(cmd)
566
567
    def get_preferences(self, **kwargs):
568
        cmd = self._generator.get_preferences_command(kwargs)
569
        return self.send_command(cmd)
570
571
    def get_reports(self, **kwargs):
572
        cmd = self._generator.get_reports_command(kwargs)
573
        return self.send_command(cmd)
574
575
    def get_report_formats(self, **kwargs):
576
        cmd = self._generator.get_report_formats_command(kwargs)
577
        return self.send_command(cmd)
578
579
    def get_results(self, **kwargs):
580
        cmd = self._generator.get_results_command(kwargs)
581
        return self.send_command(cmd)
582
583
    def get_roles(self, **kwargs):
584
        cmd = self._generator.get_roles_command(kwargs)
585
        return self.send_command(cmd)
586
587
    def get_scanners(self, **kwargs):
588
        cmd = self._generator.get_scanners_command(kwargs)
589
        return self.send_command(cmd)
590
591
    def get_schedules(self, **kwargs):
592
        cmd = self._generator.get_schedules_command(kwargs)
593
        return self.send_command(cmd)
594
595
    def get_settings(self, **kwargs):
596
        cmd = self._generator.get_settings_command(kwargs)
597
        return self.send_command(cmd)
598
599
    def get_system_reports(self, **kwargs):
600
        cmd = self._generator.get_system_reports_command(kwargs)
601
        return self.send_command(cmd)
602
603
    def get_tags(self, **kwargs):
604
        cmd = self._generator.get_tags_command(kwargs)
605
        return self.send_command(cmd)
606
607
    def get_targets(self, **kwargs):
608
        cmd = self._generator.get_targets_command(kwargs)
609
        return self.send_command(cmd)
610
611
    def get_tasks(self, **kwargs):
612
        cmd = self._generator.get_tasks_command(kwargs)
613
        return self.send_command(cmd)
614
615
    def get_users(self, **kwargs):
616
        cmd = self._generator.get_users_command(kwargs)
617
        return self.send_command(cmd)
618
619
    def get_version(self):
620
        cmd = self._generator.get_version_command()
621
        return self.send_command(cmd)
622
623
    def help(self, **kwargs):
624
        cmd = self._generator.help_command(kwargs)
625
        return self.send_command(cmd)
626
627
    def modify_agent(self, agent_id, name='', comment=''):
628
        cmd = self._generator.modify_agent_command(agent_id, name, comment)
629
        return self.send_command(cmd)
630
631
    def modify_alert(self, alert_id, **kwargs):
632
        cmd = self._generator.modify_alert_command(alert_id, kwargs)
633
        return self.send_command(cmd)
634
635
    def modify_asset(self, asset_id, comment):
636
        cmd = self._generator.modify_asset_command(asset_id, comment)
637
        return self.send_command(cmd)
638
639
    def modify_auth(self, group_name, auth_conf_settings):
640
        cmd = self._generator.modify_auth_command(group_name,
641
                                                  auth_conf_settings)
642
        return self.send_command(cmd)
643
644
    def modify_config(self, selection, **kwargs):
645
        cmd = self._generator.modify_config_command(selection, kwargs)
646
        return self.send_command(cmd)
647
648
    def modify_credential(self, credential_id, **kwargs):
649
        cmd = self._generator.modify_credential_command(
650
            credential_id, kwargs)
651
        return self.send_command(cmd)
652
653
    def modify_filter(self, filter_id, **kwargs):
654
        cmd = self._generator.modify_filter_command(filter_id, kwargs)
655
        return self.send_command(cmd)
656
657
    def modify_group(self, group_id, **kwargs):
658
        cmd = self._generator.modify_group_command(group_id, kwargs)
659
        return self.send_command(cmd)
660
661
    def modify_note(self, note_id, text, **kwargs):
662
        cmd = self._generator.modify_note_command(note_id, text, kwargs)
663
        return self.send_command(cmd)
664
665
    def modify_override(self, override_id, text, **kwargs):
666
        cmd = self._generator.modify_override_command(override_id, text,
667
                                                      kwargs)
668
        return self.send_command(cmd)
669
670
    def modify_permission(self, permission_id, **kwargs):
671
        cmd = self._generator.modify_permission_command(
672
            permission_id, kwargs)
673
        return self.send_command(cmd)
674
675
    def modify_port_list(self, port_list_id, **kwargs):
676
        cmd = self._generator.modify_port_list_command(port_list_id, kwargs)
677
        return self.send_command(cmd)
678
679
    def modify_report(self, report_id, comment):
680
        cmd = self._generator.modify_report_format_command(report_id, comment)
681
        return self.send_command(cmd)
682
683
    def modify_report_format(self, report_format_id, **kwargs):
684
        cmd = self._generator.modify_report_format_command(report_format_id,
685
                                                           kwargs)
686
        return self.send_command(cmd)
687
688
    def modify_role(self, role_id, **kwargs):
689
        cmd = self._generator.modify_role_command(role_id, kwargs)
690
        return self.send_command(cmd)
691
692
    def modify_scanner(self, scanner_id, host, port, scanner_type, **kwargs):
693
        cmd = self._generator.modify_scanner_command(scanner_id, host, port,
694
                                                     scanner_type, kwargs)
695
        return self.send_command(cmd)
696
697
    def modify_schedule(self, schedule_id, **kwargs):
698
        cmd = self._generator.modify_schedule_command(schedule_id, kwargs)
699
        return self.send_command(cmd)
700
701
    def modify_setting(self, setting_id, name, value):
702
        cmd = self._generator.modify_setting_command(setting_id, name, value)
703
        return self.send_command(cmd)
704
705
    def modify_tag(self, tag_id, **kwargs):
706
        cmd = self._generator.modify_tag_command(tag_id, kwargs)
707
        return self.send_command(cmd)
708
709
    def modify_target(self, target_id, **kwargs):
710
        cmd = self._generator.modify_target_command(target_id, kwargs)
711
        return self.send_command(cmd)
712
713
    def modify_task(self, task_id, **kwargs):
714
        cmd = self._generator.modify_task_command(task_id, kwargs)
715
        return self.send_command(cmd)
716
717
    def modify_user(self, **kwargs):
718
        cmd = self._generator.modify_user_command(kwargs)
719
        return self.send_command(cmd)
720
721
    def move_task(self, task_id, slave_id):
722
        cmd = self._generator.move_task_command(task_id, slave_id)
723
        return self.send_command(cmd)
724
725
    def restore(self, entity_id):
726
        cmd = self._generator.restore_command(entity_id)
727
        return self.send_command(cmd)
728
729
    def resume_task(self, task_id):
730
        cmd = self._generator.resume_task_command(task_id)
731
        return self.send_command(cmd)
732
733
    def start_task(self, task_id):
734
        cmd = self._generator.start_task_command(task_id)
735
        return self.send_command(cmd)
736
737
    def stop_task(self, task_id):
738
        cmd = self._generator.stop_task_command(task_id)
739
        return self.send_command(cmd)
740
741
    def sync_cert(self):
742
        cmd = self._generator.sync_cert_command()
743
        return self.send_command(cmd)
744
745
    def sync_config(self):
746
        cmd = self._generator.sync_config_command()
747
        return self.send_command(cmd)
748
749
    def sync_feed(self):
750
        cmd = self._generator.sync_feed_command()
751
        return self.send_command(cmd)
752
753
    def sync_scap(self):
754
        cmd = self._generator.sync_scap_command()
755
        return self.send_command(cmd)
756
757
    def test_alert(self, alert_id):
758
        cmd = self._generator.test_alert_command(alert_id)
759
        return self.send_command(cmd)
760
761
    def verify_agent(self, agent_id):
762
        cmd = self._generator.verify_agent_command(agent_id)
763
        return self.send_command(cmd)
764
765
    def verify_report_format(self, report_format_id):
766
        cmd = self._generator.verify_report_format_command(report_format_id)
767
        return self.send_command(cmd)
768
769
    def verify_scanner(self, scanner_id):
770
        cmd = self._generator.verify_scanner_command(scanner_id)
771
        return self.send_command(cmd)
772