Passed
Push — master ( 8c9545...f42925 )
by Jaspar
01:33 queued 10s
created

GmpV208Mixin.clone_permission()   A

Complexity

Conditions 2

Size

Total Lines 18
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 8
nop 2
dl 0
loc 18
rs 10
c 0
b 0
f 0
1
# -*- coding: utf-8 -*-
2
# Copyright (C) 2018-2021 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=arguments-differ, redefined-builtin, too-many-lines
20
21
"""
22
Module for communication with gvmd in
23
`Greenbone Management Protocol version 20.08`_
24
25
.. _Greenbone Management Protocol version 20.08:
26
    https://docs.greenbone.net/API/GMP/gmp-20.08.html
27
"""
28
import collections
29
import logging
30
import numbers
31
32
from typing import Any, List, Optional, Callable, Union, Tuple
33
from lxml import etree
34
35
from gvm.connections import GvmConnection
36
from gvm.errors import InvalidArgument, InvalidArgumentType, RequiredArgument
37
from gvm.protocols.base import GvmProtocol
38
from gvm.protocols.gmpv208.entities.report_formats import (
39
    ReportFormatType,
40
)
41
from gvm.utils import (
42
    deprecation,
43
    check_command_status,
44
    is_list_like,
45
    to_base64,
46
    to_bool,
47
    to_comma_list,
48
    add_filter,
49
)
50
from gvm.xml import XmlCommand
51
52
from . import types
53
from .types import *  # pylint: disable=unused-wildcard-import, wildcard-import
54
from .types import _UsageType as UsageType
55
56
_EMPTY_POLICY_ID = '085569ce-73ed-11df-83c3-002264764cea'
57
58
PROTOCOL_VERSION = (20, 8)
59
60
61
logger = logging.getLogger(__name__)
62
63
Severity = numbers.Real
64
65
# put this into the Alert Entity
66
def _check_event(
67
    event: AlertEvent, condition: AlertCondition, method: AlertMethod
68
):
69
    if event == AlertEvent.TASK_RUN_STATUS_CHANGED:
70
        if not condition:
71
            raise RequiredArgument(
72
                "condition is required for event {}".format(event.name)
73
            )
74
75
        if not method:
76
            raise RequiredArgument(
77
                "method is required for event {}".format(event.name)
78
            )
79
80
        if condition not in (
81
            AlertCondition.ALWAYS,
82
            AlertCondition.FILTER_COUNT_CHANGED,
83
            AlertCondition.FILTER_COUNT_AT_LEAST,
84
            AlertCondition.SEVERITY_AT_LEAST,
85
            AlertCondition.SEVERITY_CHANGED,
86
        ):
87
            raise InvalidArgument(
88
                "Invalid condition {} for event {}".format(
89
                    condition.name, event.name
90
                )
91
            )
92
    elif event in (
93
        AlertEvent.NEW_SECINFO_ARRIVED,
94
        AlertEvent.UPDATED_SECINFO_ARRIVED,
95
    ):
96
        if not condition:
97
            raise RequiredArgument(
98
                "condition is required for event {}".format(event.name)
99
            )
100
101
        if not method:
102
            raise RequiredArgument(
103
                "method is required for event {}".format(event.name)
104
            )
105
106
        if condition != AlertCondition.ALWAYS:
107
            raise InvalidArgument(
108
                "Invalid condition {} for event {}".format(
109
                    condition.name, event.name
110
                )
111
            )
112
        if method not in (
113
            AlertMethod.SCP,
114
            AlertMethod.SEND,
115
            AlertMethod.SMB,
116
            AlertMethod.SNMP,
117
            AlertMethod.SYSLOG,
118
            AlertMethod.EMAIL,
119
        ):
120
            raise InvalidArgument(
121
                "Invalid method {} for event {}".format(method.name, event.name)
122
            )
123
    elif event in (
124
        AlertEvent.TICKET_RECEIVED,
125
        AlertEvent.OWNED_TICKET_CHANGED,
126
        AlertEvent.ASSIGNED_TICKET_CHANGED,
127
    ):
128
        if not condition:
129
            raise RequiredArgument(
130
                "condition is required for event {}".format(event.name)
131
            )
132
133
        if not method:
134
            raise RequiredArgument(
135
                "method is required for event {}".format(event.name)
136
            )
137
        if condition != AlertCondition.ALWAYS:
138
            raise InvalidArgument(
139
                "Invalid condition {} for event {}".format(
140
                    condition.name, event.name
141
                )
142
            )
143
        if method not in (
144
            AlertMethod.EMAIL,
145
            AlertMethod.START_TASK,
146
            AlertMethod.SYSLOG,
147
        ):
148
            raise InvalidArgument(
149
                "Invalid method {} for event {}".format(method.name, event.name)
150
            )
151
    elif event is not None:
152
        raise InvalidArgument('Invalid event "{}"'.format(event.name))
153
154
155
class GmpV208Mixin(GvmProtocol):
156
    """Python interface for Greenbone Management Protocol
157
158
    This class implements the `Greenbone Management Protocol version 20.08`_
159
160
    Arguments:
161
        connection: Connection to use to talk with the gvmd daemon. See
162
            :mod:`gvm.connections` for possible connection types.
163
        transform: Optional transform `callable`_ to convert response data.
164
            After each request the callable gets passed the plain response data
165
            which can be used to check the data and/or conversion into different
166
            representations like a xml dom.
167
168
            See :mod:`gvm.transforms` for existing transforms.
169
170
    .. _Greenbone Management Protocol version 20.08:
171
        https://docs.greenbone.net/API/GMP/gmp-20.08.html
172
    .. _callable:
173
        https://docs.python.org/3/library/functions.html#callable
174
    """
175
176
    types = types
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable types does not seem to be defined.
Loading history...
177
178
    def __init__(
179
        self,
180
        connection: GvmConnection,
181
        *,
182
        transform: Optional[Callable[[str], Any]] = None,
183
    ):
184
        super().__init__(connection, transform=transform)
185
186
        # Is authenticated on gvmd
187
        self._authenticated = False
188
189
    def is_authenticated(self) -> bool:
190
        """Checks if the user is authenticated
191
192
        If the user is authenticated privileged GMP commands like get_tasks
193
        may be send to gvmd.
194
195
        Returns:
196
            bool: True if an authenticated connection to gvmd has been
197
            established.
198
        """
199
        return self._authenticated
200
201
    def authenticate(self, username: str, password: str) -> Any:
202
        """Authenticate to gvmd.
203
204
        The generated authenticate command will be send to server.
205
        Afterwards the response is read, transformed and returned.
206
207
        Arguments:
208
            username: Username
209
            password: Password
210
211
        Returns:
212
            Transformed response from server.
213
        """
214
        cmd = XmlCommand("authenticate")
215
216
        if not username:
217
            raise RequiredArgument(
218
                function=self.authenticate.__name__, argument='username'
219
            )
220
221
        if not password:
222
            raise RequiredArgument(
223
                function=self.authenticate.__name__, argument='password'
224
            )
225
226
        credentials = cmd.add_element("credentials")
227
        credentials.add_element("username", username)
228
        credentials.add_element("password", password)
229
230
        self._send(cmd.to_string())
231
        response = self._read()
232
233
        if check_command_status(response):
234
            self._authenticated = True
235
236
        return self._transform(response)
237
238
    def create_alert(
239
        self,
240
        name: str,
241
        condition: AlertCondition,
242
        event: AlertEvent,
243
        method: AlertMethod,
244
        *,
245
        method_data: Optional[dict] = None,
246
        event_data: Optional[dict] = None,
247
        condition_data: Optional[dict] = None,
248
        filter_id: Optional[int] = None,
249
        comment: Optional[str] = None,
250
    ) -> Any:
251
        """Create a new alert
252
253
        Arguments:
254
            name: Name of the new Alert
255
            condition: The condition that must be satisfied for the alert
256
                to occur; if the event is either 'Updated SecInfo arrived' or
257
                'New SecInfo arrived', condition must be 'Always'. Otherwise,
258
                condition can also be on of 'Severity at least', 'Filter count
259
                changed' or 'Filter count at least'.
260
            event: The event that must happen for the alert to occur, one
261
                of 'Task run status changed', 'Updated SecInfo arrived' or 'New
262
                SecInfo arrived'
263
            method: The method by which the user is alerted, one of 'SCP',
264
                'Send', 'SMB', 'SNMP', 'Syslog' or 'Email'; if the event is
265
                neither 'Updated SecInfo arrived' nor 'New SecInfo arrived',
266
                method can also be one of 'Start Task', 'HTTP Get', 'Sourcefire
267
                Connector' or 'verinice Connector'.
268
            condition_data: Data that defines the condition
269
            event_data: Data that defines the event
270
            method_data: Data that defines the method
271
            filter_id: Filter to apply when executing alert
272
            comment: Comment for the alert
273
274
        Returns:
275
            The response. See :py:meth:`send_command` for details.
276
        """
277
        if not name:
278
            raise RequiredArgument(
279
                function=self.create_alert.__name__, argument='name'
280
            )
281
282
        if not condition:
283
            raise RequiredArgument(
284
                function=self.create_alert.__name__, argument='condition'
285
            )
286
287
        if not event:
288
            raise RequiredArgument(
289
                function=self.create_alert.__name__, argument='event'
290
            )
291
292
        if not method:
293
            raise RequiredArgument(
294
                function=self.create_alert.__name__, argument='method'
295
            )
296
297
        if not isinstance(condition, AlertCondition):
298
            raise InvalidArgumentType(
299
                function=self.create_alert.__name__,
300
                argument='condition',
301
                arg_type=AlertCondition.__name__,
302
            )
303
304
        if not isinstance(event, AlertEvent):
305
            raise InvalidArgumentType(
306
                function=self.create_alert.__name__,
307
                argument='even',
308
                arg_type=AlertEvent.__name__,
309
            )
310
311
        if not isinstance(method, AlertMethod):
312
            raise InvalidArgumentType(
313
                function=self.create_alert.__name__,
314
                argument='method',
315
                arg_type=AlertMethod.__name__,
316
            )
317
318
        _check_event(event, condition, method)
319
320
        cmd = XmlCommand("create_alert")
321
        cmd.add_element("name", name)
322
323
        conditions = cmd.add_element("condition", condition.value)
324
325
        if condition_data is not None:
326
            for key, value in condition_data.items():
327
                _data = conditions.add_element("data", value)
328
                _data.add_element("name", key)
329
330
        events = cmd.add_element("event", event.value)
331
332
        if event_data is not None:
333
            for key, value in event_data.items():
334
                _data = events.add_element("data", value)
335
                _data.add_element("name", key)
336
337
        methods = cmd.add_element("method", method.value)
338
339
        if method_data is not None:
340
            for key, value in method_data.items():
341
                _data = methods.add_element("data", value)
342
                _data.add_element("name", key)
343
344
        if filter_id:
345
            cmd.add_element("filter", attrs={"id": filter_id})
346
347
        if comment:
348
            cmd.add_element("comment", comment)
349
350
        return self._send_xml_command(cmd)
351
352
    def create_audit(
353
        self,
354
        name: str,
355
        policy_id: str,
356
        target_id: str,
357
        scanner_id: str,
358
        *,
359
        alterable: Optional[bool] = None,
360
        hosts_ordering: Optional[HostsOrdering] = None,
361
        schedule_id: Optional[str] = None,
362
        alert_ids: Optional[List[str]] = None,
363
        comment: Optional[str] = None,
364
        schedule_periods: Optional[int] = None,
365
        observers: Optional[List[str]] = None,
366
        preferences: Optional[dict] = None,
367
    ) -> Any:
368
        """Create a new audit task
369
370
        Arguments:
371
            name: Name of the new audit
372
            policy_id: UUID of policy to use by the audit
373
            target_id: UUID of target to be scanned
374
            scanner_id: UUID of scanner to use for scanning the target
375
            comment: Comment for the audit
376
            alterable: Whether the task should be alterable
377
            alert_ids: List of UUIDs for alerts to be applied to the audit
378
            hosts_ordering: The order hosts are scanned in
379
            schedule_id: UUID of a schedule when the audit should be run.
380
            schedule_periods: A limit to the number of times the audit will be
381
                scheduled, or 0 for no limit
382
            observers: List of names or ids of users which should be allowed to
383
                observe this audit
384
            preferences: Name/Value pairs of scanner preferences.
385
386
        Returns:
387
            The response. See :py:meth:`send_command` for details.
388
        """
389
390
        return self.__create_task(
391
            name=name,
392
            config_id=policy_id,
393
            target_id=target_id,
394
            scanner_id=scanner_id,
395
            usage_type=UsageType.AUDIT,
396
            function=self.create_audit.__name__,
397
            alterable=alterable,
398
            hosts_ordering=hosts_ordering,
399
            schedule_id=schedule_id,
400
            alert_ids=alert_ids,
401
            comment=comment,
402
            schedule_periods=schedule_periods,
403
            observers=observers,
404
            preferences=preferences,
405
        )
406
407
    def create_config(
408
        self, config_id: str, name: str, *, comment: Optional[str] = None
409
    ) -> Any:
410
        """Create a new scan config
411
412
        Arguments:
413
            config_id: UUID of the existing scan config
414
            name: Name of the new scan config
415
            comment: A comment on the config
416
417
        Returns:
418
            The response. See :py:meth:`send_command` for details.
419
        """
420
        return self.__create_config(
421
            config_id=config_id,
422
            name=name,
423
            comment=comment,
424
            usage_type=UsageType.SCAN,
425
            function=self.create_config.__name__,
426
        )
427
428
    def create_config_from_osp_scanner(
429
        self, scanner_id: str, name: str, *, comment: Optional[str] = None
430
    ) -> Any:
431
        """Create a new scan config from an ospd scanner.
432
433
        Create config by retrieving the expected preferences from the given
434
        scanner via OSP.
435
436
        Arguments:
437
            scanner_id: UUID of an OSP scanner to get config data from
438
            name: Name of the new scan config
439
            comment: A comment on the config
440
441
        Returns:
442
            The response. See :py:meth:`send_command` for details.
443
        """
444
        return self.__create_config_from_osp_scanner(
445
            scanner_id=scanner_id,
446
            name=name,
447
            comment=comment,
448
            usage_type=UsageType.SCAN,
449
            function=self.create_config.__name__,
450
        )
451
452
    def create_permission(
453
        self,
454
        name: str,
455
        subject_id: str,
456
        subject_type: PermissionSubjectType,
457
        *,
458
        resource_id: Optional[str] = None,
459
        resource_type: Optional[EntityType] = None,
460
        comment: Optional[str] = None,
461
    ) -> Any:
462
        """Create a new permission
463
464
        Arguments:
465
            name: Name of the new permission
466
            subject_id: UUID of subject to whom the permission is granted
467
            subject_type: Type of the subject user, group or role
468
            comment: Comment for the permission
469
            resource_id: UUID of entity to which the permission applies
470
            resource_type: Type of the resource. For Super permissions user,
471
                group or role
472
473
        Returns:
474
            The response. See :py:meth:`send_command` for details.
475
        """
476
        if not name:
477
            raise RequiredArgument(
478
                function=self.create_permission.__name__, argument='name'
479
            )
480
481
        if not subject_id:
482
            raise RequiredArgument(
483
                function=self.create_permission.__name__, argument='subject_id'
484
            )
485
486
        if not isinstance(subject_type, PermissionSubjectType):
487
            raise InvalidArgumentType(
488
                function=self.create_permission.__name__,
489
                argument='subject_type',
490
                arg_type=PermissionSubjectType.__name__,
491
            )
492
493
        cmd = XmlCommand("create_permission")
494
        cmd.add_element("name", name)
495
496
        _xmlsubject = cmd.add_element("subject", attrs={"id": subject_id})
497
        _xmlsubject.add_element("type", subject_type.value)
498
499
        if comment:
500
            cmd.add_element("comment", comment)
501
502 View Code Duplication
        if resource_id or resource_type:
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
503
            if not resource_id:
504
                raise RequiredArgument(
505
                    function=self.create_permission.__name__,
506
                    argument='resource_id',
507
                )
508
509
            if not resource_type:
510
                raise RequiredArgument(
511
                    function=self.create_permission.__name__,
512
                    argument='resource_type',
513
                )
514
515
            if not isinstance(resource_type, self.types.EntityType):
516
                raise InvalidArgumentType(
517
                    function=self.create_permission.__name__,
518
                    argument='resource_type',
519
                    arg_type=self.types.EntityType.__name__,
520
                )
521
522
            _xmlresource = cmd.add_element(
523
                "resource", attrs={"id": resource_id}
524
            )
525
526
            _actual_resource_type = resource_type
527
            if resource_type.value == EntityType.AUDIT.value:
528
                _actual_resource_type = EntityType.TASK
529
            elif resource_type.value == EntityType.POLICY.value:
530
                _actual_resource_type = EntityType.SCAN_CONFIG
531
532
            _xmlresource.add_element("type", _actual_resource_type.value)
533
534
        return self._send_xml_command(cmd)
535
536
    def create_policy(
537
        self, name: str, *, policy_id: str = None, comment: Optional[str] = None
538
    ) -> Any:
539
        """Create a new policy config
540
541
        Arguments:
542
            name: Name of the new policy
543
            policy_id: UUID of an existing policy as base. By default the empty
544
                policy is used.
545
            comment: A comment on the policy
546
547
        Returns:
548
            The response. See :py:meth:`send_command` for details.
549
        """
550
        if policy_id is None:
551
            policy_id = _EMPTY_POLICY_ID
552
        return self.__create_config(
553
            config_id=policy_id,
554
            name=name,
555
            comment=comment,
556
            usage_type=UsageType.POLICY,
557
            function=self.create_policy.__name__,
558
        )
559
560
    def create_tag(
561
        self,
562
        name: str,
563
        resource_type: EntityType,
564
        *,
565
        resource_filter: Optional[str] = None,
566
        resource_ids: Optional[List[str]] = None,
567
        value: Optional[str] = None,
568
        comment: Optional[str] = None,
569
        active: Optional[bool] = None,
570
    ) -> Any:
571
        """Create a tag.
572
573
        Arguments:
574
            name: Name of the tag. A full tag name consisting of namespace and
575
                predicate e.g. `foo:bar`.
576
            resource_type: Entity type the tag is to be attached to.
577
            resource_filter: Filter term to select resources the tag is to be
578
                attached to. Only one of resource_filter or resource_ids can be
579
                provided.
580
            resource_ids: IDs of the resources the tag is to be attached to.
581
                Only one of resource_filter or resource_ids can be provided.
582
            value: Value associated with the tag.
583
            comment: Comment for the tag.
584
            active: Whether the tag should be active.
585
586
        Returns:
587
            The response. See :py:meth:`send_command` for details.
588
        """
589
        if not name:
590
            raise RequiredArgument(
591
                function=self.create_tag.__name__, argument='name'
592
            )
593
594
        if resource_filter and resource_ids:
595
            raise InvalidArgument(
596
                "create_tag accepts either resource_filter or resource_ids "
597
                "argument",
598
                function=self.create_tag.__name__,
599
            )
600
601
        if not resource_type:
602
            raise RequiredArgument(
603
                function=self.create_tag.__name__, argument='resource_type'
604
            )
605
606
        if not isinstance(resource_type, self.types.EntityType):
607
            raise InvalidArgumentType(
608
                function=self.create_tag.__name__,
609
                argument='resource_type',
610
                arg_type=EntityType.__name__,
611
            )
612
613
        cmd = XmlCommand('create_tag')
614
        cmd.add_element('name', name)
615
616
        _xmlresources = cmd.add_element("resources")
617
        if resource_filter is not None:
618
            _xmlresources.set_attribute("filter", resource_filter)
619
620
        for resource_id in resource_ids or []:
621
            _xmlresources.add_element(
622
                "resource", attrs={"id": str(resource_id)}
623
            )
624
625
        _actual_resource_type = resource_type
626
        if resource_type.value == EntityType.AUDIT.value:
627
            _actual_resource_type = EntityType.TASK
628
        elif resource_type.value == EntityType.POLICY.value:
629
            _actual_resource_type = EntityType.SCAN_CONFIG
630
        _xmlresources.add_element("type", _actual_resource_type.value)
631
632
        if comment:
633
            cmd.add_element("comment", comment)
634
635
        if value:
636
            cmd.add_element("value", value)
637
638
        if active is not None:
639
            if active:
640
                cmd.add_element("active", "1")
641
            else:
642
                cmd.add_element("active", "0")
643
644
        return self._send_xml_command(cmd)
645
646 View Code Duplication
    def create_tls_certificate(
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
647
        self,
648
        name: str,
649
        certificate: str,
650
        *,
651
        comment: Optional[str] = None,
652
        trust: Optional[bool] = None,
653
    ) -> Any:
654
        """Create a new TLS certificate
655
656
        Arguments:
657
            name: Name of the TLS certificate, defaulting to the MD5
658
                fingerprint.
659
            certificate: The Base64 encoded certificate data (x.509 DER or PEM).
660
            comment: Comment for the TLS certificate.
661
            trust: Whether the certificate is trusted.
662
663
        Returns:
664
            The response. See :py:meth:`send_command` for details.
665
        """
666
        if not name:
667
            raise RequiredArgument(
668
                function=self.create_tls_certificate.__name__, argument='name'
669
            )
670
        if not certificate:
671
            raise RequiredArgument(
672
                function=self.create_tls_certificate.__name__,
673
                argument='certificate',
674
            )
675
676
        cmd = XmlCommand("create_tls_certificate")
677
678
        if comment:
679
            cmd.add_element("comment", comment)
680
681
        cmd.add_element("name", name)
682
        cmd.add_element("certificate", certificate)
683
684
        if trust:
685
            cmd.add_element("trust", to_bool(trust))
686
687
        return self._send_xml_command(cmd)
688
689
    def get_aggregates(
690
        self,
691
        resource_type: EntityType,
692
        *,
693
        filter: Optional[str] = None,
694
        filter_id: Optional[str] = None,
695
        sort_criteria: Optional[list] = None,
696
        data_columns: Optional[list] = None,
697
        group_column: Optional[str] = None,
698
        subgroup_column: Optional[str] = None,
699
        text_columns: Optional[list] = None,
700
        first_group: Optional[int] = None,
701
        max_groups: Optional[int] = None,
702
        mode: Optional[int] = None,
703
        **kwargs,
704
    ) -> Any:
705
        """Request aggregated information on a resource / entity type
706
707
        Additional arguments can be set via the kwargs parameter for backward
708
        compatibility with older versions of python-gvm, but are not validated.
709
710
        Arguments:
711
            resource_type: The entity type to gather data from
712
            filter: Filter term to use for the query
713
            filter_id: UUID of an existing filter to use for the query
714
            sort_criteria: List of sort criteria (dicts that can contain
715
                a field, stat and order)
716
            data_columns: List of fields to aggregate data from
717
            group_column: The field to group the entities by
718
            subgroup_column: The field to further group the entities
719
                inside groups by
720
            text_columns: List of simple text columns which no statistics
721
                are calculated for
722
            first_group: The index of the first aggregate group to return
723
            max_groups: The maximum number of aggregate groups to return,
724
                -1 for all
725
            mode: Special mode for aggregation
726
727
        Returns:
728
            The response. See :py:meth:`send_command` for details.
729
        """
730
        if not resource_type:
731
            raise RequiredArgument(
732
                function=self.get_aggregates.__name__, argument='resource_type'
733
            )
734
735
        if not isinstance(resource_type, self.types.EntityType):
736
            raise InvalidArgumentType(
737
                function=self.get_aggregates.__name__,
738
                argument='resource_type',
739
                arg_type=self.types.EntityType.__name__,
740
            )
741
742
        cmd = XmlCommand('get_aggregates')
743
744
        _actual_resource_type = resource_type
745
        if resource_type.value == EntityType.AUDIT.value:
746
            _actual_resource_type = EntityType.TASK
747
            cmd.set_attribute('usage_type', 'audit')
748
        elif resource_type.value == EntityType.POLICY.value:
749
            _actual_resource_type = EntityType.SCAN_CONFIG
750
            cmd.set_attribute('usage_type', 'policy')
751
        elif resource_type.value == EntityType.SCAN_CONFIG.value:
752
            cmd.set_attribute('usage_type', 'scan')
753
        elif resource_type.value == EntityType.TASK.value:
754
            cmd.set_attribute('usage_type', 'scan')
755
        cmd.set_attribute('type', _actual_resource_type.value)
756
757
        add_filter(cmd, filter, filter_id)
758
759
        if first_group is not None:
760
            if not isinstance(first_group, int):
761
                raise InvalidArgumentType(
762
                    function=self.get_aggregates.__name__,
763
                    argument='first_group',
764
                    arg_type=int.__name__,
765
                )
766
            cmd.set_attribute('first_group', str(first_group))
767
768
        if max_groups is not None:
769
            if not isinstance(max_groups, int):
770
                raise InvalidArgumentType(
771
                    function=self.get_aggregates.__name__,
772
                    argument='max_groups',
773
                    arg_type=int.__name__,
774
                )
775
            cmd.set_attribute('max_groups', str(max_groups))
776
777
        if sort_criteria is not None:
778
            if not isinstance(sort_criteria, list):
779
                raise InvalidArgumentType(
780
                    function=self.get_aggregates.__name__,
781
                    argument='sort_criteria',
782
                    arg_type=list.__name__,
783
                )
784
            for sort in sort_criteria:
785
                if not isinstance(sort, dict):
786
                    raise InvalidArgumentType(
787
                        function=self.get_aggregates.__name__,
788
                        argument='sort_criteria',
789
                    )
790
791
                sort_elem = cmd.add_element('sort')
792
                if sort.get('field'):
793
                    sort_elem.set_attribute('field', sort.get('field'))
794
795
                if sort.get('stat'):
796
                    if isinstance(sort['stat'], AggregateStatistic):
797
                        sort_elem.set_attribute('stat', sort['stat'].value)
798
                    else:
799
                        stat = get_aggregate_statistic_from_string(sort['stat'])
