%PDF- %PDF-
Direktori : /proc/thread-self/root/usr/lib/python2.7/site-packages/salt/roster/ |
Current File : //proc/thread-self/root/usr/lib/python2.7/site-packages/salt/roster/scan.py |
# -*- coding: utf-8 -*- ''' Scan a netmask or ipaddr for open ssh ports ''' # Import python libs from __future__ import absolute_import, print_function, unicode_literals import socket import logging import copy # Import salt libs import salt.utils.network from salt._compat import ipaddress from salt.ext import six # Import 3rd-party libs from salt.ext.six.moves import map # pylint: disable=import-error,redefined-builtin log = logging.getLogger(__name__) def targets(tgt, tgt_type='glob', **kwargs): ''' Return the targets from the flat yaml file, checks opts for location but defaults to /etc/salt/roster ''' rmatcher = RosterMatcher(tgt, tgt_type) return rmatcher.targets() class RosterMatcher(object): ''' Matcher for the roster data structure ''' def __init__(self, tgt, tgt_type): self.tgt = tgt self.tgt_type = tgt_type def targets(self): ''' Return ip addrs based on netmask, sitting in the "glob" spot because it is the default ''' addrs = () ret = {} ports = __opts__['ssh_scan_ports'] if not isinstance(ports, list): # Comma-separate list of integers ports = list(map(int, six.text_type(ports).split(','))) try: addrs = [ipaddress.ip_address(self.tgt)] except ValueError: try: addrs = ipaddress.ip_network(self.tgt).hosts() except ValueError: pass for addr in addrs: addr = six.text_type(addr) ret[addr] = copy.deepcopy(__opts__.get('roster_defaults', {})) log.trace('Scanning host: %s', addr) for port in ports: log.trace('Scanning port: %s', port) try: sock = salt.utils.network.get_socket(addr, socket.SOCK_STREAM) sock.settimeout(float(__opts__['ssh_scan_timeout'])) sock.connect((addr, port)) sock.shutdown(socket.SHUT_RDWR) sock.close() ret[addr].update({'host': addr, 'port': port}) except socket.error: pass return ret