Completed
Push — master ( 47f60b...3ed0e8 )
by Juan José
17s queued 11s
created

gvm.protocols.gmpv7.Gmp.get_setting()   A

Complexity

Conditions 1

Size

Total Lines 12
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 4
nop 2
dl 0
loc 12
rs 10
c 0
b 0
f 0
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
# pylint: disable=too-many-lines,redefined-builtin
20
"""
21
Module for communication with gvmd in Greenbone Management Protocol version 7
22
"""
23
import logging
24
25
from lxml import etree
26
27
from gvm.errors import InvalidArgument, RequiredArgument
28
from gvm.utils import get_version_string
29
from gvm.xml import _GmpCommandFactory as GmpCommandFactory, XmlCommand
30
31
from .base import GvmProtocol
32
33
logger = logging.getLogger(__name__)
34
35
PROTOCOL_VERSION = (7,)
36
37
FILTER_TYPES = [
38
    'agent',
39
    'alert',
40
    'asset',
41
    'config',
42
    'credential',
43
    'filter',
44
    'group',
45
    'note',
46
    'override',
47
    'permission',
48
    'port_list',
49
    'report',
50
    'report_format',
51
    'result',
52
    'role',
53
    'schedule',
54
    'secinfo',
55
    'tag',
56
    'target',
57
    'task',
58
    'user',
59
]
60
61
TIME_UNITS = [
62
    'second',
63
    'minute',
64
    'hour',
65
    'day',
66
    'week',
67
    'month',
68
    'year',
69
    'decade',
70
]
71
72
73
def _check_command_status(xml):
74
    """Check gmp response
75
76
    Look into the gmp response and check for the status in the root element
77
78
    Arguments:
79
        xml {string} -- XML-Source
80
81
    Returns:
82
        bool -- True if valid, otherwise False
83
    """
84
85
    if xml is 0 or xml is None:
86
        logger.error('XML Command is empty')
87
        return False
88
89
    try:
90
        parser = etree.XMLParser(encoding='utf-8', recover=True)
91
92
        root = etree.XML(xml, parser=parser)
93
        status = root.attrib['status']
94
        return status is not None and status[0] == '2'
95
96
    except etree.Error as e:
97
        logger.error('etree.XML(xml): %s', e)
98
        return False
99
100
101
def _to_bool(value):
102
    return '1' if value else '0'
103
104
105
def _add_filter(cmd, filter, filter_id):
106
    if filter:
107
        cmd.set_attribute('filter', filter)
108
109
    if filter_id:
110
        cmd.set_attribute('filt_id', filter_id)
111
112
113
class Gmp(GvmProtocol):
0 ignored issues
show
best-practice introduced by
Too many public methods (153/30)
Loading history...
114
    """Python interface for Greenbone Management Protocol
115
116
    This class implements the `Greenbone Management Protocol version 7`_
117
118
    Attributes:
119
        connection (:class:`gvm.connections.GvmConnection`): Connection to use
120
            to talk with the gvmd daemon. See :mod:`gvm.connections` for
121
            possible connection types.
122
        transform (`callable`_, optional): Optional transform callable to
123
            convert response data. After each request the callable gets passed
124
            the plain response data which can be used to check the data and/or
125
            conversion into different representaitions like a xml dom.
126
127
            See :mod:`gvm.transforms` for existing transforms.
128
129
    .. _Greenbone Management Protocol version 7:
130
        https://docs.greenbone.net/API/GMP/gmp-7.0.html
131
    .. _callable:
132
        https://docs.python.org/3.6/library/functions.html#callable
133
    """
134
135
    def __init__(self, connection, transform=None):
136
        super().__init__(connection, transform)
137
138
        # Is authenticated on gvmd
139
        self._authenticated = False
140
141
        # GMP Message Creator
142
        self._generator = GmpCommandFactory()
143
144
    @staticmethod
145
    def get_protocol_version():
146
        """Allow to determine the Greenbone Management Protocol version.
147
148
            Returns:
149
                str: Implemented version of the Greenbone Management Protocol
150
        """
151
        return get_version_string(PROTOCOL_VERSION)
152
153
    def is_authenticated(self):
154
        """Checks if the user is authenticated
155
156
        If the user is authenticated privilged GMP commands like get_tasks
157
        may be send to gvmd.
158
159
        Returns:
160
            bool: True if an authenticated connection to gvmd has been
161
            established.
162
        """
163
        return self._authenticated
164
165
    def authenticate(self, username, password):
166
        """Authenticate to gvmd.
167
168
        The generated authenticate command will be send to server.
169
        Afterwards the response is read, transformed and returned.
170
171
        Arguments:
172
            username (str): Username
173
            password (str): Password
174
175
        Returns:
176
            any, str by default: Transformed response from server.
177
        """
178
        cmd = XmlCommand('authenticate')
179
180
        if not username:
181
            raise RequiredArgument('authenticate requires username')
182
183
        if not password:
184
            raise RequiredArgument('authenticate requires password')
185
186
        credentials = cmd.add_element('credentials')
187
        credentials.add_element('username', username)
188
        credentials.add_element('password', password)
189
190
        self._send(cmd.to_string())
191
        response = self._read()
192
193
        if _check_command_status(response):
194
            self._authenticated = True
195
196
        return self._transform(response)
197
198
    def create_agent(self, installer, signature, name, comment=None,
199
                     howto_install=None, howto_use=None):
200
        """Create a new agent
201
202
        Arguments:
203
            installer (str): A base64 encoded file that installs the agent on a
204
                target machine
205
            signature: (str): A detached OpenPGP signature of the installer
206
            name (str): A name for the agent
207
            comment (str, optional): A comment for the agent
208
            howto_install (str, optional): A file that describes how to install
209
                the agent
210
            howto_use (str, optional): A file that describes how to use the
211
                agent
212
213
        Returns:
214
            The response. See :py:meth:`send_command` for details.
215
        """
216
        if not name:
217
            raise RequiredArgument('create_agent requires name argument')
218
219
        if not installer:
220
            raise RequiredArgument('create_agent requires installer argument')
221
222
        if not signature:
223
            raise RequiredArgument('create_agent requires signature argument')
224
225
        cmd = XmlCommand('create_agent')
226
        cmd.add_element('installer', installer)
227
        cmd.add_element('signature', signature)
228
        cmd.add_element('name', name)
229
230
        if comment:
231
            cmd.add_element('comment', comment)
232
233
        if howto_install:
234
            cmd.add_element('howto_install', howto_install)
235
236
        if howto_use:
237
            cmd.add_element('howto_use', howto_use)
238
239
        return self._send_xml_command(cmd)
240
241
    def clone_agent(self, agent_id):
242
        """Clone an existing agent
243
244
        Arguments:
245
            copy (str): UUID of an existing agent to clone from
246
247
        Returns:
248
            The response. See :py:meth:`send_command` for details.
249
        """
250
        cmd = XmlCommand('create_agent')
251
        cmd.add_element('copy', agent_id)
252
        return self._send_xml_command(cmd)
253
254
    def create_alert(self, name, condition, event, method, method_data=None,
0 ignored issues
show
Comprehensibility introduced by
This function exceeds the maximum number of variables (18/15).
Loading history...
255
                     event_data=None, condition_data=None, filter_id=None,
256
                     comment=None):
257
        """Create a new alert
258
259
        Arguments:
260
            name (str): Name of the new Alert
261
            condition (str): The condition that must be satisfied for the alert
262
                to occur.
263
            event (str): The event that must happen for the alert to occur
264
            method (str): The method by which the user is alerted
265
            condition_data (dict, optional): Data that defines the condition
266
            event_data (dict, optional): Data that defines the event
267
            method_data (dict, optional): Data that defines the method
268
            filter_id (str, optional): Filter to apply when executing alert
269
            comment (str, optional): Comment for the alert
270
271
        Returns:
272
            The response. See :py:meth:`send_command` for details.
273
        """
274
        if not name:
275
            raise RequiredArgument('create_alert requires name argument')
276
277
        if condition is None or len(condition) == 0:
278
            raise RequiredArgument('create_alert requires condition argument')
279
280
        if event is None or len(event) == 0:
281
            raise RequiredArgument('create_alert requires event argument')
282
283
        cmd = XmlCommand('create_alert')
284
        cmd.add_element('name', name)
285
286
        conditions = cmd.add_element('condition', condition)
287
288
        if not condition_data is None:
289
            for value, key in condition_data.items():
290
                _data = conditions.add_element('data', value)
291
                _data.add_element('name', key)
292
293
        events = cmd.add_element('event', event)
294
295
        if not event_data is None:
296
            for value, key in event_data.items():
297
                _data = events.add_element('data', value)
298
                _data.add_element('name', key)
299
300
        methods = cmd.add_element('method', method)
301
302
        if not method_data is None:
303
            for value, key in method_data.items():
304
                _data = methods.add_element('data', value)
305
                _data.add_element('name', key)
306
307
        if filter_id:
308
            cmd.add_element('filter', attrs={'id': filter_id})
309
310
        if comment:
311
            cmd.add_element('comment', comment)
312
313
        return self._send_xml_command(cmd)
314
315
    def clone_alert(self, alert_id):
316
        """Clone an existing alert
317
318
        Arguments:
319
            copy (str): UUID of an existing alert to clone from
320
321
        Returns:
322
            The response. See :py:meth:`send_command` for details.
323
        """
324
        cmd = XmlCommand('create_alert')
325
        cmd.add_element('copy', alert_id)
326
        return self._send_xml_command(cmd)
327
328
    def create_asset(self, name, asset_type, comment=None):
329
        """Create a new asset
330
331
        Arguments:
332
            name (str): Name for the new asset
333
            asset_type (str): Either 'os' or 'host'
334
            comment (str, optional): Comment for the new asset
335
336
        Returns:
337
            The response. See :py:meth:`send_command` for details.
338
        """
339
        if asset_type not in ('host', 'os'):
340
            raise InvalidArgument(
341
                'create_asset requires asset_type to be either host or os')
342
343
        if not name:
344
            raise RequiredArgument('create_asset requires name argument')
345
346
        cmd = XmlCommand('create_asset')
347
        asset = cmd.add_element('asset')
348
        asset.add_element('type', asset_type)
349
        asset.add_element('name', name)
350
351
        if comment:
352
            asset.add_element('comment', comment)
353
354
        return self._send_xml_command(cmd)
355
356
    def create_config(self, name, copy):
357
        """Create a new scan config from an existing one
358
359
        Arguments:
360
            name (str): Name of the new scan config
361
            copy (str): UUID of the existing scan config
362
363
        Returns:
364
            The response. See :py:meth:`send_command` for details.
365
        """
366
        if not name:
367
            raise RequiredArgument('create_config requires name argument')
368
369
        if not copy:
370
            raise RequiredArgument('create_config requires copy argument')
371
372
        cmd = XmlCommand('create_config')
373
        cmd.add_element('copy', copy)
374
        cmd.add_element('name', name)
375
        return self._send_xml_command(cmd)
376
377
    def create_credential(self, name, comment=None, allow_insecure=False,
0 ignored issues
show
Comprehensibility introduced by
This function exceeds the maximum number of variables (18/15).
Loading history...
378
                          certificate=None, key_phrase=None, private_key=None,
379
                          login=None, password=None, auth_algorithm=None,
380
                          community=None, privacy_algorithm=None,
381
                          privacy_password=None, credential_type=None):
382
        """Create a new credential
383
384
        Arguments:
385
            name (str): Name of the new credential
386
            comment (str, optional): Comment for the credential
387
            allow_insecure (boolean, optional): Whether to allow insecure use of
388
                the credential
389
            certificate (str, optional): Certificate for the credential
390
            key_phrase (str, optional): Key passphrase for the private key
391
            private_key (str, optional): Private key to use for login
392
            login (str, optional): Username for the credential
393
            password (str, optional): Password for the credential
394
            community (str, optional): The SNMP community
395
            privacy_alogorithm (str, optional): The SNMP privacy algorithm,
396
                either aes or des.
397
            privacy_password (str, optional): The SNMP privacy password
398
            credential_type (str, optional): The credential type. One of 'cc',
399
                'snmp', 'up', 'usk'
400
401
        Returns:
402
            The response. See :py:meth:`send_command` for details.
403
        """
404
        if not name:
405
            raise RequiredArgument('create_credential requires name argument')
406
407
        cmd = XmlCommand('create_credential')
408
        cmd.add_element('name', name)
409
410
        if comment:
411
            cmd.add_element('comment', comment)
412
413
        if allow_insecure:
414
            cmd.add_element('allow_insecure', '1')
415
416
        if certificate:
417
            cmd.add_element('certificate', certificate)
418
419
        if not key_phrase is None and private_key:
420
            _xmlkey = cmd.add_element('key')
421
            _xmlkey.add_element('phrase', key_phrase)
422
            _xmlkey.add_element('private', private_key)
423
424
        if login:
425
            cmd.add_element('login', login)
426
427
        if password:
428
            cmd.add_element('password', password)
429
430
        if auth_algorithm:
431
            if auth_algorithm not in ('md5', 'sha1'):
432
                raise InvalidArgument(
433
                    'create_credential requires auth_algorithm to be either '
434
                    'md5 or sha1')
435
            cmd.add_element('auth_algorithm', auth_algorithm)
436
437
        if community:
438
            cmd.add_element('community', community)