800
                        sort_elem.set_attribute('stat', stat.value)
801
802
                if sort.get('order'):
803
                    if isinstance(sort['order'], SortOrder):
804
                        sort_elem.set_attribute('order', sort['order'].value)
805
                    else:
806
                        so = get_sort_order_from_string(sort['order'])
807
                        sort_elem.set_attribute('order', so.value)
808
809
        if data_columns is not None:
810
            if not isinstance(data_columns, list):
811
                raise InvalidArgumentType(
812
                    function=self.get_aggregates.__name__,
813
                    argument='data_columns',
814
                    arg_type=list.__name__,
815
                )
816
            for column in data_columns:
817
                cmd.add_element('data_column', column)
818
819
        if group_column is not None:
820
            cmd.set_attribute('group_column', group_column)
821
822
        if subgroup_column is not None:
823
            if not group_column:
824
                raise RequiredArgument(
825
                    '{} requires a group_column argument'
826
                    ' if subgroup_column is given'.format(
827
                        self.get_aggregates.__name__
828
                    ),
829
                    function=self.get_aggregates.__name__,
830
                    argument='subgroup_column',
831
                )
832
            cmd.set_attribute('subgroup_column', subgroup_column)
833
834
        if text_columns is not None:
835
            if not isinstance(text_columns, list):
836
                raise InvalidArgumentType(
837
                    function=self.get_aggregates.__name__,
838
                    argument='text_columns',
839
                    arg_type=list.__name__,
840
                )
841
            for column in text_columns:
842
                cmd.add_element('text_column', column)
843
844
        if mode is not None:
845
            cmd.set_attribute('mode', mode)
846
847
        # Add additional keyword args as attributes for backward compatibility.
848
        cmd.set_attributes(kwargs)
849
850
        return self._send_xml_command(cmd)
851
852 View Code Duplication
    def get_tls_certificates(
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
853
        self,
854
        *,
855
        filter: Optional[str] = None,
856
        filter_id: Optional[str] = None,
857
        include_certificate_data: Optional[bool] = None,
858
        details: Optional[bool] = None,
859
    ) -> Any:
860
        """Request a list of TLS certificates
861
862
        Arguments:
863
            filter: Filter term to use for the query
864
            filter_id: UUID of an existing filter to use for the query
865
            include_certificate_data: Whether to include the certificate data in
866
                the response
867
868
        Returns:
869
            The response. See :py:meth:`send_command` for details.
870
        """
871
872
        cmd = XmlCommand("get_tls_certificates")
873
874
        add_filter(cmd, filter, filter_id)
875
876
        if details is not None:
877
            cmd.set_attribute("details", to_bool(details))
878
879
        if include_certificate_data is not None:
880
            cmd.set_attribute(
881
                "include_certificate_data", to_bool(include_certificate_data)
882
            )
883
884
        return self._send_xml_command(cmd)
885
886
    def get_tls_certificate(self, tls_certificate_id: str) -> Any:
887
        """Request a single TLS certificate
888
889
        Arguments:
890
            tls_certificate_id: UUID of an existing TLS certificate
891
892
        Returns:
893
            The response. See :py:meth:`send_command` for details.
894
        """
895
        cmd = XmlCommand("get_tls_certificates")
896
897
        if not tls_certificate_id:
898
            raise RequiredArgument(
899
                function=self.get_tls_certificate.__name__,
900
                argument='tls_certificate_id',
901
            )
902
903
        cmd.set_attribute("tls_certificate_id", tls_certificate_id)
904
905
        # for single tls certificate always request cert data
906
        cmd.set_attribute("include_certificate_data", "1")
907
908
        # for single entity always request all details
909
        cmd.set_attribute("details", "1")
910
911
        return self._send_xml_command(cmd)
912
913
    def modify_alert(
914
        self,
915
        alert_id: str,
916
        *,
917
        name: Optional[str] = None,
918
        comment: Optional[str] = None,
919
        filter_id: Optional[str] = None,
920
        event: Optional[AlertEvent] = None,
921
        event_data: Optional[dict] = None,
922
        condition: Optional[AlertCondition] = None,
923
        condition_data: Optional[dict] = None,
924
        method: Optional[AlertMethod] = None,
925
        method_data: Optional[dict] = None,
926
    ) -> Any:
927
        """Modifies an existing alert.
928
929
        Arguments:
930
            alert_id: UUID of the alert to be modified.
931
            name: Name of the Alert.
932
            condition: The condition that must be satisfied for the alert to
933
                occur. If the event is either 'Updated SecInfo
934
                arrived' or 'New SecInfo arrived', condition must be 'Always'.
935
                Otherwise, condition can also be on of 'Severity at least',
936
                'Filter count changed' or 'Filter count at least'.
937
            condition_data: Data that defines the condition
938
            event: The event that must happen for the alert to occur, one of
939
                'Task run status changed', 'Updated SecInfo arrived' or
940
                'New SecInfo arrived'
941
            event_data: Data that defines the event
942
            method: The method by which the user is alerted, one of 'SCP',
943
                'Send', 'SMB', 'SNMP', 'Syslog' or 'Email';
944
                if the event is neither 'Updated SecInfo arrived' nor
945
                'New SecInfo arrived', method can also be one of 'Start Task',
946
                'HTTP Get', 'Sourcefire Connector' or 'verinice Connector'.
947
            method_data: Data that defines the method
948
            filter_id: Filter to apply when executing alert
949
            comment: Comment for the alert
950
951
        Returns:
952
            The response. See :py:meth:`send_command` for details.
953
        """
954
955
        if not alert_id:
956
            raise RequiredArgument(
957
                function=self.modify_alert.__name__, argument='alert_id'
958
            )
959
960
        cmd = XmlCommand("modify_alert")
961
        cmd.set_attribute("alert_id", str(alert_id))
962
963
        if name:
964
            cmd.add_element("name", name)
965
966
        if comment:
967
            cmd.add_element("comment", comment)
968
969
        if filter_id:
970
            cmd.add_element("filter", attrs={"id": filter_id})
971
972
        if condition:
973
            if not isinstance(condition, AlertCondition):
974
                raise InvalidArgumentType(
975
                    function=self.modify_alert.__name__,
976
                    argument='condition',
977
                    arg_type=AlertCondition.__name__,
978
                )
979
980
            conditions = cmd.add_element("condition", condition.value)
981
982
            if condition_data is not None:
983
                for key, value in condition_data.items():
984
                    _data = conditions.add_element("data", value)
985
                    _data.add_element("name", key)
986
987
        if method:
988
            if not isinstance(method, AlertMethod):
989
                raise InvalidArgumentType(
990
                    function=self.modify_alert.__name__,
991
                    argument='method',
992
                    arg_type=AlertMethod.__name__,
993
                )
994
995
            methods = cmd.add_element("method", method.value)
996
997
            if method_data is not None:
998
                for key, value in method_data.items():
999
                    _data = methods.add_element("data", value)
1000
                    _data.add_element("name", key)
1001
1002
        if event:
1003
            if not isinstance(event, AlertEvent):
1004
                raise InvalidArgumentType(
1005
                    function=self.modify_alert.__name__,
1006
                    argument='event',
1007
                    arg_type=AlertEvent.__name__,
1008
                )
1009
1010
            _check_event(event, condition, method)
1011
1012
            events = cmd.add_element("event", event.value)
1013
1014
            if event_data is not None:
1015
                for key, value in event_data.items():
1016
                    _data = events.add_element("data", value)
1017
                    _data.add_element("name", key)
1018
1019
        return self._send_xml_command(cmd)
1020
1021
    def modify_audit(
1022
        self,
1023
        audit_id: str,
1024
        *,
1025
        name: Optional[str] = None,
1026
        policy_id: Optional[str] = None,
1027
        target_id: Optional[str] = None,
1028
        scanner_id: Optional[str] = None,
1029
        alterable: Optional[bool] = None,
1030
        hosts_ordering: Optional[HostsOrdering] = None,
1031
        schedule_id: Optional[str] = None,
1032
        schedule_periods: Optional[int] = None,
1033
        comment: Optional[str] = None,
1034
        alert_ids: Optional[List[str]] = None,
1035
        observers: Optional[List[str]] = None,
1036
        preferences: Optional[dict] = None,
1037
    ) -> Any:
1038
        """Modifies an existing task.
1039
1040
        Arguments:
1041
            audit_id: UUID of audit to modify.
1042
            name: The name of the audit.
1043
            policy_id: UUID of policy to use by the audit
1044
            target_id: UUID of target to be scanned
1045
            scanner_id: UUID of scanner to use for scanning the target
1046
            comment: The comment on the audit.
1047
            alert_ids: List of UUIDs for alerts to be applied to the audit
1048
            hosts_ordering: The order hosts are scanned in
1049
            schedule_id: UUID of a schedule when the audit should be run.
1050
            schedule_periods: A limit to the number of times the audit will be
1051
                scheduled, or 0 for no limit.
1052
            observers: List of names or ids of users which should be allowed to
1053
                observe this audit
1054
            preferences: Name/Value pairs of scanner preferences.
1055
1056
        Returns:
1057
            The response. See :py:meth:`send_command` for details.
1058
        """
1059
        self.modify_task(
1060
            task_id=audit_id,
1061
            name=name,
1062
            config_id=policy_id,
1063
            target_id=target_id,
1064
            scanner_id=scanner_id,
1065
            alterable=alterable,
1066
            hosts_ordering=hosts_ordering,
1067
            schedule_id=schedule_id,
1068
            schedule_periods=schedule_periods,
1069
            comment=comment,
1070
            alert_ids=alert_ids,
1071
            observers=observers,
1072
            preferences=preferences,
1073
        )
1074
1075
    def modify_permission(
1076
        self,
1077
        permission_id: str,
1078
        *,
1079
        comment: Optional[str] = None,
1080
        name: Optional[str] = None,
1081
        resource_id: Optional[str] = None,
1082
        resource_type: Optional[EntityType] = None,
1083
        subject_id: Optional[str] = None,
1084
        subject_type: Optional[PermissionSubjectType] = None,
1085
    ) -> Any:
1086
        """Modifies an existing permission.
1087
1088
        Arguments:
1089
            permission_id: UUID of permission to be modified.
1090
            comment: The comment on the permission.
1091
            name: Permission name, currently the name of a command.
1092
            subject_id: UUID of subject to whom the permission is granted
1093
            subject_type: Type of the subject user, group or role
1094
            resource_id: UUID of entity to which the permission applies
1095
            resource_type: Type of the resource. For Super permissions user,
1096
                group or role
1097
1098
        Returns:
1099
            The response. See :py:meth:`send_command` for details.
1100
        """
1101
        if not permission_id:
1102
            raise RequiredArgument(
1103
                function=self.modify_permission.__name__,
1104
                argument='permission_id',
1105
            )
1106
1107
        cmd = XmlCommand("modify_permission")
1108
        cmd.set_attribute("permission_id", permission_id)
1109
1110
        if comment:
1111
            cmd.add_element("comment", comment)
1112
1113
        if name:
1114
            cmd.add_element("name", name)
1115
1116 View Code Duplication
        if resource_id or resource_type:
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
1117
            if not resource_id:
1118
                raise RequiredArgument(
1119
                    function=self.modify_permission.__name__,
1120
                    argument='resource_id',
1121
                )
1122
1123
            if not resource_type:
1124
                raise RequiredArgument(
1125
                    function=self.modify_permission.__name__,
1126
                    argument='resource_type',
1127
                )
1128
1129
            if not isinstance(resource_type, self.types.EntityType):
1130
                raise InvalidArgumentType(
1131
                    function=self.modify_permission.__name__,
1132
                    argument='resource_type',
1133
                    arg_type=self.types.EntityType.__name__,
1134
                )
1135
1136
            _xmlresource = cmd.add_element(
1137
                "resource", attrs={"id": resource_id}
1138
            )
1139
            _actual_resource_type = resource_type
1140
            if resource_type.value == EntityType.AUDIT.value:
1141
                _actual_resource_type = EntityType.TASK
1142
            elif resource_type.value == EntityType.POLICY.value:
1143
                _actual_resource_type = EntityType.SCAN_CONFIG
1144
            _xmlresource.add_element("type", _actual_resource_type.value)
1145
1146
        if subject_id or subject_type:
1147
            if not subject_id:
1148
                raise RequiredArgument(
1149
                    function=self.modify_permission.__name__,
1150
                    argument='subject_id',
1151
                )
1152
1153
            if not isinstance(subject_type, PermissionSubjectType):
1154
                raise InvalidArgumentType(
1155
                    function=self.modify_permission.__name__,
1156
                    argument='subject_type',
1157
                    arg_type=PermissionSubjectType.__name__,
1158
                )
1159
1160
            _xmlsubject = cmd.add_element("subject", attrs={"id": subject_id})
1161
            _xmlsubject.add_element("type", subject_type.value)
1162
1163
        return self._send_xml_command(cmd)
1164
1165
    def modify_policy_set_nvt_preference(
1166
        self,
1167
        policy_id: str,
1168
        name: str,
1169
        nvt_oid: str,
1170
        *,
1171
        value: Optional[str] = None,
1172
    ) -> Any:
1173
        """Modifies the nvt preferences of an existing policy.
1174
1175
        Arguments:
1176
            policy_id: UUID of policy to modify.
1177
            name: Name for preference to change.
1178
            nvt_oid: OID of the NVT associated with preference to modify
1179
            value: New value for the preference. None to delete the preference
1180
                and to use the default instead.
1181
        """
1182
        self.modify_config_set_nvt_preference(
1183
            config_id=policy_id, name=name, nvt_oid=nvt_oid, value=value
1184
        )
1185
1186
    def modify_policy_set_name(self, policy_id: str, name: str) -> Any:
1187
        """Modifies the name of an existing policy
1188
1189
        Arguments:
1190
            config_id: UUID of policy to modify.
1191
            name: New name for the config.
1192
        """
1193
        self.modify_config_set_name(config_id=policy_id, name=name)
1194
1195
    def modify_policy_set_comment(
1196
        self, policy_id: str, comment: Optional[str] = ""
1197
    ) -> Any:
1198
        """Modifies the comment of an existing policy
1199
1200
        Arguments:
1201
            policy_id: UUID of policy to modify.
1202
            comment: Comment to set on a config. Default: ''
1203
        """
1204
        self.modify_config_set_comment(config_id=policy_id, comment=comment)
1205
1206
    def modify_policy_set_scanner_preference(
1207
        self, policy_id: str, name: str, *, value: Optional[str] = None
1208
    ) -> Any:
1209
        """Modifies the scanner preferences of an existing policy
1210
1211
        Arguments:
1212
            policy_id: UUID of policy to modify.
1213
            name: Name of the scanner preference to change
1214
            value: New value for the preference. None to delete the preference
1215
                and to use the default instead.
1216
1217
        """
1218
        self.modify_config_set_scanner_preference(
1219
            config_id=policy_id, name=name, value=value
1220
        )
1221
1222
    def modify_policy_set_nvt_selection(
1223
        self, policy_id: str, family: str, nvt_oids: List[str]
1224
    ) -> Any:
1225
        """Modifies the selected nvts of an existing policy
1226
1227
        The manager updates the given family in the config to include only the
1228
        given NVTs.
1229
1230
        Arguments:
1231
            policy_id: UUID of policy to modify.
1232
            family: Name of the NVT family to include NVTs from
1233
            nvt_oids: List of NVTs to select for the family.
1234
        """
1235
        self.modify_config_set_nvt_selection(
1236
            config_id=policy_id, family=family, nvt_oids=nvt_oids
1237
        )
1238
1239
    def modify_policy_set_family_selection(
1240
        self,
1241
        policy_id: str,
1242
        families: List[Tuple[str, bool, bool]],
1243
        *,
1244
        auto_add_new_families: Optional[bool] = True,
1245
    ) -> Any:
1246
        """
1247
        Selected the NVTs of a policy at a family level.
1248
1249
        Arguments:
1250
            policy_id: UUID of policy to modify.
1251
            families: A list of tuples with the first entry being the name
1252
                of the NVT family selected, second entry a boolean indicating
1253
                whether new NVTs should be added to the family automatically,
1254
                and third entry a boolean indicating whether all nvts from
1255
                the family should be included.
1256
            auto_add_new_families: Whether new families should be added to the
1257
                policy automatically. Default: True.
1258
        """
1259
        self.modify_config_set_family_selection(
1260
            config_id=policy_id,
1261
            families=families,
1262
            auto_add_new_families=auto_add_new_families,
1263
        )
1264
1265
    def modify_tag(
1266
        self,
1267
        tag_id: str,
1268
        *,
1269
        comment: Optional[str] = None,
1270
        name: Optional[str] = None,
1271
        value=None,
1272
        active=None,
1273
        resource_action: Optional[str] = None,
1274
        resource_type: Optional[EntityType] = None,
1275
        resource_filter: Optional[str] = None,
1276
        resource_ids: Optional[List[str]] = None,
1277
    ) -> Any:
1278
        """Modifies an existing tag.
1279
1280
        Arguments:
1281
            tag_id: UUID of the tag.
1282
            comment: Comment to add to the tag.
1283
            name: Name of the tag.
1284
            value: Value of the tag.
1285
            active: Whether the tag is active.
1286
            resource_action: Whether to add or remove resources instead of
1287
                overwriting. One of '', 'add', 'set' or 'remove'.
1288
            resource_type: Type of the resources to which to attach the tag.
1289
                Required if resource_filter is set.
1290
            resource_filter: Filter term to select resources the tag is to be
1291
                attached to.
1292
            resource_ids: IDs of the resources to which to attach the tag.
1293
1294
        Returns:
1295
            The response. See :py:meth:`send_command` for details.
1296
        """
1297
        if not tag_id:
1298
            raise RequiredArgument(
1299
                function=self.modify_tag.__name__, argument='tag_id'
1300
            )
1301
1302
        cmd = XmlCommand("modify_tag")
1303
        cmd.set_attribute("tag_id", str(tag_id))
1304
1305
        if comment:
1306
            cmd.add_element("comment", comment)
1307
1308
        if name:
1309
            cmd.add_element("name", name)
1310
1311
        if value:
1312
            cmd.add_element("value", value)
1313
1314
        if active is not None:
1315
            cmd.add_element("active", to_bool(active))
1316
1317
        if resource_action or resource_filter or resource_ids or resource_type:
1318
            if resource_filter and not resource_type:
1319
                raise RequiredArgument(
1320
                    function=self.modify_tag.__name__, argument='resource_type'
1321
                )
1322
1323
            _xmlresources = cmd.add_element("resources")
1324
            if resource_action is not None:
1325
                _xmlresources.set_attribute("action", resource_action)
1326
1327
            if resource_filter is not None:
1328
                _xmlresources.set_attribute("filter", resource_filter)
1329
1330
            for resource_id in resource_ids or []:
1331
                _xmlresources.add_element(
1332
                    "resource", attrs={"id": str(resource_id)}
1333
                )
1334
1335
            if resource_type is not None:
1336
                if not isinstance(resource_type, self.types.EntityType):
1337
                    raise InvalidArgumentType(
1338
                        function=self.modify_tag.__name__,
1339
                        argument="resource_type",
1340
                        arg_type=EntityType.__name__,
1341
                    )
1342
                _actual_resource_type = resource_type
1343
                if resource_type.value == EntityType.AUDIT.value:
1344
                    _actual_resource_type = EntityType.TASK
1345
                elif resource_type.value == EntityType.POLICY.value:
1346
                    _actual_resource_type = EntityType.SCAN_CONFIG
1347
                _xmlresources.add_element("type", _actual_resource_type.value)
1348
1349
        return self._send_xml_command(cmd)
1350
1351 View Code Duplication
    def modify_tls_certificate(
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
1352
        self,
1353
        tls_certificate_id: str,
1354
        *,
1355
        name: Optional[str] = None,
1356
        comment: Optional[str] = None,
1357
        trust: Optional[bool] = None,
1358
    ) -> Any:
1359
        """Modifies an existing TLS certificate.
1360
1361
        Arguments:
1362
            tls_certificate_id: UUID of the TLS certificate to be modified.
1363
            name: Name of the TLS certificate, defaulting to the MD5 fingerprint
1364
            comment: Comment for the TLS certificate.
1365
            trust: Whether the certificate is trusted.
1366
1367
        Returns:
1368
            The response. See :py:meth:`send_command` for details.
1369
        """
1370
        if not tls_certificate_id:
1371
            raise RequiredArgument(
1372
                function=self.modify_tls_certificate.__name__,
1373
                argument='tls_certificate_id',
1374
            )
1375
1376
        cmd = XmlCommand("modify_tls_certificate")
1377
        cmd.set_attribute("tls_certificate_id", str(tls_certificate_id))
1378
1379
        if comment:
1380
            cmd.add_element("comment", comment)
1381
1382
        if name:
1383
            cmd.add_element("name", name)
1384
1385
        if trust:
1386
            cmd.add_element("trust", to_bool(trust))
1387
1388
        return self._send_xml_command(cmd)
1389
1390
    def clone_alert(self, alert_id: str) -> Any:
1391
        """Clone an existing alert
1392
1393
        Arguments:
1394
            alert_id: UUID of an existing alert to clone from
1395
1396
        Returns:
1397
            The response. See :py:meth:`send_command` for details.
1398
        """
1399
        if not alert_id:
1400
            raise RequiredArgument(
1401
                function=self.clone_alert.__name__, argument='alert_id'
1402
            )
1403
1404
        cmd = XmlCommand("create_alert")
1405
        cmd.add_element("copy", alert_id)
1406
        return self._send_xml_command(cmd)
1407
1408
    def clone_ticket(self, ticket_id: str) -> Any:
1409
        """Clone an existing ticket
1410
1411
        Arguments:
1412
            ticket_id: UUID of an existing ticket to clone from
1413
1414
        Returns:
1415
            The response. See :py:meth:`send_command` for details.
1416
        """
1417
        if not ticket_id:
1418
            raise RequiredArgument(
1419
                function=self.clone_ticket.__name__, argument='ticket_id'
1420
            )
1421
1422
        cmd = XmlCommand("create_ticket")
1423
1424
        _copy = cmd.add_element("copy", ticket_id)
1425
1426
        return self._send_xml_command(cmd)
1427
1428
    def clone_tls_certificate(self, tls_certificate_id: str) -> Any:
1429
        """Modifies an existing TLS certificate.
1430
1431
        Arguments:
1432
            tls_certificate_id: The UUID of an existing TLS certificate
1433
1434
        Returns:
1435
            The response. See :py:meth:`send_command` for details.
1436
        """
1437
        if not tls_certificate_id:
1438
            raise RequiredArgument(
1439
                function=self.clone_tls_certificate.__name__,
1440
                argument='tls_certificate_id',
1441
            )
1442
1443
        cmd = XmlCommand("create_tls_certificate")
1444
1445
        cmd.add_element("copy", tls_certificate_id)
1446
1447
        return self._send_xml_command(cmd)
1448
1449
    def get_configs(
1450
        self,
1451
        *,
1452
        filter: Optional[str] = None,
1453
        filter_id: Optional[str] = None,
1454
        trash: Optional[bool] = None,
1455
        details: Optional[bool] = None,
1456
        families: Optional[bool] = None,
1457
        preferences: Optional[bool] = None,
1458
        tasks: Optional[bool] = None,
1459
    ) -> Any:
1460
        """Request a list of scan configs
1461
1462
        Arguments:
1463
            filter: Filter term to use for the query
1464
            filter_id: UUID of an existing filter to use for the query
1465
            trash: Whether to get the trashcan scan configs instead
1466
            details: Whether to get config families, preferences, nvt selectors
1467
                and tasks.
1468
            families: Whether to include the families if no details are
1469
                requested
1470
            preferences: Whether to include the preferences if no details are
1471
                requested
1472
            tasks: Whether to get tasks using this config
1473
1474
        Returns:
1475
            The response. See :py:meth:`send_command` for details.
1476
        """
1477
        return self.__get_configs(
1478
            UsageType.SCAN,
1479
            filter=filter,
1480
            filter_id=filter_id,
1481
            trash=trash,
1482
            details=details,
1483
            families=families,
1484
            preferences=preferences,
1485
            tasks=tasks,
1486
        )
1487
1488
    def get_policies(
1489
        self,
1490
        *,
1491
        audits: Optional[bool] = None,
1492
        filter: Optional[str] = None,
1493
        filter_id: Optional[str] = None,
1494
        details: Optional[bool] = None,
1495
        families: Optional[bool] = None,
1496
        preferences: Optional[bool] = None,
1497
        trash: Optional[bool] = None,
1498
    ) -> Any:
1499
        """Request a list of policies
1500
1501
        Arguments:
1502
            audits: Whether to get audits using the policy
1503
            filter: Filter term to use for the query
1504
            filter_id: UUID of an existing filter to use for the query
1505
            details: Whether to get  families, preferences, nvt selectors
1506
                and tasks.
1507
            families: Whether to include the families if no details are
1508
                requested
1509
            preferences: Whether to include the preferences if no details are
1510
                requested
1511
            trash: Whether to get the trashcan audits instead
1512
1513
        Returns:
1514
            The response. See :py:meth:`send_command` for details.
1515
        """
1516
        return self.__get_configs(
1517
            UsageType.POLICY,
1518
            filter=filter,
1519
            filter_id=filter_id,
1520
            details=details,
1521
            families=families,
1522
            preferences=preferences,
1523
            tasks=audits,
1524
            trash=trash,
1525
        )
1526
1527
    def get_config(
1528
        self, config_id: str, *, tasks: Optional[bool] = None
1529
    ) -> Any:
1530
        """Request a single scan config
1531
1532
        Arguments:
1533
            config_id: UUID of an existing scan config
1534
            tasks: Whether to get tasks using this config
1535
1536
        Returns:
1537
            The response. See :py:meth:`send_command` for details.
1538
        """
1539
        return self.__get_config(
1540
            config_id=config_id, usage_type=UsageType.SCAN, tasks=tasks
1541
        )
