def modify_policy_set_family_selection( self, policy_id: str, families: List[Tuple[str, bool, bool]], *, auto_add_new_families: Optional[bool] = True, ) -> Any: """ Selected the NVTs of a policy at a family level. Arguments: policy_id: UUID of policy to modify. families: A list of tuples with the first entry being the name of the NVT family selected, second entry a boolean indicating whether new NVTs should be added to the family automatically, and third entry a boolean indicating whether all nvts from the family should be included. auto_add_new_families: Whether new families should be added to the policy automatically. Default: True. """ if not policy_id: raise RequiredArgument( function=self.modify_policy_set_family_selection.__name__, argument="policy_id", ) if not is_list_like(families): raise InvalidArgumentType( function=self.modify_policy_set_family_selection.__name__, argument="families", arg_type="list", ) cmd = XmlCommand("modify_config") cmd.set_attribute("config_id", str(policy_id)) _xmlfamsel = cmd.add_element("family_selection") _xmlfamsel.add_element("growing", to_bool(auto_add_new_families)) for family in families: _xmlfamily = _xmlfamsel.add_element("family") _xmlfamily.add_element("name", family[0]) if len(family) != 3: raise InvalidArgument( "Family must be a tuple of 3. (str, bool, bool)") if not isinstance(family[1], bool) or not isinstance( family[2], bool): raise InvalidArgumentType( function=( self.modify_policy_set_family_selection.__name__), argument="families", arg_type="[tuple(str, bool, bool)]", ) _xmlfamily.add_element("all", to_bool(family[2])) _xmlfamily.add_element("growing", to_bool(family[1])) return self._send_xml_command(cmd)
def modify_scan_config_set_family_selection( self, config_id: str, families: List[Tuple[str, bool, bool]], *, auto_add_new_families: Optional[bool] = True, ) -> Any: """ Selected the NVTs of a scan config at a family level. Arguments: config_id: UUID of scan config to modify. families: A list of tuples (str, bool, bool): str: the name of the NVT family selected, bool: add new NVTs to the family automatically, bool: include all NVTs from the family auto_add_new_families: Whether new families should be added to the scan config automatically. Default: True. """ if not config_id: raise RequiredArgument( function=self.modify_scan_config_set_family_selection.__name__, argument="config_id", ) if not is_list_like(families): raise InvalidArgumentType( function=self.modify_scan_config_set_family_selection.__name__, argument="families", arg_type="list", ) cmd = XmlCommand("modify_config") cmd.set_attribute("config_id", str(config_id)) _xmlfamsel = cmd.add_element("family_selection") _xmlfamsel.add_element("growing", to_bool(auto_add_new_families)) for family in families: _xmlfamily = _xmlfamsel.add_element("family") _xmlfamily.add_element("name", family[0]) if len(family) != 3: raise InvalidArgument( "Family must be a tuple of 3. (str, bool, bool)") if not isinstance(family[1], bool) or not isinstance( family[2], bool): raise InvalidArgumentType( function=( self.modify_scan_config_set_family_selection.__name__), argument="families", arg_type="[tuple(str, bool, bool)]", ) _xmlfamily.add_element("all", to_bool(family[2])) _xmlfamily.add_element("growing", to_bool(family[1])) return self._send_xml_command(cmd)
def test_is_list_like(self): self.assertFalse(is_list_like(True)) self.assertFalse(is_list_like("foo")) self.assertFalse(is_list_like(13)) self.assertTrue(is_list_like([1])) self.assertTrue(is_list_like(["1", "2"])) self.assertTrue(is_list_like(("2", "3")))
def modify_scan_config_set_nvt_selection(self, config_id: str, family: str, nvt_oids: List[str]) -> Any: """Modifies the selected nvts of an existing scan config The manager updates the given family in the config to include only the given NVTs. Arguments: config_id: UUID of scan config to modify. family: Name of the NVT family to include NVTs from nvt_oids: List of NVTs to select for the family. """ if not config_id: raise RequiredArgument( function=self.modify_scan_config_set_nvt_selection.__name__, argument="config_id", ) if not family: raise RequiredArgument( function=self.modify_scan_config_set_nvt_selection.__name__, argument="family argument", ) if not is_list_like(nvt_oids): raise InvalidArgumentType( function=self.modify_scan_config_set_nvt_selection.__name__, argument="nvt_oids", arg_type="list", ) cmd = XmlCommand("modify_config") cmd.set_attribute("config_id", str(config_id)) _xmlnvtsel = cmd.add_element("nvt_selection") _xmlnvtsel.add_element("family", family) for nvt in nvt_oids: _xmlnvtsel.add_element("nvt", attrs={"oid": nvt}) return self._send_xml_command(cmd)
def create_task( self, name: str, config_id: str, target_id: str, scanner_id: str, *, alterable: Optional[bool] = None, hosts_ordering: Optional[HostsOrdering] = None, schedule_id: Optional[str] = None, alert_ids: Optional[List[str]] = None, comment: Optional[str] = None, schedule_periods: Optional[int] = None, observers: Optional[List[str]] = None, preferences: Optional[dict] = None, ) -> Any: """Create a new scan task Arguments: name: Name of the new task config_id: UUID of config to use by the task target_id: UUID of target to be scanned scanner_id: UUID of scanner to use for scanning the target comment: Comment for the task alterable: Whether the task should be alterable alert_ids: List of UUIDs for alerts to be applied to the task hosts_ordering: The order hosts are scanned in schedule_id: UUID of a schedule when the task should be run. schedule_periods: A limit to the number of times the task will be scheduled, or 0 for no limit observers: List of names or ids of users which should be allowed to observe this task preferences: Name/Value pairs of scanner preferences. Returns: The response. See :py:meth:`send_command` for details. """ if not name: raise RequiredArgument(function=self.create_task.__name__, argument="name") if not config_id: raise RequiredArgument(function=self.create_task.__name__, argument="config_id") if not target_id: raise RequiredArgument(function=self.create_task.__name__, argument="target_id") if not scanner_id: raise RequiredArgument(function=self.create_task.__name__, argument="scanner_id") # don't allow to create a container task with create_task if target_id == "0": raise InvalidArgument(function=self.create_task.__name__, argument="target_id") cmd = XmlCommand("create_task") cmd.add_element("name", name) cmd.add_element("usage_type", "scan") cmd.add_element("config", attrs={"id": config_id}) cmd.add_element("target", attrs={"id": target_id}) cmd.add_element("scanner", attrs={"id": scanner_id}) if comment: cmd.add_element("comment", comment) if alterable is not None: cmd.add_element("alterable", to_bool(alterable)) if hosts_ordering: if not isinstance(hosts_ordering, HostsOrdering): raise InvalidArgumentType( function=self.create_task.__name__, argument="hosts_ordering", arg_type=HostsOrdering.__name__, ) cmd.add_element("hosts_ordering", hosts_ordering.value) if alert_ids is not None: if not is_list_like(alert_ids): raise InvalidArgumentType( function=self.modify_task.__name__, argument="alert_ids", arg_type="list", ) if not len(alert_ids) == 0: for alert in alert_ids: cmd.add_element("alert", attrs={"id": str(alert)}) if schedule_id: cmd.add_element("schedule", attrs={"id": schedule_id}) if schedule_periods is not None: if (not isinstance(schedule_periods, Integral) or schedule_periods < 0): raise InvalidArgument( "schedule_periods must be an integer greater or equal " "than 0") cmd.add_element("schedule_periods", str(schedule_periods)) if observers is not None: if not is_list_like(observers): raise InvalidArgumentType( function=self.create_task.__name__, argument="observers", arg_type="list", ) # gvmd splits by comma and space # gvmd tries to lookup each value as user name and afterwards as # user id. So both user name and user id are possible cmd.add_element("observers", to_comma_list(observers)) if preferences is not None: if not isinstance(preferences, Mapping): raise InvalidArgumentType( function=self.create_task.__name__, argument="preferences", arg_type=Mapping.__name__, ) _xmlprefs = cmd.add_element("preferences") for pref_name, pref_value in preferences.items(): _xmlpref = _xmlprefs.add_element("preference") _xmlpref.add_element("scanner_name", pref_name) _xmlpref.add_element("value", str(pref_value)) return self._send_xml_command(cmd)
def modify_task( self, task_id: str, *, name: Optional[str] = None, config_id: Optional[str] = None, target_id: Optional[str] = None, scanner_id: Optional[str] = None, alterable: Optional[bool] = None, hosts_ordering: Optional[HostsOrdering] = None, schedule_id: Optional[str] = None, schedule_periods: Optional[int] = None, comment: Optional[str] = None, alert_ids: Optional[List[str]] = None, observers: Optional[List[str]] = None, preferences: Optional[dict] = None, ) -> Any: """Modifies an existing task. Arguments: task_id: UUID of task to modify. name: The name of the task. config_id: UUID of scan config to use by the task target_id: UUID of target to be scanned scanner_id: UUID of scanner to use for scanning the target comment: The comment on the task. alert_ids: List of UUIDs for alerts to be applied to the task hosts_ordering: The order hosts are scanned in schedule_id: UUID of a schedule when the task should be run. schedule_periods: A limit to the number of times the task will be scheduled, or 0 for no limit. observers: List of names or ids of users which should be allowed to observe this task preferences: Name/Value pairs of scanner preferences. Returns: The response. See :py:meth:`send_command` for details. """ if not task_id: raise RequiredArgument(function=self.modify_task.__name__, argument="task_id argument") cmd = XmlCommand("modify_task") cmd.set_attribute("task_id", task_id) if name: cmd.add_element("name", name) if comment: cmd.add_element("comment", comment) if config_id: cmd.add_element("config", attrs={"id": config_id}) if target_id: cmd.add_element("target", attrs={"id": target_id}) if alterable is not None: cmd.add_element("alterable", to_bool(alterable)) if hosts_ordering: if not isinstance(hosts_ordering, HostsOrdering): raise InvalidArgumentType( function=self.modify_task.__name__, argument="hosts_ordering", arg_type=HostsOrdering.__name__, ) cmd.add_element("hosts_ordering", hosts_ordering.value) if scanner_id: cmd.add_element("scanner", attrs={"id": scanner_id}) if schedule_id: cmd.add_element("schedule", attrs={"id": schedule_id}) if schedule_periods is not None: if (not isinstance(schedule_periods, Integral) or schedule_periods < 0): raise InvalidArgument( "schedule_periods must be an integer greater or equal " "than 0") cmd.add_element("schedule_periods", str(schedule_periods)) if alert_ids is not None: if not is_list_like(alert_ids): raise InvalidArgumentType( function=self.modify_task.__name__, argument="alert_ids", arg_type="list", ) if len(alert_ids) == 0: cmd.add_element("alert", attrs={"id": "0"}) else: for alert in alert_ids: cmd.add_element("alert", attrs={"id": str(alert)}) if observers is not None: if not is_list_like(observers): raise InvalidArgumentType( function=self.modify_task.__name__, argument="observers", arg_type="list", ) cmd.add_element("observers", to_comma_list(observers)) if preferences is not None: if not isinstance(preferences, Mapping): raise InvalidArgumentType( function=self.modify_task.__name__, argument="preferences", arg_type=Mapping.__name__, ) _xmlprefs = cmd.add_element("preferences") for pref_name, pref_value in preferences.items(): _xmlpref = _xmlprefs.add_element("preference") _xmlpref.add_element("scanner_name", pref_name) _xmlpref.add_element("value", str(pref_value)) return self._send_xml_command(cmd)
def create_task( self, name: str, config_id: str, target_id: str, scanner_id: str, *, alterable: Optional[bool] = None, hosts_ordering: Optional[HostsOrdering] = None, schedule_id: Optional[str] = None, alert_ids: Optional[List[str]] = None, comment: Optional[str] = None, schedule_periods: Optional[int] = None, observers: Optional[List[str]] = None, preferences: Optional[dict] = None, ) -> Any: if not name: raise RequiredArgument(function=self.create_task.__name__, argument='name') if not config_id: raise RequiredArgument(function=self.create_task.__name__, argument='config_id') if not target_id: raise RequiredArgument(function=self.create_task.__name__, argument='target_id') if not scanner_id: raise RequiredArgument(function=self.create_task.__name__, argument='scanner_id') # don't allow to create a container task with create_task if target_id == '0': raise InvalidArgument(function=self.create_task.__name__, argument='target_id') cmd = XmlCommand("create_task") cmd.add_element("name", name) cmd.add_element("usage_type", "scan") cmd.add_element("config", attrs={"id": config_id}) cmd.add_element("target", attrs={"id": target_id}) cmd.add_element("scanner", attrs={"id": scanner_id}) if comment: cmd.add_element("comment", comment) if alterable is not None: cmd.add_element("alterable", to_bool(alterable)) if hosts_ordering: if not isinstance(hosts_ordering, self.types.HostsOrdering): raise InvalidArgumentType( function=self.create_task.__name__, argument='hosts_ordering', arg_type=HostsOrdering.__name__, ) cmd.add_element("hosts_ordering", hosts_ordering.value) if alert_ids: if is_list_like(alert_ids): # parse all given alert id's for alert in alert_ids: cmd.add_element("alert", attrs={"id": str(alert)}) if schedule_id: cmd.add_element("schedule", attrs={"id": schedule_id}) if schedule_periods is not None: if (not isinstance(schedule_periods, Integral) or schedule_periods < 0): raise InvalidArgument( "schedule_periods must be an integer greater or equal " "than 0") cmd.add_element("schedule_periods", str(schedule_periods)) if observers is not None: if not is_list_like(observers): raise InvalidArgumentType( function=self.create_task.__name__, argument='observers', arg_type='list', ) # gvmd splits by comma and space # gvmd tries to lookup each value as user name and afterwards as # user id. So both user name and user id are possible cmd.add_element("observers", to_comma_list(observers)) if preferences is not None: if not isinstance(preferences, Mapping): raise InvalidArgumentType( function=self.create_task.__name__, argument='preferences', arg_type=Mapping.__name__, ) _xmlprefs = cmd.add_element("preferences") for pref_name, pref_value in preferences.items(): _xmlpref = _xmlprefs.add_element("preference") _xmlpref.add_element("scanner_name", pref_name) _xmlpref.add_element("value", str(pref_value)) return self._send_xml_command(cmd)