439
440
        if privacy_algorithm and privacy_password:
441
            if privacy_algorithm not in ('aes', 'des'):
442
                raise InvalidArgument(
443
                    'create_credential requires algorithm to be either aes or '
444
                    'des')
445
            _xmlprivacy = cmd.add_element('privacy')
446
            _xmlprivacy.add_element('algorithm', privacy_algorithm)
447
            _xmlprivacy.add_element('password', privacy_password)
448
449
        if credential_type:
450
            if credential_type not in ('cc', 'snmp', 'up', 'usk'):
451
                raise InvalidArgument(
452
                    'create_credential requires type to be either cc, snmp, up '
453
                    ' or usk')
454
            cmd.add_element('type', credential_type)
455
456
        return self._send_xml_command(cmd)
457
458
    def clone_credential(self, credential_id):
459
        """Clone an existing credential
460
461
        Arguments:
462
            copy (str): UUID of an existing credential to clone from
463
464
        Returns:
465
            The response. See :py:meth:`send_command` for details.
466
        """
467
        cmd = XmlCommand('create_credential')
468
        cmd.add_element('copy', credential_id)
469
        return self._send_xml_command(cmd)
470
471
    def create_filter(self, name, make_unique=False, filter_type=None,
472
                      comment=None, term=None):
473
        """Create a new filter
474
475
        Arguments:
476
            name (str): Name of the new filter
477
            make_unique (boolean, optional):
478
            filter_type (str, optional): Filter for entity type
479
            comment (str, optional): Comment for the filter
480
            term (str, optional): Filter term e.g. 'name=foo'
481
482
        Returns:
483
            The response. See :py:meth:`send_command` for details.
484
        """
485
        if not name:
486
            raise RequiredArgument('create_filter requires a name argument')
487
488
        cmd = XmlCommand('create_filter')
489
        _xmlname = cmd.add_element('name', name)
490
        if make_unique:
491
            _xmlname.add_element('make_unique', '1')
492
493
        if comment:
494
            cmd.add_element('comment', comment)
495
496
        if term:
497
            cmd.add_element('term', term)
498
499
        if filter_type:
500
            filter_type = filter_type.lower()
501
            if filter_type not in FILTER_TYPES:
502
                raise InvalidArgument(
503
                    'create_filter requires type to be one of {0} but '
504
                    'was {1}'.format(', '.join(FILTER_TYPES), filter_type))
505
            cmd.add_element('type', filter_type)
506
507
        return self._send_xml_command(cmd)
508
509
    def clone_filter(self, filter_id):
510
        """Clone an existing filter
511
512
        Arguments:
513
            copy (str): UUID of an existing filter to clone from
514
515
        Returns:
516
            The response. See :py:meth:`send_command` for details.
517
        """
518
        cmd = XmlCommand('create_filter')
519
        cmd.add_element('copy', filter_id)
520
        return self._send_xml_command(cmd)
521
522
    def create_group(self, name, comment=None, special=False, users=None):
523
        """Create a new group
524
525
        Arguments:
526
            name (str): Name of the new group
527
            comment (str, optional): Comment for the group
528
            special (boolean, optional): Create permission giving members full
529
                access to each other's entities
530
            users (list, optional): List of user names to be in the group
531
532
        Returns:
533
            The response. See :py:meth:`send_command` for details.
534
        """
535
        if not name:
536
            raise RequiredArgument('create_group requires a name argument')
537
538
        cmd = XmlCommand('create_group')
539
        cmd.add_element('name', name)
540
541
        if comment:
542
            cmd.add_element('comment', comment)
543
544
        if special:
545
            _xmlspecial = cmd.add_element('specials')
546
            _xmlspecial.add_element('full')
547
548
        if users:
549
            cmd.add_element('users', ','.join(users))
550
551
        return self._send_xml_command(cmd)
552
553
    def clone_group(self, group_id):
554
        """Clone an existing group
555
556
        Arguments:
557
            copy (str): UUID of an existing group to clone from
558
559
        Returns:
560
            The response. See :py:meth:`send_command` for details.
561
        """
562
        cmd = XmlCommand('create_group')
563
        cmd.add_element('copy', group_id)
564
        return self._send_xml_command(cmd)
565
566
    def create_note(self, text, nvt_oid, seconds_active=None, comment=None,
567
                    hosts=None, result_id=None, severity=None, task_id=None,
568
                    threat=None, port=None):
569
        """Create a new note
570
571
        Arguments:
572
            text (str): Text of the new note
573
            nvt_id (str): OID of the nvt to which note applies
574
            seconds_active (int, optional): Seconds note will be active. -1 on
575
                always, 0 off
576
            comment (str, optional): Comment for the note
577
            hosts (list, optional): A list of hosts addresses
578
            port (str, optional): Port to which the note applies
579
            result_id (str, optional): UUID of a result to which note applies
580
            severity (decimal, optional): Severity to which note applies
581
            task_id (str, optional): UUID of task to which note applies
582
            threat (str, optional): Threat level to which note applies. Will be
583
                converted to severity
584
585
        Returns:
586
            The response. See :py:meth:`send_command` for details.
587
        """
588
        if not text:
589
            raise RequiredArgument('create_note requires a text argument')
590
591
        if not nvt_oid:
592
            raise RequiredArgument('create_note requires a nvt_oid argument')
593
594
        cmd = XmlCommand('create_note')
595
        cmd.add_element('text', text)
596
        cmd.add_element('nvt', attrs={"oid": nvt_oid})
597
598
        if not seconds_active is None:
599
            cmd.add_element('active', str(seconds_active))
600
601
        if comment:
602
            cmd.add_element('comment', comment)
603
604
        if hosts:
605
            cmd.add_element('hosts', ', '.join(hosts))
606
607
        if port:
608
            cmd.add_element('port', port)
609
610
        if result_id:
611
            cmd.add_element('result', attrs={'id': result_id})
612
613
        if severity:
614
            cmd.add_element('severity', severity)
615
616
        if task_id:
617
            cmd.add_element('task', attrs={'id': task_id})
618
619
        if threat:
620
            cmd.add_element('threat', threat)
621
622
        return self._send_xml_command(cmd)
623
624
    def clone_note(self, note_id):
625
        """Clone an existing note
626
627
        Arguments:
628
            copy (str): UUID of an existing note to clone from
629
630
        Returns:
631
            The response. See :py:meth:`send_command` for details.
632
        """
633
        cmd = XmlCommand('create_note')
634
        cmd.add_element('copy', note_id)
635
        return self._send_xml_command(cmd)
636
637 View Code Duplication
    def create_override(self, text, nvt_oid, seconds_active=None, hosts=None,
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
638
                        port=None, result_id=None, severity=None, comment=None,
639
                        new_severity=None, task_id=None, threat=None,
640
                        new_threat=None):
641
        """Create a new override
642
643
        Arguments:
644
            text (str): Text of the new override
645
            nvt_id (str): OID of the nvt to which override applies
646
            seconds_active (int, optional): Seconds override will be active.
647
                -1 on always, 0 off
648
            comment (str, optional): Comment for the override
649
            hosts (list, optional): A list of host addresses
650
            port (str, optional): Port ot which the override applies
651
            result_id (str, optional): UUID of a result to which override
652
                applies
653
            severity (decimal, optional): Severity to which override applies
654
            new_severity (decimal, optional): New severity for result
655
            task_id (str, optional): UUID of task to which override applies
656
            threat (str, optional): Threat level to which override applies. Will
657
                be converted to severity
658
            new_threat (str, optional): New threat level for result, will be
659
                converted to a new_severity
660
661
        Returns:
662
            The response. See :py:meth:`send_command` for details.
663
        """
664
        if not text:
665
            raise RequiredArgument('create_override requires a text argument')
666
667
        if not nvt_oid:
668
            raise RequiredArgument('create_override requires a nvt_oid '
669
                                   'argument')
670
671
        cmd = XmlCommand('create_override')
672
        cmd.add_element('text', text)
673
        cmd.add_element('nvt', attrs={'oid': nvt_oid})
674
675
        if not seconds_active is None:
676
            cmd.add_element('active', str(seconds_active))
677
678
        if comment:
679
            cmd.add_element('comment', comment)
680
681
        if hosts:
682
            cmd.add_element('hosts', ', '.join(hosts))
683
684
        if port:
685
            cmd.add_element('port', port)
686
687
        if result_id:
688
            cmd.add_element('result', attrs={'id': result_id})
689
690
        if severity:
691
            cmd.add_element('severity', severity)
692
693
        if new_severity:
694
            cmd.add_element('new_severity', new_severity)
695
696
        if task_id:
697
            cmd.add_element('task', attrs={'id': task_id})
698
699
        if threat:
700
            cmd.add_element('threat', threat)
701
702
        if new_threat:
703
            cmd.add_element('new_threat', new_threat)
704
705
        return self._send_xml_command(cmd)
706
707
    def clone_override(self, override_id):
708
        """Clone an existing override
709
710
        Arguments:
711
            copy (str): UUID of an existing override to clone from
712
713
        Returns:
714
            The response. See :py:meth:`send_command` for details.
715
        """
716
        cmd = XmlCommand('create_override')
717
        cmd.add_element('copy', override_id)
718
        return self._send_xml_command(cmd)
719
720 View Code Duplication
    def create_permission(self, name, subject_id, subject_type,
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
721
                          resource_id=None, resource_type=None,
722
                          comment=None):
723
        """Create a new permission
724
725
        Arguments:
726
            name (str): Name of the new permission
727
            subject_id (str): UUID of subject to whom the permission is granted
728
            subject_type (str): Type of the subject user, group or role
729
            comment (str, optional): Comment for the permission
730
            resource_id (str, optional): UUID of entity to which the permission
731
                applies
732
            resource_type (str, optional): Type of the resource. For Super
733
                permissions user, group or role
734
735
        Returns:
736
            The response. See :py:meth:`send_command` for details.
737
        """
738
        if not name:
739
            raise RequiredArgument('create_permission requires a name argument')
740
741
        if not subject_id:
742
            raise RequiredArgument(
743
                'create_permission requires a subject_id argument')
744
745
        if subject_type not in ('user', 'group', 'role'):
746
            raise InvalidArgument(
747
                'create_permission requires subject_type to be either user, '
748
                'group or role')
749
750
        cmd = XmlCommand('create_permission')
751
        cmd.add_element('name', name)
752
753
        _xmlsubject = cmd.add_element('subject', attrs={'id': subject_id})
754
        _xmlsubject.add_element('type', type)
755
756
        if comment:
757
            cmd.add_element('comment', comment)
758
759
        if resource_id and resource_type:
760
            _xmlresource = cmd.add_element('resource',
761
                                           attrs={'id': resource_id})
762
            _xmlresource.add_element('type', resource_type)
763
764
765
        return self._send_xml_command(cmd)
766
767
    def clone_permission(self, permission_id):
768
        """Clone an existing permission
769
770
        Arguments:
771
            copy (str): UUID of an existing permission to clone from
772
773
        Returns:
774
            The response. See :py:meth:`send_command` for details.
775
        """
776
        cmd = XmlCommand('create_permission')
777
        cmd.add_element('copy', permission_id)
778
        return self._send_xml_command(cmd)
779
780
    def create_port_list(self, name, port_range, comment=None):
781
        """Create a new port list
782
783
        Arguments:
784
            name (str): Name of the new port list
785
            port_range (str): Port list ranges e.g. `"T: 1-1234"` for tcp port
786
                1 - 1234
787
            comment (str, optional): Comment for the port list
788
789
        Returns:
790
            The response. See :py:meth:`send_command` for details.
791
        """
792
        if not name:
793
            raise RequiredArgument('create_port_list requires a name argument')
794
795
        if not port_range:
796
            raise RequiredArgument(
797
                'create_port_list requires a port_range argument')
798
799
        cmd = XmlCommand('create_port_list')
800
        cmd.add_element('name', name)
801
        cmd.add_element('port_range', port_range)
802
803
        if comment:
804
            cmd.add_element('comment', comment)
805
806
        return self._send_xml_command(cmd)
807
808
    def clone_port_list(self, port_list_id):
809
        """Clone an existing port list
810
811
        Arguments:
812
            copy (str): UUID of an existing port list to clone from
813
814
        Returns:
815
            The response. See :py:meth:`send_command` for details.
816
        """
817
        cmd = XmlCommand('create_port_list')
818
        cmd.add_element('copy', port_list_id)
819
        return self._send_xml_command(cmd)
820
821
    def create_port_range(self, port_list_id, start, end, port_range_type,
822
                          comment=None):
823
        """Create new port range
824
825
        Arguments:
826
            port_list_id (str): UUID of the port list to which to add the range
827
            start (int): The first port in the range
828
            end (int): The last port in the range
829
            type (str): The type of the ports: TCP, UDP, ...
830
            comment (str, optional): Comment for the port range
831
832
        Returns:
833
            The response. See :py:meth:`send_command` for details.
834
        """
835
        if not port_list_id:
836
            raise RequiredArgument('create_port_range requires '
837
                                   'a port_list_id argument')
838
839
        if not port_range_type:
840
            raise RequiredArgument(
841
                'create_port_range requires a port_range_type argument')
842
843
        if not start:
844
            raise RequiredArgument(
845
                'create_port_range requires a start argument')
846
847
        if not end:
848
            raise RequiredArgument(
849
                'create_port_range requires a end argument')