1542
1543
    def get_policy(
1544
        self, policy_id: str, *, audits: Optional[bool] = None
1545
    ) -> Any:
1546
        """Request a single policy
1547
1548
        Arguments:
1549
            policy_id: UUID of an existing policy
1550
            audits: Whether to get audits using this config
1551
1552
        Returns:
1553
            The response. See :py:meth:`send_command` for details.
1554
        """
1555
        return self.__get_config(policy_id, UsageType.POLICY, tasks=audits)
1556
1557
    def get_tasks(
1558
        self,
1559
        *,
1560
        filter: Optional[str] = None,
1561
        filter_id: Optional[str] = None,
1562
        trash: Optional[bool] = None,
1563
        details: Optional[bool] = None,
1564
        schedules_only: Optional[bool] = None,
1565
    ) -> Any:
1566
        """Request a list of tasks
1567
1568
        Arguments:
1569
            filter: Filter term to use for the query
1570
            filter_id: UUID of an existing filter to use for the query
1571
            trash: Whether to get the trashcan tasks instead
1572
            details: Whether to include full task details
1573
            schedules_only: Whether to only include id, name and schedule
1574
                details
1575
1576
        Returns:
1577
            The response. See :py:meth:`send_command` for details.
1578
        """
1579
        return self.__get_tasks(
1580
            UsageType.SCAN,
1581
            filter=filter,
1582
            filter_id=filter_id,
1583
            trash=trash,
1584
            details=details,
1585
            schedules_only=schedules_only,
1586
        )
1587
1588
    def get_audits(
1589
        self,
1590
        *,
1591
        filter: Optional[str] = None,
1592
        filter_id: Optional[str] = None,
1593
        trash: Optional[bool] = None,
1594
        details: Optional[bool] = None,
1595
        schedules_only: Optional[bool] = None,
1596
    ) -> Any:
1597
        """Request a list of audits
1598
1599
        Arguments:
1600
            filter: Filter term to use for the query
1601
            filter_id: UUID of an existing filter to use for the query
1602
            trash: Whether to get the trashcan audits instead
1603
            details: Whether to include full audit details
1604
            schedules_only: Whether to only include id, name and schedule
1605
                details
1606
1607
        Returns:
1608
            The response. See :py:meth:`send_command` for details.
1609
        """
1610
        return self.__get_tasks(
1611
            UsageType.AUDIT,
1612
            filter=filter,
1613
            filter_id=filter_id,
1614
            trash=trash,
1615
            details=details,
1616
            schedules_only=schedules_only,
1617
        )
1618
1619
    def get_task(self, task_id: str) -> Any:
1620
        """Request a single task
1621
1622
        Arguments:
1623
            task_id: UUID of an existing task
1624
1625
        Returns:
1626
            The response. See :py:meth:`send_command` for details.
1627
        """
1628
        return self.__get_task(task_id, UsageType.SCAN)
1629
1630
    def get_audit(self, audit_id: str) -> Any:
1631
        """Request a single audit
1632
1633
        Arguments:
1634
            audit_id: UUID of an existing audit
1635
1636
        Returns:
1637
            The response. See :py:meth:`send_command` for details.
1638
        """
1639
        return self.__get_task(audit_id, UsageType.AUDIT)
1640
1641
    def clone_audit(self, audit_id: str) -> Any:
1642
        """Clone an existing audit
1643
1644
        Arguments:
1645
            audit_id: UUID of existing audit to clone from
1646
1647
        Returns:
1648
            The response. See :py:meth:`send_command` for details.
1649
        """
1650
        if not audit_id:
1651
            raise RequiredArgument(
1652
                function=self.clone_audit.__name__, argument='audit_id'
1653
            )
1654
1655
        cmd = XmlCommand("create_task")
1656
        cmd.add_element("copy", audit_id)
1657
        return self._send_xml_command(cmd)
1658
1659
    def clone_policy(self, policy_id: str) -> Any:
1660
        """Clone a policy from an existing one
1661
1662
        Arguments:
1663
            policy_id: UUID of the existing policy
1664
1665
        Returns:
1666
            The response. See :py:meth:`send_command` for details.
1667
        """
1668
        if not policy_id:
1669
            raise RequiredArgument(
1670
                function=self.clone_policy.__name__, argument='policy_id'
1671
            )
1672
1673
        cmd = XmlCommand("create_config")
1674
        cmd.add_element("copy", policy_id)
1675
        return self._send_xml_command(cmd)
1676
1677
    def delete_audit(
1678
        self, audit_id: str, *, ultimate: Optional[bool] = False
1679
    ) -> Any:
1680
        """Deletes an existing audit
1681
1682
        Arguments:
1683
            audit_id: UUID of the audit to be deleted.
1684
            ultimate: Whether to remove entirely, or to the trashcan.
1685
        """
1686
        if not audit_id:
1687
            raise RequiredArgument(
1688
                function=self.delete_audit.__name__, argument='audit_id'
1689
            )
1690
1691
        cmd = XmlCommand("delete_task")
1692
        cmd.set_attribute("task_id", audit_id)
1693
        cmd.set_attribute("ultimate", to_bool(ultimate))
1694
1695
        return self._send_xml_command(cmd)
1696
1697
    def delete_policy(
1698
        self, policy_id: str, *, ultimate: Optional[bool] = False
1699
    ) -> Any:
1700
        """Deletes an existing policy
1701
1702
        Arguments:
1703
            policy_id: UUID of the policy to be deleted.
1704
            ultimate: Whether to remove entirely, or to the trashcan.
1705
        """
1706
        if not policy_id:
1707
            raise RequiredArgument(
1708
                function=self.delete_policy.__name__, argument='policy_id'
1709
            )
1710
1711
        cmd = XmlCommand("delete_config")
1712
        cmd.set_attribute("config_id", policy_id)
1713
        cmd.set_attribute("ultimate", to_bool(ultimate))
1714
1715
        return self._send_xml_command(cmd)
1716
1717
    def delete_tls_certificate(self, tls_certificate_id: str) -> Any:
1718
        """Deletes an existing tls certificate
1719
1720
        Arguments:
1721
            tls_certificate_id: UUID of the tls certificate to be deleted.
1722
        """
1723
        if not tls_certificate_id:
1724
            raise RequiredArgument(
1725
                function=self.delete_tls_certificate.__name__,
1726
                argument='tls_certificate_id',
1727
            )
1728
1729
        cmd = XmlCommand("delete_tls_certificate")
1730
        cmd.set_attribute("tls_certificate_id", tls_certificate_id)
1731
1732
        return self._send_xml_command(cmd)
1733
1734
    def __create_task(
1735
        self,
1736
        name: str,
1737
        config_id: str,
1738
        target_id: str,
1739
        scanner_id: str,
1740
        usage_type: UsageType,
1741
        function: str,
1742
        *,
1743
        alterable: Optional[bool] = None,
1744
        hosts_ordering: Optional[HostsOrdering] = None,
1745
        schedule_id: Optional[str] = None,
1746
        alert_ids: Optional[List[str]] = None,
1747
        comment: Optional[str] = None,
1748
        schedule_periods: Optional[int] = None,
1749
        observers: Optional[List[str]] = None,
1750
        preferences: Optional[dict] = None,
1751
    ) -> Any:
1752
        if not name:
1753
            raise RequiredArgument(function=function, argument='name')
1754
1755
        if not config_id:
1756
            raise RequiredArgument(function=function, argument='config_id')
1757
1758
        if not target_id:
1759
            raise RequiredArgument(function=function, argument='target_id')
1760
1761
        if not scanner_id:
1762
            raise RequiredArgument(function=function, argument='scanner_id')
1763
1764
        # don't allow to create a container task with create_task
1765
        if target_id == '0':
1766
            raise InvalidArgument(function=function, argument='target_id')
1767
1768
        cmd = XmlCommand("create_task")
1769
        cmd.add_element("name", name)
1770
        cmd.add_element("usage_type", usage_type.value)
1771
        cmd.add_element("config", attrs={"id": config_id})
1772
        cmd.add_element("target", attrs={"id": target_id})
1773
        cmd.add_element("scanner", attrs={"id": scanner_id})
1774
1775
        if comment:
1776
            cmd.add_element("comment", comment)
1777
1778
        if alterable is not None:
1779
            cmd.add_element("alterable", to_bool(alterable))
1780
1781
        if hosts_ordering:
1782
            if not isinstance(hosts_ordering, self.types.HostsOrdering):
1783
                raise InvalidArgumentType(
1784
                    function=function,
1785
                    argument='hosts_ordering',
1786
                    arg_type=HostsOrdering.__name__,
1787
                )
1788
            cmd.add_element("hosts_ordering", hosts_ordering.value)
1789
1790
        if alert_ids:
1791
            if isinstance(alert_ids, str):
1792
                deprecation(
1793
                    "Please pass a list as alert_ids parameter to {}. "
1794
                    "Passing a string is deprecated and will be removed in "
1795
                    "future.".format(function)
1796
                )
1797
1798
                # if a single id is given as a string wrap it into a list
1799
                alert_ids = [alert_ids]
1800
            if is_list_like(alert_ids):
1801
                # parse all given alert id's
1802
                for alert in alert_ids:
1803
                    cmd.add_element("alert", attrs={"id": str(alert)})
1804
1805 View Code Duplication
        if schedule_id:
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
1806
            cmd.add_element("schedule", attrs={"id": schedule_id})
1807
1808
            if schedule_periods is not None:
1809
                if (
1810
                    not isinstance(schedule_periods, numbers.Integral)
1811
                    or schedule_periods < 0
1812
                ):
1813
                    raise InvalidArgument(
1814
                        "schedule_periods must be an integer greater or equal "
1815
                        "than 0"
1816
                    )
1817
                cmd.add_element("schedule_periods", str(schedule_periods))
1818
1819
        if observers is not None:
1820
            if not is_list_like(observers):
1821
                raise InvalidArgumentType(
1822
                    function=function, argument='observers', arg_type='list'
1823
                )
1824
1825
            # gvmd splits by comma and space
1826
            # gvmd tries to lookup each value as user name and afterwards as
1827
            # user id. So both user name and user id are possible
1828
            cmd.add_element("observers", to_comma_list(observers))
1829
1830 View Code Duplication
        if preferences is not None:
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
1831
            if not isinstance(preferences, collections.abc.Mapping):
1832
                raise InvalidArgumentType(
1833
                    function=function,
1834
                    argument='preferences',
1835
                    arg_type=collections.abc.Mapping.__name__,
1836
                )
1837
1838
            _xmlprefs = cmd.add_element("preferences")
1839
            for pref_name, pref_value in preferences.items():
1840
                _xmlpref = _xmlprefs.add_element("preference")
1841
                _xmlpref.add_element("scanner_name", pref_name)
1842
                _xmlpref.add_element("value", str(pref_value))
1843
1844
        return self._send_xml_command(cmd)
1845
1846
    def __create_config(
1847
        self,
1848
        config_id: str,
1849
        name: str,
1850
        usage_type: UsageType,
1851
        function: str,
1852
        *,
1853
        comment: Optional[str] = None,
1854
    ) -> Any:
1855
        if not name:
1856
            raise RequiredArgument(function=function, argument='name')
1857
1858
        if not config_id:
1859
            raise RequiredArgument(function=function, argument='config_id')
1860
1861
        cmd = XmlCommand("create_config")
1862
        if comment is not None:
1863
            cmd.add_element("comment", comment)
1864
        cmd.add_element("copy", config_id)
1865
        cmd.add_element("name", name)
1866
        cmd.add_element("usage_type", usage_type.value)
1867
        return self._send_xml_command(cmd)
1868
1869
    def __create_config_from_osp_scanner(
1870
        self,
1871
        scanner_id: str,
1872
        name: str,
1873
        usage_type: UsageType,
1874
        function: str,
1875
        *,
1876
        comment: Optional[str] = None,
1877
    ) -> Any:
1878
        if not name:
1879
            raise RequiredArgument(function=function, argument='name')
1880
1881
        if not scanner_id:
1882
            raise RequiredArgument(function=function, argument='scanner_id')
1883
1884
        cmd = XmlCommand("create_config")
1885
        if comment is not None:
1886
            cmd.add_element("comment", comment)
1887
        cmd.add_element("scanner", scanner_id)
1888
        cmd.add_element("name", name)
1889
        cmd.add_element("usage_type", usage_type.value)
1890
        return self._send_xml_command(cmd)
1891
1892
    def __get_configs(
1893
        self,
1894
        usage_type: UsageType,
1895
        *,
1896
        filter: Optional[str] = None,
1897
        filter_id: Optional[str] = None,
1898
        trash: Optional[bool] = None,
1899
        details: Optional[bool] = None,
1900
        families: Optional[bool] = None,
1901
        preferences: Optional[bool] = None,
1902
        tasks: Optional[bool] = None,
1903
    ) -> Any:
1904
        cmd = XmlCommand("get_configs")
1905
        cmd.set_attribute("usage_type", usage_type.value)
1906
1907
        add_filter(cmd, filter, filter_id)
1908
1909
        if trash is not None:
1910
            cmd.set_attribute("trash", to_bool(trash))
1911
1912
        if details is not None:
1913
            cmd.set_attribute("details", to_bool(details))
1914
1915
        if families is not None:
1916
            cmd.set_attribute("families", to_bool(families))
1917
1918
        if preferences is not None:
1919
            cmd.set_attribute("preferences", to_bool(preferences))
1920
1921
        if tasks is not None:
1922
            cmd.set_attribute("tasks", to_bool(tasks))
1923
1924
        return self._send_xml_command(cmd)
1925
1926
    def __get_config(
1927
        self,
1928
        config_id: str,
1929
        usage_type: UsageType,
1930
        *,
1931
        tasks: Optional[bool] = None,
1932
    ) -> Any:
1933
        if not config_id:
1934
            raise RequiredArgument(
1935
                function=self.get_config.__name__, argument='config_id'
1936
            )
1937
1938
        cmd = XmlCommand("get_configs")
1939
        cmd.set_attribute("config_id", config_id)
1940
1941
        cmd.set_attribute("usage_type", usage_type.value)
1942
1943
        if tasks is not None:
1944
            cmd.set_attribute("tasks", to_bool(tasks))
1945
1946
        # for single entity always request all details
1947
        cmd.set_attribute("details", "1")
1948
1949
        return self._send_xml_command(cmd)
1950
1951
    def __get_tasks(
1952
        self,
1953
        usage_type: UsageType,
1954
        *,
1955
        filter: Optional[str] = None,
1956
        filter_id: Optional[str] = None,
1957
        trash: Optional[bool] = None,
1958
        details: Optional[bool] = None,
1959
        schedules_only: Optional[bool] = None,
1960
    ) -> Any:
1961
        cmd = XmlCommand("get_tasks")
1962
        cmd.set_attribute("usage_type", usage_type.value)
1963
1964
        add_filter(cmd, filter, filter_id)
1965
1966
        if trash is not None:
1967
            cmd.set_attribute("trash", to_bool(trash))
1968
1969
        if details is not None:
1970
            cmd.set_attribute("details", to_bool(details))
1971
1972
        if schedules_only is not None:
1973
            cmd.set_attribute("schedules_only", to_bool(schedules_only))
1974
1975
        return self._send_xml_command(cmd)
1976
1977
    def __get_task(self, task_id: str, usage_type: UsageType) -> Any:
1978
        if not task_id:
1979
            raise RequiredArgument(
1980
                function=self.get_task.__name__, argument='task_id'
1981
            )
1982
1983
        cmd = XmlCommand("get_tasks")
1984
        cmd.set_attribute("task_id", task_id)
1985
        cmd.set_attribute("usage_type", usage_type.value)
1986
1987
        # for single entity always request all details
1988
        cmd.set_attribute("details", "1")
1989
        return self._send_xml_command(cmd)
1990
1991
    def resume_audit(self, audit_id: str) -> Any:
1992
        """Resume an existing stopped audit
1993
1994
        Arguments:
1995
            audit_id: UUID of the audit to be resumed
1996
1997
        Returns:
1998
            The response. See :py:meth:`send_command` for details.
1999
        """
2000
        if not audit_id:
2001
            raise RequiredArgument(
2002
                function=self.resume_audit.__name__, argument='audit_id'
2003
            )
2004
2005
        cmd = XmlCommand("resume_task")
2006
        cmd.set_attribute("task_id", audit_id)
2007
2008
        return self._send_xml_command(cmd)
2009
2010
    def start_audit(self, audit_id: str) -> Any:
2011
        """Start an existing audit
2012
2013
        Arguments:
2014
            audit_id: UUID of the audit to be started
2015
2016
        Returns:
2017
            The response. See :py:meth:`send_command` for details.
2018
        """
2019
        if not audit_id:
2020
            raise RequiredArgument(
2021
                function=self.start_audit.__name__, argument='audit_id'
2022
            )
2023
2024
        cmd = XmlCommand("start_task")
2025
        cmd.set_attribute("task_id", audit_id)
2026
2027
        return self._send_xml_command(cmd)
2028
2029
    def stop_audit(self, audit_id: str) -> Any:
2030
        """Stop an existing running audit
2031
2032
        Arguments:
2033
            audit_id: UUID of the audit to be stopped
2034
2035
        Returns:
2036
            The response. See :py:meth:`send_command` for details.
2037
        """
2038
        if not audit_id:
2039
            raise RequiredArgument(
2040
                function=self.stop_audit.__name__, argument='audit_id'
2041
            )
2042
2043
        cmd = XmlCommand("stop_task")
2044
        cmd.set_attribute("task_id", audit_id)
2045
2046
        return self._send_xml_command(cmd)
2047
2048
    def get_info_list(
2049
        self,
2050
        info_type: InfoType,
2051
        *,
2052
        filter: Optional[str] = None,
2053
        filter_id: Optional[str] = None,
2054
        name: Optional[str] = None,
2055
        details: Optional[bool] = None,
2056
    ) -> Any:
2057
        """Request a list of security information
2058
2059
        Arguments:
2060
            info_type: Type must be either CERT_BUND_ADV, CPE, CVE,
2061
                DFN_CERT_ADV, OVALDEF, NVT or ALLINFO
2062
            filter: Filter term to use for the query
2063
            filter_id: UUID of an existing filter to use for the query
2064
            name: Name or identifier of the requested information
2065
            details: Whether to include information about references to this
2066
                information
2067
2068
        Returns:
2069
            The response. See :py:meth:`send_command` for details.
2070
        """
2071
        if not info_type:
2072
            raise RequiredArgument(
2073
                function=self.get_info_list.__name__, argument='info_type'
2074
            )
2075
2076
        if not isinstance(info_type, InfoType):
2077
            raise InvalidArgumentType(
2078
                function=self.get_info_list.__name__,
2079
                argument='info_type',
2080
                arg_type=InfoType.__name__,
2081
            )
2082
2083
        cmd = XmlCommand("get_info")
2084
2085
        cmd.set_attribute("type", info_type.value)
2086
2087
        add_filter(cmd, filter, filter_id)
2088
2089
        if name:
2090
            cmd.set_attribute("name", name)
2091
2092
        if details is not None:
2093
            cmd.set_attribute("details", to_bool(details))
2094
2095
        return self._send_xml_command(cmd)
2096
2097
    def get_info(self, info_id: str, info_type: InfoType) -> Any:
2098
        """Request a single secinfo
2099
2100
        Arguments:
2101
            info_id: UUID of an existing secinfo
2102
            info_type: Type must be either CERT_BUND_ADV, CPE, CVE,
2103
                DFN_CERT_ADV, OVALDEF, NVT
2104
2105
        Returns:
2106
            The response. See :py:meth:`send_command` for details.
2107
        """
2108
        if not info_type:
2109
            raise RequiredArgument(
2110
                function=self.get_info.__name__, argument='info_type'
2111
            )
2112
2113
        if not isinstance(info_type, InfoType):
2114
            raise InvalidArgumentType(
2115
                function=self.get_info.__name__,
2116
                argument='info_type',
2117
                arg_type=InfoType.__name__,
2118
            )
2119
2120
        if not info_id:
2121
            raise RequiredArgument(
2122
                function=self.get_info.__name__, argument='info_id'
2123
            )
2124
2125
        cmd = XmlCommand("get_info")
2126
        cmd.set_attribute("info_id", info_id)
2127
2128
        cmd.set_attribute("type", info_type.value)
2129
2130
        # for single entity always request all details
2131
        cmd.set_attribute("details", "1")
2132
        return self._send_xml_command(cmd)
2133
2134
    def get_feed(self, feed_type: Optional[FeedType]) -> Any:
2135
        """Request a single feed
2136
2137
        Arguments:
2138
            feed_type: Type of single feed to get: NVT, CERT or SCAP
2139
2140
        Returns:
2141
            The response. See :py:meth:`send_command` for details.
2142
        """
2143
        if not feed_type:
2144
            raise RequiredArgument(
2145
                function=self.get_feed.__name__, argument='feed_type'
2146
            )
2147
2148
        if not isinstance(feed_type, FeedType):
2149
            raise InvalidArgumentType(
2150
                function=self.get_feed.__name__,
2151
                argument='feed_type',
2152
                arg_type=FeedType.__name__,
2153
            )
2154
2155
        cmd = XmlCommand("get_feeds")
2156
        cmd.set_attribute("type", feed_type.value)
2157
2158
        return self._send_xml_command(cmd)
2159
2160
    def create_credential(
2161
        self,
2162
        name: str,
2163
        credential_type: CredentialType,
2164
        *,
2165
        comment: Optional[str] = None,
2166
        allow_insecure: Optional[bool] = None,
2167
        certificate: Optional[str] = None,
2168
        key_phrase: Optional[str] = None,
2169
        private_key: Optional[str] = None,
2170
        login: Optional[str] = None,
2171
        password: Optional[str] = None,
2172
        auth_algorithm: Optional[SnmpAuthAlgorithm] = None,
2173
        community: Optional[str] = None,
2174
        privacy_algorithm: Optional[SnmpPrivacyAlgorithm] = None,
2175
        privacy_password: Optional[str] = None,
2176
        public_key: Optional[str] = None,
2177
    ) -> Any:
2178
        """Create a new credential
2179
2180
        Create a new credential e.g. to be used in the method of an alert.
2181
2182
        Currently the following credential types are supported:
2183
2184
            - Username + Password
2185
            - Username + SSH-Key
2186
            - Client Certificates
2187
            - SNMPv1 or SNMPv2c protocol
2188
            - S/MIME Certificate
2189
            - OpenPGP Key
2190
            - Password only
2191
2192
        Arguments:
2193
            name: Name of the new credential
2194
            credential_type: The credential type.
2195
            comment: Comment for the credential
2196
            allow_insecure: Whether to allow insecure use of the credential
2197
            certificate: Certificate for the credential.
2198
                Required for client-certificate and smime credential types.
2199
            key_phrase: Key passphrase for the private key.
2200
                Used for the username+ssh-key credential type.
2201
            private_key: Private key to use for login. Required
2202
                for usk credential type. Also used for the cc credential type.
2203
                The supported key types (dsa, rsa, ecdsa, ...) and formats (PEM,
2204
                PKC#12, OpenSSL, ...) depend on your installed GnuTLS version.
2205
            login: Username for the credential. Required for username+password,
2206
                username+ssh-key and snmp credential type.
2207
            password: Password for the credential. Used for username+password
2208
                and snmp credential types.
2209
            community: The SNMP community
2210
            auth_algorithm: The SNMP authentication algorithm. Required for snmp
2211
                credential type.
2212
            privacy_algorithm: The SNMP privacy algorithm
2213
            privacy_password: The SNMP privacy password
2214
            public_key: PGP public key in *armor* plain text format. Required
2215
                for pgp credential type.
2216
2217
        Examples:
2218
            Creating a Username + Password credential
2219
2220
            .. code-block:: python
2221
2222
                gmp.create_credential(
2223
                    name='UP Credential',
2224
                    credential_type=CredentialType.USERNAME_PASSWORD,
2225
                    login='foo',
2226
                    password='bar',
2227
                )
2228
2229
            Creating a Username + SSH Key credential
2230
2231
            .. code-block:: python
2232
2233
                with open('path/to/private-ssh-key') as f:
2234
                    key = f.read()
2235
2236
                gmp.create_credential(
2237
                    name='USK Credential',
2238
                    credential_type=CredentialType.USERNAME_SSH_KEY,
2239
                    login='foo',
2240
                    key_phrase='foobar',
2241
                    private_key=key,
2242
                )
2243
2244
            Creating a PGP credential
2245
2246
            .. note::
2247
2248
                A compatible public pgp key file can be exported with GnuPG via
2249
                ::
2250
2251
                    $ gpg --armor --export [email protected] > alice.asc
2252
2253
            .. code-block:: python
2254
2255
                with open('path/to/pgp.key.asc') as f:
2256
                    key = f.read()
2257
2258
                gmp.create_credential(
2259
                    name='PGP Credential',
2260
                    credential_type=CredentialType.PGP_ENCRYPTION_KEY,
2261
                    public_key=key,
2262
                )
2263
2264
            Creating a S/MIME credential
2265
2266
            .. code-block:: python
2267
2268
                with open('path/to/smime-cert') as f:
2269
                    cert = f.read()
2270
2271
                gmp.create_credential(
2272
                    name='SMIME Credential',
2273
                    credential_type=CredentialType.SMIME_CERTIFICATE,
2274
                    certificate=cert,
2275
                )
2276
2277
            Creating a Password-Only credential
2278
2279
            .. code-block:: python
2280
2281
                gmp.create_credential(
2282
                    name='Password-Only Credential',
2283
                    credential_type=CredentialType.PASSWORD_ONLY,
2284
                    password='foo',
2285
                )
2286
        Returns:
2287
            The response. See :py:meth:`send_command` for details.
2288
        """
2289
        if not name:
2290
            raise RequiredArgument(
2291
                function=self.create_credential.__name__, argument='name'
2292
            )
2293
2294
        if not isinstance(credential_type, self.types.CredentialType):
2295
            raise InvalidArgumentType(
2296
                function=self.create_credential.__name__,
2297
                argument='credential_type',
2298
                arg_type=CredentialType.__name__,
2299
            )
2300
2301
        cmd = XmlCommand("create_credential")
2302
        cmd.add_element("name", name)
2303
2304
        cmd.add_element("type", credential_type.value)
2305
2306
        if comment:
2307
            cmd.add_element("comment", comment)
2308
2309
        if allow_insecure is not None:
2310
            cmd.add_element("allow_insecure", to_bool(allow_insecure))
2311
2312
        if (
2313
            credential_type == CredentialType.CLIENT_CERTIFICATE
2314
            or credential_type == CredentialType.SMIME_CERTIFICATE
2315
        ):
2316
            if not certificate:
2317
                raise RequiredArgument(
2318
                    function=self.create_credential.__name__,
2319
                    argument='certificate',
2320
                )
2321
2322
            cmd.add_element("certificate", certificate)
2323
2324
        if (
2325
            credential_type == CredentialType.USERNAME_PASSWORD
2326
            or credential_type == CredentialType.USERNAME_SSH_KEY
2327
            or credential_type == CredentialType.SNMP
2328
        ):
2329
            if not login:
2330
                raise RequiredArgument(
2331
                    function=self.create_credential.__name__, argument='login'
2332
                )
2333
2334
            cmd.add_element("login", login)
2335
2336
        if credential_type == CredentialType.PASSWORD_ONLY and not password:
2337
            raise RequiredArgument(
2338
                function=self.create_credential.__name__, argument='password'
2339
            )
2340
2341
        if (
2342
            credential_type == CredentialType.USERNAME_PASSWORD
2343
            or credential_type == CredentialType.SNMP
2344
            or credential_type == CredentialType.PASSWORD_ONLY
2345
        ) and password:
2346
            cmd.add_element("password", password)
2347
2348
        if credential_type == CredentialType.USERNAME_SSH_KEY:
2349
            if not private_key:
2350
                raise RequiredArgument(
2351
                    function=self.create_credential.__name__,
2352
                    argument='private_key',
2353
                )
2354
2355
            _xmlkey = cmd.add_element("key")
2356
            _xmlkey.add_element("private", private_key)
2357
2358
            if key_phrase:
2359
                _xmlkey.add_element("phrase", key_phrase)
2360
2361
        if credential_type == CredentialType.CLIENT_CERTIFICATE and private_key:
2362
            _xmlkey = cmd.add_element("key")
2363
            _xmlkey.add_element("private", private_key)
2364
2365
        if credential_type == CredentialType.SNMP:
2366
            if not isinstance(auth_algorithm, self.types.SnmpAuthAlgorithm):
2367
                raise InvalidArgumentType(
2368
                    function=self.create_credential.__name__,
2369
                    argument='auth_algorithm',
2370
                    arg_type=SnmpAuthAlgorithm.__name__,
2371
                )
2372
2373
            cmd.add_element("auth_algorithm", auth_algorithm.value)
2374
2375
            if community:
2376
                cmd.add_element("community", community)
2377
2378 View Code Duplication
            if privacy_algorithm is not None or privacy_password:
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
2379
                _xmlprivacy = cmd.add_element("privacy")
2380
2381
                if privacy_algorithm is not None:
2382
                    if not isinstance(
2383
                        privacy_algorithm, self.types.SnmpPrivacyAlgorithm
2384
                    ):
2385
                        raise InvalidArgumentType(
2386
                            function=self.create_credential.__name__,
2387
                            argument='privacy_algorithm',
2388
                            arg_type=SnmpPrivacyAlgorithm.__name__,
2389
                        )
2390
2391
                    _xmlprivacy.add_element(
2392
                        "algorithm", privacy_algorithm.value
2393
                    )
2394
2395
                if privacy_password:
2396
                    _xmlprivacy.add_element("password", privacy_password)
2397
2398
        if credential_type == CredentialType.PGP_ENCRYPTION_KEY:
2399
            if not public_key:
2400
                raise RequiredArgument(
2401
                    function=self.create_credential.__name__,
2402
                    argument='public_key',
2403
                )
2404
2405
            _xmlkey = cmd.add_element("key")
2406
            _xmlkey.add_element("public", public_key)
2407
2408
        return self._send_xml_command(cmd)
2409
2410
    def modify_credential(
2411
        self,
2412
        credential_id: str,
2413
        *,
2414
        name: Optional[str] = None,
2415
        comment: Optional[str] = None,
2416
        allow_insecure: Optional[bool] = None,
2417
        certificate: Optional[str] = None,
2418
        key_phrase: Optional[str] = None,
2419
        private_key: Optional[str] = None,
2420
        login: Optional[str] = None,
2421
        password: Optional[str] = None,
2422
        auth_algorithm: Optional[SnmpAuthAlgorithm] = None,
2423
        community: Optional[str] = None,
2424
        privacy_algorithm: Optional[SnmpPrivacyAlgorithm] = None,
2425
        privacy_password: Optional[str] = None,
2426
        public_key: Optional[str] = None,
2427
    ) -> Any:
2428
        """Modifies an existing credential.
2429
2430
        Arguments:
2431
            credential_id: UUID of the credential
2432
            name: Name of the credential
2433
            comment: Comment for the credential
2434
            allow_insecure: Whether to allow insecure use of the credential
2435
            certificate: Certificate for the credential
2436
            key_phrase: Key passphrase for the private key
2437
            private_key: Private key to use for login
2438
            login: Username for the credential
2439
            password: Password for the credential
2440
            auth_algorithm: The authentication algorithm for SNMP
2441
            community: The SNMP community
2442
            privacy_algorithm: The privacy algorithm for SNMP
2443
            privacy_password: The SNMP privacy password
2444
            public_key: PGP public key in *armor* plain text format
2445
2446
        Returns:
2447
            The response. See :py:meth:`send_command` for details.
2448
        """
2449
        if not credential_id:
2450
            raise RequiredArgument(
2451
                function=self.modify_credential.__name__,
2452
                argument='credential_id',
2453
            )
2454
2455
        cmd = XmlCommand("modify_credential")
2456
        cmd.set_attribute("credential_id", credential_id)
2457
2458
        if comment:
2459
            cmd.add_element("comment", comment)
2460
2461
        if name:
2462
            cmd.add_element("name", name)
2463
2464
        if allow_insecure is not None:
2465
            cmd.add_element("allow_insecure", to_bool(allow_insecure))
2466
2467
        if certificate:
2468
            cmd.add_element("certificate", certificate)
2469
2470
        if key_phrase and private_key:
2471
            _xmlkey = cmd.add_element("key")
2472
            _xmlkey.add_element("phrase", key_phrase)
2473
            _xmlkey.add_element("private", private_key)
2474
        elif (not key_phrase and private_key) or (
2475
            key_phrase and not private_key
2476
        ):
2477
            raise RequiredArgument(
2478
                function=self.modify_credential.__name__,
2479
                argument='key_phrase and private_key',
2480
            )
2481
2482
        if login:
2483
            cmd.add_element("login", login)
2484
2485
        if password:
2486
            cmd.add_element("password", password)
2487
2488
        if auth_algorithm:
2489
            if not isinstance(auth_algorithm, self.types.SnmpAuthAlgorithm):
2490
                raise InvalidArgumentType(
2491
                    function=self.modify_credential.__name__,
2492
                    argument='auth_algorithm',
2493
                    arg_type=SnmpAuthAlgorithm.__name__,
2494
                )
2495
            cmd.add_element("auth_algorithm", auth_algorithm.value)
2496
2497
        if community:
2498
            cmd.add_element("community", community)
2499
2500 View Code Duplication
        if privacy_algorithm is not None or privacy_password is not None:
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
2501
            _xmlprivacy = cmd.add_element("privacy")
2502
2503
            if privacy_algorithm is not None:
2504
                if not isinstance(
2505
                    privacy_algorithm, self.types.SnmpPrivacyAlgorithm
2506
                ):
2507
                    raise InvalidArgumentType(
2508
                        function=self.modify_credential.__name__,
2509
                        argument='privacy_algorithm',
2510
                        arg_type=SnmpPrivacyAlgorithm.__name__,
2511
                    )
2512
2513
                _xmlprivacy.add_element("algorithm", privacy_algorithm.value)
2514
2515
            if privacy_password is not None:
2516
                _xmlprivacy.add_element("password", privacy_password)
2517
2518
        if public_key:
2519
            _xmlkey = cmd.add_element("key")
2520
            _xmlkey.add_element("public", public_key)
2521
2522
        return self._send_xml_command(cmd)
2523
2524
    def create_ticket(
2525
        self,
2526
        *,
2527
        result_id: str,
2528
        assigned_to_user_id: str,
2529
        note: str,
2530
        comment: Optional[str] = None,
2531
    ) -> Any:
2532
        """Create a new ticket
2533
2534
        Arguments:
2535
            result_id: UUID of the result the ticket applies to
2536
            assigned_to_user_id: UUID of a user the ticket should be assigned to
2537
            note: A note about opening the ticket
2538
            comment: Comment for the ticket
2539
2540
        Returns:
2541
            The response. See :py:meth:`send_command` for details.
2542
        """
2543
        if not result_id:
2544
            raise RequiredArgument(
2545
                function=self.create_ticket.__name__, argument='result_id'
2546
            )
2547
2548
        if not assigned_to_user_id:
2549
            raise RequiredArgument(
2550
                function=self.create_ticket.__name__,
2551
                argument='assigned_to_user_id',
2552
            )
2553
2554
        if not note:
2555
            raise RequiredArgument(
2556
                function=self.create_ticket.__name__, argument='note'
2557
            )
2558
2559
        cmd = XmlCommand("create_ticket")
2560
2561
        _result = cmd.add_element("result")
2562
        _result.set_attribute("id", result_id)
2563
2564
        _assigned = cmd.add_element("assigned_to")
2565
        _user = _assigned.add_element("user")
2566
        _user.set_attribute("id", assigned_to_user_id)
2567
2568
        _note = cmd.add_element("open_note", note)
2569
2570
        if comment:
2571
            cmd.add_element("comment", comment)
2572
2573
        return self._send_xml_command(cmd)
2574
2575
    def delete_ticket(
2576
        self, ticket_id: str, *, ultimate: Optional[bool] = False
2577
    ):
2578
        """Deletes an existing ticket
2579
2580
        Arguments:
2581
            ticket_id: UUID of the ticket to be deleted.
2582
            ultimate: Whether to remove entirely, or to the trashcan.
2583
        """
2584
        if not ticket_id:
2585
            raise RequiredArgument(
2586
                function=self.delete_ticket.__name__, argument='ticket_id'
2587
            )
2588
2589
        cmd = XmlCommand("delete_ticket")
2590
        cmd.set_attribute("ticket_id", ticket_id)
2591
        cmd.set_attribute("ultimate", to_bool(ultimate))
2592
2593
        return self._send_xml_command(cmd)
2594
2595 View Code Duplication
    def get_tickets(
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
2596
        self,
2597
        *,
2598
        trash: Optional[bool] = None,
2599
        filter: Optional[str] = None,
2600
        filter_id: Optional[str] = None,
2601
    ) -> Any:
2602
        """Request a list of tickets
2603
2604
        Arguments:
2605
            filter: Filter term to use for the query
2606
            filter_id: UUID of an existing filter to use for the query
2607
            trash: True to request the tickets in the trashcan
2608
2609
        Returns:
2610
            The response. See :py:meth:`send_command` for details.
2611
        """
2612
        cmd = XmlCommand("get_tickets")
2613
2614
        add_filter(cmd, filter, filter_id)
2615
2616
        if trash is not None:
2617
            cmd.set_attribute("trash", to_bool(trash))
2618
2619
        return self._send_xml_command(cmd)
2620
2621
    def get_ticket(self, ticket_id: str) -> Any:
2622
        """Request a single ticket
2623
2624
        Arguments:
2625
            ticket_id: UUID of an existing ticket
2626
2627
        Returns:
2628
            The response. See :py:meth:`send_command` for details.
2629
        """
2630
        if not ticket_id:
2631
            raise RequiredArgument(
2632
                function=self.get_ticket.__name__, argument='ticket_id'
2633
            )
2634
2635
        cmd = XmlCommand("get_tickets")
2636
        cmd.set_attribute("ticket_id", ticket_id)
2637
        return self._send_xml_command(cmd)
2638
2639
    def get_vulnerabilities(
2640
        self, *, filter: Optional[str] = None, filter_id: Optional[str] = None
2641
    ) -> Any:
2642
        """Request a list of vulnerabilities
2643
2644
        Arguments:
2645
            filter: Filter term to use for the query
2646
            filter_id: UUID of an existing filter to use for the query
2647
        Returns:
2648
            The response. See :py:meth:`send_command` for details.
2649
        """
2650
        cmd = XmlCommand("get_vulns")
2651
2652
        add_filter(cmd, filter, filter_id)
2653
2654
        return self._send_xml_command(cmd)
2655
2656
    def get_vulnerability(self, vulnerability_id: str) -> Any:
2657
        """Request a single vulnerability
2658
2659
        Arguments:
2660
            vulnerability_id: ID of an existing vulnerability
2661
2662
        Returns:
2663
            The response. See :py:meth:`send_command` for details.
2664
        """
2665
        if not vulnerability_id:
2666
            raise RequiredArgument(
2667
                function=self.get_vulnerability.__name__,
2668
                argument='vulnerability_id',
2669
            )
2670
2671
        cmd = XmlCommand("get_vulns")
2672
        cmd.set_attribute("vuln_id", vulnerability_id)
2673
        return self._send_xml_command(cmd)
2674
2675
    def modify_ticket(
2676
        self,
2677
        ticket_id: str,
2678
        *,
2679
        status: Optional[TicketStatus] = None,
2680
        note: Optional[str] = None,
2681
        assigned_to_user_id: Optional[str] = None,
2682
        comment: Optional[str] = None,
2683
    ) -> Any:
2684
        """Modify a single ticket
2685
2686
        Arguments:
2687
            ticket_id: UUID of an existing ticket
2688
            status: New status for the ticket
2689
            note: Note for the status change. Required if status is set.
2690
            assigned_to_user_id: UUID of the user the ticket should be assigned
2691
                to
2692
            comment: Comment for the ticket
2693
2694
        Returns:
2695
            The response. See :py:meth:`send_command` for details.
2696
        """
2697
        if not ticket_id:
2698
            raise RequiredArgument(
2699
                function=self.modify_ticket.__name__, argument='ticket_id'
2700
            )
2701
2702
        if status and not note:
2703
            raise RequiredArgument(
2704
                function=self.modify_ticket.__name__, argument='note'
2705
            )
2706
2707
        if note and not status:
2708
            raise RequiredArgument(
2709
                function=self.modify_ticket.__name__, argument='status'
2710
            )
2711
2712
        cmd = XmlCommand("modify_ticket")
2713
        cmd.set_attribute("ticket_id", ticket_id)
2714
2715
        if assigned_to_user_id:
2716
            _assigned = cmd.add_element("assigned_to")
2717
            _user = _assigned.add_element("user")
2718
            _user.set_attribute("id", assigned_to_user_id)
2719
2720
        if status:
2721
            if not isinstance(status, self.types.TicketStatus):
2722
                raise InvalidArgumentType(
2723
                    function=self.modify_ticket.__name__,
2724
                    argument='status',
2725
                    arg_type=TicketStatus.__name__,
2726
                )
2727
2728
            cmd.add_element('status', status.value)
2729
            cmd.add_element('{}_note'.format(status.name.lower()), note)
2730
2731
        if comment:
2732
            cmd.add_element("comment", comment)
2733
2734
        return self._send_xml_command(cmd)
2735
2736 View Code Duplication
    def create_filter(
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
2737
        self,
2738
        name: str,
2739
        *,
2740
        filter_type: Optional[FilterType] = None,
2741
        comment: Optional[str] = None,
2742
        term: Optional[str] = None,
2743
    ) -> Any:
2744
        """Create a new filter
2745
2746
        Arguments:
2747
            name: Name of the new filter
2748
            filter_type: Filter for entity type
2749
            comment: Comment for the filter
2750
            term: Filter term e.g. 'name=foo'
2751
2752
        Returns:
2753
            The response. See :py:meth:`send_command` for details.
2754
        """
2755
        if not name:
2756
            raise RequiredArgument(
2757
                function=self.create_filter.__name__, argument="name"
2758
            )
2759
2760
        cmd = XmlCommand("create_filter")
2761
        _xmlname = cmd.add_element("name", name)
2762
2763
        if comment:
2764
            cmd.add_element("comment", comment)
2765
2766
        if term:
2767
            cmd.add_element("term", term)
2768
2769
        if filter_type:
2770
            if not isinstance(filter_type, self.types.FilterType):
2771
                raise InvalidArgumentType(
2772
                    function=self.create_filter.__name__,
2773
                    argument="filter_type",
2774
                    arg_type=self.types.FilterType.__name__,
2775
                )
2776
2777
            cmd.add_element("type", filter_type.value)
2778
2779
        return self._send_xml_command(cmd)
2780
2781 View Code Duplication
    def modify_filter(
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
2782
        self,
2783
        filter_id: str,
2784
        *,
2785
        comment: Optional[str] = None,
2786
        name: Optional[str] = None,
2787
        term: Optional[str] = None,
2788
        filter_type: Optional[FilterType] = None,
2789
    ) -> Any:
2790
        """Modifies an existing filter.
2791
2792
        Arguments:
2793
            filter_id: UUID of the filter to be modified
2794
            comment: Comment on filter.
2795
            name: Name of filter.
2796
            term: Filter term.
2797
            filter_type: Resource type filter applies to.
2798
2799
        Returns:
2800
            The response. See :py:meth:`send_command` for details.
2801
        """
2802
        if not filter_id:
2803
            raise RequiredArgument(
2804
                function=self.modify_filter.__name__, argument='filter_id'
2805
            )
2806
2807
        cmd = XmlCommand("modify_filter")
2808
        cmd.set_attribute("filter_id", filter_id)
2809
2810
        if comment:
2811
            cmd.add_element("comment", comment)
2812
2813
        if name:
2814
            cmd.add_element("name", name)
2815
2816
        if term:
2817
            cmd.add_element("term", term)
2818
2819
        if filter_type:
2820
            if not isinstance(filter_type, self.types.FilterType):
2821
                raise InvalidArgumentType(
2822
                    function=self.modify_filter.__name__,
2823
                    argument='filter_type',
2824
                    arg_type=FilterType.__name__,
2825
                )
2826
            cmd.add_element("type", filter_type.value)
2827
2828
        return self._send_xml_command(cmd)
2829
2830
    def create_schedule(
2831
        self,
2832
        name: str,
2833
        icalendar: str,
2834
        timezone: str,
2835
        *,
2836
        comment: Optional[str] = None,
2837
    ) -> Any:
2838
        """Create a new schedule based in `iCalendar`_ data.
2839
2840
        Example:
2841
            Requires https://pypi.org/project/icalendar/
2842
2843
            .. code-block:: python
2844
2845
                import pytz
2846
2847
                from datetime import datetime
2848
2849
                from icalendar import Calendar, Event
2850
2851
                cal = Calendar()
2852
2853
                cal.add('prodid', '-//Foo Bar//')
2854
                cal.add('version', '2.0')
2855
2856
                event = Event()
2857
                event.add('dtstamp', datetime.now(tz=pytz.UTC))
2858
                event.add('dtstart', datetime(2020, 1, 1, tzinfo=pytz.utc))
2859
2860
                cal.add_component(event)
2861
2862
                gmp.create_schedule(
2863
                    name="My Schedule",
2864
                    icalendar=cal.to_ical(),
2865
                    timezone='UTC'
2866
                )
2867
2868
2869
        Arguments:
2870
            name: Name of the new schedule
2871
            icalendar: `iCalendar`_ (RFC 5545) based data.
2872
            timezone: Timezone to use for the icalender events e.g
2873
                Europe/Berlin. If the datetime values in the icalendar data are
2874
                missing timezone information this timezone gets applied.
2875
                Otherwise the datetime values from the icalendar data are
2876
                displayed in this timezone
2877
            comment: Comment on schedule.
2878
2879
        Returns:
2880
            The response. See :py:meth:`send_command` for details.
2881
2882
        .. _iCalendar:
2883
            https://tools.ietf.org/html/rfc5545
2884
        """
2885
        if not name:
2886
            raise RequiredArgument(
2887
                function=self.create_schedule.__name__, argument='name'
2888
            )
2889
        if not icalendar:
2890
            raise RequiredArgument(
2891
                function=self.create_schedule.__name__, argument='icalendar'
2892
            )
2893
        if not timezone:
2894
            raise RequiredArgument(
2895
                function=self.create_schedule.__name__, argument='timezone'
2896
            )
2897
2898
        cmd = XmlCommand("create_schedule")
2899
2900
        cmd.add_element("name", name)
2901
        cmd.add_element("icalendar", icalendar)
2902
        cmd.add_element("timezone", timezone)
2903
2904
        if comment:
2905
            cmd.add_element("comment", comment)
2906
2907
        return self._send_xml_command(cmd)
2908
2909
    def modify_schedule(
2910
        self,
2911
        schedule_id: str,
2912
        *,
2913
        name: Optional[str] = None,
2914
        icalendar: Optional[str] = None,
2915
        timezone: Optional[str] = None,
2916
        comment: Optional[str] = None,
2917
    ) -> Any:
2918
        """Modifies an existing schedule
2919
2920
        Arguments:
2921
            schedule_id: UUID of the schedule to be modified
2922
            name: Name of the schedule
2923
            icalendar: `iCalendar`_ (RFC 5545) based data.
2924
            timezone: Timezone to use for the icalender events e.g
2925
                Europe/Berlin. If the datetime values in the icalendar data are
2926
                missing timezone information this timezone gets applied.
2927
                Otherwise the datetime values from the icalendar data are
2928
                displayed in this timezone
2929
            commenhedule.
2930
2931
        Returns:
2932
            The response. See :py:meth:`send_command` for details.
2933
2934
        .. _iCalendar:
2935
            https://tools.ietf.org/html/rfc5545
2936
        """
2937
        if not schedule_id:
2938
            raise RequiredArgument(
2939
                function=self.modify_schedule.__name__, argument='schedule_id'
2940
            )
2941
2942
        cmd = XmlCommand("modify_schedule")
2943
        cmd.set_attribute("schedule_id", schedule_id)
2944
2945
        if name:
2946
            cmd.add_element("name", name)
2947
2948
        if icalendar:
2949
            cmd.add_element("icalendar", icalendar)
2950
2951
        if timezone:
2952
            cmd.add_element("timezone", timezone)
2953
2954
        if comment:
2955
            cmd.add_element("comment", comment)
2956
2957
        return self._send_xml_command(cmd)
2958
2959
    def clone_config(self, config_id: str) -> Any:
2960
        """Clone a scan config from an existing one
2961
2962
        Arguments:
2963
            config_id: UUID of the existing scan config
2964
2965
        Returns:
2966
            The response. See :py:meth:`send_command` for details.
2967
        """
2968
        if not config_id:
2969
            raise RequiredArgument(
2970
                function=self.clone_config.__name__, argument='config_id'
2971
            )
2972
2973
        cmd = XmlCommand("create_config")
2974
        cmd.add_element("copy", config_id)
2975
        return self._send_xml_command(cmd)
2976
2977
    def import_config(self, config: str) -> Any:
2978
        """Import a scan config from XML
2979
2980
        Arguments:
2981
            config: Scan Config XML as string to import. This XML must
2982
                contain a :code:`<get_configs_response>` root element.
2983
2984
        Returns:
2985
            The response. See :py:meth:`send_command` for details.
2986
        """
2987
        if not config:
2988
            raise RequiredArgument(
2989
                function=self.import_config.__name__, argument='config'
2990
            )
2991
2992
        cmd = XmlCommand("create_config")
2993
2994
        try:
2995
            cmd.append_xml_str(config)
2996
        except etree.XMLSyntaxError as e:
2997
            raise InvalidArgument(
2998
                function=self.import_config.__name__, argument='config'
2999
            ) from e
3000
3001
        return self._send_xml_command(cmd)
3002
3003
    def clone_credential(self, credential_id: str) -> Any:
3004
        """Clone an existing credential
3005
3006
        Arguments:
3007
            credential_id: UUID of an existing credential to clone from
3008
3009
        Returns:
3010
            The response. See :py:meth:`send_command` for details.
3011
        """
3012
        if not credential_id:
3013
            raise RequiredArgument(
3014
                function=self.clone_credential.__name__,
3015
                argument='credential_id',
3016
            )
3017
3018
        cmd = XmlCommand("create_credential")
3019
        cmd.add_element("copy", credential_id)
3020
        return self._send_xml_command(cmd)
3021
3022
    def clone_filter(self, filter_id: str) -> Any:
3023
        """Clone an existing filter
3024
3025
        Arguments:
3026
            filter_id: UUID of an existing filter to clone from
3027
3028
        Returns:
3029
            The response. See :py:meth:`send_command` for details.
3030
        """
3031
        if not filter_id:
3032
            raise RequiredArgument(
3033
                function=self.clone_filter.__name__, argument='filter_id'
3034
            )
3035
3036
        cmd = XmlCommand("create_filter")
3037
        cmd.add_element("copy", filter_id)
3038
        return self._send_xml_command(cmd)
3039
3040
    def create_group(
3041
        self,
3042
        name: str,
3043
        *,
3044
        comment: Optional[str] = None,
3045
        special: Optional[bool] = False,
3046
        users: Optional[List[str]] = None,
3047
    ) -> Any:
3048
        """Create a new group
3049
3050
        Arguments:
3051
            name: Name of the new group
3052
            comment: Comment for the group
3053
            special: Create permission giving members full access to each
3054
                other's entities
3055
            users: List of user names to be in the group
3056
3057
        Returns:
3058
            The response. See :py:meth:`send_command` for details.
3059
        """
3060
        if not name:
3061
            raise RequiredArgument(
3062
                function=self.create_group.__name__, argument='name'
3063
            )
3064
3065
        cmd = XmlCommand("create_group")