850
851
        cmd = XmlCommand('create_port_range')
852
        cmd.add_element('port_list', attrs={'id': port_list_id})
853
        cmd.add_element('start', start)
854
        cmd.add_element('end', end)
855
        cmd.add_element('type', port_range_type)
856
857
        if comment:
858
            cmd.add_element('comment', comment)
859
860
        return self._send_xml_command(cmd)
861
862
    def import_report(self, report, task_id=None, task_name=None,
863
                      task_comment=None, in_assets=None):
864
        """Import a Report
865
866
        Arguments:
867
            report (str): Report XML as string to import
868
            task_id (str, optional): UUID of task to import report to
869
            task_name (str, optional): Name of task to be createed if task_id is
870
                not present. Either task_id or task_name must be passed
871
            task_comment (str, optional): Comment for task to be created if
872
                task_id is not present
873
            in_asset (boolean, optional): Whether to create or update assets
874
                using the report
875
876
        Returns:
877
            The response. See :py:meth:`send_command` for details.
878
        """
879
        if not report:
880
            raise RequiredArgument('create_report requires a report argument')
881
882
        cmd = XmlCommand('create_report')
883
884
        if task_id:
885
            cmd.add_element('task', attrs={'id': task_id})
886
        elif task_name:
887
            _xmltask = cmd.add_element('task')
888
            _xmltask.add_element('name', task_name)
889
890
            if task_comment:
891
                _xmltask.add_element('comment', task_comment)
892
        else:
893
            raise RequiredArgument(
894
                'import_report requires a task_id or task_name argument')
895
896
        if not in_assets is None:
897
            if in_assets:
898
                cmd.add_element('in_assets', '1')
899
            else:
900
                cmd.add_element('in_assets', '0')
901
        try:
902
            cmd.append_xml_str(report)
903
        except etree.XMLSyntaxError as e:
904
            raise InvalidArgument(
905
                'Invalid xml passed as report to import_report', e)
906
907
        return self._send_xml_command(cmd)
908
909
    def create_role(self, name, comment=None, users=None):
910
        """Create a new role
911
912
        Arguments:
913
            name (str): Name of the role
914
            comment (str, optional): Comment for the role
915
            users (list, optional): List of user names to add to the role
916
917
        Returns:
918
            The response. See :py:meth:`send_command` for details.
919
        """
920
921
        if not name:
922
            raise RequiredArgument('create_role requires a name argument')
923
924
        cmd = XmlCommand('create_role')
925
        cmd.add_element('name', name)
926
927
        if comment:
928
            cmd.add_element('comment', comment)
929
930
        if users:
931
            cmd.add_element('users', ",".join(users))
932
933
        return self._send_xml_command(cmd)
934
935
    def clone_role(self, role_id):
936
        """Clone an existing role
937
938
        Arguments:
939
            copy (str): UUID of an existing role to clone from
940
941
        Returns:
942
            The response. See :py:meth:`send_command` for details.
943
        """
944
        cmd = XmlCommand('create_role')
945
        cmd.add_element('copy', role_id)
946
        return self._send_xml_command(cmd)
947
948
    def create_scanner(self, name, host, port, scanner_type, ca_pub,
949
                       credential_id, comment=None):
950
        """Create a new scanner
951
952
        Arguments:
953
            name (str): Name of the scanner
954
            host (str): The host of the scanner
955
            port (str): The port of the scanner
956
            scanner_type (str): The type of the scanner
957
            ca_pub (str): Certificate of CA to verify scanner certificate
958
            credential_id (str): UUID of client certificate credential for the
959
                scanner
960
            comment (str, optional): Comment for the scanner
961
962
        Returns:
963
            The response. See :py:meth:`send_command` for details.
964
        """
965
        if not name:
966
            raise RequiredArgument('create_scanner requires a name argument')
967
968
        if not host:
969
            raise RequiredArgument('create_scanner requires a host argument')
970
971
        if not port:
972
            raise RequiredArgument('create_scanner requires a port argument')
973
974
        if not type:
975
            raise RequiredArgument('create_scanner requires a scanner_type '
976
                                   'argument')
977
        if not ca_pub:
978
            raise RequiredArgument('create_scanner requires a ca_pub argument')
979
980
        if not credential_id:
981
            raise RequiredArgument('create_scanner requires a credential_id '
982
                                   'argument')
983
984
        cmd = XmlCommand('create_scanner')
985
        cmd.add_element('name', name)
986
        cmd.add_element('host', host)
987
        cmd.add_element('port', port)
988
        cmd.add_element('type', scanner_type)
989
        cmd.add_element('ca_pub', ca_pub)
990
        cmd.add_element('credential', attrs={'id': str(credential_id)})
991
992
        if comment:
993
            cmd.add_element('comment', comment)
994
995
        return self._send_xml_command(cmd)
996
997
    def clone_scanner(self, scanner_id):
998
        """Clone an existing scanner
999
1000
        Arguments:
1001
            copy (str): UUID of an existing scanner to clone from
1002
1003
        Returns:
1004
            The response. See :py:meth:`send_command` for details.
1005
        """
1006
        cmd = XmlCommand('create_scanner')
1007
        cmd.add_element('copy', scanner_id)
1008
        return self._send_xml_command(cmd)
1009
1010
    def create_schedule(self, name, comment=None, first_time_minute=None,
0 ignored issues
show
Comprehensibility introduced by
This function exceeds the maximum number of variables (18/15).
Loading history...
1011
                        first_time_hour=None, first_time_day_of_month=None,
1012
                        first_time_month=None, first_time_year=None,
1013
                        duration=None, duration_unit=None, period=None,
1014
                        period_unit=None, timezone=None):
1015
        """Create a new schedule
1016
1017
        Arguments:
1018
            name (str): Name of the schedule
1019
            comment (str, optional): Comment for the schedule
1020
            first_time_minute (int, optional): First time minute the schedule
1021
                will run
1022
            first_time_hour (int, optional): First time hour the schedule
1023
                will run
1024
            first_time_day_of_month (int, optional): First time day of month the
1025
                schedule will run
1026
            first_time_month (int, optional): First time month the schedule
1027
                will run
1028
            first_time_year (int, optional): First time year the schedule
1029
                will run
1030
            duration (int, optional): How long the Manager will run the
1031
                scheduled task for until it gets paused if not finished yet.
1032
            duration_unit (str, optional): Unit of the duration. One of second,
1033
                minute, hour, day, week, month, year, decade. Required if
1034
                duration is set.
1035
            period (int, optional): How often the Manager will repeat the
1036
                scheduled task
1037
            period_unit (str, optional): Unit of the period. One of second,
1038
                minute, hour, day, week, month, year, decade. Required if
1039
                period is set.
1040
            timezone (str, optional): The timezone the schedule will follow
1041
1042
        Returns:
1043
            The response. See :py:meth:`send_command` for details.
1044
        """
1045
        if not name:
1046
            raise RequiredArgument('create_schedule requires a name argument')
1047
1048
        cmd = XmlCommand('create_schedule')
1049
        cmd.add_element('name', name)
1050
1051
        if comment:
1052
            cmd.add_element('comment', comment)
1053
1054
        if first_time_minute or first_time_hour or first_time_day_of_month or \
1055
            first_time_month or first_time_year:
1056
1057
            if not first_time_minute:
1058
                raise RequiredArgument(
1059
                    'Setting first_time requires first_time_minute argument')
1060
            if not first_time_hour:
1061
                raise RequiredArgument(
1062
                    'Setting first_time requires first_time_hour argument')
1063
            if not first_time_day_of_month:
1064
                raise RequiredArgument(
1065
                    'Setting first_time requires first_time_day_of_month '
1066
                    'argument')
1067
            if not first_time_month:
1068
                raise RequiredArgument(
1069
                    'Setting first_time requires first_time_month argument')
1070
            if not first_time_year:
1071
                raise RequiredArgument(
1072
                    'Setting first_time requires first_time_year argument')
1073
1074
            _xmlftime = cmd.add_element('first_time')
1075
            _xmlftime.add_element('minute', str(first_time_minute))
1076
            _xmlftime.add_element('hour', str(first_time_hour))
1077
            _xmlftime.add_element('day_of_month', str(first_time_day_of_month))
1078
            _xmlftime.add_element('month', str(first_time_month))
1079
            _xmlftime.add_element('year', str(first_time_year))
1080
1081
        if duration:
1082
            if not duration_unit:
1083
                raise RequiredArgument(
1084
                    'Setting duration requires duration_unit argument')
1085
1086
            if not duration_unit in TIME_UNITS:
1087
                raise InvalidArgument(
1088
                    'duration_unit must be one of {units} but {actual} has '
1089
                    'been passed'.format(
1090
                        units=', '.join(TIME_UNITS), actual=duration_unit))
1091
1092
            _xmlduration = cmd.add_element('duration', str(duration))
1093
            _xmlduration.add_element('unit', duration_unit)
1094
1095
        if period:
1096
            if not period_unit:
1097
                raise RequiredArgument(
1098
                    'Setting period requires period_unit argument')
1099
1100
            if not period_unit in TIME_UNITS:
1101
                raise InvalidArgument(
1102
                    'period_unit must be one of {units} but {actual} has '
1103
                    'been passed'.format(
1104
                        units=', '.join(TIME_UNITS), actual=period_unit))
1105
1106
            _xmlperiod = cmd.add_element('period', str(period))
1107
            _xmlperiod.add_element('unit', period_unit)
1108
1109
        if timezone:
1110
            cmd.add_element('timezone', timezone)
1111
1112
        return self._send_xml_command(cmd)
1113
1114
    def clone_schedule(self, schedule_id):
1115
        """Clone an existing schedule
1116
1117
        Arguments:
1118
            copy (str): UUID of an existing schedule to clone from
1119
1120
        Returns:
1121
            The response. See :py:meth:`send_command` for details.
1122
        """
1123
        cmd = XmlCommand('create_schedule')
1124
        cmd.add_element('copy', schedule_id)
1125
        return self._send_xml_command(cmd)
1126
1127
    def create_tag(self, name, resource_id, resource_type, value=None,
1128
                   comment=None, active=None):
1129
        """Create a new tag
1130
1131
        Arguments:
1132
            name (str): Name of the tag. A full tag name consisting of namespace
1133
                and predicate e.g. `foo:bar`.
1134
            resource_id (str): ID of the resource  the tag is to be attached to.
1135
            resource_type (str): Entity type the tag is to be attached to
1136
            value (str, optional): Value associated with the tag
1137
            comment (str, optional): Comment for the tag
1138
            active (boolean, optional): Whether the tag should be active
1139
1140
        Returns:
1141
            The response. See :py:meth:`send_command` for details.
1142
        """
1143
        cmd = XmlCommand('create_tag')
1144
        cmd.add_element('name', name)
1145
        _xmlresource = cmd.add_element('resource',
1146
                                       attrs={'id': str(resource_id)})
1147
        _xmlresource.add_element('type', resource_type)
1148
1149
        if comment:
1150
            cmd.add_element('comment', comment)
1151
1152
        if value:
1153
            cmd.add_element('value', value)
1154
1155
        if not active is None:
1156
            if active:
1157
                cmd.add_element('active', '1')
1158
            else:
1159
                cmd.add_element('active', '0')
1160
1161
        return self._send_xml_command(cmd)
1162
1163
    def clone_tag(self, tag_id):
1164
        """Clone an existing tag
1165
1166
        Arguments:
1167
            copy (str): UUID of an existing tag to clone from
1168
1169
        Returns:
1170
            The response. See :py:meth:`send_command` for details.
1171
        """
1172
        cmd = XmlCommand('create_tag')
1173
        cmd.add_element('copy', tag_id)
1174
        return self._send_xml_command(cmd)
1175
1176
    def create_target(self, name, make_unique=False, asset_hosts_filter=None,
0 ignored issues
show
best-practice introduced by
Too many arguments (17/15)
Loading history...
Comprehensibility introduced by
This function exceeds the maximum number of variables (21/15).
Loading history...
1177
                      hosts=None, comment=None, exclude_hosts=None,
1178
                      ssh_credential_id=None, ssh_credential_port=None,
1179
                      smb_credential_id=None, esxi_credential_id=None,
1180
                      snmp_credential_id=None, alive_tests=None,
1181
                      reverse_lookup_only=None, reverse_lookup_unify=None,
1182
                      port_range=None, port_list_id=None):
1183
        """Create a new target
1184
1185
        Arguments:
1186
            name (str): Name of the target
1187
            make_unique (boolean, optional): Append a unique suffix if the name
1188
                already exists
1189
            asset_hosts_filter (str, optional): Filter to select target host
1190
                from assets hosts
1191
            hosts (list, optional): List of hosts addresses to scan
1192
            exclude_hosts (list, optional): List of hosts addresses to exclude
1193
                from scan
1194
            comment (str, optional): Comment for the target
1195
            ssh_credential_id (str, optional): UUID of a ssh credential to use
1196
                on target
1197
            ssh_credential_port (str, optional): The port to use for ssh
1198
                credential
1199
            smb_credential_id (str, optional): UUID of a smb credential to use
1200
                on target
1201
            snmp_credential_id (str, optional): UUID of a snmp credential to use
1202
                on target
1203
            esxi_credential_id (str, optional): UUID of a esxi credential to use
1204
                on target
1205
            alive_tests (str, optional): Which alive tests to use
1206
            reverse_lookup_only (boolean, optional): Whether to scan only hosts
1207
                that have names
1208
            reverse_lookup_unify (boolean, optional): Whether to scan only one
1209
                IP when multiple IPs have the same name.
1210
            port_range (str, optional): Port range for the target
1211
            port_list_id (str, optional): UUID of the port list to use on target
1212
1213
        Returns:
1214
            The response. See :py:meth:`send_command` for details.
1215
        """