3066
        cmd.add_element("name", name)
3067
3068
        if comment:
3069
            cmd.add_element("comment", comment)
3070
3071
        if special:
3072
            _xmlspecial = cmd.add_element("specials")
3073
            _xmlspecial.add_element("full")
3074
3075
        if users:
3076
            cmd.add_element("users", to_comma_list(users))
3077
3078
        return self._send_xml_command(cmd)
3079
3080
    def clone_group(self, group_id: str) -> Any:
3081
        """Clone an existing group
3082
3083
        Arguments:
3084
            group_id: UUID of an existing group to clone from
3085
3086
        Returns:
3087
            The response. See :py:meth:`send_command` for details.
3088
        """
3089
        if not group_id:
3090
            raise RequiredArgument(
3091
                function=self.clone_group.__name__, argument='group_id'
3092
            )
3093
3094
        cmd = XmlCommand("create_group")
3095
        cmd.add_element("copy", group_id)
3096
        return self._send_xml_command(cmd)
3097
3098
    def create_host(self, name: str, *, comment: Optional[str] = None) -> Any:
3099
        """Create a new host asset
3100
3101
        Arguments:
3102
            name: Name for the new host asset
3103
            comment: Comment for the new host asset
3104
3105
        Returns:
3106
            The response. See :py:meth:`send_command` for details.
3107
        """
3108
        if not name:
3109
            raise RequiredArgument(
3110
                function=self.create_host.__name__, argument='name'
3111
            )
3112
3113
        cmd = XmlCommand("create_asset")
3114
        asset = cmd.add_element("asset")
3115
        asset.add_element("type", "host")  # ignored for gmp7, required for gmp8
3116
        asset.add_element("name", name)
3117
3118
        if comment:
3119
            asset.add_element("comment", comment)
3120
3121
        return self._send_xml_command(cmd)
3122
3123 View Code Duplication
    def create_note(
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
3124
        self,
3125
        text: str,
3126
        nvt_oid: str,
3127
        *,
3128
        days_active: Optional[int] = None,
3129
        hosts: Optional[List[str]] = None,
3130
        port: Optional[int] = None,
3131
        result_id: Optional[str] = None,
3132
        severity: Optional[Severity] = None,
3133
        task_id: Optional[str] = None,
3134
        threat: Optional[SeverityLevel] = None,
3135
    ) -> Any:
3136
        """Create a new note
3137
3138
        Arguments:
3139
            text: Text of the new note
3140
            nvt_id: OID of the nvt to which note applies
3141
            days_active: Days note will be active. -1 on
3142
                always, 0 off
3143
            hosts: A list of hosts addresses
3144
            port: Port to which the note applies
3145
            result_id: UUID of a result to which note applies
3146
            severity: Severity to which note applies
3147
            task_id: UUID of task to which note applies
3148
            threat: Severity level to which note applies. Will be converted to
3149
                severity.
3150
3151
        Returns:
3152
            The response. See :py:meth:`send_command` for details.
3153
        """
3154
        if not text:
3155
            raise RequiredArgument(
3156
                function=self.create_note.__name__, argument='text'
3157
            )
3158
3159
        if not nvt_oid:
3160
            raise RequiredArgument(
3161
                function=self.create_note.__name__, argument='nvt_oid'
3162
            )
3163
3164
        cmd = XmlCommand("create_note")
3165
        cmd.add_element("text", text)
3166
        cmd.add_element("nvt", attrs={"oid": nvt_oid})
3167
3168
        if days_active is not None:
3169
            cmd.add_element("active", str(days_active))
3170
3171
        if hosts:
3172
            cmd.add_element("hosts", to_comma_list(hosts))
3173
3174
        if port:
3175
            cmd.add_element("port", str(port))
3176
3177
        if result_id:
3178
            cmd.add_element("result", attrs={"id": result_id})
3179
3180
        if severity:
3181
            cmd.add_element("severity", str(severity))
3182
3183
        if task_id:
3184
            cmd.add_element("task", attrs={"id": task_id})
3185
3186
        if threat is not None:
3187
            if not isinstance(threat, SeverityLevel):
3188
                raise InvalidArgumentType(
3189
                    function="create_note",
3190
                    argument="threat",
3191
                    arg_type=SeverityLevel.__name__,
3192
                )
3193
3194
            cmd.add_element("threat", threat.value)
3195
3196
        return self._send_xml_command(cmd)
3197
3198
    def clone_note(self, note_id: str) -> Any:
3199
        """Clone an existing note
3200
3201
        Arguments:
3202
            note_id: UUID of an existing note to clone from
3203
3204
        Returns:
3205
            The response. See :py:meth:`send_command` for details.
3206
        """
3207
        if not note_id:
3208
            raise RequiredArgument(
3209
                function=self.clone_note.__name__, argument='note_id'
3210
            )
3211
3212
        cmd = XmlCommand("create_note")
3213
        cmd.add_element("copy", note_id)
3214
        return self._send_xml_command(cmd)
3215
3216 View Code Duplication
    def create_override(
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
3217
        self,
3218
        text: str,
3219
        nvt_oid: str,
3220
        *,
3221
        days_active: Optional[int] = None,
3222
        hosts: Optional[List[str]] = None,
3223
        port: Optional[int] = None,
3224
        result_id: Optional[str] = None,
3225
        severity: Optional[Severity] = None,
3226
        new_severity: Optional[Severity] = None,
3227
        task_id: Optional[str] = None,
3228
        threat: Optional[SeverityLevel] = None,
3229
        new_threat: Optional[SeverityLevel] = None,
3230
    ) -> Any:
3231
        """Create a new override
3232
3233
        Arguments:
3234
            text: Text of the new override
3235
            nvt_id: OID of the nvt to which override applies
3236
            days_active: Days override will be active. -1 on always, 0 off
3237
            hosts: A list of host addresses
3238
            port: Port to which the override applies
3239
            result_id: UUID of a result to which override applies
3240
            severity: Severity to which override applies
3241
            new_severity: New severity for result
3242
            task_id: UUID of task to which override applies
3243
            threat: Severity level to which override applies. Will be converted
3244
                to severity.
3245
            new_threat: New severity level for results. Will be converted to
3246
                new_severity.
3247
3248
        Returns:
3249
            The response. See :py:meth:`send_command` for details.
3250
        """
3251
        if not text:
3252
            raise RequiredArgument(
3253
                function=self.create_override.__name__, argument='text'
3254
            )
3255
3256
        if not nvt_oid:
3257
            raise RequiredArgument(
3258
                function=self.create_override.__name__, argument='nvt_oid'
3259
            )
3260
3261
        cmd = XmlCommand("create_override")
3262
        cmd.add_element("text", text)
3263
        cmd.add_element("nvt", attrs={"oid": nvt_oid})
3264
3265
        if days_active is not None:
3266
            cmd.add_element("active", str(days_active))
3267
3268
        if hosts:
3269
            cmd.add_element("hosts", to_comma_list(hosts))
3270
3271
        if port:
3272
            cmd.add_element("port", str(port))
3273
3274
        if result_id:
3275
            cmd.add_element("result", attrs={"id": result_id})
3276
3277
        if severity:
3278
            cmd.add_element("severity", str(severity))
3279
3280
        if new_severity:
3281
            cmd.add_element("new_severity", str(new_severity))
3282
3283
        if task_id:
3284
            cmd.add_element("task", attrs={"id": task_id})
3285
3286
        if threat is not None:
3287
            if not isinstance(threat, SeverityLevel):
3288
                raise InvalidArgumentType(
3289
                    function=self.create_override.__name__,
3290
                    argument="threat",
3291
                    arg_type=SeverityLevel.__name__,
3292
                )
3293
3294
            cmd.add_element("threat", threat.value)
3295
3296
        if new_threat is not None:
3297
            if not isinstance(new_threat, SeverityLevel):
3298
                raise InvalidArgumentType(
3299
                    function=self.create_override.__name__,
3300
                    argument="new_threat",
3301
                    arg_type=SeverityLevel.__name__,
3302
                )
3303
3304
            cmd.add_element("new_threat", new_threat.value)
3305
3306
        return self._send_xml_command(cmd)
3307
3308
    def clone_override(self, override_id: str) -> Any:
3309
        """Clone an existing override
3310
3311
        Arguments:
3312
            override_id: UUID of an existing override to clone from
3313
3314
        Returns:
3315
            The response. See :py:meth:`send_command` for details.
3316
        """
3317
        if not override_id:
3318
            raise RequiredArgument(
3319
                function=self.clone_override.__name__, argument='override_id'
3320
            )
3321
3322
        cmd = XmlCommand("create_override")
3323
        cmd.add_element("copy", override_id)
3324
        return self._send_xml_command(cmd)
3325
3326
    def clone_permission(self, permission_id: str) -> Any:
3327
        """Clone an existing permission
3328
3329
        Arguments:
3330
            permission_id: UUID of an existing permission to clone from
3331
3332
        Returns:
3333
            The response. See :py:meth:`send_command` for details.
3334
        """
3335
        if not permission_id:
3336
            raise RequiredArgument(
3337
                function=self.clone_permission.__name__,
3338
                argument='permission_id',
3339
            )
3340
3341
        cmd = XmlCommand("create_permission")
3342
        cmd.add_element("copy", permission_id)
3343
        return self._send_xml_command(cmd)
3344
3345
    def clone_report_format(
3346
        self, report_format_id: [Union[str, ReportFormatType]]
3347
    ) -> Any:
3348
        """Clone a report format from an existing one
3349
3350
        Arguments:
3351
            report_format_id: UUID of the existing report format
3352
                              or ReportFormatType (enum)
3353
3354
        Returns:
3355
            The response. See :py:meth:`send_command` for details.
3356
        """
3357
        if not report_format_id:
3358
            raise RequiredArgument(
3359
                function=self.clone_report_format.__name__,
3360
                argument='report_format_id',
3361
            )
3362
3363
        cmd = XmlCommand("create_report_format")
3364
3365
        if isinstance(report_format_id, ReportFormatType):
3366
            report_format_id = report_format_id.value
3367
3368
        cmd.add_element("copy", report_format_id)
3369
        return self._send_xml_command(cmd)
3370
3371
    def import_report_format(self, report_format: str) -> Any:
3372
        """Import a report format from XML
3373
3374
        Arguments:
3375
            report_format: Report format XML as string to import. This XML must
3376
                contain a :code:`<get_report_formats_response>` root element.
3377
3378
        Returns:
3379
            The response. See :py:meth:`send_command` for details.
3380
        """
3381
        if not report_format:
3382
            raise RequiredArgument(
3383
                function=self.import_report_format.__name__,
3384
                argument='report_format',
3385
            )
3386
3387
        cmd = XmlCommand("create_report_format")
3388
3389
        try:
3390
            cmd.append_xml_str(report_format)
3391
        except etree.XMLSyntaxError as e:
3392
            raise InvalidArgument(
3393
                function=self.import_report_format.__name__,
3394
                argument='report_format',
3395
            ) from e
3396
3397
        return self._send_xml_command(cmd)
3398
3399
    def create_role(
3400
        self,
3401
        name: str,
3402
        *,
3403
        comment: Optional[str] = None,
3404
        users: Optional[List[str]] = None,
3405
    ) -> Any:
3406
        """Create a new role
3407
3408
        Arguments:
3409
            name: Name of the role
3410
            comment: Comment for the role
3411
            users: List of user names to add to the role
3412
3413
        Returns:
3414
            The response. See :py:meth:`send_command` for details.
3415
        """
3416
3417
        if not name:
3418
            raise RequiredArgument(
3419
                function=self.create_role.__name__, argument='name'
3420
            )
3421
3422
        cmd = XmlCommand("create_role")
3423
        cmd.add_element("name", name)
3424
3425
        if comment:
3426
            cmd.add_element("comment", comment)
3427
3428
        if users:
3429
            cmd.add_element("users", to_comma_list(users))
3430
3431
        return self._send_xml_command(cmd)
3432
3433
    def clone_role(self, role_id: str) -> Any:
3434
        """Clone an existing role
3435
3436
        Arguments:
3437
            role_id: UUID of an existing role to clone from
3438
3439
        Returns:
3440
            The response. See :py:meth:`send_command` for details.
3441
        """
3442
        if not role_id:
3443
            raise RequiredArgument(
3444
                function=self.clone_role.__name__, argument='role_id'
3445
            )
3446
3447
        cmd = XmlCommand("create_role")
3448
        cmd.add_element("copy", role_id)
3449
        return self._send_xml_command(cmd)
3450
3451
    def create_scanner(
3452
        self,
3453
        name: str,
3454
        host: str,
3455
        port: int,
3456
        scanner_type: ScannerType,
3457
        credential_id: str,
3458
        *,
3459
        ca_pub: Optional[str] = None,
3460
        comment: Optional[str] = None,
3461
    ) -> Any:
3462
        """Create a new scanner
3463
3464
        Arguments:
3465
            name: Name of the scanner
3466
            host: The host of the scanner
3467
            port: The port of the scanner
3468
            scanner_type: Type of the scanner.
3469
            credential_id: UUID of client certificate credential for the
3470
                scanner
3471
            ca_pub: Certificate of CA to verify scanner certificate
3472
            comment: Comment for the scanner
3473
        Returns:
3474
            The response. See :py:meth:`send_command` for details.
3475
        """
3476
        if not name:
3477
            raise RequiredArgument(
3478
                function=self.create_scanner.__name__, argument='name'
3479
            )
3480
3481
        if not host:
3482
            raise RequiredArgument(
3483
                function=self.create_scanner.__name__, argument='host'
3484
            )
3485
3486
        if not port:
3487
            raise RequiredArgument(
3488
                function=self.create_scanner.__name__, argument='port'
3489
            )
3490
3491
        if not scanner_type:
3492
            raise RequiredArgument(
3493
                function=self.create_scanner.__name__, argument='scanner_type'
3494
            )
3495
3496
        if not credential_id:
3497
            raise RequiredArgument(
3498
                function=self.create_scanner.__name__, argument='credential_id'
3499
            )
3500
3501
        if not isinstance(scanner_type, self.types.ScannerType):
3502
            raise InvalidArgumentType(
3503
                function=self.create_scanner.__name__,
3504
                argument='scanner_type',
3505
                arg_type=self.types.ScannerType.__name__,
3506
            )
3507
3508
        cmd = XmlCommand("create_scanner")
3509
        cmd.add_element("name", name)
3510
        cmd.add_element("host", host)
3511
        cmd.add_element("port", str(port))
3512
        cmd.add_element("type", scanner_type.value)
3513
3514
        if ca_pub:
3515
            cmd.add_element("ca_pub", ca_pub)
3516
3517
        cmd.add_element("credential", attrs={"id": str(credential_id)})
3518
3519
        if comment:
3520
            cmd.add_element("comment", comment)
3521
3522
        return self._send_xml_command(cmd)
3523
3524
    def clone_scanner(self, scanner_id: str) -> Any:
3525
        """Clone an existing scanner
3526
3527
        Arguments:
3528
            scanner_id: UUID of an existing scanner to clone from
3529
3530
        Returns:
3531
            The response. See :py:meth:`send_command` for details.
3532
        """
3533
        if not scanner_id:
3534
            raise RequiredArgument(
3535
                function=self.clone_scanner.__name__, argument='scanner_id'
3536
            )
3537
3538
        cmd = XmlCommand("create_scanner")
3539
        cmd.add_element("copy", scanner_id)
3540
        return self._send_xml_command(cmd)
3541
3542
    def clone_schedule(self, schedule_id: str) -> Any:
3543
        """Clone an existing schedule
3544
3545
        Arguments:
3546
            schedule_id: UUID of an existing schedule to clone from
3547
3548
        Returns:
3549
            The response. See :py:meth:`send_command` for details.
3550
        """
3551
        if not schedule_id:
3552
            raise RequiredArgument(
3553
                function=self.clone_schedule.__name__, argument='schedule_id'
3554
            )
3555
3556
        cmd = XmlCommand("create_schedule")
3557
        cmd.add_element("copy", schedule_id)
3558
        return self._send_xml_command(cmd)
3559
3560
    def clone_tag(self, tag_id: str) -> Any:
3561
        """Clone an existing tag
3562
3563
        Arguments:
3564
            tag_id: UUID of an existing tag to clone from
3565
3566
        Returns:
3567
            The response. See :py:meth:`send_command` for details.
3568
        """
3569
        if not tag_id:
3570
            raise RequiredArgument(
3571
                function=self.clone_tag.__name__, argument='tag_id'
3572
            )
3573
3574
        cmd = XmlCommand("create_tag")
3575
        cmd.add_element("copy", tag_id)
3576
        return self._send_xml_command(cmd)
3577
3578
    def create_user(
3579
        self,
3580
        name: str,
3581
        *,
3582
        password: Optional[str] = None,
3583
        hosts: Optional[List[str]] = None,
3584
        hosts_allow: Optional[bool] = False,
3585
        ifaces: Optional[List[str]] = None,
3586
        ifaces_allow: Optional[bool] = False,
3587
        role_ids: Optional[List[str]] = None,
3588
    ) -> Any:
3589
        """Create a new user
3590
3591
        Arguments:
3592
            name: Name of the user
3593
            password: Password of the user
3594
            hosts: A list of host addresses (IPs, DNS names)
3595
            hosts_allow: If True allow only access to passed hosts otherwise
3596
                deny access. Default is False for deny hosts.
3597
            ifaces: A list of interface names
3598
            ifaces_allow: If True allow only access to passed interfaces
3599
                otherwise deny access. Default is False for deny interfaces.
3600
            role_ids: A list of role UUIDs for the user
3601
3602
        Returns:
3603
            The response. See :py:meth:`send_command` for details.
3604
        """
3605
        if not name:
3606
            raise RequiredArgument(
3607
                function=self.create_user.__name__, argument='name'
3608
            )
3609
3610
        cmd = XmlCommand("create_user")
3611
        cmd.add_element("name", name)
3612
3613
        if password:
3614
            cmd.add_element("password", password)
3615
3616
        if hosts:
3617
            cmd.add_element(
3618
                "hosts",
3619
                to_comma_list(hosts),
3620
                attrs={"allow": to_bool(hosts_allow)},
3621
            )
3622
3623
        if ifaces:
3624
            cmd.add_element(
3625
                "ifaces",
3626
                to_comma_list(ifaces),
3627
                attrs={"allow": to_bool(ifaces_allow)},
3628
            )
3629
3630
        if role_ids:
3631
            for role in role_ids:
3632
                cmd.add_element("role", attrs={"id": role})
3633
3634
        return self._send_xml_command(cmd)
3635
3636
    def clone_user(self, user_id: str) -> Any:
3637
        """Clone an existing user
3638
3639
        Arguments:
3640
            user_id: UUID of existing user to clone from
3641
3642
        Returns:
3643
            The response. See :py:meth:`send_command` for details.
3644
        """
3645
        if not user_id:
3646
            raise RequiredArgument(
3647
                function=self.clone_user.__name__, argument='user_id'
3648
            )
3649
3650
        cmd = XmlCommand("create_user")
3651
        cmd.add_element("copy", user_id)
3652
        return self._send_xml_command(cmd)
3653
3654
    def delete_alert(
3655
        self, alert_id: str, *, ultimate: Optional[bool] = False
3656
    ) -> Any:
3657
        """Deletes an existing alert
3658
3659
        Arguments:
3660
            alert_id: UUID of the alert to be deleted.
3661
            ultimate: Whether to remove entirely, or to the trashcan.
3662
        """
3663
        if not alert_id:
3664
            raise RequiredArgument(
3665
                function=self.delete_alert.__name__, argument='alert_id'
3666
            )
3667
3668
        cmd = XmlCommand("delete_alert")
3669
        cmd.set_attribute("alert_id", alert_id)
3670
        cmd.set_attribute("ultimate", to_bool(ultimate))
3671
3672
        return self._send_xml_command(cmd)
3673
3674
    def delete_asset(
3675
        self, *, asset_id: Optional[str] = None, report_id: Optional[str] = None
3676
    ) -> Any:
3677
        """Deletes an existing asset
3678
3679
        Arguments:
3680
            asset_id: UUID of the single asset to delete.
3681
            report_id: UUID of report from which to get all
3682
                assets to delete.
3683
        """
3684
        if not asset_id and not report_id:
3685
            raise RequiredArgument(
3686
                function=self.delete_asset.__name__,
3687
                argument='asset_id or report_id',
3688
            )
3689
3690
        cmd = XmlCommand("delete_asset")
3691
        if asset_id:
3692
            cmd.set_attribute("asset_id", asset_id)
3693
        else:
3694
            cmd.set_attribute("report_id", report_id)
3695
3696
        return self._send_xml_command(cmd)
3697
3698
    def delete_config(
3699
        self, config_id: str, *, ultimate: Optional[bool] = False
3700
    ) -> Any:
3701
        """Deletes an existing config
3702
3703
        Arguments:
3704
            config_id: UUID of the config to be deleted.
3705
            ultimate: Whether to remove entirely, or to the trashcan.
3706
        """
3707
        if not config_id:
3708
            raise RequiredArgument(
3709
                function=self.delete_config.__name__, argument='config_id'
3710
            )
3711
3712
        cmd = XmlCommand("delete_config")
3713
        cmd.set_attribute("config_id", config_id)
3714
        cmd.set_attribute("ultimate", to_bool(ultimate))
3715
3716
        return self._send_xml_command(cmd)
3717
3718
    def delete_credential(
3719
        self, credential_id: str, *, ultimate: Optional[bool] = False
3720
    ) -> Any:
3721
        """Deletes an existing credential
3722
3723
        Arguments:
3724
            credential_id: UUID of the credential to be deleted.
3725
            ultimate: Whether to remove entirely, or to the trashcan.
3726
        """
3727
        if not credential_id:
3728
            raise RequiredArgument(
3729
                function=self.delete_credential.__name__,
3730
                argument='credential_id',
3731
            )
3732
3733
        cmd = XmlCommand("delete_credential")
3734
        cmd.set_attribute("credential_id", credential_id)
3735
        cmd.set_attribute("ultimate", to_bool(ultimate))
3736
3737
        return self._send_xml_command(cmd)
3738
3739
    def delete_filter(
3740
        self, filter_id: str, *, ultimate: Optional[bool] = False
3741
    ) -> Any:
3742
        """Deletes an existing filter
3743
3744
        Arguments:
3745
            filter_id: UUID of the filter to be deleted.
3746
            ultimate: Whether to remove entirely, or to the trashcan.
3747
        """
3748
        if not filter_id:
3749
            raise RequiredArgument(
3750
                function=self.delete_filter.__name__, argument='filter_id'
3751
            )
3752
3753
        cmd = XmlCommand("delete_filter")
3754
        cmd.set_attribute("filter_id", filter_id)
3755
        cmd.set_attribute("ultimate", to_bool(ultimate))
3756
3757
        return self._send_xml_command(cmd)
3758
3759
    def delete_group(
3760
        self, group_id: str, *, ultimate: Optional[bool] = False
3761
    ) -> Any:
3762
        """Deletes an existing group
3763
3764
        Arguments:
3765
            group_id: UUID of the group to be deleted.
3766
            ultimate: Whether to remove entirely, or to the trashcan.
3767
        """
3768
        if not group_id:
3769
            raise RequiredArgument(
3770
                function=self.delete_group.__name__, argument='group_id'
3771
            )
3772
3773
        cmd = XmlCommand("delete_group")
3774
        cmd.set_attribute("group_id", group_id)
3775
        cmd.set_attribute("ultimate", to_bool(ultimate))
3776
3777
        return self._send_xml_command(cmd)
3778
3779
    def delete_note(
3780
        self, note_id: str, *, ultimate: Optional[bool] = False
3781
    ) -> Any:
3782
        """Deletes an existing note
3783
3784
        Arguments:
3785
            note_id: UUID of the note to be deleted.
3786
            ultimate: Whether to remove entirely,or to the trashcan.
3787
        """
3788
        if not note_id:
3789
            raise RequiredArgument(
3790
                function=self.delete_note.__name__, argument='note_id'
3791
            )
3792
3793
        cmd = XmlCommand("delete_note")
3794
        cmd.set_attribute("note_id", note_id)
3795
        cmd.set_attribute("ultimate", to_bool(ultimate))
3796
3797
        return self._send_xml_command(cmd)
3798
3799
    def delete_override(
3800
        self, override_id: str, *, ultimate: Optional[bool] = False
3801
    ) -> Any:
3802
        """Deletes an existing override
3803
3804
        Arguments:
3805
            override_id: UUID of the override to be deleted.
3806
            ultimate: Whether to remove entirely, or to the trashcan.
3807
        """
3808
        if not override_id:
3809
            raise RequiredArgument(
3810
                function=self.delete_override.__name__, argument='override_id'
3811
            )
3812
3813
        cmd = XmlCommand("delete_override")
3814
        cmd.set_attribute("override_id", override_id)
3815
        cmd.set_attribute("ultimate", to_bool(ultimate))
3816
3817
        return self._send_xml_command(cmd)
3818
3819
    def delete_permission(
3820
        self, permission_id: str, *, ultimate: Optional[bool] = False
3821
    ) -> Any:
3822
        """Deletes an existing permission
3823
3824
        Arguments:
3825
            permission_id: UUID of the permission to be deleted.
3826
            ultimate: Whether to remove entirely, or to the trashcan.
3827
        """
3828
        if not permission_id:
3829
            raise RequiredArgument(
3830
                function=self.delete_permission.__name__,
3831
                argument='permission_id',
3832
            )
3833
3834
        cmd = XmlCommand("delete_permission")
3835
        cmd.set_attribute("permission_id", permission_id)
3836
        cmd.set_attribute("ultimate", to_bool(ultimate))
3837
3838
        return self._send_xml_command(cmd)
3839
3840
    def delete_report_format(
3841
        self,
3842
        report_format_id: Optional[Union[str, ReportFormatType]] = None,
3843
        *,
3844
        ultimate: Optional[bool] = False,
3845
    ) -> Any:
3846
        """Deletes an existing report format
3847
3848
        Arguments:
3849
            report_format_id: UUID of the report format to be deleted.
3850
                              or ReportFormatType (enum)
3851
            ultimate: Whether to remove entirely, or to the trashcan.
3852
        """
3853
        if not report_format_id:
3854
            raise RequiredArgument(
3855
                function=self.delete_report_format.__name__,
3856
                argument='report_format_id',
3857
            )
3858
3859
        cmd = XmlCommand("delete_report_format")
3860
3861
        if isinstance(report_format_id, ReportFormatType):
3862
            report_format_id = report_format_id.value
3863
3864
        cmd.set_attribute("report_format_id", report_format_id)
3865
3866
        cmd.set_attribute("ultimate", to_bool(ultimate))
3867
3868
        return self._send_xml_command(cmd)
3869
3870
    def delete_role(
3871
        self, role_id: str, *, ultimate: Optional[bool] = False
3872
    ) -> Any:
3873
        """Deletes an existing role
3874
3875
        Arguments:
3876
            role_id: UUID of the role to be deleted.
3877
            ultimate: Whether to remove entirely, or to the trashcan.
3878
        """
3879
        if not role_id:
3880
            raise RequiredArgument(
3881
                function=self.delete_role.__name__, argument='role_id'
3882
            )
3883
3884
        cmd = XmlCommand("delete_role")
3885
        cmd.set_attribute("role_id", role_id)
3886
        cmd.set_attribute("ultimate", to_bool(ultimate))
3887
3888
        return self._send_xml_command(cmd)
3889
3890
    def delete_scanner(
3891
        self, scanner_id: str, *, ultimate: Optional[bool] = False
3892
    ) -> Any:
3893
        """Deletes an existing scanner
3894
3895
        Arguments:
3896
            scanner_id: UUID of the scanner to be deleted.
3897
            ultimate: Whether to remove entirely, or to the trashcan.
3898
        """
3899
        if not scanner_id:
3900
            raise RequiredArgument(
3901
                function=self.delete_scanner.__name__, argument='scanner_id'
3902
            )
3903
3904
        cmd = XmlCommand("delete_scanner")
3905
        cmd.set_attribute("scanner_id", scanner_id)
3906
        cmd.set_attribute("ultimate", to_bool(ultimate))
3907
3908
        return self._send_xml_command(cmd)
3909
3910
    def delete_schedule(
3911
        self, schedule_id: str, *, ultimate: Optional[bool] = False
3912
    ) -> Any:
3913
        """Deletes an existing schedule
3914
3915
        Arguments:
3916
            schedule_id: UUID of the schedule to be deleted.
3917
            ultimate: Whether to remove entirely, or to the trashcan.
3918
        """
3919
        if not schedule_id:
3920
            raise RequiredArgument(
3921
                function=self.delete_schedule.__name__, argument='schedule_id'
3922
            )
3923
3924
        cmd = XmlCommand("delete_schedule")
3925
        cmd.set_attribute("schedule_id", schedule_id)
3926
        cmd.set_attribute("ultimate", to_bool(ultimate))
3927
3928
        return self._send_xml_command(cmd)
3929
3930
    def delete_tag(
3931
        self, tag_id: str, *, ultimate: Optional[bool] = False
3932
    ) -> Any:
3933
        """Deletes an existing tag
3934
3935
        Arguments:
3936
            tag_id: UUID of the tag to be deleted.
3937
            ultimate: Whether to remove entirely, or to the trashcan.
3938
        """
3939
        if not tag_id:
3940
            raise RequiredArgument(
3941
                function=self.delete_tag.__name__, argument='tag_id'
3942
            )
3943
3944
        cmd = XmlCommand("delete_tag")
3945
        cmd.set_attribute("tag_id", tag_id)
3946
        cmd.set_attribute("ultimate", to_bool(ultimate))
3947
3948
        return self._send_xml_command(cmd)
3949
3950
    def delete_user(
3951
        self,
3952
        user_id: str = None,
3953
        *,
3954
        name: Optional[str] = None,
3955
        inheritor_id: Optional[str] = None,
3956
        inheritor_name: Optional[str] = None,
3957
    ) -> Any:
3958
        """Deletes an existing user
3959
3960
        Either user_id or name must be passed.
3961
3962
        Arguments:
3963
            user_id: UUID of the task to be deleted.
3964
            name: The name of the user to be deleted.
3965
            inheritor_id: The ID of the inheriting user or "self". Overrides
3966
                inheritor_name.
3967
            inheritor_name: The name of the inheriting user.
3968
3969
        """
3970
        if not user_id and not name:
3971
            raise RequiredArgument(
3972
                function=self.delete_user.__name__, argument='user_id or name'
3973
            )
3974
3975
        cmd = XmlCommand("delete_user")
3976
3977
        if user_id:
3978
            cmd.set_attribute("user_id", user_id)
3979
3980
        if name:
3981
            cmd.set_attribute("name", name)
3982
3983
        if inheritor_id:
3984
            cmd.set_attribute("inheritor_id", inheritor_id)
3985
        if inheritor_name:
3986
            cmd.set_attribute("inheritor_name", inheritor_name)
3987
3988
        return self._send_xml_command(cmd)
3989
3990
    def describe_auth(self) -> Any:
3991
        """Describe authentication methods
3992
3993
        Returns a list of all used authentication methods if such a list is
3994
        available.
3995
3996
        Returns:
3997
            The response. See :py:meth:`send_command` for details.
3998
        """
3999
        return self._send_xml_command(XmlCommand("describe_auth"))
4000
4001
    def empty_trashcan(self) -> Any:
4002
        """Empty the trashcan
4003
4004
        Remove all entities from the trashcan. **Attention:** this command can
4005
        not be reverted
4006
4007
        Returns:
4008
            The response. See :py:meth:`send_command` for details.
4009
        """
4010
        return self._send_xml_command(XmlCommand("empty_trashcan"))
4011
4012
    def get_alerts(
4013
        self,
4014
        *,
4015
        filter: Optional[str] = None,
4016
        filter_id: Optional[str] = None,
4017
        trash: Optional[bool] = None,
4018
        tasks: Optional[bool] = None,
4019
    ) -> Any:
4020
        """Request a list of alerts
4021
4022
        Arguments:
4023
            filter: Filter term to use for the query
4024
            filter_id: UUID of an existing filter to use for the query
4025
            trash: True to request the alerts in the trashcan
4026
            tasks: Whether to include the tasks using the alerts
4027
        Returns:
4028
            The response. See :py:meth:`send_command` for details.
4029
        """
4030
        cmd = XmlCommand("get_alerts")
4031
4032
        add_filter(cmd, filter, filter_id)
4033
4034
        if trash is not None:
4035
            cmd.set_attribute("trash", to_bool(trash))
4036
4037
        if tasks is not None:
4038
            cmd.set_attribute("tasks", to_bool(tasks))
4039
4040
        return self._send_xml_command(cmd)
4041
4042
    def get_alert(self, alert_id: str, *, tasks: Optional[bool] = None) -> Any:
4043
        """Request a single alert
4044
4045
        Arguments:
4046
            alert_id: UUID of an existing alert
4047
4048
        Returns:
4049
            The response. See :py:meth:`send_command` for details.
4050
        """
4051
        cmd = XmlCommand("get_alerts")
4052
4053
        if not alert_id:
4054
            raise RequiredArgument(
4055
                function=self.get_alert.__name__, argument='alert_id'
4056
            )
4057
4058
        cmd.set_attribute("alert_id", alert_id)
4059
4060
        if tasks is not None:
4061
            cmd.set_attribute("tasks", to_bool(tasks))
4062
4063
        return self._send_xml_command(cmd)
4064
4065
    def get_assets(
4066
        self,
4067
        asset_type: AssetType,
4068
        *,
4069
        filter: Optional[str] = None,
4070
        filter_id: Optional[str] = None,
4071
    ) -> Any:
4072
        """Request a list of assets
4073
4074
        Arguments:
4075
            asset_type: Either 'os' or 'host'
4076
            filter: Filter term to use for the query
4077
            filter_id: UUID of an existing filter to use for the query
4078
4079
        Returns:
4080
            The response. See :py:meth:`send_command` for details.
4081
        """
4082
        if not isinstance(asset_type, AssetType):
4083
            raise InvalidArgumentType(
4084
                function=self.get_assets.__name__,
4085
                argument='asset_type',
4086
                arg_type=AssetType.__name__,
4087
            )
4088
4089
        cmd = XmlCommand("get_assets")
4090
4091
        cmd.set_attribute("type", asset_type.value)
4092
4093
        add_filter(cmd, filter, filter_id)
4094
4095
        return self._send_xml_command(cmd)
4096
4097
    def get_asset(self, asset_id: str, asset_type: AssetType) -> Any:
4098
        """Request a single asset
4099
4100
        Arguments:
4101
            asset_id: UUID of an existing asset
4102
            asset_type: Either 'os' or 'host'
4103
4104
        Returns:
4105
            The response. See :py:meth:`send_command` for details.
4106
        """
4107
        cmd = XmlCommand("get_assets")
4108
4109
        if not isinstance(asset_type, AssetType):
4110
            raise InvalidArgumentType(
4111
                function=self.get_asset.__name__,
4112
                argument='asset_type',
4113
                arg_type=AssetType.__name__,
4114
            )
4115
4116
        if not asset_id:
4117
            raise RequiredArgument(
4118
                function=self.get_asset.__name__, argument='asset_id'
4119
            )
4120
4121
        cmd.set_attribute("asset_id", asset_id)
4122
        cmd.set_attribute("type", asset_type.value)
4123
4124
        return self._send_xml_command(cmd)
4125
4126 View Code Duplication
    def get_credentials(
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
4127
        self,
4128
        *,
4129
        filter: Optional[str] = None,
4130
        filter_id: Optional[str] = None,
4131
        scanners: Optional[bool] = None,
4132
        trash: Optional[bool] = None,
4133
        targets: Optional[bool] = None,
4134
    ) -> Any:
4135
        """Request a list of credentials
4136
4137
        Arguments:
4138
            filter: Filter term to use for the query
4139
            filter_id: UUID of an existing filter to use for the query
4140
            scanners: Whether to include a list of scanners using the
4141
                credentials
4142
            trash: Whether to get the trashcan credentials instead
4143
            targets: Whether to include a list of targets using the credentials
4144
4145
        Returns:
4146
            The response. See :py:meth:`send_command` for details.
4147
        """
4148
        cmd = XmlCommand("get_credentials")
4149
4150
        add_filter(cmd, filter, filter_id)
4151
4152
        if scanners is not None:
4153
            cmd.set_attribute("scanners", to_bool(scanners))
4154
4155
        if trash is not None:
4156
            cmd.set_attribute("trash", to_bool(trash))
4157
4158
        if targets is not None:
4159
            cmd.set_attribute("targets", to_bool(targets))
4160
4161
        return self._send_xml_command(cmd)
4162
4163
    def get_credential(
4164
        self,
4165
        credential_id: str,
4166
        *,
4167
        scanners: Optional[bool] = None,
4168
        targets: Optional[bool] = None,
4169
        credential_format: Optional[CredentialFormat] = None,
4170
    ) -> Any:
4171
        """Request a single credential
4172
4173
        Arguments:
4174
            credential_id: UUID of an existing credential
4175
            scanners: Whether to include a list of scanners using the
4176
                credentials
4177
            targets: Whether to include a list of targets using the credentials
4178
            credential_format: One of "key", "rpm", "deb", "exe" or "pem"
4179
4180
        Returns:
4181
            The response. See :py:meth:`send_command` for details.
4182
        """
4183
        if not credential_id:
4184
            raise RequiredArgument(
4185
                function=self.get_credential.__name__, argument='credential_id'
4186
            )
4187
4188
        cmd = XmlCommand("get_credentials")
4189
        cmd.set_attribute("credential_id", credential_id)
4190
4191
        if credential_format:
4192
            if not isinstance(credential_format, CredentialFormat):
4193
                raise InvalidArgumentType(
4194
                    function=self.get_credential.__name__,
4195
                    argument='credential_format',
4196
                    arg_type=CredentialFormat.__name__,
4197
                )
4198
4199
            cmd.set_attribute("format", credential_format.value)
4200
4201
        if scanners is not None:
4202
            cmd.set_attribute("scanners", to_bool(scanners))
4203
4204
        if targets is not None:
4205
            cmd.set_attribute("targets", to_bool(targets))
4206
4207
        return self._send_xml_command(cmd)
4208
4209
    def get_feeds(self) -> Any:
4210
        """Request the list of feeds
4211
4212
        Returns:
4213
            The response. See :py:meth:`send_command` for details.
4214
        """
4215
        return self._send_xml_command(XmlCommand("get_feeds"))
4216
4217
    def get_filters(
4218
        self,
4219
        *,
4220
        filter: Optional[str] = None,
4221
        filter_id: Optional[str] = None,
4222
        trash: Optional[bool] = None,
4223
        alerts: Optional[bool] = None,
4224
    ) -> Any:
4225
        """Request a list of filters
4226
4227
        Arguments:
4228
            filter: Filter term to use for the query
4229
            filter_id: UUID of an existing filter to use for the query
4230
            trash: Whether to get the trashcan filters instead
4231
            alerts: Whether to include list of alerts that use the filter.
4232
4233
        Returns:
4234
            The response. See :py:meth:`send_command` for details.
4235
        """
4236
        cmd = XmlCommand("get_filters")
4237
4238
        add_filter(cmd, filter, filter_id)
4239
4240
        if trash is not None:
4241
            cmd.set_attribute("trash", to_bool(trash))
4242
4243
        if alerts is not None:
4244
            cmd.set_attribute("alerts", to_bool(alerts))
4245
4246
        return self._send_xml_command(cmd)
4247
4248
    def get_filter(
4249
        self, filter_id: str, *, alerts: Optional[bool] = None
4250
    ) -> Any:
4251
        """Request a single filter
4252
4253
        Arguments:
4254
            filter_id: UUID of an existing filter
4255
            alerts: Whether to include list of alerts that use the filter.
4256
4257
        Returns:
4258
            The response. See :py:meth:`send_command` for details.
4259
        """
4260
        cmd = XmlCommand("get_filters")
4261
4262
        if not filter_id:
4263
            raise RequiredArgument(
4264
                function=self.get_filter.__name__, argument='filter_id'
4265
            )
4266
4267
        cmd.set_attribute("filter_id", filter_id)
4268
4269
        if alerts is not None:
4270
            cmd.set_attribute("alerts", to_bool(alerts))
4271
4272
        return self._send_xml_command(cmd)
4273
4274 View Code Duplication
    def get_groups(
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
4275
        self,
4276
        *,
4277
        filter: Optional[str] = None,
4278
        filter_id: Optional[str] = None,
4279
        trash: Optional[bool] = None,
4280
    ) -> Any:
4281
        """Request a list of groups
4282
4283
        Arguments:
4284
            filter: Filter term to use for the query
4285
            filter_id: UUID of an existing filter to use for the query
4286
            trash: Whether to get the trashcan groups instead
4287
4288
        Returns:
4289
            The response. See :py:meth:`send_command` for details.
4290
        """
4291
        cmd = XmlCommand("get_groups")
4292
4293
        add_filter(cmd, filter, filter_id)
4294
4295
        if trash is not None:
4296
            cmd.set_attribute("trash", to_bool(trash))
4297
4298
        return self._send_xml_command(cmd)
4299
4300
    def get_group(self, group_id: str) -> Any:
4301
        """Request a single group
4302
4303
        Arguments:
4304
            group_id: UUID of an existing group
4305
4306
        Returns:
4307
            The response. See :py:meth:`send_command` for details.
4308
        """
4309
        cmd = XmlCommand("get_groups")
4310
4311
        if not group_id:
4312
            raise RequiredArgument(
4313
                function=self.get_group.__name__, argument='group_id'
4314
            )
4315
4316
        cmd.set_attribute("group_id", group_id)
4317
        return self._send_xml_command(cmd)
4318
4319 View Code Duplication
    def get_notes(
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
4320
        self,
4321
        *,
4322
        filter: Optional[str] = None,
4323
        filter_id: Optional[str] = None,
4324
        details: Optional[bool] = None,
4325
        result: Optional[bool] = None,
4326
    ) -> Any:
4327
        """Request a list of notes
4328
4329
        Arguments:
4330
            filter: Filter term to use for the query
4331
            filter_id: UUID of an existing filter to use for the query
4332
            details: Add info about connected results and tasks
4333
            result: Return the details of possible connected results.
4334
4335
        Returns:
4336
            The response. See :py:meth:`send_command` for details.
4337
        """
4338
        cmd = XmlCommand("get_notes")
4339
4340
        add_filter(cmd, filter, filter_id)
4341
4342
        if details is not None:
4343
            cmd.set_attribute("details", to_bool(details))
4344
4345
        if result is not None:
4346
            cmd.set_attribute("result", to_bool(result))
4347
4348
        return self._send_xml_command(cmd)
4349
4350
    def get_note(self, note_id: str) -> Any:
4351
        """Request a single note
4352
4353
        Arguments:
4354
            note_id: UUID of an existing note
4355
4356
        Returns:
4357
            The response. See :py:meth:`send_command` for details.
4358
        """
4359
        if not note_id:
4360
            raise RequiredArgument(
4361
                function=self.get_note.__name__, argument='note_id'
4362
            )
4363
4364
        cmd = XmlCommand("get_notes")
4365
        cmd.set_attribute("note_id", note_id)
4366
4367
        # for single entity always request all details
4368
        cmd.set_attribute("details", "1")
4369
        return self._send_xml_command(cmd)
4370
4371
    def get_nvts(
4372
        self,
4373
        *,
4374
        details: Optional[bool] = None,
4375
        preferences: Optional[bool] = None,
4376
        preference_count: Optional[bool] = None,
4377
        timeout: Optional[bool] = None,
4378
        config_id: Optional[str] = None,
4379
        preferences_config_id: Optional[str] = None,
4380
        family: Optional[str] = None,
4381
        sort_order: Optional[str] = None,
4382
        sort_field: Optional[str] = None,
4383
    ):
4384
        """Request a list of nvts
4385
4386
        Arguments:
4387
            details: Whether to include full details
4388
            preferences: Whether to include nvt preferences
4389
            preference_count: Whether to include preference count
4390
            timeout: Whether to include the special timeout preference
4391
            config_id: UUID of scan config to which to limit the NVT listing
4392
            preferences_config_id: UUID of scan config to use for preference
4393
                values
4394
            family: Family to which to limit NVT listing
4395
            sort_order: Sort order
4396
            sort_field: Sort field
4397
4398
        Returns:
4399
            The response. See :py:meth:`send_command` for details.
4400
        """
4401
        cmd = XmlCommand("get_nvts")
4402
4403
        if details is not None:
4404
            cmd.set_attribute("details", to_bool(details))
4405
4406
        if preferences is not None:
4407
            cmd.set_attribute("preferences", to_bool(preferences))
4408
4409
        if preference_count is not None:
4410
            cmd.set_attribute("preference_count", to_bool(preference_count))
4411
4412
        if timeout is not None:
4413
            cmd.set_attribute("timeout", to_bool(timeout))
4414
4415
        if config_id:
4416
            cmd.set_attribute("config_id", config_id)
4417
4418
        if preferences_config_id:
4419
            cmd.set_attribute("preferences_config_id", preferences_config_id)
4420
4421
        if family:
4422
            cmd.set_attribute("family", family)
4423
4424
        if sort_order:
4425
            cmd.set_attribute("sort_order", sort_order)
4426
4427
        if sort_field:
4428
            cmd.set_attribute("sort_field", sort_field)
4429
4430
        return self._send_xml_command(cmd)
4431
4432
    def get_nvt(self, nvt_oid: str):
4433
        """Request a single nvt
4434
4435
        Arguments:
4436
            nvt_oid: OID of an existing nvt
4437
4438
        Returns:
4439
            The response. See :py:meth:`send_command` for details.
4440
        """
4441
        cmd = XmlCommand("get_nvts")
4442
4443
        if not nvt_oid:
4444
            raise RequiredArgument(
4445
                function=self.get_nvt.__name__, argument='nvt_oid'
4446
            )
4447
4448
        cmd.set_attribute("nvt_oid", nvt_oid)
4449
4450
        # for single entity always request all details
4451
        cmd.set_attribute("details", "1")
4452
        cmd.set_attribute("preferences", "1")
4453
        cmd.set_attribute("preference_count", "1")
4454
        return self._send_xml_command(cmd)
4455
4456
    def get_nvt_families(self, *, sort_order: Optional[str] = None):
4457
        """Request a list of nvt families
4458
4459
        Arguments:
4460
            sort_order: Sort order
4461
4462
        Returns:
4463
            The response. See :py:meth:`send_command` for details.
4464
        """
4465
        cmd = XmlCommand("get_nvt_families")
4466
4467
        if sort_order:
4468
            cmd.set_attribute("sort_order", sort_order)
4469
4470
        return self._send_xml_command(cmd)
4471
4472 View Code Duplication
    def get_overrides(
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
4473
        self,
4474
        *,
4475
        filter: Optional[str] = None,
4476
        filter_id: Optional[str] = None,
4477
        details: Optional[bool] = None,
4478
        result: Optional[bool] = None,
4479
    ) -> Any:
4480
        """Request a list of overrides
4481
4482
        Arguments:
4483
            filter: Filter term to use for the query
4484
            filter_id: UUID of an existing filter to use for the query
4485
            details: Whether to include full details
4486
            result: Whether to include results using the override
4487
4488
        Returns:
4489
            The response. See :py:meth:`send_command` for details.
4490
        """
4491
        cmd = XmlCommand("get_overrides")
4492
4493
        add_filter(cmd, filter, filter_id)
4494
4495
        if details is not None:
4496
            cmd.set_attribute("details", to_bool(details))
4497
4498
        if result is not None:
4499
            cmd.set_attribute("result", to_bool(result))
4500
4501
        return self._send_xml_command(cmd)
4502
4503
    def get_override(self, override_id: str) -> Any:
4504
        """Request a single override
4505
4506
        Arguments:
4507
            override_id: UUID of an existing override
4508
4509
        Returns:
4510
            The response. See :py:meth:`send_command` for details.
4511
        """
4512
        cmd = XmlCommand("get_overrides")
4513
4514
        if not override_id:
4515
            raise RequiredArgument(
4516
                function=self.get_override.__name__, argument='override_id'
4517
            )
4518
4519
        cmd.set_attribute("override_id", override_id)
4520
4521
        # for single entity always request all details
4522
        cmd.set_attribute("details", "1")
4523
        return self._send_xml_command(cmd)
4524
4525 View Code Duplication
    def get_permissions(
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
4526
        self,
4527
        *,
4528
        filter: Optional[str] = None,
4529
        filter_id: Optional[str] = None,
4530
        trash: Optional[bool] = None,
4531
    ) -> Any:
4532
        """Request a list of permissions
4533
4534
        Arguments:
4535
            filter: Filter term to use for the query
4536
            filter_id: UUID of an existing filter to use for the query
4537
            trash: Whether to get permissions in the trashcan instead
4538
4539
        Returns:
4540
            The response. See :py:meth:`send_command` for details.
4541
        """
4542
        cmd = XmlCommand("get_permissions")
4543
4544
        add_filter(cmd, filter, filter_id)
4545
4546
        if trash is not None:
4547
            cmd.set_attribute("trash", to_bool(trash))
4548
4549
        return self._send_xml_command(cmd)
4550
4551
    def get_permission(self, permission_id: str) -> Any:
4552
        """Request a single permission
4553
4554
        Arguments:
4555
            permission_id: UUID of an existing permission
4556
4557
        Returns:
4558
            The response. See :py:meth:`send_command` for details.
4559
        """
4560
        cmd = XmlCommand("get_permissions")
4561
4562
        if not permission_id:
4563
            raise RequiredArgument(
4564
                function=self.get_permission.__name__, argument='permission_id'
4565
            )
4566
4567
        cmd.set_attribute("permission_id", permission_id)
4568
        return self._send_xml_command(cmd)
4569
4570
    def get_preferences(
4571
        self, *, nvt_oid: Optional[str] = None, config_id: Optional[str] = None
4572
    ) -> Any:
4573
        """Request a list of preferences
4574
4575
        When the command includes a config_id attribute, the preference element
4576
        includes the preference name, type and value, and the NVT to which the
4577
        preference applies. Otherwise, the preference element includes just the
4578
        name and value, with the NVT and type built into the name.
4579
4580
        Arguments:
4581
            nvt_oid: OID of nvt
4582
            config_id: UUID of scan config of which to show preference values
4583
4584
        Returns:
4585
            The response. See :py:meth:`send_command` for details.
4586
        """
4587
        cmd = XmlCommand("get_preferences")
4588
4589
        if nvt_oid:
4590
            cmd.set_attribute("nvt_oid", nvt_oid)
4591
4592
        if config_id:
4593
            cmd.set_attribute("config_id", config_id)
4594
4595
        return self._send_xml_command(cmd)
4596
4597
    def get_preference(
4598
        self,
4599
        name: str,
4600
        *,
4601
        nvt_oid: Optional[str] = None,
4602
        config_id: Optional[str] = None,
4603
    ) -> Any:
4604
        """Request a nvt preference
4605
4606
        Arguments:
4607
            name: name of a particular preference
4608
            nvt_oid: OID of nvt
4609
            config_id: UUID of scan config of which to show preference values
4610
4611
        Returns:
4612
            The response. See :py:meth:`send_command` for details.
4613
        """
4614
        cmd = XmlCommand("get_preferences")
4615
4616
        if not name:
4617
            raise RequiredArgument(
4618
                function=self.get_preference.__name__, argument='name'
4619
            )
4620
4621
        cmd.set_attribute("preference", name)
4622
4623
        if nvt_oid:
4624
            cmd.set_attribute("nvt_oid", nvt_oid)
4625
4626
        if config_id:
4627
            cmd.set_attribute("config_id", config_id)
4628
4629
        return self._send_xml_command(cmd)