1216
        if not name:
1217
            raise RequiredArgument('create_target requires a name argument')
1218
1219
        cmd = XmlCommand('create_target')
1220
        _xmlname = cmd.add_element('name', name)
1221
        if make_unique:
1222
            _xmlname.add_element('make_unique', '1')
1223
1224
        if asset_hosts_filter:
1225
            cmd.add_element('asset_hosts',
1226
                            attrs={'filter': str(asset_hosts_filter)})
1227
        elif hosts:
1228
            cmd.add_element('hosts', ', '.join(hosts))
1229
        else:
1230
            raise RequiredArgument('create_target requires either a hosts or '
1231
                                   'an asset_hosts_filter argument')
1232
1233
        if comment:
1234
            cmd.add_element('comment', comment)
1235
1236
        if exclude_hosts:
1237
            cmd.add_element('exclude_hosts', ', '.join(exclude_hosts))
1238
1239
        if ssh_credential_id:
1240
            _xmlssh = cmd.add_element('ssh_credential',
1241
                                      attrs={'id': ssh_credential_id})
1242
            if ssh_credential_port:
1243
                _xmlssh.add_element('port', ssh_credential_port)
1244
1245
        if smb_credential_id:
1246
            cmd.add_element('smb_credential', attrs={'id': smb_credential_id})
1247
1248
        if esxi_credential_id:
1249
            cmd.add_element('esxi_credential', attrs={'id': esxi_credential_id})
1250
1251
        if snmp_credential_id:
1252
            cmd.add_element('snmp_credential', attrs={'id': snmp_credential_id})
1253
1254
        if alive_tests:
1255
            cmd.add_element('alive_tests', alive_tests)
1256
1257
        if not reverse_lookup_only is None:
1258
            if reverse_lookup_only:
1259
                cmd.add_element('reverse_lookup_only', '1')
1260
            else:
1261
                cmd.add_element('reverse_lookup_only', '0')
1262
1263
        if not reverse_lookup_unify is None:
1264
            if reverse_lookup_unify:
1265
                cmd.add_element('reverse_lookup_unify', '1')
1266
            else:
1267
                cmd.add_element('reverse_lookup_unify', '0')
1268
1269
        if port_range:
1270
            cmd.add_element('port_range', port_range)
1271
1272
        if port_list_id:
1273
            cmd.add_element('port_list', attrs={'id': port_list_id})
1274
1275
        return self._send_xml_command(cmd)
1276
1277
    def clone_target(self, target_id):
1278
        """Clone an existing target
1279
1280
        Arguments:
1281
            copy (str): UUID of an existing target to clone from
1282
1283
        Returns:
1284
            The response. See :py:meth:`send_command` for details.
1285
        """
1286
        cmd = XmlCommand('create_target')
1287
        cmd.add_element('copy', target_id)
1288
        return self._send_xml_command(cmd)
1289
1290
    def create_task(self, name, config_id, target_id, scanner_id,
1291
                    alterable=None, hosts_ordering=None, schedule_id=None,
1292
                    alert_ids=None, comment=None, schedule_periods=None,
1293
                    observers=None):
1294
        """Create a new task
1295
1296
        Arguments:
1297
            name (str): Name of the task
1298
            config_id (str): UUID of scan config to use by the task
1299
            target_id (str): UUID of target to be scanned
1300
            scanner_id (str): UUID of scanner to use for scanning the target
1301
            comment (str, optional): Comment for the task
1302
            alterable (boolean, optional): Wether the task should be alterable
1303
            alert_ids (list, optional): List of UUIDs for alerts to be applied
1304
                to the task
1305
            hosts_ordering (str, optional): The order hosts are scanned in
1306
            schedule_id (str, optional): UUID of a schedule when the task should
1307
                be run.
1308
            schedule_periods (int, optional): A limit to the number of times the
1309
                task will be scheduled, or 0 for no limit
1310
            observers (list, optional): List of user names which should be
1311
                allowed to observe this task
1312
1313
        Returns:
1314
            The response. See :py:meth:`send_command` for details.
1315
        """
1316
        if not name:
1317
            raise RequiredArgument('create_task requires a name argument')
1318
1319
        if not config_id:
1320
            raise RequiredArgument('create_task requires a config_id argument')
1321
1322
        if not target_id:
1323
            raise RequiredArgument('create_task requires a target_id argument')
1324
1325
        if not scanner_id:
1326
            raise RequiredArgument('create_task requires a scanner_id argument')
1327
1328
        cmd = XmlCommand('create_task')
1329
        cmd.add_element('name', name)
1330
        cmd.add_element('config', attrs={'id': config_id})
1331
        cmd.add_element('target', attrs={'id': target_id})
1332
        cmd.add_element('scanner', attrs={'id': scanner_id})
1333
1334
        if comment:
1335
            cmd.add_element('comment', comment)
1336
1337
        if not alterable is None:
1338
            if alterable:
1339
                cmd.add_element('alterable', '1')
1340
            else:
1341
                cmd.add_element('alterable', '0')
1342
1343
        if hosts_ordering:
1344
            cmd.add_element('hosts_ordering', hosts_ordering)
1345
1346
        if alert_ids:
1347
            if isinstance(alert_ids, str):
1348
                logger.warning(
1349
                    'Please pass a list as alert_ids parameter to create_task. '
1350
                    'Passing a string is deprecated and will be removed in '
1351
                    'future.')
1352
1353
                #if a single id is given as a string wrap it into a list
1354
                alert_ids = [alert_ids]
1355
            if isinstance(alert_ids, list):
1356
                #parse all given alert id's
1357
                for alert in alert_ids:
1358
                    cmd.add_element('alert', attrs={'id': str(alert)})
1359
1360
        if schedule_id:
1361
            cmd.add_element('schedule', schedule_id)
1362
1363
            if schedule_periods:
1364
                cmd.add_element('schedule_periods', str(schedule_periods))
1365
1366
        if observers:
1367
            cmd.add_element('observers', ' '.join(observers))
1368
1369
        return self._send_xml_command(cmd)
1370
1371
    def clone_task(self, task_id):
1372
        """Clone an existing task
1373
1374
        Arguments:
1375
            task_id (str): UUID of existing task to clone from
1376
1377
        Returns:
1378
            The response. See :py:meth:`send_command` for details.
1379
        """
1380
        cmd = XmlCommand('create_task')
1381
        cmd.add_element('copy', task_id)
1382
        return self._send_xml_command(cmd)
1383
1384
    def create_user(self, name, password=None, hosts=None, hosts_allow=False,
1385
                    ifaces=None, ifaces_allow=False, role_ids=None):
1386
        """Create a new user
1387
1388
        Arguments:
1389
            name (str): Name of the user
1390
            password (str, optional): Password of the user
1391
            hosts (list, optional): A list of host addresses (IPs, DNS names)
1392
            hosts_allow (boolean, optional): If True allow only access to passed
1393
                hosts otherwise deny access. Default is False for deny hosts.
1394
            ifaces (list, optional): A list of interface names
1395
            ifaces_allow (boolean, optional): If True allow only access to
1396
                passed interfaces otherwise deny access. Default is False for
1397
                deny interfaces.
1398
            role_ids (list, optional): A list of role UUIDs for the user
1399
1400
        Returns:
1401
            The response. See :py:meth:`send_command` for details.
1402
        """
1403
        if not name:
1404
            raise RequiredArgument('create_user requires a name argument')
1405
1406
        cmd = XmlCommand('create_user')
1407
        cmd.add_element('name', name)
1408
1409
        if password:
1410
            cmd.add_element('password', password)
1411
1412
        if hosts:
1413
            cmd.add_element('hosts', ', '.join(hosts),
1414
                            attrs={'allow': '1' if hosts_allow else '0'})
1415
1416
        if ifaces:
1417
            cmd.add_element('ifaces', ', '.join(ifaces),
1418
                            attrs={'allow': '1' if ifaces_allow else '0'})
1419
1420
        if role_ids:
1421
            for role in role_ids:
1422
                cmd.add_element('role', attrs={'id': role})
1423
1424
        return self._send_xml_command(cmd)
1425
1426
    def clone_user(self, user_id):
1427
        """Clone an existing user
1428
1429
        Arguments:
1430
            user_id (str): UUID of existing user to clone from
1431
1432
        Returns:
1433
            The response. See :py:meth:`send_command` for details.
1434
        """
1435
        cmd = XmlCommand('create_user')
1436
        cmd.add_element('copy', user_id)
1437
        return self._send_xml_command(cmd)
1438
1439
    def delete_agent(self, **kwargs):
1440
        cmd = self._generator.delete_agent_command(kwargs)
1441
        return self.send_command(cmd)
1442
1443
    def delete_alert(self, **kwargs):
1444
        cmd = self._generator.delete_alert_command(kwargs)
1445
        return self.send_command(cmd)
1446
1447
    def delete_asset(self, asset_id, ultimate=0):
1448
        cmd = self._generator.delete_asset_command(asset_id, ultimate)
1449
        return self.send_command(cmd)
1450
1451
    def delete_config(self, config_id, ultimate=0):
1452
        cmd = self._generator.delete_config_command(config_id, ultimate)
1453
        return self.send_command(cmd)
1454
1455
    def delete_credential(self, credential_id, ultimate=0):
1456
        cmd = self._generator.delete_credential_command(credential_id, ultimate)
1457
        return self.send_command(cmd)
1458
1459
    def delete_filter(self, filter_id, ultimate=0):
1460
        cmd = self._generator.delete_filter_command(filter_id, ultimate)
1461
        return self.send_command(cmd)
1462
1463
    def delete_group(self, group_id, ultimate=0):
1464
        cmd = self._generator.delete_group_command(group_id, ultimate)
1465
        return self.send_command(cmd)
1466
1467
    def delete_note(self, note_id, ultimate=0):
1468
        cmd = self._generator.delete_note_command(note_id, ultimate)
1469
        return self.send_command(cmd)
1470
1471
    def delete_override(self, override_id, ultimate=0):
1472
        cmd = self._generator.delete_override_command(override_id, ultimate)
1473
        return self.send_command(cmd)
1474
1475
    def delete_permission(self, permission_id, ultimate=0):
1476
        cmd = self._generator.delete_permission_command(permission_id, ultimate)
1477
        return self.send_command(cmd)
1478
1479
    def delete_port_list(self, port_list_id, ultimate=0):
1480
        cmd = self._generator.delete_port_list_command(port_list_id, ultimate)
1481
        return self.send_command(cmd)
1482
1483
    def delete_port_range(self, port_range_id):
1484
        cmd = self._generator.delete_port_range_command(port_range_id)
1485
        return self.send_command(cmd)
1486
1487
    def delete_report(self, report_id):
1488
        cmd = self._generator.delete_report_command(report_id)
1489
        return self.send_command(cmd)
1490
1491
    def delete_report_format(self, report_format_id, ultimate=0):
1492
        cmd = self._generator.delete_report_format_command(
1493
            report_format_id, ultimate)
1494
        return self.send_command(cmd)
1495
1496
    def delete_role(self, role_id, ultimate=0):
1497
        cmd = self._generator.delete_role_command(role_id, ultimate)
1498
        return self.send_command(cmd)
1499
1500
    def delete_scanner(self, scanner_id, ultimate=0):
1501
        cmd = self._generator.delete_scanner_command(scanner_id, ultimate)
1502
        return self.send_command(cmd)
1503
1504
    def delete_schedule(self, schedule_id, ultimate=0):
1505
        cmd = self._generator.delete_schedule_command(schedule_id, ultimate)
1506
        return self.send_command(cmd)
1507
1508
    def delete_tag(self, tag_id, ultimate=0):
1509
        cmd = self._generator.delete_tag_command(tag_id, ultimate)
1510
        return self.send_command(cmd)
1511
1512
    def delete_target(self, target_id, ultimate=0):
1513
        cmd = self._generator.delete_target_command(target_id, ultimate)
1514
        return self.send_command(cmd)
1515
1516
    def delete_task(self, task_id, ultimate=0):
1517
        cmd = self._generator.delete_task_command(task_id, ultimate)
1518
        return self.send_command(cmd)
1519
1520
    def delete_user(self, **kwargs):
1521
        cmd = self._generator.delete_user_command(kwargs)
1522
        return self.send_command(cmd)
1523
1524
    def describe_auth(self):
1525
        """Describe authentication methods
1526
1527
        Returns a list of all used authentication methods if such a list is
1528
        available.
1529
1530
        Returns:
1531
            The response. See :py:meth:`send_command` for details.
1532
        """
1533
        return self._send_xml_command(XmlCommand('describe_auth'))
1534
1535
    def empty_trashcan(self):
1536
        """Empty the trashcan
1537
1538
        Remove all entities from the trashcan. **Attention:** this command can
1539
        not be reverted
1540
1541
        Returns:
1542
            The response. See :py:meth:`send_command` for details.
1543
        """
1544
        return self._send_xml_command(XmlCommand('empty_trashcan'))
1545
1546
    def get_agents(self, filter=None, filter_id=None, trash=None, details=None,
1547
                   format=None):
1548
        """Request a list of agents
1549
1550
        Arguments:
1551
            filter (str, optional): Filter term to use for the query
1552
            filter_id (str, optional): UUID of an existing filter to use for
1553
                the query
1554
            trash (boolean, optional): True to request the filters in the
1555
                trashcan
1556
            details (boolean, optional): Whether to include agents package
1557
                information when no format was provided
1558
            format (str, optional): One of "installer", "howto_install" or
1559
                "howto_use"
1560
1561
        Returns:
1562
            The response. See :py:meth:`send_command` for details.
1563
        """
1564
        cmd = XmlCommand('get_agents')
1565
1566
        _add_filter(cmd, filter, filter_id)
1567
1568
        if not trash is None:
1569
            cmd.set_attribute('trash', _to_bool(trash))
1570
1571
        if not details is None:
1572
            cmd.set_attribute('details', _to_bool(details))
1573
1574
        if format:
1575
            if not format in ('installer', 'howto_install', 'howto_use'):
1576
                raise InvalidArgument(
1577
                    'installer argument needs to be one of installer, '
1578
                    'howto_install or howto_use')
1579
1580
            cmd.set_attribute('format', format)
1581
1582
        return self._send_xml_command(cmd)
1583
1584
    def get_agent(self, agent_id):
1585
        """Request a single agent
1586
1587
        Arguments:
1588
            agent_id (str): UUID of an existing agent
1589
1590
        Returns:
1591
            The response. See :py:meth:`send_command` for details.
1592
        """
1593
        cmd = XmlCommand('get_agents')
1594
        cmd.set_attribute('agent_id', agent_id)
1595
        return self._send_xml_command(cmd)
1596
1597
    def get_aggregates(self, **kwargs):
1598
        cmd = XmlCommand('get_aggregates')
1599
        cmd.set_attributes(kwargs)
1600
        return self._send_xml_command(cmd)
1601
1602
    def get_alerts(self, filter=None, filter_id=None, trash=None, tasks=None):
1603
        """Request a list of alerts
1604
1605
        Arguments:
1606
            filter (str, optional): Filter term to use for the query
1607
            filter_id (str, optional): UUID of an existing filter to use for
1608
                the query
1609
            trash (boolean, optional): True to request the alerts in the
1610
                trashcan
1611
            tasks (boolean, optional): Whether to include the tasks using the
1612
                alerts
1613
        Returns:
1614
            The response. See :py:meth:`send_command` for details.
1615
        """
1616
        cmd = XmlCommand('get_alerts')
1617
1618
        _add_filter(cmd, filter, filter_id)
1619
1620
        if not trash is None:
1621
            cmd.set_attribute('trash', _to_bool(trash))
1622
1623
        if not tasks is None:
1624
            cmd.set_attribute('tasks', _to_bool(tasks))
1625
1626
        return self._send_xml_command(cmd)
1627
1628
    def get_alert(self, alert_id):
1629
        """Request a single alert
1630
1631
        Arguments:
1632
            alert_id (str): UUID of an existing alert
1633
1634
        Returns:
1635
            The response. See :py:meth:`send_command` for details.
1636
        """
1637
        cmd = XmlCommand('get_alerts')
1638
        cmd.set_attribute('alert_id', alert_id)
1639
        return self._send_xml_command(cmd)
1640
1641
    def get_assets(self, filter=None, filter_id=None):
1642
        """Request a list of assets
1643
1644
        Arguments:
1645
            filter (str, optional): Filter term to use for the query
1646
            filter_id (str, optional): UUID of an existing filter to use for
1647
                the query
1648
1649
        Returns:
1650
            The response. See :py:meth:`send_command` for details.
1651
        """
1652
        cmd = XmlCommand('get_assets')
1653
1654
        _add_filter(cmd, filter, filter_id)
1655
1656
        return self._send_xml_command(cmd)
1657
1658
    def get_asset(self, asset_id):
1659
        """Request a single asset
1660
1661
        Arguments:
1662
            asset_id (str): UUID of an existing asset
1663
1664
        Returns:
1665
            The response. See :py:meth:`send_command` for details.
1666
        """
1667
        cmd = XmlCommand('get_assets')
1668
        cmd.set_attribute('asset_id', asset_id)
1669
        return self._send_xml_command(cmd)
1670
1671
    def get_credentials(self, filter=None, filter_id=None, scanners=None,
1672
                        trash=None, targets=None, format=None):
1673
        """Request a list of credentials
1674
1675
        Arguments:
1676
            filter (str, optional): Filter term to use for the query
1677
            filter_id (str, optional): UUID of an existing filter to use for
1678
                the query
1679
            scanners (boolean, optional): Whether to include a list of scanners
1680
                using the credentials
1681
            trash (boolean, optional): Whether to get the trashcan credentials
1682
                instead
1683
            targets (boolean, optional): Whether to include a list of targets
1684
                using the credentials
1685
            format (str, optional): One of "key", "rpm", "deb" or "exe"
1686
1687
        Returns:
1688
            The response. See :py:meth:`send_command` for details.
1689
        """
1690
        cmd = XmlCommand('get_credentials')
1691
1692
        _add_filter(cmd, filter, filter_id)
1693
1694
        if not scanners is None:
1695
            cmd.set_attribute('scanners', _to_bool(scanners))
1696
1697
        if not trash is None:
1698
            cmd.set_attribute('trash', _to_bool(trash))
1699
1700
        if not targets is None:
1701
            cmd.set_attribute('targets', _to_bool(targets))
1702
1703
        if format:
1704
            if not format in ('key', 'rpm', 'deb', 'exe'):
1705
                raise InvalidArgument(
1706
                    'format argument needs to one of key, rpm, deb or exe')
1707
1708
            cmd.set_attribute('format', format)
1709
1710
        return self.send_command(cmd)
1711
1712
    def get_credential(self, credential_id):
1713
        """Request a single credential
1714
1715
        Arguments:
1716
            credential_id (str): UUID of an existing credential
1717
1718
        Returns:
1719
            The response. See :py:meth:`send_command` for details.
1720
        """
1721
        cmd = XmlCommand('get_credentials')
1722
        cmd.set_attribute('credential_id', credential_id)
1723
        return self._send_xml_command(cmd)
1724
1725
    def get_configs(self, filter=None, filter_id=None, trash=None, details=None,
1726
                    families=None, preferences=None, tasks=None):
1727
        """Request a list of scan configs
1728
1729
        Arguments:
1730
            filter (str, optional): Filter term to use for the query
1731
            filter_id (str, optional): UUID of an existing filter to use for
1732
                the query
1733
            trash (boolean, optional): Whether to get the trashcan scan configs
1734
                instead
1735
            details (boolean, optional): Whether to get config families,
1736
                preferences, nvt selectors and tasks.
1737
            families (boolean, optional): Whether to include the families if no
1738
                details are requested
1739
            preferences (boolean, optional): Whether to include the preferences
1740
                if no details are requested
1741
            tasks (boolean, optional): Whether to get tasks using this config
1742
1743
        Returns:
1744
            The response. See :py:meth:`send_command` for details.
1745
        """
1746
        cmd = XmlCommand('get_credentials')
1747
1748
        _add_filter(cmd, filter, filter_id)
1749
1750
        if not trash is None:
1751
            cmd.set_attribute('trash', _to_bool(trash))
1752
1753
        if not details is None:
1754
            cmd.set_attribute('details', _to_bool(details))
1755
1756
        if not families is None:
1757
            cmd.set_attribute('families', _to_bool(families))
1758
1759
        if not preferences is None:
1760
            cmd.set_attribute('preferences', _to_bool(preferences))
1761
1762
        if not tasks is None:
1763
            cmd.set_attribute('tasks', _to_bool(tasks))
1764
1765
        return self._send_xml_command(cmd)
1766
1767
    def get_config(self, config_id):
1768
        """Request a single scan config
1769
1770
        Arguments:
1771
            config_id (str): UUID of an existing scan config
1772
1773
        Returns:
1774
            The response. See :py:meth:`send_command` for details.
1775
        """
1776
        cmd = XmlCommand('get_configs')
1777
        cmd.set_attribute('config_id', config_id)
1778
        return self._send_xml_command(cmd)
1779
1780
    def get_feeds(self):
1781
        """Request the list of feeds
1782
1783
        Returns:
1784
            The response. See :py:meth:`send_command` for details.
1785
        """
1786
        return self._send_xml_command(XmlCommand('get_feeds'))
1787
1788
    def get_feed(self, feed_type):
1789
        """Request a single feed
1790
1791
        Arguments:
1792
            feed_type (str): Type of single feed to get: NVT, CERT or SCAP
1793
1794
        Returns:
1795
            The response. See :py:meth:`send_command` for details.
1796
        """
1797
        feed_type = feed_type.upper()
1798
1799
        if not feed_type in ('NVT', 'CERT', 'SCAP'):
1800
            raise InvalidArgument(
1801
                'get_feed type arguments must be one of NVT, CERT or SCAP')
1802
1803
        cmd = XmlCommand('get_feeds')
1804
        cmd.set_attribute('type', feed_type)
1805
1806
        return self._send_xml_command(cmd)
1807
1808
    def get_filters(self, filter=None, filter_id=None, trash=None, alerts=None):
1809
        """Request a list of filters
1810
1811
        Arguments:
1812
            filter (str, optional): Filter term to use for the query
1813
            filter_id (str, optional): UUID of an existing filter to use for
1814
                the query
1815
            trash (boolean, optional): Whether to get the trashcan filters
1816
                instead
1817
            alerts (boolean, optional): Whether to include list of alerts that
1818
                use the filter.
1819
1820
        Returns:
1821
            The response. See :py:meth:`send_command` for details.
1822
        """
1823
        cmd = XmlCommand('get_filters')
1824
1825
        _add_filter(cmd, filter, filter_id)
1826
1827
        if not trash is None:
1828
            cmd.set_attribute('trash', _to_bool(trash))
1829
1830
        if not alerts is None:
1831
            cmd.set_attribute('alerts', _to_bool(alerts))
1832
1833
        return self._send_xml_command(cmd)
1834
1835
    def get_filter(self, filter_id):
1836
        """Request a single filter
1837
1838
        Arguments:
1839
            filter_id (str): UUID of an existing filter
1840
1841
        Returns:
1842
            The response. See :py:meth:`send_command` for details.
1843
        """
1844
        cmd = XmlCommand('get_filters')
1845
        cmd.set_attribute('filter_id', filter_id)
1846
        return self._send_xml_command(cmd)
1847
1848
    def get_groups(self, filter=None, filter_id=None, trash=None):
1849
        """Request a list of groups
1850
1851
        Arguments:
1852
            filter (str, optional): Filter term to use for the query
1853
            filter_id (str, optional): UUID of an existing filter to use for
1854
                the query
1855
            trash (boolean, optional): Whether to get the trashcan groups
1856
                instead
1857
        Returns:
1858
            The response. See :py:meth:`send_command` for details.
1859
        """
1860
        cmd = XmlCommand('get_groups')
1861
1862
        _add_filter(cmd, filter, filter_id)
1863
1864
        if not trash is None:
1865
            cmd.set_attribute('trash', _to_bool(trash))
1866
1867
        return self._send_xml_command(cmd)
1868
1869
    def get_group(self, group_id):
1870
        """Request a single group
1871
1872
        Arguments:
1873
            group_id (str): UUID of an existing group
1874
1875
        Returns:
1876
            The response. See :py:meth:`send_command` for details.
1877
        """
1878
        cmd = XmlCommand('get_groups')
1879
        cmd.set_attribute('group_id', group_id)
1880
        return self._send_xml_command(cmd)
1881
1882
    def get_info_list(self, info_type, filter=None, filter_id=None,
1883
                      name=None, details=None):
1884
        """Request a list of security information
1885
1886
        Arguments:
1887
            info_type (str): Type must be either CERT_BUND_ADV, CPE, CVE,
1888
                DFN_CERT_ADV, OVALDEF, NVT or ALLINFO
1889
            filter (str, optional): Filter term to use for the query
1890
            filter_id (str, optional): UUID of an existing filter to use for
1891
                the query
1892
            name (str, optional): Name or identifier of the requested
1893
                information
1894
            details (boolean, optional): Whether to include information about
1895
                references to this information
1896
1897
        Returns:
1898
            The response. See :py:meth:`send_command` for details.
1899
        """
1900
        info_type = info_type.upper()
1901
1902
        if not info_type in (
1903
                'CERT_BUND_ADV', 'CPE', 'CVE', 'DFN_CERT_ADV', 'OVALDEF', 'NVT',
1904
                'ALLINFO'):
1905
            raise InvalidArgument(
1906
                'get_info_list info_type argument must be one of CERT_BUND_ADV'
1907
                ', CPE, CVE, DFN_CERT_ADV, OVALDEF, NVT or ALLINFO')
1908
1909
        cmd = XmlCommand('get_groups')
1910
1911
        _add_filter(cmd, filter, filter_id)
1912
1913
        if name:
1914
            cmd.set_attribute('name', name)
1915
1916
        if not details is None:
1917
            cmd.set_attribute('details', _to_bool(details))
1918
1919
        return self._send_xml_command(cmd)
1920
1921
    def get_info(self, info_id):