4630
4631
    def get_report_formats(
4632
        self,
4633
        *,
4634
        filter: Optional[str] = None,
4635
        filter_id: Optional[str] = None,
4636
        trash: Optional[bool] = None,
4637
        alerts: Optional[bool] = None,
4638
        params: Optional[bool] = None,
4639
        details: Optional[bool] = None,
4640
    ) -> Any:
4641
        """Request a list of report formats
4642
4643
        Arguments:
4644
            filter: Filter term to use for the query
4645
            filter_id: UUID of an existing filter to use for the query
4646
            trash: Whether to get the trashcan report formats instead
4647
            alerts: Whether to include alerts that use the report format
4648
            params: Whether to include report format parameters
4649
            details: Include report format file, signature and parameters
4650
4651
        Returns:
4652
            The response. See :py:meth:`send_command` for details.
4653
        """
4654
        cmd = XmlCommand("get_report_formats")
4655
4656
        add_filter(cmd, filter, filter_id)
4657
4658
        if details is not None:
4659
            cmd.set_attribute("details", to_bool(details))
4660
4661
        if alerts is not None:
4662
            cmd.set_attribute("alerts", to_bool(alerts))
4663
4664
        if params is not None:
4665
            cmd.set_attribute("params", to_bool(params))
4666
4667
        if trash is not None:
4668
            cmd.set_attribute("trash", to_bool(trash))
4669
4670
        return self._send_xml_command(cmd)
4671
4672 View Code Duplication
    def get_report_format(
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
4673
        self, report_format_id: Union[str, ReportFormatType]
4674
    ) -> Any:
4675
        """Request a single report format
4676
4677
        Arguments:
4678
            report_format_id: UUID of an existing report format
4679
                              or ReportFormatType (enum)
4680
4681
        Returns:
4682
            The response. See :py:meth:`send_command` for details.
4683
        """
4684
        cmd = XmlCommand("get_report_formats")
4685
4686
        if not report_format_id:
4687
            raise RequiredArgument(
4688
                function=self.get_report_format.__name__,
4689
                argument='report_format_id',
4690
            )
4691
4692
        if isinstance(report_format_id, ReportFormatType):
4693
            report_format_id = report_format_id.value
4694
4695
        cmd.set_attribute("report_format_id", report_format_id)
4696
4697
        # for single entity always request all details
4698
        cmd.set_attribute("details", "1")
4699
        return self._send_xml_command(cmd)
4700
4701 View Code Duplication
    def get_results(
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
4702
        self,
4703
        *,
4704
        filter: Optional[str] = None,
4705
        filter_id: Optional[str] = None,
4706
        task_id: Optional[str] = None,
4707
        note_details: Optional[bool] = None,
4708
        override_details: Optional[bool] = None,
4709
        details: Optional[bool] = None,
4710
    ) -> Any:
4711
        """Request a list of results
4712
4713
        Arguments:
4714
            filter: Filter term to use for the query
4715
            filter_id: UUID of an existing filter to use for the query
4716
            task_id: UUID of task for note and override handling
4717
            note_details: If notes are included, whether to include note details
4718
            override_details: If overrides are included, whether to include
4719
                override details
4720
            details: Whether to include additional details of the results
4721
4722
        Returns:
4723
            The response. See :py:meth:`send_command` for details.
4724
        """
4725
        cmd = XmlCommand("get_results")
4726
4727
        add_filter(cmd, filter, filter_id)
4728
4729
        if task_id:
4730
            cmd.set_attribute("task_id", task_id)
4731
4732
        if details is not None:
4733
            cmd.set_attribute("details", to_bool(details))
4734
        if note_details is not None:
4735
            cmd.set_attribute("note_details", to_bool(note_details))
4736
4737
        if override_details is not None:
4738
            cmd.set_attribute("override_details", to_bool(override_details))
4739
4740
        return self._send_xml_command(cmd)
4741
4742
    def get_result(self, result_id: str) -> Any:
4743
        """Request a single result
4744
4745
        Arguments:
4746
            result_id: UUID of an existing result
4747
4748
        Returns:
4749
            The response. See :py:meth:`send_command` for details.
4750
        """
4751
        cmd = XmlCommand("get_results")
4752
4753
        if not result_id:
4754
            raise RequiredArgument(
4755
                function=self.get_result.__name__, argument='result_id'
4756
            )
4757
4758
        cmd.set_attribute("result_id", result_id)
4759
4760
        # for single entity always request all details
4761
        cmd.set_attribute("details", "1")
4762
        return self._send_xml_command(cmd)
4763
4764 View Code Duplication
    def get_roles(
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
4765
        self,
4766
        *,
4767
        filter: Optional[str] = None,
4768
        filter_id: Optional[str] = None,
4769
        trash: Optional[bool] = None,
4770
    ) -> Any:
4771
        """Request a list of roles
4772
4773
        Arguments:
4774
            filter: Filter term to use for the query
4775
            filter_id: UUID of an existing filter to use for the query
4776
            trash: Whether to get the trashcan roles instead
4777
4778
        Returns:
4779
            The response. See :py:meth:`send_command` for details.
4780
        """
4781
        cmd = XmlCommand("get_roles")
4782
4783
        add_filter(cmd, filter, filter_id)
4784
4785
        if trash is not None:
4786
            cmd.set_attribute("trash", to_bool(trash))
4787
4788
        return self._send_xml_command(cmd)
4789
4790
    def get_role(self, role_id: str) -> Any:
4791
        """Request a single role
4792
4793
        Arguments:
4794
            role_id: UUID of an existing role
4795
4796
        Returns:
4797
            The response. See :py:meth:`send_command` for details.
4798
        """
4799
        if not role_id:
4800
            raise RequiredArgument(
4801
                function=self.get_role.__name__, argument='role_id'
4802
            )
4803
4804
        cmd = XmlCommand("get_roles")
4805
        cmd.set_attribute("role_id", role_id)
4806
        return self._send_xml_command(cmd)
4807
4808 View Code Duplication
    def get_scanners(
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
4809
        self,
4810
        *,
4811
        filter: Optional[str] = None,
4812
        filter_id: Optional[str] = None,
4813
        trash: Optional[bool] = None,
4814
        details: Optional[bool] = None,
4815
    ) -> Any:
4816
        """Request a list of scanners
4817
4818
        Arguments:
4819
            filter: Filter term to use for the query
4820
            filter_id: UUID of an existing filter to use for the query
4821
            trash: Whether to get the trashcan scanners instead
4822
            details:  Whether to include extra details like tasks using this
4823
                scanner
4824
4825
        Returns:
4826
            The response. See :py:meth:`send_command` for details.
4827
        """
4828
        cmd = XmlCommand("get_scanners")
4829
4830
        add_filter(cmd, filter, filter_id)
4831
4832
        if trash is not None:
4833
            cmd.set_attribute("trash", to_bool(trash))
4834
4835
        if details is not None:
4836
            cmd.set_attribute("details", to_bool(details))
4837
4838
        return self._send_xml_command(cmd)
4839
4840
    def get_scanner(self, scanner_id: str) -> Any:
4841
        """Request a single scanner
4842
4843
        Arguments:
4844
            scanner_id: UUID of an existing scanner
4845
4846
        Returns:
4847
            The response. See :py:meth:`send_command` for details.
4848
        """
4849
        cmd = XmlCommand("get_scanners")
4850
4851
        if not scanner_id:
4852
            raise RequiredArgument(
4853
                function=self.get_scanner.__name__, argument='scanner_id'
4854
            )
4855
4856
        cmd.set_attribute("scanner_id", scanner_id)
4857
4858
        # for single entity always request all details
4859
        cmd.set_attribute("details", "1")
4860
        return self._send_xml_command(cmd)
4861
4862
    def get_schedules(
4863
        self,
4864
        *,
4865
        filter: Optional[str] = None,
4866
        filter_id: Optional[str] = None,
4867
        trash: Optional[bool] = None,
4868
        tasks: Optional[bool] = None,
4869
    ) -> Any:
4870
        """Request a list of schedules
4871
4872
        Arguments:
4873
            filter: Filter term to use for the query
4874
            filter_id: UUID of an existing filter to use for the query
4875
            trash: Whether to get the trashcan schedules instead
4876
            tasks: Whether to include tasks using the schedules
4877
4878
        Returns:
4879
            The response. See :py:meth:`send_command` for details.
4880
        """
4881
        cmd = XmlCommand("get_schedules")
4882
4883
        add_filter(cmd, filter, filter_id)
4884
4885
        if trash is not None:
4886
            cmd.set_attribute("trash", to_bool(trash))
4887
4888
        if tasks is not None:
4889
            cmd.set_attribute("tasks", to_bool(tasks))
4890
4891
        return self._send_xml_command(cmd)
4892
4893
    def get_schedule(
4894
        self, schedule_id: str, *, tasks: Optional[bool] = None
4895
    ) -> Any:
4896
        """Request a single schedule
4897
4898
        Arguments:
4899
            schedule_id: UUID of an existing schedule
4900
            tasks: Whether to include tasks using the schedules
4901
4902
        Returns:
4903
            The response. See :py:meth:`send_command` for details.
4904
        """
4905
        cmd = XmlCommand("get_schedules")
4906
4907
        if not schedule_id:
4908
            raise RequiredArgument(
4909
                function=self.get_schedule.__name__, argument='schedule_id'
4910
            )
4911
4912
        cmd.set_attribute("schedule_id", schedule_id)
4913
4914
        if tasks is not None:
4915
            cmd.set_attribute("tasks", to_bool(tasks))
4916
4917
        return self._send_xml_command(cmd)
4918
4919
    def get_settings(self, *, filter: Optional[str] = None) -> Any:
4920
        """Request a list of user settings
4921
4922
        Arguments:
4923
            filter: Filter term to use for the query
4924
4925
        Returns:
4926
            The response. See :py:meth:`send_command` for details.
4927
        """
4928
        cmd = XmlCommand("get_settings")
4929
4930
        if filter:
4931
            cmd.set_attribute("filter", filter)
4932
4933
        return self._send_xml_command(cmd)
4934
4935
    def get_setting(self, setting_id: str) -> Any:
4936
        """Request a single setting
4937
4938
        Arguments:
4939
            setting_id: UUID of an existing setting
4940
4941
        Returns:
4942
            The response. See :py:meth:`send_command` for details.
4943
        """
4944
        cmd = XmlCommand("get_settings")
4945
4946
        if not setting_id:
4947
            raise RequiredArgument(
4948
                function=self.get_setting.__name__, argument='setting_id'
4949
            )
4950
4951
        cmd.set_attribute("setting_id", setting_id)
4952
        return self._send_xml_command(cmd)
4953
4954
    def get_system_reports(
4955
        self,
4956
        *,
4957
        name: Optional[str] = None,
4958
        duration: Optional[int] = None,
4959
        start_time: Optional[str] = None,
4960
        end_time: Optional[str] = None,
4961
        brief: Optional[bool] = None,
4962
        slave_id: Optional[str] = None,
4963
    ) -> Any:
4964
        """Request a list of system reports
4965
4966
        Arguments:
4967
            name: A string describing the required system report
4968
            duration: The number of seconds into the past that the system report
4969
                should include
4970
            start_time: The start of the time interval the system report should
4971
                include in ISO time format
4972
            end_time: The end of the time interval the system report should
4973
                include in ISO time format
4974
            brief: Whether to include the actual system reports
4975
            slave_id: UUID of GMP scanner from which to get the system reports
4976
4977
        Returns:
4978
            The response. See :py:meth:`send_command` for details.
4979
        """
4980
        cmd = XmlCommand("get_system_reports")
4981
4982
        if name:
4983
            cmd.set_attribute("name", name)
4984
4985
        if duration is not None:
4986
            if not isinstance(duration, numbers.Integral):
4987
                raise InvalidArgument("duration needs to be an integer number")
4988
4989
            cmd.set_attribute("duration", str(duration))
4990
4991
        if start_time:
4992
            cmd.set_attribute("start_time", str(start_time))
4993
4994
        if end_time:
4995
            cmd.set_attribute("end_time", str(end_time))
4996
4997
        if brief is not None:
4998
            cmd.set_attribute("brief", to_bool(brief))
4999
5000
        if slave_id:
5001
            cmd.set_attribute("slave_id", slave_id)
5002
5003
        return self._send_xml_command(cmd)
5004
5005
    def get_tags(
5006
        self,
5007
        *,
5008
        filter: Optional[str] = None,
5009
        filter_id: Optional[str] = None,
5010
        trash: Optional[bool] = None,
5011
        names_only: Optional[bool] = None,
5012
    ) -> Any:
5013
        """Request a list of tags
5014
5015
        Arguments:
5016
            filter: Filter term to use for the query
5017
            filter_id: UUID of an existing filter to use for the query
5018
            trash: Whether to get tags from the trashcan instead
5019
            names_only: Whether to get only distinct tag names
5020
5021
        Returns:
5022
            The response. See :py:meth:`send_command` for details.
5023
        """
5024
        cmd = XmlCommand("get_tags")
5025
5026
        add_filter(cmd, filter, filter_id)
5027
5028
        if trash is not None:
5029
            cmd.set_attribute("trash", to_bool(trash))
5030
5031
        if names_only is not None:
5032
            cmd.set_attribute("names_only", to_bool(names_only))
5033
5034
        return self._send_xml_command(cmd)
5035
5036
    def get_tag(self, tag_id: str) -> Any:
5037
        """Request a single tag
5038
5039
        Arguments:
5040
            tag_id: UUID of an existing tag
5041
5042
        Returns:
5043
            The response. See :py:meth:`send_command` for details.
5044
        """
5045
        cmd = XmlCommand("get_tags")
5046
5047
        if not tag_id:
5048
            raise RequiredArgument(
5049
                function=self.get_tag.__name__, argument='tag_id'
5050
            )
5051
5052
        cmd.set_attribute("tag_id", tag_id)
5053
        return self._send_xml_command(cmd)
5054
5055
    def get_users(
5056
        self, *, filter: Optional[str] = None, filter_id: Optional[str] = None
5057
    ) -> Any:
5058
        """Request a list of users
5059
5060
        Arguments:
5061
            filter: Filter term to use for the query
5062
            filter_id: UUID of an existing filter to use for the query
5063
5064
        Returns:
5065
            The response. See :py:meth:`send_command` for details.
5066
        """
5067
        cmd = XmlCommand("get_users")
5068
5069
        add_filter(cmd, filter, filter_id)
5070
5071
        return self._send_xml_command(cmd)
5072
5073
    def get_user(self, user_id: str) -> Any:
5074
        """Request a single user
5075
5076
        Arguments:
5077
            user_id: UUID of an existing user
5078
5079
        Returns:
5080
            The response. See :py:meth:`send_command` for details.
5081
        """
5082
        cmd = XmlCommand("get_users")
5083
5084
        if not user_id:
5085
            raise RequiredArgument(
5086
                function=self.get_user.__name__, argument='user_id'
5087
            )
5088
5089
        cmd.set_attribute("user_id", user_id)
5090
        return self._send_xml_command(cmd)
5091
5092
    def get_version(self) -> Any:
5093
        """Get the Greenbone Manager Protocol version used by the remote gvmd
5094
5095
        Returns:
5096
            The response. See :py:meth:`send_command` for details.
5097
        """
5098
        return self._send_xml_command(XmlCommand("get_version"))
5099
5100
    def help(
5101
        self, *, format: Optional[str] = None, help_type: Optional[str] = ""
5102
    ) -> Any:
5103
        """Get the help text
5104
5105
        Arguments:
5106
            format: One of "html", "rnc", "text" or "xml
5107
            help_type: One of "brief" or "". Default ""
5108
5109
        Returns:
5110
            The response. See :py:meth:`send_command` for details.
5111
        """
5112
        cmd = XmlCommand("help")
5113
5114
        if help_type not in ("", "brief"):
5115
            raise InvalidArgument(
5116
                'help_type argument must be an empty string or "brief"'
5117
            )
5118
5119
        cmd.set_attribute("type", help_type)
5120
5121
        if format:
5122
            if not format.lower() in ("html", "rnc", "text", "xml"):
5123
                raise InvalidArgument(
5124
                    "help format Argument must be one of html, rnc, text or "
5125
                    "xml"
5126
                )
5127
5128
            cmd.set_attribute("format", format)
5129
5130
        return self._send_xml_command(cmd)
5131
5132
    def modify_asset(self, asset_id: str, comment: Optional[str] = "") -> Any:
5133
        """Modifies an existing asset.
5134
5135
        Arguments:
5136
            asset_id: UUID of the asset to be modified.
5137
            comment: Comment for the asset.
5138
5139
        Returns:
5140
            The response. See :py:meth:`send_command` for details.
5141
        """
5142
        if not asset_id:
5143
            raise RequiredArgument(
5144
                function=self.modify_asset.__name__, argument='asset_id'
5145
            )
5146
5147
        cmd = XmlCommand("modify_asset")
5148
        cmd.set_attribute("asset_id", asset_id)
5149
        cmd.add_element("comment", comment)
5150
5151
        return self._send_xml_command(cmd)
5152
5153
    def modify_auth(self, group_name: str, auth_conf_settings: dict) -> Any:
5154
        """Modifies an existing auth.
5155
5156
        Arguments:
5157
            group_name: Name of the group to be modified.
5158
            auth_conf_settings: The new auth config.
5159
5160
        Returns:
5161
            The response. See :py:meth:`send_command` for details.
5162
        """
5163
        if not group_name:
5164
            raise RequiredArgument(
5165
                function=self.modify_auth.__name__, argument='group_name'
5166
            )
5167
        if not auth_conf_settings:
5168
            raise RequiredArgument(
5169
                function=self.modify_auth.__name__,
5170
                argument='auth_conf_settings',
5171
            )
5172
        cmd = XmlCommand("modify_auth")
5173
        _xmlgroup = cmd.add_element("group", attrs={"name": str(group_name)})
5174
5175
        for key, value in auth_conf_settings.items():
5176
            _xmlauthconf = _xmlgroup.add_element("auth_conf_setting")
5177
            _xmlauthconf.add_element("key", key)
5178
            _xmlauthconf.add_element("value", value)
5179
5180
        return self._send_xml_command(cmd)
5181
5182
    def modify_config_set_nvt_preference(
5183
        self,
5184
        config_id: str,
5185
        name: str,
5186
        nvt_oid: str,
5187
        *,
5188
        value: Optional[str] = None,
5189
    ) -> Any:
5190
        """Modifies the nvt preferences of an existing scan config.
5191
5192
        Arguments:
5193
            config_id: UUID of scan config to modify.
5194
            name: Name for nvt preference to change.
5195
            nvt_oid: OID of the NVT associated with preference to modify
5196
            value: New value for the preference. None to delete the preference
5197
                and to use the default instead.
5198
        """
5199
        if not config_id:
5200
            raise RequiredArgument(
5201
                function=self.modify_config_set_nvt_preference.__name__,
5202
                argument='config_id',
5203
            )
5204
5205
        if not nvt_oid:
5206
            raise RequiredArgument(
5207
                function=self.modify_config_set_nvt_preference.__name__,
5208
                argument='nvt_oid',
5209
            )
5210
5211
        if not name:
5212
            raise RequiredArgument(
5213
                function=self.modify_config_set_nvt_preference.__name__,
5214
                argument='name',
5215
            )
5216
5217
        cmd = XmlCommand("modify_config")
5218
        cmd.set_attribute("config_id", str(config_id))
5219
5220
        _xmlpref = cmd.add_element("preference")
5221
5222
        _xmlpref.add_element("nvt", attrs={"oid": nvt_oid})
5223
        _xmlpref.add_element("name", name)
5224
5225
        if value:
5226
            _xmlpref.add_element("value", to_base64(value))
5227
5228
        return self._send_xml_command(cmd)
5229
5230
    def modify_config_set_name(self, config_id: str, name: str) -> Any:
5231
        """Modifies the name of an existing scan config
5232
5233
        Arguments:
5234
            config_id: UUID of scan config to modify.
5235
            name: New name for the config.
5236
        """
5237
        if not config_id:
5238
            raise RequiredArgument(
5239
                function=self.modify_config_set_name.__name__,
5240
                argument='config_id',
5241
            )
5242
5243
        if not name:
5244
            raise RequiredArgument(
5245
                function=self.modify_config_set_name.__name__, argument='name'
5246
            )
5247
5248
        cmd = XmlCommand("modify_config")
5249
        cmd.set_attribute("config_id", str(config_id))
5250
5251
        cmd.add_element("name", name)
5252
5253
        return self._send_xml_command(cmd)
5254
5255
    def modify_config_set_comment(
5256
        self, config_id: str, comment: Optional[str] = ""
5257
    ) -> Any:
5258
        """Modifies the comment of an existing scan config
5259
5260
        Arguments:
5261
            config_id: UUID of scan config to modify.
5262
            comment: Comment to set on a config. Default: ''
5263
        """
5264
        if not config_id:
5265
            raise RequiredArgument(
5266
                function=self.modify_config_set_comment.__name__,
5267
                argument='config_id argument',
5268
            )
5269
5270
        cmd = XmlCommand("modify_config")
5271
        cmd.set_attribute("config_id", str(config_id))
5272
5273
        cmd.add_element("comment", comment)
5274
5275
        return self._send_xml_command(cmd)
5276
5277
    def modify_config_set_scanner_preference(
5278
        self, config_id: str, name: str, *, value: Optional[str] = None
5279
    ) -> Any:
5280
        """Modifies the scanner preferences of an existing scan config
5281
5282
        Arguments:
5283
            config_id: UUID of scan config to modify.
5284
            name: Name of the scanner preference to change
5285
            value: New value for the preference. None to delete the preference
5286
                and to use the default instead.
5287
5288
        """
5289
        if not config_id:
5290
            raise RequiredArgument(
5291
                function=self.modify_config_set_scanner_preference.__name__,
5292
                argument='config_id',
5293
            )
5294
5295
        if not name:
5296
            raise RequiredArgument(
5297
                function=self.modify_config_set_scanner_preference.__name__,
5298
                argument='name argument',
5299
            )
5300
5301
        cmd = XmlCommand("modify_config")
5302
        cmd.set_attribute("config_id", str(config_id))
5303
5304
        _xmlpref = cmd.add_element("preference")
5305
5306
        _xmlpref.add_element("name", name)
5307
5308
        if value:
5309
            _xmlpref.add_element("value", to_base64(value))
5310
5311
        return self._send_xml_command(cmd)
5312
5313
    def modify_config_set_nvt_selection(
5314
        self, config_id: str, family: str, nvt_oids: List[str]
5315
    ) -> Any:
5316
        """Modifies the selected nvts of an existing scan config
5317
5318
        The manager updates the given family in the config to include only the
5319
        given NVTs.
5320
5321
        Arguments:
5322
            config_id: UUID of scan config to modify.
5323
            family: Name of the NVT family to include NVTs from
5324
            nvt_oids: List of NVTs to select for the family.
5325
        """
5326
        if not config_id:
5327
            raise RequiredArgument(
5328
                function=self.modify_config_set_nvt_selection.__name__,
5329
                argument='config_id',
5330
            )
5331
5332
        if not family:
5333
            raise RequiredArgument(
5334
                function=self.modify_config_set_nvt_selection.__name__,
5335
                argument='family argument',
5336
            )
5337
5338
        if not is_list_like(nvt_oids):
5339
            raise InvalidArgumentType(
5340
                function=self.modify_config_set_nvt_selection.__name__,
5341
                argument='nvt_oids',
5342
                arg_type='list',
5343
            )
5344
5345
        cmd = XmlCommand("modify_config")
5346
        cmd.set_attribute("config_id", str(config_id))
5347
5348
        _xmlnvtsel = cmd.add_element("nvt_selection")
5349
        _xmlnvtsel.add_element("family", family)
5350
5351
        for nvt in nvt_oids:
5352
            _xmlnvtsel.add_element("nvt", attrs={"oid": nvt})
5353
5354
        return self._send_xml_command(cmd)
5355
5356
    def modify_config_set_family_selection(
5357
        self,
5358
        config_id: str,
5359
        families: List[Tuple[str, bool, bool]],
5360
        *,
5361
        auto_add_new_families: Optional[bool] = True,
5362
    ) -> Any:
5363
        """
5364
        Selected the NVTs of a scan config at a family level.
5365
5366
        Arguments:
5367
            config_id: UUID of scan config to modify.
5368
            families: A list of tuples (str, bool, bool):
5369
                str: the name of the NVT family selected,
5370
                bool: add new NVTs  to the family automatically,
5371
                bool: include all NVTs from the family
5372
            auto_add_new_families: Whether new families should be added to the
5373
                scan config automatically. Default: True.
5374
        """
5375
        if not config_id:
5376
            raise RequiredArgument(
5377
                function=self.modify_config_set_family_selection.__name__,
5378
                argument='config_id',
5379
            )
5380
5381
        if not is_list_like(families):
5382
            raise InvalidArgumentType(
5383
                function=self.modify_config_set_family_selection.__name__,
5384
                argument='families',
5385
                arg_type='list',
5386
            )
5387
5388
        cmd = XmlCommand("modify_config")
5389
        cmd.set_attribute("config_id", str(config_id))
5390
5391
        _xmlfamsel = cmd.add_element("family_selection")
5392
        _xmlfamsel.add_element("growing", to_bool(auto_add_new_families))
5393
5394
        for family in families:
5395
            _xmlfamily = _xmlfamsel.add_element("family")
5396
            _xmlfamily.add_element("name", family[0])
5397
5398
            if len(family) != 3:
5399
                raise InvalidArgument(
5400
                    "Family must be a tuple of 3. (str, bool, bool)"
5401
                )
5402
5403
            if not isinstance(family[1], bool) or not isinstance(
5404
                family[2], bool
5405
            ):
5406
                raise InvalidArgumentType(
5407
                    function=self.modify_config_set_family_selection.__name__,
5408
                    argument='families',
5409
                    arg_type='[tuple(str, bool, bool)]',
5410
                )
5411
5412
            _xmlfamily.add_element("all", to_bool(family[2]))