1922
        """Request a single secinfo
1923
1924
        Arguments:
1925
            info_id (str): UUID of an existing secinfo
1926
1927
        Returns:
1928
            The response. See :py:meth:`send_command` for details.
1929
        """
1930
        cmd = XmlCommand('get_infos')
1931
        cmd.set_attribute('info_id', info_id)
1932
        return self._send_xml_command(cmd)
1933
1934
    def get_notes(self, filter=None, filter_id=None, nvt_oid=None,
1935
                  task_id=None, details=None, result=None):
1936
        """Request a list of notes
1937
1938
        Arguments:
1939
            filter (str, optional): Filter term to use for the query
1940
            filter_id (str, optional): UUID of an existing filter to use for
1941
                the query
1942
            nvt_oid (str, optional): OID of a nvt
1943
            task_id (str, optional): UUID of a task
1944
            details (boolean, optional):
1945
            result (boolean, optional):
1946
1947
        Returns:
1948
            The response. See :py:meth:`send_command` for details.
1949
        """
1950
        cmd = XmlCommand('get_notes')
1951
1952
        _add_filter(cmd, filter, filter_id)
1953
1954
        if nvt_oid:
1955
            cmd.set_attribute('nvt_oid', nvt_oid)
1956
1957
        if task_id:
1958
            cmd.set_attribute('task_id', task_id)
1959
1960
        if not details is None:
1961
            cmd.set_attribute('details', _to_bool(details))
1962
1963
        if not result is None:
1964
            cmd.set_attribute('result', _to_bool(result))
1965
1966
        return self._send_xml_command(cmd)
1967
1968
    def get_note(self, note_id):
1969
        """Request a single note
1970
1971
        Arguments:
1972
            note_id (str): UUID of an existing note
1973
1974
        Returns:
1975
            The response. See :py:meth:`send_command` for details.
1976
        """
1977
        cmd = XmlCommand('get_notes')
1978
        cmd.set_attribute('note_id', note_id)
1979
        return self._send_xml_command(cmd)
1980
1981
    def get_nvts(self, details=None, preferences=None, preference_count=None,
1982
                 timeout=None, config_id=None, preferences_config_id=None,
1983
                 family=None, sort_order=None, sort_field=None):
1984
        """Request a list of nvts
1985
1986
        Arguments:
1987
            details (boolean, optional): Whether to include full details
1988
            preferences (boolean, optional): Whether to include nvt preferences
1989
            preference_count (boolean, optional): Whether to include preference
1990
                count
1991
            timeout (boolean, optional):  Whether to include the special timeout
1992
                preference
1993
            config_id (str, optional): UUID of scan config to which to limit the
1994
                NVT listing
1995
            preferences_config_id (str, optional): UUID of scan config to use
1996
                for preference values
1997
            family (str, optional): Family to which to limit NVT listing
1998
            sort_order (str, optional): Sort order
1999
            sort_field (str, optional): Sort field
2000
2001
        Returns:
2002
            The response. See :py:meth:`send_command` for details.
2003
        """
2004
        cmd = XmlCommand('get_notes')
2005
2006
        if not details is None:
2007
            cmd.set_attribute('details', _to_bool(details))
2008
2009
        if not preferences is None:
2010
            cmd.set_attribute('preferences', _to_bool(preferences))
2011
2012
        if not preference_count is None:
2013
            cmd.set_attribute('preference_count', _to_bool(preference_count))
2014
2015
        if not timeout is None:
2016
            cmd.set_attribute('timeout', _to_bool(timeout))
2017
2018
        if config_id:
2019
            cmd.set_attribute('config_id', config_id)
2020
2021
        if preferences_config_id:
2022
            cmd.set_attribute('preferences_config_id', preferences_config_id)
2023
2024
        if family:
2025
            cmd.set_attribute('family', family)
2026
2027
        if sort_order:
2028
            cmd.set_attribute('sort_order', sort_order)
2029
2030
        if sort_field:
2031
            cmd.set_attribute('sort_field', sort_field)
2032
2033
        return self._send_xml_command(cmd)
2034
2035
    def get_nvt(self, nvt_id):
2036
        """Request a single nvt
2037
2038
        Arguments:
2039
            nvt_id (str): OID of an existing nvt
2040
2041
        Returns:
2042
            The response. See :py:meth:`send_command` for details.
2043
        """
2044
        cmd = XmlCommand('get_nvts')
2045
        cmd.set_attribute('nvt_id', nvt_id)
2046
        return self._send_xml_command(cmd)
2047
2048
    def get_nvt_families(self, **kwargs):
2049
        cmd = self._generator.get_nvt_families_command(kwargs)
2050
        return self.send_command(cmd)
2051
2052
    def get_overrides(self, **kwargs):
2053
        cmd = self._generator.get_overrides_command(kwargs)
2054
        return self.send_command(cmd)
2055
2056
    def get_override(self, override_id):
2057
        """Request a single override
2058
2059
        Arguments:
2060
            override_id (str): UUID of an existing override
2061
2062
        Returns:
2063
            The response. See :py:meth:`send_command` for details.
2064
        """
2065
        cmd = XmlCommand('get_overrides')
2066
        cmd.set_attribute('override_id', override_id)
2067
        return self._send_xml_command(cmd)
2068
2069
    def get_permissions(self, **kwargs):
2070
        cmd = self._generator.get_permissions_command(kwargs)
2071
        return self.send_command(cmd)
2072
2073
    def get_permission(self, permission_id):
2074
        """Request a single permission
2075
2076
        Arguments:
2077
            permission_id (str): UUID of an existing permission
2078
2079
        Returns:
2080
            The response. See :py:meth:`send_command` for details.
2081
        """
2082
        cmd = XmlCommand('get_permissions')
2083
        cmd.set_attribute('permission_id', permission_id)
2084
        return self._send_xml_command(cmd)
2085
2086
    def get_port_lists(self, **kwargs):
2087
        cmd = self._generator.get_port_lists_command(kwargs)
2088
        return self.send_command(cmd)
2089
2090
    def get_port_list(self, port_list_id):
2091
        """Request a single port list
2092
2093
        Arguments:
2094
            port_list_id (str): UUID of an existing port list
2095
2096
        Returns:
2097
            The response. See :py:meth:`send_command` for details.
2098
        """
2099
        cmd = XmlCommand('get_port_lists')
2100
        cmd.set_attribute('port_list_id', port_list_id)
2101
        return self._send_xml_command(cmd)
2102
2103
    def get_preferences(self, **kwargs):
2104
        cmd = self._generator.get_preferences_command(kwargs)
2105
        return self.send_command(cmd)
2106
2107
    def get_reports(self, **kwargs):
2108
        cmd = self._generator.get_reports_command(kwargs)
2109
        return self.send_command(cmd)
2110
2111
    def get_report(self, report_id):
2112
        """Request a single report
2113
2114
        Arguments:
2115
            report_id (str): UUID of an existing report
2116
2117
        Returns:
2118
            The response. See :py:meth:`send_command` for details.
2119
        """
2120
        cmd = XmlCommand('get_reports')
2121
        cmd.set_attribute('report_id', report_id)
2122
        return self._send_xml_command(cmd)
2123
2124
    def get_report_formats(self, **kwargs):
2125
        cmd = self._generator.get_report_formats_command(kwargs)
2126
        return self.send_command(cmd)
2127
2128
    def get_report_format(self, report_format_id):
2129
        """Request a single report format
2130
2131
        Arguments:
2132
            report_format_id (str): UUID of an existing report format
2133
2134
        Returns:
2135
            The response. See :py:meth:`send_command` for details.
2136
        """
2137
        cmd = XmlCommand('get_report_formats')
2138
        cmd.set_attribute('report_format_id', report_format_id)
2139
        return self._send_xml_command(cmd)
2140
2141
    def get_results(self, **kwargs):
2142
        cmd = self._generator.get_results_command(kwargs)
2143
        return self.send_command(cmd)
2144
2145
    def get_result(self, result_id):
2146
        """Request a single result
2147
2148
        Arguments:
2149
            result_id (str): UUID of an existing result
2150
2151
        Returns:
2152
            The response. See :py:meth:`send_command` for details.
2153
        """
2154
        cmd = XmlCommand('get_results')
2155
        cmd.set_attribute('result_id', result_id)
2156
        return self._send_xml_command(cmd)
2157
2158
    def get_roles(self, **kwargs):
2159
        cmd = self._generator.get_roles_command(kwargs)
2160
        return self.send_command(cmd)
2161
2162
    def get_role(self, role_id):
2163
        """Request a single role
2164
2165
        Arguments:
2166
            role_id (str): UUID of an existing role
2167
2168
        Returns:
2169
            The response. See :py:meth:`send_command` for details.
2170
        """
2171
        cmd = XmlCommand('get_roles')
2172
        cmd.set_attribute('role_id', role_id)
2173
        return self._send_xml_command(cmd)
2174
2175
    def get_scanners(self, **kwargs):
2176
        cmd = self._generator.get_scanners_command(kwargs)
2177
        return self.send_command(cmd)
2178
2179
    def get_scanner(self, scanner_id):
2180
        """Request a single scanner
2181
2182
        Arguments:
2183
            scanner_id (str): UUID of an existing scanner
2184
2185
        Returns:
2186
            The response. See :py:meth:`send_command` for details.
2187
        """
2188
        cmd = XmlCommand('get_scanners')
2189
        cmd.set_attribute('scanner_id', scanner_id)
2190
        return self._send_xml_command(cmd)
2191
2192
    def get_schedules(self, **kwargs):
2193
        cmd = self._generator.get_schedules_command(kwargs)
2194
        return self.send_command(cmd)
2195
2196
    def get_schedule(self, schedule_id):
2197
        """Request a single schedule
2198
2199
        Arguments:
2200
            schedule_id (str): UUID of an existing schedule
2201
2202
        Returns:
2203
            The response. See :py:meth:`send_command` for details.
2204
        """
2205
        cmd = XmlCommand('get_schedules')
2206
        cmd.set_attribute('schedule_id', schedule_id)
2207
        return self._send_xml_command(cmd)
2208
2209
    def get_settings(self, **kwargs):
2210
        cmd = self._generator.get_settings_command(kwargs)
2211
        return self.send_command(cmd)
2212
2213
    def get_setting(self, setting_id):
2214
        """Request a single setting
2215
2216
        Arguments:
2217
            setting_id (str): UUID of an existing setting
2218
2219
        Returns:
2220
            The response. See :py:meth:`send_command` for details.
2221
        """
2222
        cmd = XmlCommand('get_settings')
2223
        cmd.set_attribute('setting_id', setting_id)
2224
        return self._send_xml_command(cmd)
2225
2226
    def get_system_reports(self, **kwargs):
2227
        cmd = self._generator.get_system_reports_command(kwargs)
2228
        return self.send_command(cmd)
2229
2230
    def get_tags(self, **kwargs):
2231
        cmd = self._generator.get_tags_command(kwargs)
2232
        return self.send_command(cmd)
2233
2234
    def get_tag(self, tag_id):
2235
        """Request a single tag
2236
2237
        Arguments:
2238
            tag_id (str): UUID of an existing tag
2239
2240
        Returns:
2241
            The response. See :py:meth:`send_command` for details.
2242
        """
2243
        cmd = XmlCommand('get_tags')
2244
        cmd.set_attribute('tag_id', tag_id)
2245
        return self._send_xml_command(cmd)
2246
2247
    def get_targets(self, **kwargs):
2248
        cmd = self._generator.get_targets_command(kwargs)
2249
        return self.send_command(cmd)
2250
2251
    def get_target(self, target_id):
2252
        """Request a single target
2253
2254
        Arguments:
2255
            target_id (str): UUID of an existing target
2256
2257
        Returns:
2258
            The response. See :py:meth:`send_command` for details.
2259
        """
2260
        cmd = XmlCommand('get_targets')
2261
        cmd.set_attribute('target_id', target_id)
2262
        return self._send_xml_command(cmd)
2263
2264
    def get_tasks(self, **kwargs):
2265
        cmd = self._generator.get_tasks_command(kwargs)
2266
        return self.send_command(cmd)
2267
2268
    def get_task(self, task_id):
2269
        """Request a single task
2270
2271
        Arguments:
2272
            task_id (str): UUID of an existing task
2273
2274
        Returns:
2275
            The response. See :py:meth:`send_command` for details.
2276
        """
2277
        cmd = XmlCommand('get_tasks')
2278
        cmd.set_attribute('task_id', task_id)
2279
        return self._send_xml_command(cmd)
2280
2281
    def get_users(self, **kwargs):
2282
        cmd = self._generator.get_users_command(kwargs)
2283
        return self.send_command(cmd)
2284
2285
    def get_user(self, user_id):
2286
        """Request a single user
2287
2288
        Arguments:
2289
            user_id (str): UUID of an existing user
2290
2291
        Returns:
2292
            The response. See :py:meth:`send_command` for details.
2293
        """
2294
        cmd = XmlCommand('get_users')
2295
        cmd.set_attribute('user_id', user_id)
2296
        return self._send_xml_command(cmd)
2297
2298
    def get_version(self):
2299
        """Get the Greenbone Manager Protocol version used by the remote gvmd
2300
2301
        Returns:
2302
            The response. See :py:meth:`send_command` for details.
2303
        """
2304
        return self._send_xml_command(XmlCommand('get_version'))
2305
2306
    def help(self, format=None, type=''):
2307
        """Get the help text
2308
2309
        Arguments:
2310
            format (str, optional): One of "html", "rnc", "text" or "xml
2311
            type (str, optional): One of "brief" or "". Default ""
2312
2313
        Returns:
2314
            The response. See :py:meth:`send_command` for details.
2315
        """
2316
        cmd = XmlCommand('help')
2317
2318
        cmd.set_attribute('type', type)
2319
2320
        if format:
2321
            if not format.lower() in ('html', 'rnc', 'text', 'xml'):
2322
                raise InvalidArgument(
2323
                    'help format Argument must be one of html, rnc, text or '
2324
                    'xml')
2325
2326
            cmd.set_attribute('format', format)
2327
2328
        return self.send_command(cmd)
2329
2330
    def modify_agent(self, agent_id, name=None, comment=None):
2331
        """Modifies an existing agent
2332
2333
        Arguments:
2334
            agent_id (str) UUID of the agent to be modified.
2335
            name (str, optional): Name of the new credential
2336
            comment (str, optional): Comment for the credential
2337
        """
2338
        if not agent_id:
2339
            raise RequiredArgument('modify_agent requires agent_id argument')
2340
2341
        cmd = XmlCommand('modify_agent')
2342
        cmd.set_attribute('agent_id', str(agent_id))
2343
        if name:
2344
            cmd.add_element('name', name)
2345
        if comment:
2346
            cmd.add_element('comment', comment)
2347
2348
        return self._send_xml_command(cmd)
2349
2350
    def modify_alert(self, alert_id, name=None, comment=None,
0 ignored issues
show
Comprehensibility introduced by
This function exceeds the maximum number of variables (19/15).
Loading history...
2351
                     filter_id=None, event=None, event_data=None,
2352
                     condition=None, condition_data=None, method=None,
2353
                     method_data=None):
2354
        """Modifies an existing alert.
2355
2356
        Arguments:
2357
            alert_id (str) UUID of the alert to be modified.
2358
            name (str, optional): Name of the Alert.
2359
            condition (str, optional): The condition that must be satisfied
2360
                for the alert to occur.
2361
            condition_data (dict, optional): Data that defines the condition
2362
            event (str, optional): The event that must happen for the alert
2363
               to occur.
2364
            event_data (dict, optional): Data that defines the event
2365
            method (str, optional): The method by which the user is alerted
2366
            method_data (dict, optional): Data that defines the method
2367
            filter_id (str, optional): Filter to apply when executing alert
2368
            comment (str, optional): Comment for the alert
2369
        """
2370
2371
        if not alert_id:
2372
            raise RequiredArgument('modify_alert requires an alert_id argument')
2373
2374
        cmd = XmlCommand('modify_alert')
2375
        cmd.set_attribute('alert_id', str(alert_id))
2376
2377
        if name:
2378
            cmd.add_element('name', name)
2379
2380
        if comment:
2381
            cmd.add_element('comment', comment)
2382
2383
        if filter_id:
2384
            cmd.add_element('filter', attrs={'id': filter_id})
2385
2386
        conditions = cmd.add_element('condition', condition)
2387
2388
        if not condition_data is None:
2389
            for value, key in condition_data.items():
2390
                _data = conditions.add_element('data', value)
2391
                _data.add_element('name', key)
2392
2393
        events = cmd.add_element('event', event)
2394
2395
        if not event_data is None:
2396
            for value, key in event_data.items():
2397
                _data = events.add_element('data', value)
2398
                _data.add_element('name', key)
2399
2400
        methods = cmd.add_element('method', method)
2401
2402
        if not method_data is None:
2403
            for value, key in method_data.items():
2404
                _data = methods.add_element('data', value)
2405
                _data.add_element('name', key)
2406
2407
        return self._send_xml_command(cmd)
2408
2409
    def modify_asset(self, asset_id, comment):
2410
        """Modifies an existing asset.
2411
2412
        Arguments:
2413
            asset_id (str) UUID of the asset to be modified.
2414
            comment (str, optional): Comment for the asset.
2415
        """
2416
        if not asset_id:
2417
            raise RequiredArgument('modify_asset requires an asset_id argument')
2418
2419
        cmd = XmlCommand('modify_asset')
2420
        cmd.set_attribute('asset_id', asset_id)
2421
        cmd.add_element('comment', comment)
2422
2423
        return self._send_xml_command(cmd)
2424
2425
    def modify_auth(self, group_name, auth_conf_settings):
2426
        """Modifies an existing auth.
2427
        Arguments:
2428
            group_name (str) Name of the group to be modified.
2429
            auth_conf_settings (dict): The new auth config.
2430
        """
2431
        if not group_name:
2432
            raise RequiredArgument('modify_auth requires a group_name argument')
2433
        if not auth_conf_settings:
2434
            raise RequiredArgument('modify_auth requires an '
2435
                                   'auth_conf_settings argument')
2436
        cmd = XmlCommand('modify_auth')
2437
        _xmlgroup = cmd.add_element('group', attrs={'name': str(group_name)})
2438
2439
        for key, value in auth_conf_settings.items():
2440
            _xmlauthconf = _xmlgroup.add_element('auth_conf_setting')
2441
            _xmlauthconf.add_element('key', key)
2442
            _xmlauthconf.add_element('value', value)
2443
2444
        return self._send_xml_command(cmd)
2445
2446
    def modify_config(self, selection, config_id=None, nvt_oids=None, name=None,
2447
                      value=None, family=None):
2448
        """Modifies an existing existing scan config.
2449
2450
        Arguments:
2451
            selection (str): one of 'nvt_pref', nvt_selection or
2452
                family_selection'
2453
            config_id (str, optional): UUID of scan config to modify.
2454
            name (str, optional): New name for preference.
2455
            value(str, optional): New value for preference.
2456
            nvt_oids (list, optional): List of NVTs associated with preference
2457
                to modify.
2458
            family (str,optional): Name of family to modify.
2459
        """
2460
        if selection not in ('nvt_pref', 'scan_pref',
2461
                             'family_selection', 'nvt_selection'):
2462
            raise InvalidArgument('selection must be one of nvt_pref, '
2463
                                  'scan_pref, family_selection or '
2464
                                  'nvt_selection')
2465
2466
        cmd = XmlCommand('modify_config')
2467
        cmd.set_attribute('config_id', str(config_id))
2468
2469
        if selection == 'nvt_pref':
2470
            _xmlpref = cmd.add_element('preference')
2471
            if not nvt_oids:
2472
                raise InvalidArgument('modify_config requires a nvt_oids '
2473
                                      'argument')
2474
            _xmlpref.add_element('nvt', attrs={'oid': nvt_oids[0]})
2475
            _xmlpref.add_element('name', name)
2476
            _xmlpref.add_element('value', value)
2477
2478
        elif selection == 'nvt_selection':
2479
            _xmlnvtsel = cmd.add_element('nvt_selection')
2480
            _xmlnvtsel.add_element('family', family)
2481
2482
            if nvt_oids:
2483
                for nvt in nvt_oids:
2484
                    _xmlnvtsel.add_element('nvt', attrs={'oid': nvt})
2485
            else:
2486
                raise InvalidArgument('modify_config requires a nvt_oid '
2487
                                      'argument')
2488
2489
        elif selection == 'family_selection':
2490
            _xmlfamsel = cmd.add_element('family_selection')
2491
            _xmlfamsel.add_element('growing', '1')
2492
            _xmlfamily = _xmlfamsel.add_element('family')
2493
            _xmlfamily.add_element('name', family)
2494
            _xmlfamily.add_element('all', '1')
2495
            _xmlfamily.add_element('growing', '1')
2496
2497
        return self._send_xml_command(cmd)
2498
2499
    def modify_credential(self, credential_id, name=None, comment=None,
0 ignored issues
show
Comprehensibility introduced by
This function exceeds the maximum number of variables (19/15).
Loading history...
2500
                          allow_insecure=None, certificate=None,
2501
                          key_phrase=None, private_key=None, login=None,
2502
                          password=None, auth_algorithm=None, community=None,
2503
                          privacy_algorithm=None, privacy_password=None,
2504
                          credential_type=None):
2505
        """Modifies an existing credential.
2506
2507
        Arguments:
2508
            credential_id (str): UUID of the credential
2509
            name (str, optional): Name of the credential
2510
            comment (str, optional): Comment for the credential
2511
            allow_insecure (boolean, optional): Whether to allow insecure use of
2512
                 the credential
2513
            certificate (str, optional): Certificate for the credential
2514
            key_phrase (str, optional): Key passphrase for the private key
2515
            private_key (str, optional): Private key to use for login
2516
            login (str, optional): Username for the credential
2517
            password (str, optional): Password for the credential
2518
            auth_algorithm (str, optional): The auth_algorithm,
2519
                either md5 or sha1.
2520
            community (str, optional): The SNMP community
2521
            privacy_algorithm (str, optional): The SNMP privacy algorithm,
2522
                either aes or des.
2523
            privacy_password (str, optional): The SNMP privacy password
2524
            credential_type (str, optional): The credential type. One of 'cc',
2525
                'snmp', 'up', 'usk'
2526
        """
2527
        if not credential_id:
2528
            raise RequiredArgument('modify_credential requires '
2529
                                   'a credential_id attribute')
2530
2531
        cmd = XmlCommand('modify_credential')
2532
        cmd.set_attribute('credential_id', credential_id)
2533
2534
        if comment:
2535
            cmd.add_element('comment', comment)
2536
2537
        if name:
2538
            cmd.add_element('name', name)
2539
2540
        if allow_insecure:
2541
            cmd.add_element('allow_insecure', allow_insecure)
2542
2543
        if certificate:
2544
            cmd.add_element('certificate', certificate)
2545
2546
        if key_phrase or private_key:
2547
            if not key_phrase or not private_key:
2548
                raise RequiredArgument('modify_credential requires '
2549
                                       'a key_phrase and private_key arguments')
2550
            _xmlkey = cmd.add_element('key')
2551
            _xmlkey.add_element('phrase', key_phrase)
2552
            _xmlkey.add_element('private', private_key)
2553
2554
        if login:
2555
            cmd.add_element('login', login)
2556
2557
        if password:
2558
            cmd.add_element('password', password)
2559
2560
        if auth_algorithm:
2561
            if auth_algorithm not in ('md5', 'sha1'):
2562
                raise RequiredArgument('modify_credential requires '
2563
                                       'auth_algorithm to be either '
2564
                                       'md5 or sha1')
2565
            cmd.add_element('auth_algorithm', auth_algorithm)
2566
2567
        if community:
2568
            cmd.add_element('community', community)
2569
2570
        if privacy_algorithm:
2571
            if privacy_algorithm not in ('aes', 'des'):
2572
                raise RequiredArgument('modify_credential requires '
2573
                                       'privacy_algorithm to be either'
2574
                                       'aes or des')
2575
            _xmlprivacy = cmd.add_element('privacy')
2576
            _xmlprivacy.add_element('algorithm', privacy_algorithm)
2577
            _xmlprivacy.add_element('password', privacy_password)
2578
2579
        if credential_type:
2580
            if credential_type not in ('cc', 'snmp', 'up', 'usk'):
2581
                raise RequiredArgument('modify_credential requires type '
2582
                                       'to be either cc, snmp, up or usk')
2583
            cmd.add_element('type', credential_type)
2584
2585
        return self._send_xml_command(cmd)
2586
2587
    def modify_filter(self, filter_id, comment=None, name=None, term=None,
2588
                      filter_type=None):
2589
        """Modifies an existing filter.
2590
2591
        Arguments:
2592
            filter_id (str): UUID of the filter to be modified
2593
            comment (str, optional): Comment on filter.
2594
            name (str, optional): Name of filter.
2595
            term (str, optional): Filter term.
2596
            filter_type (str, optional): Resource type filter applies to.
2597
        """
2598
        if not filter_id:
2599
            raise RequiredArgument('modify_filter requires a filter_id '
2600
                                   'attribute')
2601
2602
        cmd = XmlCommand('modify_filter')
2603
        cmd.set_attribute('filter_id', filter_id)
2604
2605
        if comment:
2606
            cmd.add_element('comment', comment)
2607
2608
        if name:
2609
            cmd.add_element('name', name)
2610
2611
        if term:
2612
            cmd.add_element('term', term)
2613
2614
        if filter_type:
2615
            filter_type = filter_type.lower()
2616
            if filter_type not in FILTER_TYPES:
2617
                raise InvalidArgument(
2618
                    'modify_filter requires type to be one of {0} but '
2619
                    'was {1}'.format(', '.join(FILTER_TYPES), filter_type))
2620
            cmd.add_element('type', filter_type)
2621
2622
        return self._send_xml_command(cmd)
2623
2624
    def modify_group(self, group_id, comment=None, name=None,
2625
                     users=None):
2626
        """Modifies an existing group.
2627
2628
        Arguments:
2629
            group_id (str): UUID of group to modify.
2630
            comment (str, optional): Comment on group.
2631
            name (str, optional): Name of group.
2632
            users (list, optional): List of user names to be in the group
2633
        """
2634
        if not group_id:
2635
            raise RequiredArgument('modify_group requires a group_id argument')
2636
2637
        cmd = XmlCommand('modify_group')
2638
        cmd.set_attribute('group_id', group_id)
2639
2640
        if comment:
2641
            cmd.add_element('comment', comment)