5413
            _xmlfamily.add_element("growing", to_bool(family[1]))
5414
5415
        return self._send_xml_command(cmd)
5416
5417
    def modify_config(
5418
        self, config_id: str, selection: Optional[str] = None, **kwargs
5419
    ) -> Any:
5420
        """Modifies an existing scan config.
5421
5422
        DEPRECATED. Please use *modify_config_set_* methods instead.
5423
5424
        modify_config has four modes to operate depending on the selection.
5425
5426
        Arguments:
5427
            config_id: UUID of scan config to modify.
5428
            selection: one of 'scan_pref', 'nvt_pref', 'nvt_selection' or
5429
                'family_selection'
5430
            name: New name for preference.
5431
            value: New value for preference.
5432
            nvt_oids: List of NVTs associated with preference to modify.
5433
            family: Name of family to modify.
5434
5435
        Returns:
5436
            The response. See :py:meth:`send_command` for details.
5437
        """
5438
        if not config_id:
5439
            raise RequiredArgument(
5440
                function=self.modify_config.__name__,
5441
                argument='config_id argument',
5442
            )
5443
5444
        if selection is None:
5445
            deprecation(
5446
                "Using modify_config to update the comment of a scan config is"
5447
                "deprecated. Please use modify_config_set_comment instead."
5448
            )
5449
            return self.modify_config_set_comment(
5450
                config_id, kwargs.get("comment")
5451
            )
5452
5453
        if selection not in (
5454
            "nvt_pref",
5455
            "scan_pref",
5456
            "family_selection",
5457
            "nvt_selection",
5458
        ):
5459
            raise InvalidArgument(
5460
                "selection must be one of nvt_pref, "
5461
                "scan_pref, family_selection or "
5462
                "nvt_selection"
5463
            )
5464
5465
        if selection == "nvt_pref":
5466
            deprecation(
5467
                "Using modify_config to update a nvt preference of a scan "
5468
                "config is deprecated. Please use "
5469
                "modify_config_set_nvt_preference instead."
5470
            )
5471
            return self.modify_config_set_nvt_preference(config_id, **kwargs)
5472
5473
        if selection == "scan_pref":
5474
            deprecation(
5475
                "Using modify_config to update a scanner preference of a "
5476
                "scan config is deprecated. Please use "
5477
                "modify_config_set_scanner_preference instead."
5478
            )
5479
            return self.modify_config_set_scanner_preference(
5480
                config_id, **kwargs
5481
            )
5482
5483
        if selection == "nvt_selection":
5484
            deprecation(
5485
                "Using modify_config to update a nvt selection of a "
5486
                "scan config is deprecated. Please use "
5487
                "modify_config_set_nvt_selection instead."
5488
            )
5489
            return self.modify_config_set_nvt_selection(config_id, **kwargs)
5490
5491
        deprecation(
5492
            "Using modify_config to update a family selection of a "
5493
            "scan config is deprecated. Please use "
5494
            "modify_config_set_family_selection instead."
5495
        )
5496
        return self.modify_config_set_family_selection(config_id, **kwargs)
5497
5498 View Code Duplication
    def modify_group(
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
5499
        self,
5500
        group_id: str,
5501
        *,
5502
        comment: Optional[str] = None,
5503
        name: Optional[str] = None,
5504
        users: Optional[List[str]] = None,
5505
    ) -> Any:
5506
        """Modifies an existing group.
5507
5508
        Arguments:
5509
            group_id: UUID of group to modify.
5510
            comment: Comment on group.
5511
            name: Name of group.
5512
            users: List of user names to be in the group
5513
5514
        Returns:
5515
            The response. See :py:meth:`send_command` for details.
5516
        """
5517
        if not group_id:
5518
            raise RequiredArgument(
5519
                function=self.modify_group.__name__, argument='group_id'
5520
            )
5521
5522
        cmd = XmlCommand("modify_group")
5523
        cmd.set_attribute("group_id", group_id)
5524
5525
        if comment:
5526
            cmd.add_element("comment", comment)
5527
5528
        if name:
5529
            cmd.add_element("name", name)
5530
5531
        if users:
5532
            cmd.add_element("users", to_comma_list(users))
5533
5534
        return self._send_xml_command(cmd)
5535
5536 View Code Duplication
    def modify_note(
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
5537
        self,
5538
        note_id: str,
5539
        text: str,
5540
        *,
5541
        days_active: Optional[int] = None,
5542
        hosts: Optional[List[str]] = None,
5543
        port: Optional[int] = None,
5544
        result_id: Optional[str] = None,
5545
        severity: Optional[Severity] = None,
5546
        task_id: Optional[str] = None,
5547
        threat: Optional[SeverityLevel] = None,
5548
    ) -> Any:
5549
        """Modifies an existing note.
5550
5551
        Arguments:
5552
            note_id: UUID of note to modify.
5553
            text: The text of the note.
5554
            days_active: Days note will be active. -1 on always, 0 off.
5555
            hosts: A list of hosts addresses
5556
            port: Port to which note applies.
5557
            result_id: Result to which note applies.
5558
            severity: Severity to which note applies.
5559
            task_id: Task to which note applies.
5560
            threat: Threat level to which note applies. Will be converted to
5561
                severity.
5562
5563
        Returns:
5564
            The response. See :py:meth:`send_command` for details.
5565
        """
5566
        if not note_id:
5567
            raise RequiredArgument(
5568
                function=self.modify_note.__name__, argument='note_id'
5569
            )
5570
5571
        if not text:
5572
            raise RequiredArgument(
5573
                function=self.modify_note.__name__, argument='text'
5574
            )
5575
5576
        cmd = XmlCommand("modify_note")
5577
        cmd.set_attribute("note_id", note_id)
5578
        cmd.add_element("text", text)
5579
5580
        if days_active is not None:
5581
            cmd.add_element("active", str(days_active))
5582
5583
        if hosts:
5584
            cmd.add_element("hosts", to_comma_list(hosts))
5585
5586
        if port:
5587
            cmd.add_element("port", str(port))
5588
5589
        if result_id:
5590
            cmd.add_element("result", attrs={"id": result_id})
5591
5592
        if severity:
5593
            cmd.add_element("severity", str(severity))
5594
5595
        if task_id:
5596
            cmd.add_element("task", attrs={"id": task_id})
5597
5598
        if threat is not None:
5599
5600
            if not isinstance(threat, SeverityLevel):
5601
                raise InvalidArgumentType(
5602
                    function=self.modify_note.__name__,
5603
                    argument='threat',
5604
                    arg_type=SeverityLevel.__name__,
5605
                )
5606
5607
            cmd.add_element("threat", threat.value)
5608
5609
        return self._send_xml_command(cmd)
5610
5611 View Code Duplication
    def modify_override(
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
5612
        self,
5613
        override_id: str,
5614
        text: str,
5615
        *,
5616
        days_active: Optional[int] = None,
5617
        hosts: Optional[List[str]] = None,
5618
        port: Optional[int] = None,
5619
        result_id: Optional[str] = None,
5620
        severity: Optional[Severity] = None,
5621
        new_severity: Optional[Severity] = None,
5622
        task_id: Optional[str] = None,
5623
        threat: Optional[SeverityLevel] = None,
5624
        new_threat: Optional[SeverityLevel] = None,
5625
    ) -> Any:
5626
        """Modifies an existing override.
5627
5628
        Arguments:
5629
            override_id: UUID of override to modify.
5630
            text: The text of the override.
5631
            days_active: Days override will be active. -1 on always,
5632
                0 off.
5633
            hosts: A list of host addresses
5634
            port: Port to which override applies.
5635
            result_id: Result to which override applies.
5636
            severity: Severity to which override applies.
5637
            new_severity: New severity score for result.
5638
            task_id: Task to which override applies.
5639
            threat: Threat level to which override applies.
5640
                Will be converted to severity.
5641
            new_threat: New threat level for results. Will be converted to
5642
                new_severity.
5643
5644
        Returns:
5645
            The response. See :py:meth:`send_command` for details.
5646
        """
5647
        if not override_id:
5648
            raise RequiredArgument(
5649
                function=self.modify_override.__name__, argument='override_id'
5650
            )
5651
        if not text:
5652
            raise RequiredArgument(
5653
                function=self.modify_override.__name__, argument='text'
5654
            )
5655
5656
        cmd = XmlCommand("modify_override")
5657
        cmd.set_attribute("override_id", override_id)
5658
        cmd.add_element("text", text)
5659
5660
        if days_active is not None:
5661
            cmd.add_element("active", str(days_active))
5662
5663
        if hosts:
5664
            cmd.add_element("hosts", to_comma_list(hosts))
5665
5666
        if port:
5667
            cmd.add_element("port", str(port))
5668
5669
        if result_id:
5670
            cmd.add_element("result", attrs={"id": result_id})
5671
5672
        if severity:
5673
            cmd.add_element("severity", str(severity))
5674
5675
        if new_severity:
5676
            cmd.add_element("new_severity", str(new_severity))
5677
5678
        if task_id:
5679
            cmd.add_element("task", attrs={"id": task_id})
5680
5681
        if threat is not None:
5682
            if not isinstance(threat, SeverityLevel):
5683
                raise InvalidArgumentType(
5684
                    function=self.modify_override.__name__,
5685
                    argument='threat',
5686
                    arg_type=SeverityLevel.__name__,
5687
                )
5688
            cmd.add_element("threat", threat.value)
5689
5690
        if new_threat is not None:
5691
            if not isinstance(new_threat, SeverityLevel):
5692
                raise InvalidArgumentType(
5693
                    function=self.modify_override.__name__,
5694
                    argument='new_threat',
5695
                    arg_type=SeverityLevel.__name__,
5696
                )
5697
5698
            cmd.add_element("new_threat", new_threat.value)
5699
5700
        return self._send_xml_command(cmd)
5701
5702
    def modify_report_format(
5703
        self,
5704
        report_format_id: Optional[Union[str, ReportFormatType]] = None,
5705
        *,
5706
        active: Optional[bool] = None,
5707
        name: Optional[str] = None,
5708
        summary: Optional[str] = None,
5709
        param_name: Optional[str] = None,
5710
        param_value: Optional[str] = None,
5711
    ) -> Any:
5712
        """Modifies an existing report format.
5713
5714
        Arguments:
5715
            report_format_id: UUID of report format to modify
5716
                              or ReportFormatType (enum)
5717
            active: Whether the report format is active.
5718
            name: The name of the report format.
5719
            summary: A summary of the report format.
5720
            param_name: The name of the param.
5721
            param_value: The value of the param.
5722
5723
        Returns:
5724
            The response. See :py:meth:`send_command` for details.
5725
        """
5726
        if not report_format_id:
5727
            raise RequiredArgument(
5728
                function=self.modify_report_format.__name__,
5729
                argument='report_format_id ',
5730
            )
5731
5732
        cmd = XmlCommand("modify_report_format")
5733
5734
        if isinstance(report_format_id, ReportFormatType):
5735
            report_format_id = report_format_id.value
5736
5737
        cmd.set_attribute("report_format_id", report_format_id)
5738
5739
        if active is not None:
5740
            cmd.add_element("active", to_bool(active))
5741
5742
        if name:
5743
            cmd.add_element("name", name)
5744
5745
        if summary:
5746
            cmd.add_element("summary", summary)
5747
5748
        if param_name:
5749
            _xmlparam = cmd.add_element("param")
5750
            _xmlparam.add_element("name", param_name)
5751
5752
            if param_value is not None:
5753
                _xmlparam.add_element("value", param_value)
5754
5755
        return self._send_xml_command(cmd)
5756
5757 View Code Duplication
    def modify_role(
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
5758
        self,
5759
        role_id: str,
5760
        *,
5761
        comment: Optional[str] = None,
5762
        name: Optional[str] = None,
5763
        users: Optional[List[str]] = None,
5764
    ) -> Any:
5765
        """Modifies an existing role.
5766
5767
        Arguments:
5768
            role_id: UUID of role to modify.
5769
            comment: Name of role.
5770
            name: Comment on role.
5771
            users: List of user names.
5772
5773
        Returns:
5774
            The response. See :py:meth:`send_command` for details.
5775
        """
5776
        if not role_id:
5777
            raise RequiredArgument(
5778
                function=self.modify_role.__name__, argument='role_id argument'
5779
            )
5780
5781
        cmd = XmlCommand("modify_role")
5782
        cmd.set_attribute("role_id", role_id)
5783
5784
        if comment:
5785
            cmd.add_element("comment", comment)
5786
5787
        if name:
5788
            cmd.add_element("name", name)
5789
5790
        if users:
5791
            cmd.add_element("users", to_comma_list(users))
5792
5793
        return self._send_xml_command(cmd)
5794
5795
    def modify_scanner(
5796
        self,
5797
        scanner_id: str,
5798
        *,
5799
        scanner_type: Optional[ScannerType] = None,
5800
        host: Optional[str] = None,
5801
        port: Optional[int] = None,
5802
        comment: Optional[str] = None,
5803
        name: Optional[str] = None,
5804
        ca_pub: Optional[str] = None,
5805
        credential_id: Optional[str] = None,
5806
    ) -> Any:
5807
        """Modifies an existing scanner.
5808
5809
        Arguments:
5810
            scanner_id: UUID of scanner to modify.
5811
            scanner_type: New type of the Scanner.
5812
            host: Host of the scanner.
5813
            port: Port of the scanner.
5814
            comment: Comment on scanner.
5815
            name: Name of scanner.
5816
            ca_pub: Certificate of CA to verify scanner's certificate.
5817
            credential_id: UUID of the client certificate credential for the
5818
                Scanner.
5819
5820
        Returns:
5821
            The response. See :py:meth:`send_command` for details.
5822
        """
5823
        if not scanner_id:
5824
            raise RequiredArgument(
5825
                function=self.modify_scanner.__name__,
5826
                argument='scanner_id argument',
5827
            )
5828
5829
        cmd = XmlCommand("modify_scanner")
5830
        cmd.set_attribute("scanner_id", scanner_id)
5831
5832
        if scanner_type is not None:
5833
            if not isinstance(scanner_type, self.types.ScannerType):
5834
                raise InvalidArgumentType(
5835
                    function=self.modify_scanner.__name__,
5836
                    argument='scanner_type',
5837
                    arg_type=self.types.ScannerType.__name__,
5838
                )
5839
5840
            cmd.add_element("type", scanner_type.value)
5841
5842
        if host:
5843
            cmd.add_element("host", host)
5844
5845
        if port:
5846
            cmd.add_element("port", str(port))
5847
5848
        if comment:
5849
            cmd.add_element("comment", comment)
5850
5851
        if name:
5852
            cmd.add_element("name", name)
5853
5854
        if ca_pub:
5855
            cmd.add_element("ca_pub", ca_pub)
5856
5857
        if credential_id:
5858
            cmd.add_element("credential", attrs={"id": str(credential_id)})
5859
5860
        return self._send_xml_command(cmd)
5861
5862
    def modify_setting(
5863
        self,
5864
        setting_id: Optional[str] = None,
5865
        name: Optional[str] = None,
5866
        value: Optional[str] = None,
5867
    ) -> Any:
5868
        """Modifies an existing setting.
5869
5870
        Arguments:
5871
            setting_id: UUID of the setting to be changed.
5872
            name: The name of the setting. Either setting_id or name must be
5873
                passed.
5874
            value: The value of the setting.
5875
5876
        Returns:
5877
            The response. See :py:meth:`send_command` for details.
5878
        """
5879
        if not setting_id and not name:
5880
            raise RequiredArgument(
5881
                function=self.modify_setting.__name__,
5882
                argument='setting_id or name argument',
5883
            )
5884
5885
        if value is None:
5886
            raise RequiredArgument(
5887
                function=self.modify_setting.__name__, argument='value argument'
5888
            )
5889
5890
        cmd = XmlCommand("modify_setting")
5891
5892
        if setting_id:
5893
            cmd.set_attribute("setting_id", setting_id)
5894
        else:
5895
            cmd.add_element("name", name)
5896
5897
        cmd.add_element("value", to_base64(value))
5898
5899
        return self._send_xml_command(cmd)
5900
5901 View Code Duplication
    def modify_user(
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
5902
        self,
5903
        user_id: str = None,
5904
        name: str = None,
5905
        *,
5906
        new_name: Optional[str] = None,
5907
        comment: Optional[str] = None,
5908
        password: Optional[str] = None,
5909
        auth_source: Optional[UserAuthType] = None,
5910
        role_ids: Optional[List[str]] = None,
5911
        hosts: Optional[List[str]] = None,
5912
        hosts_allow: Optional[bool] = False,
5913
        ifaces: Optional[List[str]] = None,
5914
        ifaces_allow: Optional[bool] = False,
5915
        group_ids: Optional[List[str]] = None,
5916
    ) -> Any:
5917
        """Modifies an existing user. Most of the fields need to be supplied
5918
        for changing a single field even if no change is wanted for those.
5919
        Else empty values are inserted for the missing fields instead.
5920
        Arguments:
5921
            user_id: UUID of the user to be modified. Overrides name element
5922
                argument.
5923
            name: The name of the user to be modified. Either user_id or name
5924
                must be passed.
5925
            new_name: The new name for the user.
5926
            comment: Comment on the user.
5927
            password: The password for the user.
5928
            auth_source: Source allowed for authentication for this user.
5929
            roles_id: List of roles UUIDs for the user.
5930
            hosts: User access rules: List of hosts.
5931
            hosts_allow: Defines how the hosts list is to be interpreted.
5932
                If False (default) the list is treated as a deny list.
5933
                All hosts are allowed by default except those provided by
5934
                the hosts parameter. If True the list is treated as a
5935
                allow list. All hosts are denied by default except those
5936
                provided by the hosts parameter.
5937
            ifaces: User access rules: List of ifaces.
5938
            ifaces_allow: Defines how the ifaces list is to be interpreted.
5939
                If False (default) the list is treated as a deny list.
5940
                All ifaces are allowed by default except those provided by
5941
                the ifaces parameter. If True the list is treated as a
5942
                allow list. All ifaces are denied by default except those
5943
                provided by the ifaces parameter.
5944
            group_ids: List of group UUIDs for the user.
5945
5946
        Returns:
5947
            The response. See :py:meth:`send_command` for details.
5948
        """
5949
        if not user_id and not name:
5950
            raise RequiredArgument(
5951
                function=self.modify_user.__name__, argument='user_id or name'
5952
            )
5953
5954
        cmd = XmlCommand("modify_user")
5955
5956
        if user_id:
5957
            cmd.set_attribute("user_id", user_id)
5958
        else:
5959
            cmd.add_element("name", name)
5960
5961
        if new_name:
5962
            cmd.add_element("new_name", new_name)
5963
5964
        if role_ids:
5965
            for role in role_ids:
5966
                cmd.add_element("role", attrs={"id": role})
5967
5968
        if hosts:
5969
            cmd.add_element(
5970
                "hosts",
5971
                to_comma_list(hosts),
5972
                attrs={"allow": to_bool(hosts_allow)},
5973
            )
5974
5975
        if ifaces:
5976
            cmd.add_element(
5977
                "ifaces",
5978
                to_comma_list(ifaces),
5979
                attrs={"allow": to_bool(ifaces_allow)},
5980
            )
5981
5982
        if comment:
5983
            cmd.add_element("comment", comment)
5984
5985
        if password:
5986
            cmd.add_element("password", password)
5987
5988
        if auth_source:
5989
            _xmlauthsrc = cmd.add_element("sources")
5990
            _xmlauthsrc.add_element("source", auth_source.value)
5991
5992
        if group_ids:
5993
            _xmlgroups = cmd.add_element("groups")
5994
            for group_id in group_ids:
5995
                _xmlgroups.add_element("group", attrs={"id": group_id})
5996
5997
        return self._send_xml_command(cmd)
5998
5999
    def restore(self, entity_id: str) -> Any:
6000
        """Restore an entity from the trashcan
6001
6002
        Arguments:
6003
            entity_id: ID of the entity to be restored from the trashcan
6004
6005
        Returns:
6006
            The response. See :py:meth:`send_command` for details.
6007
        """
6008
        if not entity_id:
6009
            raise RequiredArgument(
6010
                function=self.restore.__name__, argument='entity_id'
6011
            )
6012
6013
        cmd = XmlCommand("restore")
6014
        cmd.set_attribute("id", entity_id)
6015
6016
        return self._send_xml_command(cmd)
6017
6018
    def sync_cert(self) -> Any:
6019
        """Request a synchronization with the CERT feed service
6020
6021
        Returns:
6022
            The response. See :py:meth:`send_command` for details.
6023
        """
6024
        return self._send_xml_command(XmlCommand("sync_cert"))
6025
6026
    def sync_config(self) -> Any:
6027
        """Request an OSP config synchronization with scanner
6028
6029
        Returns:
6030
            The response. See :py:meth:`send_command` for details.
6031
        """
6032
        return self._send_xml_command(XmlCommand("sync_config"))
6033
6034
    def sync_feed(self) -> Any:
6035
        """Request a synchronization with the NVT feed service
6036
6037
        Returns:
6038
            The response. See :py:meth:`send_command` for details.
6039
        """
6040
        return self._send_xml_command(XmlCommand("sync_feed"))
6041
6042
    def sync_scap(self) -> Any:
6043
        """Request a synchronization with the SCAP feed service
6044
6045
        Returns:
6046
            The response. See :py:meth:`send_command` for details.
6047
        """
6048
        return self._send_xml_command(XmlCommand("sync_scap"))
6049
6050
    def test_alert(self, alert_id: str) -> Any:
6051
        """Run an alert
6052
6053
        Invoke a test run of an alert
6054
6055
        Arguments:
6056
            alert_id: UUID of the alert to be tested
6057
6058
        Returns:
6059
            The response. See :py:meth:`send_command` for details.
6060
        """
6061
        if not alert_id:
6062
            raise InvalidArgument("test_alert requires an alert_id argument")
6063
6064
        cmd = XmlCommand("test_alert")
6065
        cmd.set_attribute("alert_id", alert_id)
6066
6067
        return self._send_xml_command(cmd)
6068
6069
    def trigger_alert(
6070
        self,
6071
        alert_id: str,
6072
        report_id: str,
6073
        *,
6074
        filter: Optional[str] = None,
6075
        filter_id: Optional[str] = None,
6076
        report_format_id: Optional[Union[str, ReportFormatType]] = None,
6077
        delta_report_id: Optional[str] = None,
6078
    ) -> Any:
6079
        """Run an alert by ignoring its event and conditions
6080
6081
        The alert is triggered to run immediately with the provided filtered
6082
        report by ignoring the even and condition settings.
6083
6084
        Arguments:
6085
            alert_id: UUID of the alert to be run
6086
            report_id: UUID of the report to be provided to the alert
6087
            filter: Filter term to use to filter results in the report
6088
            filter_id: UUID of filter to use to filter results in the report
6089
            report_format_id: UUID of report format to use
6090
                              or ReportFormatType (enum)
6091
            delta_report_id: UUID of an existing report to compare report to.
6092
6093
        Returns:
6094
            The response. See :py:meth:`send_command` for details.
6095
        """
6096
        if not alert_id:
6097
            raise RequiredArgument(
6098
                function=self.trigger_alert.__name__,
6099
                argument='alert_id argument',
6100
            )
6101
6102
        if not report_id:
6103
            raise RequiredArgument(
6104
                function=self.trigger_alert.__name__,
6105
                argument='report_id argument',
6106
            )
6107
6108
        cmd = XmlCommand("get_reports")
6109
        cmd.set_attribute("report_id", report_id)
6110
        cmd.set_attribute("alert_id", alert_id)
6111
6112
        if filter:
6113
            cmd.set_attribute("filter", filter)
6114
6115
        if filter_id:
6116
            cmd.set_attribute("filt_id", filter_id)
6117
6118
        if report_format_id:
6119
            if isinstance(report_format_id, ReportFormatType):
6120
                report_format_id = report_format_id.value
6121
6122
            cmd.set_attribute("format_id", report_format_id)
6123
6124
        if delta_report_id:
6125
            cmd.set_attribute("delta_report_id", delta_report_id)
6126
6127
        return self._send_xml_command(cmd)
6128
6129 View Code Duplication
    def verify_report_format(
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
6130
        self, report_format_id: Union[str, ReportFormatType]
6131
    ) -> Any:
6132
        """Verify an existing report format
6133
6134
        Verifies the trust level of an existing report format. It will be
6135
        checked whether the signature of the report format currently matches the
6136
        report format. This includes the script and files used to generate
6137
        reports of this format. It is *not* verified if the report format works
6138
        as expected by the user.
6139
6140
        Arguments:
6141
            report_format_id: UUID of the report format to be verified
6142
                              or ReportFormatType (enum)
6143
6144
        Returns:
6145
            The response. See :py:meth:`send_command` for details.
6146
        """
6147
        if not report_format_id:
6148
            raise RequiredArgument(
6149
                function=self.verify_report_format.__name__,
6150
                argument='report_format_id',
6151
            )
6152
6153
        cmd = XmlCommand("verify_report_format")
6154
6155
        if isinstance(report_format_id, ReportFormatType):
6156
            report_format_id = report_format_id.value
6157
6158
        cmd.set_attribute("report_format_id", report_format_id)
6159
6160
        return self._send_xml_command(cmd)
6161
6162
    def verify_scanner(self, scanner_id: str) -> Any:
6163
        """Verify an existing scanner
6164
6165
        Verifies if it is possible to connect to an existing scanner. It is
6166
        *not* verified if the scanner works as expected by the user.
6167
6168
        Arguments:
6169
            scanner_id: UUID of the scanner to be verified
6170
6171
        Returns:
6172
            The response. See :py:meth:`send_command` for details.
6173
        """
6174
        if not scanner_id:
6175
            raise RequiredArgument(
6176
                function=self.verify_scanner.__name__, argument='scanner_id'
6177
            )
6178
6179
        cmd = XmlCommand("verify_scanner")
6180
        cmd.set_attribute("scanner_id", scanner_id)
6181
6182
        return self._send_xml_command(cmd)
6183