2642
2643
        if name:
2644
            cmd.add_element('name', name)
2645
2646
        if users:
2647
            cmd.add_element('users', ','.join(users))
2648
2649
        return self._send_xml_command(cmd)
2650
2651
    def modify_note(self, note_id, text, seconds_active=None, hosts=None,
2652
                    port=None, result_id=None, severity=None, task_id=None,
2653
                    threat=None):
2654
        """Modifies an existing note.
2655
2656
        Arguments:
2657
            note_id (str): UUID of note to modify.
2658
            text (str): The text of the note.
2659
            seconds_active (int, optional): Seconds note will be active.
2660
                -1 on always, 0 off.
2661
            hosts (list, optional): A list of hosts addresses
2662
            port (str, optional): Port to which note applies.
2663
            result_id (str, optional): Result to which note applies.
2664
            severity (str, optional): Severity to which note applies.
2665
            task_id (str, optional): Task to which note applies.
2666
            threat (str, optional): Threat level to which note applies.
2667
        """
2668
        if not note_id:
2669
            raise RequiredArgument('modify_note requires a note_id attribute')
2670
        if not text:
2671
            raise RequiredArgument('modify_note requires a text element')
2672
2673
        cmd = XmlCommand('modify_note')
2674
        cmd.set_attribute('note_id', note_id)
2675
        cmd.add_element('text', text)
2676
2677
        if not seconds_active is None:
2678
            cmd.add_element('active', str(seconds_active))
2679
2680
        if hosts:
2681
            cmd.add_element('hosts', ', '.join(hosts))
2682
2683
        if port:
2684
            cmd.add_element('port', port)
2685
2686
        if result_id:
2687
            cmd.add_element('result', attrs={'id': result_id})
2688
2689
        if severity:
2690
            cmd.add_element('severity', severity)
2691
2692
        if task_id:
2693
            cmd.add_element('task', attrs={'id': task_id})
2694
2695
        if threat:
2696
            cmd.add_element('threat', threat)
2697
2698
        return self._send_xml_command(cmd)
2699
2700 View Code Duplication
    def modify_override(self, override_id, text, seconds_active=None,
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
2701
                        hosts=None, port=None, result_id=None, severity=None,
2702
                        new_severity=None, task_id=None, threat=None,
2703
                        new_threat=None):
2704
        """Modifies an existing override.
2705
2706
        Arguments:
2707
            override_id (str): UUID of override to modify.
2708
            text (str): The text of the override.
2709
            seconds_active (int, optional): Seconds override will be active.
2710
                -1 on always, 0 off.
2711
            hosts (list, optional): A list of host addresses
2712
            port (str, optional): Port to which override applies.
2713
            result_id (str, optional): Result to which override applies.
2714
            severity (str, optional): Severity to which override applies.
2715
            new_severity (str, optional): New severity score for result.
2716
            task_id (str, optional): Task to which override applies.
2717
            threat (str, optional): Threat level to which override applies.
2718
            new_threat (str, optional): New threat level for results.
2719
        """
2720
        if not override_id:
2721
            raise RequiredArgument('modify_override requires a override_id '
2722
                                   'argument')
2723
        if not text:
2724
            raise RequiredArgument('modify_override requires a text argument')
2725
2726
        cmd = XmlCommand('modify_override')
2727
        cmd.set_attribute('override_id', override_id)
2728
        cmd.add_element('text', text)
2729
2730
        if not seconds_active is None:
2731
            cmd.add_element('active', str(seconds_active))
2732
2733
        if hosts:
2734
            cmd.add_element('hosts', ', '.join(hosts))
2735
2736
        if port:
2737
            cmd.add_element('port', port)
2738
2739
        if result_id:
2740
            cmd.add_element('result', attrs={'id': result_id})
2741
2742
        if severity:
2743
            cmd.add_element('severity', severity)
2744
2745
        if new_severity:
2746
            cmd.add_element('new_severity', new_severity)
2747
2748
        if task_id:
2749
            cmd.add_element('task', attrs={'id': task_id})
2750
2751
        if threat:
2752
            cmd.add_element('threat', threat)
2753
2754
        if new_threat:
2755
            cmd.add_element('new_threat', new_threat)
2756
2757
        return self._send_xml_command(cmd)
2758
2759 View Code Duplication
    def modify_permission(self, permission_id, comment=None, name=None,
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
2760
                          resource_id=None, resource_type=None,
2761
                          subject_id=None, subject_type=None):
2762
        """Modifies an existing permission.
2763
2764
        Arguments:
2765
            permission_id (str): UUID of permission to be modified.
2766
            comment (str, optional): The comment on the permission.
2767
            name (str, optional): Permission name, currently the name of
2768
                a command.
2769
            subject_id (str, optional): UUID of subject to whom the permission
2770
                is granted
2771
            subject_type (str, optional): Type of the subject user, group or
2772
                role
2773
            resource_id (str, optional): UUID of entity to which the permission
2774
                applies
2775
            resource_type (str, optional): Type of the resource. For Super
2776
                permissions user, group or role
2777
        """
2778
        if not permission_id:
2779
            raise RequiredArgument('modify_permission requires '
2780
                                   'a permission_id element')
2781
2782
        cmd = XmlCommand('modify_permission')
2783
        cmd.set_attribute('permission_id', permission_id)
2784
2785
        if comment:
2786
            cmd.add_element('comment', comment)
2787
2788
        if name:
2789
            cmd.add_element('name', name)
2790
2791
        if resource_id and resource_type:
2792
            _xmlresource = cmd.add_element('resource',
2793
                                           attrs={'id': resource_id})
2794
            _xmlresource.add_element('type', resource_type)
2795
2796
        if subject_id and subject_type:
2797
            _xmlsubject = cmd.add_element('subject',
2798
                                           attrs={'id': subject_id})
0 ignored issues
show
Coding Style introduced by
Wrong continued indentation (remove 1 space).
Loading history...
2799
            _xmlsubject.add_element('type', subject_type)
2800
2801
        return self._send_xml_command(cmd)
2802
2803
    def modify_port_list(self, port_list_id, comment=None, name=None, ):
2804
        """Modifies an existing port list.
2805
2806
        Arguments:
2807
            port_list_id (str): UUID of port list to modify.
2808
            name (str, optional): Name of port list.
2809
            comment (str, optional): Comment on port list.
2810
        """
2811
        if not port_list_id:
2812
            raise RequiredArgument('modify_port_list requires '
2813
                                   'a port_list_id attribute')
2814
        cmd = XmlCommand('modify_port_list')
2815
        cmd.set_attribute('port_list_id', port_list_id)
2816
2817
        if comment:
2818
            cmd.add_element('comment', comment)
2819
2820
        if name:
2821
            cmd.add_element('name', name)
2822
2823
        return self._send_xml_command(cmd)
2824
2825
    def modify_report(self, report_id, comment):
2826
        """Modifies an existing report.
2827
2828
        Arguments:
2829
            report_id (str): UUID of report to modify.
2830
            comment (str): The comment on the report.
2831
        """
2832
        if not report_id:
2833
            raise RequiredArgument('modify_report requires '
2834
                                   'a report_id attribute')
2835
        if not comment:
2836
            raise RequiredArgument('modify_report requires '
2837
                                   'a comment attribute')
2838
        cmd = XmlCommand('modify_report')
2839
        cmd.set_attribute('report_id', report_id)
2840
        cmd.add_element('comment', comment)
2841
2842
        return self._send_xml_command(cmd)
2843
2844
    def modify_report_format(self, report_format_id, active=None, name=None,
2845
                             summary=None, param_name=None, param_value=None):
2846
        """Modifies an existing report format on gvmd.
2847
2848
        Arguments:
2849
            report_format_id (str) UUID of report format to modify.
2850
            active (boolean, optional): Whether the report format is active.
2851
            name (str, optional): The name of the report format.
2852
            summary (str, optional): A summary of the report format.
2853
            param_name (str, optional): The name of the param.
2854
            param_value (str, optional): The value of the param.
2855
        """
2856
        if not report_format_id:
2857
            raise RequiredArgument('modify_report requires '
2858
                                   'a report_format_id attribute')
2859
        cmd = XmlCommand('modify_report_format')
2860
        cmd.set_attribute('report_format_id', report_format_id)
2861
2862
        if not active is None:
2863
            cmd.add_element('active', '1' if active else '0')
2864
2865
        if name:
2866
            cmd.add_element('name', name)
2867
2868
        if summary:
2869
            cmd.add_element('summary', summary)
2870
2871
        if param_name and param_value:
2872
            _xmlparam = cmd.add_element('param')
2873
            _xmlparam.add_element('name', param_name)
2874
            _xmlparam.add_element('value', param_value)
2875
2876
        return self._send_xml_command(cmd)
2877
2878
    def modify_role(self, role_id, comment=None, name=None, users=None):
2879
        """Modifies an existing role.
2880
2881
        Arguments:
2882
            role_id (str): UUID of role to modify.
2883
            comment (str, optional): Name of role.
2884
            name (str, optional): Comment on role.
2885
            users  (list, optional): List of user names.
2886
        """
2887
        if not role_id:
2888
            raise RequiredArgument('modify_role requires a role_id argument')
2889
2890
        cmd = XmlCommand('modify_role')
2891
        cmd.set_attribute('role_id', role_id)
2892
2893
        if comment:
2894
            cmd.add_element('comment', comment)
2895
2896
        if name:
2897
            cmd.add_element('name', name)
2898
2899
        if users:
2900
            cmd.add_element('users', ",".join(users))
2901
2902
        return self._send_xml_command(cmd)
2903
2904
    def modify_scanner(self, scanner_id, host, port, scanner_type, **kwargs):
2905
        cmd = self._generator.modify_scanner_command(scanner_id, host, port,
2906
                                                     scanner_type, kwargs)
2907
        return self.send_command(cmd)
2908
2909
    def modify_schedule(self, schedule_id, **kwargs):
2910
        cmd = self._generator.modify_schedule_command(schedule_id, kwargs)
2911
        return self.send_command(cmd)
2912
2913
    def modify_setting(self, setting_id, name, value):
2914
        cmd = self._generator.modify_setting_command(setting_id, name, value)
2915
        return self.send_command(cmd)
2916
2917
    def modify_tag(self, tag_id, **kwargs):
2918
        cmd = self._generator.modify_tag_command(tag_id, kwargs)
2919
        return self.send_command(cmd)
2920
2921
    def modify_target(self, target_id, **kwargs):
2922
        cmd = self._generator.modify_target_command(target_id, kwargs)
2923
        return self.send_command(cmd)
2924
2925
    def modify_task(self, task_id, **kwargs):
2926
        cmd = self._generator.modify_task_command(task_id, kwargs)
2927
        return self.send_command(cmd)
2928
2929
    def modify_user(self, **kwargs):
2930
        cmd = self._generator.modify_user_command(kwargs)
2931
        return self.send_command(cmd)
2932
2933
    def move_task(self, task_id, slave_id):
2934
        cmd = self._generator.move_task_command(task_id, slave_id)
2935
        return self.send_command(cmd)
2936
2937
    def restore(self, entity_id):
2938
        cmd = self._generator.restore_command(entity_id)
2939
        return self.send_command(cmd)
2940
2941
    def resume_task(self, task_id):
2942
        cmd = self._generator.resume_task_command(task_id)
2943
        return self.send_command(cmd)
2944
2945
    def start_task(self, task_id):
2946
        cmd = self._generator.start_task_command(task_id)
2947
        return self.send_command(cmd)
2948
2949
    def stop_task(self, task_id):
2950
        cmd = self._generator.stop_task_command(task_id)
2951
        return self.send_command(cmd)
2952
2953
    def sync_cert(self):
2954
        """Request a synchronization with the CERT feed service
2955
2956
        Returns:
2957
            The response. See :py:meth:`send_command` for details.
2958
        """
2959
        return self._send_xml_command(XmlCommand('sync_cert'))
2960
2961
    def sync_config(self):
2962
        """Request an OSP config synchronization with scanner
2963
2964
        Returns:
2965
            The response. See :py:meth:`send_command` for details.
2966
        """
2967
        return self._send_xml_command(XmlCommand('sync_config'))
2968
2969
    def sync_feed(self):
2970
        """Request a synchronization with the NVT feed service
2971
2972
        Returns:
2973
            The response. See :py:meth:`send_command` for details.
2974
        """
2975
        return self._send_xml_command(XmlCommand('sync_feed'))
2976
2977
    def sync_scap(self):
2978
        """Request a synchronization with the SCAP feed service
2979
2980
        Returns:
2981
            The response. See :py:meth:`send_command` for details.
2982
        """
2983
        return self._send_xml_command(XmlCommand('sync_scap'))
2984
2985
    def test_alert(self, alert_id):
2986
        cmd = self._generator.test_alert_command(alert_id)
2987
        return self.send_command(cmd)
2988
2989
    def verify_agent(self, agent_id):
2990
        cmd = self._generator.verify_agent_command(agent_id)
2991
        return self.send_command(cmd)
2992
2993
    def verify_report_format(self, report_format_id):
2994
        cmd = self._generator.verify_report_format_command(report_format_id)
2995
        return self.send_command(cmd)
2996
2997
    def verify_scanner(self, scanner_id):
2998
        cmd = self._generator.verify_scanner_command(scanner_id)
2999
        return self.send_command(cmd)
3000