{"action":"created","comment":{"url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/pulls/comments/89395412","pull_request_review_id":9939438,"id":89395412,"diff_hunk":"@@ -1,492 +0,0 @@\n-#!/usr/bin/python\n-# -*- coding: utf-8 -*-\n-\n-#\n-# Collection of crawlers that extract specific types of features from\n-# the host machine. This code is portable across OS platforms (Linux, Windows)\n-#\n-\n-\n-import logging\n-import time\n-import signal\n-from ctypes import CDLL\n-import uuid\n-import psutil\n-from mesos import snapshot_crawler_mesos_frame\n-\n-try:\n-    libc = CDLL('libc.so.6')\n-except Exception as e:\n-    libc = None\n-\n-\n-# External dependencies that must be pip install'ed separately\n-\n-from emitter import Emitter\n-from containers import get_filtered_list_of_containers\n-import misc\n-from crawlmodes import Modes\n-import plugins_manager\n-\n-logger = logging.getLogger('crawlutils')\n-\n-\n-\"\"\"\n-This flag is checked at each iteration of the main crawling loop, and while\n-crawling all features for a specific system (container or local system).\n-\"\"\"\n-should_exit = False\n-\n-\n-def signal_handler_exit(signum, stack):\n-    global should_exit\n-    logger.info('Got signal to exit ..')\n-    should_exit = True\n-\n-\n-def snapshot_generic(\n-    crawlmode=Modes.INVM,\n-    urls=['stdout://'],\n-    snapshot_num=0,\n-    features=['os'],\n-    compress=False,\n-    options={},\n-    format='csv',\n-    namespace='',\n-    ignore_exceptions=True\n-):\n-\n-    metadata = {\n-        'namespace': namespace,\n-        'features': ','.join(map(str, features)),\n-        'timestamp': int(time.time()),\n-        'system_type': 'vm',\n-        'compress': compress,\n-    }\n-\n-    output_urls = [('{0}.{1}'.format(u, snapshot_num)\n-                    if u.startswith('file:') else u) for u in urls]\n-\n-    host_crawl_plugins = plugins_manager.get_host_crawl_plugins(features)\n-\n-    with Emitter(\n-        urls=output_urls,\n-        emitter_args=metadata,\n-        format=format,\n-    ) as emitter:\n-        for (plugin_obj, plugin_args) in host_crawl_plugins:\n-            try:\n-                if should_exit:\n-                    break\n-                for (key, val, feature_type) in plugin_obj.crawl(\n-                        **plugin_args):\n-                    emitter.emit(key, val, feature_type)\n-            except Exception as exc:\n-                logger.exception(exc)\n-                if not ignore_exceptions:\n-                    raise exc\n-\n-\n-def snapshot_mesos(\n-    crawlmode=Modes.MESOS,\n-    urls=['stdout://'],\n-    snapshot_num=0,\n-    features=[],\n-    compress=False,\n-    options={},\n-    format='csv',\n-    namespace='',\n-    ignore_exceptions=True,\n-):\n-    metadata = {\n-        'namespace': namespace,\n-        'timestamp': int(time.time()),\n-        'system_type': 'mesos',\n-        'compress': compress,\n-    }\n-\n-    output_urls = [('{0}.{1}'.format(u, snapshot_num)\n-                    if u.startswith('file:') else u) for u in urls]\n-\n-    with Emitter(\n-        urls=output_urls,\n-        emitter_args=metadata,\n-        format=format,\n-    ) as emitter:\n-        frame = snapshot_crawler_mesos_frame()\n-        emitter.emit('mesos', frame)\n-\n-\n-def sanitize_vm_list(vm_list):\n-\n-    _vm_list = []\n-    for vm_desc in vm_list:\n-        vm_name, vm_kernel, vm_distro, vm_arch = vm_desc.split(',')\n-\n-        for proc in psutil.process_iter():\n-            if 'qemu' in proc.name():\n-                line = proc.cmdline()\n-                if vm_name == line[line.index('-name') + 1]:\n-                    vm = (\n-                        vm_name, str(proc.pid), vm_kernel, vm_distro, vm_arch)\n-                    _vm_list.append(vm)\n-                    found_qemu_pid = True\n-\n-        if found_qemu_pid is False:\n-            raise ValueError('no VM with vm_name: %s' % vm_name)\n-\n-    return _vm_list\n-\n-\n-def reformat_output_urls(urls, name, snapshot_num):\n-    \"\"\"\n-    Reformat output URLs to include the snapshot_num and the system name\n-    \"\"\"\n-    output_urls = []\n-    for url in urls:\n-        if url.startswith('file:'):\n-            file_suffix = ''\n-            file_suffix = '{0}.{1}'.format(name, snapshot_num)\n-            output_urls.append('{0}.{1}'.format(url, file_suffix))\n-        else:\n-            output_urls.append(url)\n-    return output_urls\n-\n-\n-def snapshot_vms(\n-    urls=['stdout://'],\n-    snapshot_num=0,\n-    features=['os'],\n-    compress=False,\n-    options={},\n-    format='csv',\n-    namespace='',\n-    ignore_exceptions=True\n-):\n-\n-    # Default will become ALL from None, when auto kernel detection\n-    # gets merged\n-    vm_list = options.get('vm_list', None)\n-\n-    if vm_list is None:\n-        raise ValueError('need list of VMs (with descriptors) to crawl!')\n-        # When None gets changed to ALL, this will not be raised\n-\n-    # convert VM descriptor for each VM to\n-    # (vm_name, qemu_pid, kernel_version_long, distro, arch)\n-    # from input type: 'vm_name, kernel_version_long, distro, arch'\n-    vm_list = sanitize_vm_list(vm_list)\n-\n-    for vm in vm_list:\n-        vm_name = vm[0]\n-        vm = vm[1:]\n-\n-        metadata = {\n-            'namespace': namespace,\n-            'features': ','.join(map(str, features)),\n-            'timestamp': int(time.time()),\n-            'system_type': 'vm',\n-            'compress': compress,\n-        }\n-\n-        output_urls = reformat_output_urls(urls, vm_name, snapshot_num)\n-\n-        vm_crawl_plugins = plugins_manager.get_vm_crawl_plugins(features)\n-\n-        with Emitter(\n-            urls=output_urls,\n-            emitter_args=metadata,\n-            format=format,\n-        ) as emitter:\n-            for (plugin_obj, plugin_args) in vm_crawl_plugins:\n-                try:\n-                    if should_exit:\n-                        break\n-                    for (key, val, feature_type) in plugin_obj.crawl(\n-                            vm_desc=vm, **plugin_args):\n-                        emitter.emit(key, val, feature_type)\n-                except Exception as exc:\n-                    logger.exception(exc)\n-                    if not ignore_exceptions:\n-                        raise exc\n-\n-\n-def snapshot_container(\n-    urls=['stdout://'],\n-    snapshot_num=0,\n-    features=['os'],\n-    compress=False,\n-    options={},\n-    format='csv',\n-    container=None,\n-    ignore_exceptions=True\n-):\n-    global should_exit\n-\n-    if not container:\n-        raise ValueError('snapshot_container can only be called with a '\n-                         'container object already initialized.')\n-\n-    metadata = options.get('metadata', {})\n-    extra_metadata = metadata.get('extra_metadata', {})\n-    extra_metadata_for_all = metadata.get('extra_metadata_for_all', False)\n-\n-    metadata = {\n-        'namespace': container.namespace,\n-        'system_type': 'container',\n-        'features': ','.join(map(str, features)),\n-        'timestamp': int(time.time()),\n-        'compress': compress,\n-        'container_long_id': container.long_id,\n-        'container_name': container.name,\n-        'container_image': container.image,\n-        'extra': extra_metadata,\n-        'extra_all_features': extra_metadata_for_all,\n-        'uuid': str(uuid.uuid4())\n-    }\n-\n-    if container.is_docker_container():\n-        metadata['owner_namespace'] = container.owner_namespace\n-        metadata['docker_image_long_name'] = container.docker_image_long_name\n-        metadata['docker_image_short_name'] = container.docker_image_short_name\n-        metadata['docker_image_tag'] = container.docker_image_tag\n-        metadata['docker_image_registry'] = container.docker_image_registry\n-\n-    output_urls = reformat_output_urls(urls, container.short_id, snapshot_num)\n-\n-    container_crawl_plugins = plugins_manager.get_container_crawl_plugins(\n-        features=features)\n-\n-    with Emitter(\n-        urls=output_urls,\n-        emitter_args=metadata,\n-        format=format,\n-    ) as emitter:\n-        for (plugin_obj, plugin_args) in container_crawl_plugins:\n-            try:\n-                if should_exit:\n-                    break\n-                for (key, val, typ) in plugin_obj.crawl(\n-                        container_id=container.long_id, **plugin_args):\n-                    emitter.emit(key, val, typ)\n-            except Exception as exc:\n-                logger.exception(exc)\n-                if not ignore_exceptions:\n-                    raise exc\n-\n-\n-def snapshot_containers(\n-    containers,\n-    urls=['stdout://'],\n-    snapshot_num=0,\n-    features=['os'],\n-    compress=False,\n-    environment='cloudsight',\n-    options={},\n-    format='csv',\n-    ignore_exceptions=True,\n-    host_namespace='',\n-    link_log_files=False\n-):\n-\n-    user_list = options.get('docker_containers_list', 'ALL')\n-    partition_strategy = options.get('partition_strategy', {})\n-\n-    curr_containers = get_filtered_list_of_containers(\n-        environment=environment,\n-        user_list=user_list,\n-        partition_strategy=partition_strategy,\n-        host_namespace=host_namespace)\n-    deleted = [c for c in containers if c not in curr_containers]\n-    containers = curr_containers\n-\n-    for container in deleted:\n-        if link_log_files:\n-            try:\n-                container.unlink_logfiles()\n-            except NotImplementedError:\n-                pass\n-\n-    logger.debug('Crawling %d containers' % (len(containers)))\n-\n-    for container in containers:\n-\n-        logger.info(\n-            'Crawling container %s %s %s' %\n-            (container.pid, container.short_id, container.namespace))\n-\n-        if link_log_files:\n-            # This is a NOP if files are already linked (which is\n-            # pretty much always).\n-            try:\n-                container.link_logfiles()\n-            except NotImplementedError:\n-                pass\n-\n-        # no feature crawling\n-        if 'nofeatures' in features:\n-            continue\n-        snapshot_container(\n-            urls=urls,\n-            snapshot_num=snapshot_num,\n-            features=features,\n-            compress=compress,\n-            options=options,\n-            format=format,\n-            container=container,\n-        )\n-    return containers\n-\n-\n-def _get_next_iteration_time(next_iteration_time, frequency, snapshot_time):\n-    if frequency == 0:\n-        return (0, 0)\n-\n-    if next_iteration_time is None:\n-        next_iteration_time = snapshot_time + frequency\n-    else:\n-        next_iteration_time = next_iteration_time + frequency\n-\n-    while next_iteration_time + frequency < time.time():\n-        next_iteration_time = next_iteration_time + frequency\n-\n-    time_to_sleep = next_iteration_time - time.time()\n-    return (time_to_sleep, next_iteration_time)\n-\n-\n-def load_plugins(\n-    features=['os', 'cpu'],\n-    options={}\n-):\n-    plugins_manager.reload_env_plugin(options=options)\n-\n-    plugins_manager.reload_container_crawl_plugins(\n-        features=features,\n-        options=options)\n-\n-    plugins_manager.reload_vm_crawl_plugins(\n-        features=features,\n-        options=options)\n-\n-    plugins_manager.reload_host_crawl_plugins(\n-        features=features,\n-        options=options)\n-\n-\n-def snapshot(\n-    urls=['stdout://'],\n-    namespace=misc.get_host_ipaddr(),\n-    features=['os', 'cpu'],\n-    options={},\n-    frequency=-1,\n-    crawlmode=Modes.INVM,\n-    format='csv',\n-    first_snapshot_num=0,\n-    max_snapshots=-1\n-):\n-    \"\"\"Entrypoint for crawler functionality.\n-\n-    This is the function executed by long running crawler processes. It just\n-    loops sleeping for `frequency` seconds at each crawl interval.  During each\n-    interval, it collects the features listed in `features`, and sends them to\n-    the outputs listed in `urls`.\n-\n-    :param urls: The url used as the output of the snapshot.\n-    :param namespace: This a pointer to a specific system (e.g. IP for INVM).\n-    :param features: List of features to crawl.\n-    :param options: Tree of options with details like what config files.\n-    :param frequency: Target time period for iterations. -1 means just one run.\n-    :param crawlmode: What's the system we want to crawl.\n-    :param format: The format of the frame, defaults to csv.\n-    \"\"\"\n-\n-    global should_exit\n-    saved_args = locals()\n-    logger.debug('snapshot args: %s' % (saved_args))\n-\n-    compress = False\n-    environment = options.get('environment', 'cloudsight')\n-\n-    load_plugins(features, options)\n-\n-    next_iteration_time = None\n-\n-    snapshot_num = first_snapshot_num\n-\n-    # Die if the parent dies\n-    PR_SET_PDEATHSIG = 1\n-    try:\n-        libc.prctl(PR_SET_PDEATHSIG, signal.SIGHUP)\n-        signal.signal(signal.SIGHUP, signal_handler_exit)\n-    except AttributeError:\n-        logger.warning('prctl is not available. MacOS is not supported.')\n-\n-    containers = []\n-\n-    # This is the main loop of the system, taking a snapshot and sleeping at\n-    # every iteration.\n-\n-    while True:\n-\n-        snapshot_time = int(time.time())\n-\n-        if crawlmode == Modes.OUTCONTAINER:\n-            containers = snapshot_containers(\n-                containers=containers,\n-                urls=urls,\n-                snapshot_num=snapshot_num,\n-                features=features,\n-                compress=compress,\n-                environment=environment,\n-                options=options,\n-                format=format,\n-                host_namespace=namespace,\n-                link_log_files=options.get('link_container_log_files', False)\n-            )\n-        elif crawlmode == Modes.MESOS:\n-            snapshot_mesos(\n-                crawlmode=crawlmode,\n-                urls=urls,\n-                snapshot_num=snapshot_num,\n-                compress=compress,\n-                options=options,\n-                format=format,\n-                namespace=namespace,\n-            )\n-        elif crawlmode == Modes.OUTVM:\n-            snapshot_vms(\n-                urls=urls,\n-                snapshot_num=snapshot_num,\n-                features=features,\n-                compress=compress,\n-                options=options,\n-                format=format,\n-                namespace=namespace\n-            )\n-        elif crawlmode in [Modes.INVM, Modes.MOUNTPOINT]:\n-            snapshot_generic(\n-                crawlmode=crawlmode,\n-                urls=urls,\n-                snapshot_num=snapshot_num,\n-                features=features,\n-                compress=compress,\n-                options=options,\n-                format=format,\n-                namespace=namespace\n-            )\n-        else:\n-            raise NotImplementedError('Crawl mode %s is not implemented' %\n-                                      crawlmode)\n-\n-        # Frequency < 0 means only one run.\n-        if (frequency < 0 or should_exit or snapshot_num == max_snapshots):\n-            logger.info('Bye')\n-            break\n-\n-        time_to_sleep, next_iteration_time = _get_next_iteration_time(\n-            next_iteration_time, frequency, snapshot_time)\n-        if time_to_sleep > 0:\n-            time.sleep(time_to_sleep)\n-\n-        snapshot_num += 1","path":"crawler/crawlutils.py","position":492,"original_position":492,"commit_id":"434f30511f82f5ec0746954a38f27735bbecb0c4","original_commit_id":"434f30511f82f5ec0746954a38f27735bbecb0c4","user":{"login":"sahilsuneja1","id":6835847,"avatar_url":"https://avatars.githubusercontent.com/u/6835847?v=3","gravatar_id":"","url":"https://api.github.com/users/sahilsuneja1","html_url":"https://github.com/sahilsuneja1","followers_url":"https://api.github.com/users/sahilsuneja1/followers","following_url":"https://api.github.com/users/sahilsuneja1/following{/other_user}","gists_url":"https://api.github.com/users/sahilsuneja1/gists{/gist_id}","starred_url":"https://api.github.com/users/sahilsuneja1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sahilsuneja1/subscriptions","organizations_url":"https://api.github.com/users/sahilsuneja1/orgs","repos_url":"https://api.github.com/users/sahilsuneja1/repos","events_url":"https://api.github.com/users/sahilsuneja1/events{/privacy}","received_events_url":"https://api.github.com/users/sahilsuneja1/received_events","type":"User","site_admin":false},"body":"did you smile or sighed?  ;)","created_at":"2016-11-23T20:39:10Z","updated_at":"2016-11-23T20:58:17Z","html_url":"https://github.com/cloudviz/agentless-system-crawler/pull/200#discussion_r89395412","pull_request_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/pulls/200","_links":{"self":{"href":"https://api.github.com/repos/cloudviz/agentless-system-crawler/pulls/comments/89395412"},"html":{"href":"https://github.com/cloudviz/agentless-system-crawler/pull/200#discussion_r89395412"},"pull_request":{"href":"https://api.github.com/repos/cloudviz/agentless-system-crawler/pulls/200"}}},"pull_request":{"url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/pulls/200","id":94628771,"html_url":"https://github.com/cloudviz/agentless-system-crawler/pull/200","diff_url":"https://github.com/cloudviz/agentless-system-crawler/pull/200.diff","patch_url":"https://github.com/cloudviz/agentless-system-crawler/pull/200.patch","issue_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/issues/200","number":200,"state":"open","locked":false,"title":"Work in progress: Cleanup of crawler.py and getting rid of crawlutils.py in favor of pretty objects","user":{"login":"ricarkol","id":11448949,"avatar_url":"https://avatars.githubusercontent.com/u/11448949?v=3","gravatar_id":"","url":"https://api.github.com/users/ricarkol","html_url":"https://github.com/ricarkol","followers_url":"https://api.github.com/users/ricarkol/followers","following_url":"https://api.github.com/users/ricarkol/following{/other_user}","gists_url":"https://api.github.com/users/ricarkol/gists{/gist_id}","starred_url":"https://api.github.com/users/ricarkol/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ricarkol/subscriptions","organizations_url":"https://api.github.com/users/ricarkol/orgs","repos_url":"https://api.github.com/users/ricarkol/repos","events_url":"https://api.github.com/users/ricarkol/events{/privacy}","received_events_url":"https://api.github.com/users/ricarkol/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-11-21T14:48:46Z","updated_at":"2016-11-23T20:58:17Z","closed_at":null,"merged_at":null,"merge_commit_sha":"440fec1c331f2136f3ed2cc2ed0fe31f537a7c9c","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/pulls/200/commits","review_comments_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/pulls/200/comments","review_comment_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/pulls/comments{/number}","comments_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/issues/200/comments","statuses_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/statuses/434f30511f82f5ec0746954a38f27735bbecb0c4","head":{"label":"ricarkol:clean","ref":"clean","sha":"434f30511f82f5ec0746954a38f27735bbecb0c4","user":{"login":"ricarkol","id":11448949,"avatar_url":"https://avatars.githubusercontent.com/u/11448949?v=3","gravatar_id":"","url":"https://api.github.com/users/ricarkol","html_url":"https://github.com/ricarkol","followers_url":"https://api.github.com/users/ricarkol/followers","following_url":"https://api.github.com/users/ricarkol/following{/other_user}","gists_url":"https://api.github.com/users/ricarkol/gists{/gist_id}","starred_url":"https://api.github.com/users/ricarkol/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ricarkol/subscriptions","organizations_url":"https://api.github.com/users/ricarkol/orgs","repos_url":"https://api.github.com/users/ricarkol/repos","events_url":"https://api.github.com/users/ricarkol/events{/privacy}","received_events_url":"https://api.github.com/users/ricarkol/received_events","type":"User","site_admin":false},"repo":{"id":48145424,"name":"agentless-system-crawler","full_name":"ricarkol/agentless-system-crawler","owner":{"login":"ricarkol","id":11448949,"avatar_url":"https://avatars.githubusercontent.com/u/11448949?v=3","gravatar_id":"","url":"https://api.github.com/users/ricarkol","html_url":"https://github.com/ricarkol","followers_url":"https://api.github.com/users/ricarkol/followers","following_url":"https://api.github.com/users/ricarkol/following{/other_user}","gists_url":"https://api.github.com/users/ricarkol/gists{/gist_id}","starred_url":"https://api.github.com/users/ricarkol/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ricarkol/subscriptions","organizations_url":"https://api.github.com/users/ricarkol/orgs","repos_url":"https://api.github.com/users/ricarkol/repos","events_url":"https://api.github.com/users/ricarkol/events{/privacy}","received_events_url":"https://api.github.com/users/ricarkol/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ricarkol/agentless-system-crawler","description":null,"fork":true,"url":"https://api.github.com/repos/ricarkol/agentless-system-crawler","forks_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/forks","keys_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/teams","hooks_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/hooks","issue_events_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/issues/events{/number}","events_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/events","assignees_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/assignees{/user}","branches_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/branches{/branch}","tags_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/tags","blobs_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/git/refs{/sha}","trees_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/statuses/{sha}","languages_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/languages","stargazers_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/stargazers","contributors_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/contributors","subscribers_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/subscribers","subscription_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/subscription","commits_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/commits{/sha}","git_commits_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/git/commits{/sha}","comments_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/comments{/number}","issue_comment_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/issues/comments{/number}","contents_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/contents/{+path}","compare_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/merges","archive_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/downloads","issues_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/issues{/number}","pulls_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/pulls{/number}","milestones_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/milestones{/number}","notifications_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/labels{/name}","releases_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/releases{/id}","deployments_url":"https://api.github.com/repos/ricarkol/agentless-system-crawler/deployments","created_at":"2015-12-17T01:39:39Z","updated_at":"2016-03-28T14:33:08Z","pushed_at":"2016-11-21T21:33:11Z","git_url":"git://github.com/ricarkol/agentless-system-crawler.git","ssh_url":"git@github.com:ricarkol/agentless-system-crawler.git","clone_url":"https://github.com/ricarkol/agentless-system-crawler.git","svn_url":"https://github.com/ricarkol/agentless-system-crawler","homepage":null,"size":12724,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"cloudviz:master","ref":"master","sha":"d9c6e5d47b861fcd1b38551e2d300e73a553214c","user":{"login":"cloudviz","id":13337905,"avatar_url":"https://avatars.githubusercontent.com/u/13337905?v=3","gravatar_id":"","url":"https://api.github.com/users/cloudviz","html_url":"https://github.com/cloudviz","followers_url":"https://api.github.com/users/cloudviz/followers","following_url":"https://api.github.com/users/cloudviz/following{/other_user}","gists_url":"https://api.github.com/users/cloudviz/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudviz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudviz/subscriptions","organizations_url":"https://api.github.com/users/cloudviz/orgs","repos_url":"https://api.github.com/users/cloudviz/repos","events_url":"https://api.github.com/users/cloudviz/events{/privacy}","received_events_url":"https://api.github.com/users/cloudviz/received_events","type":"Organization","site_admin":false},"repo":{"id":39209164,"name":"agentless-system-crawler","full_name":"cloudviz/agentless-system-crawler","owner":{"login":"cloudviz","id":13337905,"avatar_url":"https://avatars.githubusercontent.com/u/13337905?v=3","gravatar_id":"","url":"https://api.github.com/users/cloudviz","html_url":"https://github.com/cloudviz","followers_url":"https://api.github.com/users/cloudviz/followers","following_url":"https://api.github.com/users/cloudviz/following{/other_user}","gists_url":"https://api.github.com/users/cloudviz/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudviz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudviz/subscriptions","organizations_url":"https://api.github.com/users/cloudviz/orgs","repos_url":"https://api.github.com/users/cloudviz/repos","events_url":"https://api.github.com/users/cloudviz/events{/privacy}","received_events_url":"https://api.github.com/users/cloudviz/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/cloudviz/agentless-system-crawler","description":"A tool to crawl systems like crawlers for the web","fork":false,"url":"https://api.github.com/repos/cloudviz/agentless-system-crawler","forks_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/forks","keys_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/keys{/key_id}","collaborators_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/teams","hooks_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/hooks","issue_events_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/issues/events{/number}","events_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/events","assignees_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/assignees{/user}","branches_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/branches{/branch}","tags_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/tags","blobs_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/git/refs{/sha}","trees_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/git/trees{/sha}","statuses_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/statuses/{sha}","languages_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/languages","stargazers_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/stargazers","contributors_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/contributors","subscribers_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/subscribers","subscription_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/subscription","commits_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/commits{/sha}","git_commits_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/git/commits{/sha}","comments_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/comments{/number}","issue_comment_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/issues/comments{/number}","contents_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/contents/{+path}","compare_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/compare/{base}...{head}","merges_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/merges","archive_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/downloads","issues_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/issues{/number}","pulls_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/pulls{/number}","milestones_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/milestones{/number}","notifications_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/labels{/name}","releases_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/releases{/id}","deployments_url":"https://api.github.com/repos/cloudviz/agentless-system-crawler/deployments","created_at":"2015-07-16T16:51:58Z","updated_at":"2016-11-21T12:40:44Z","pushed_at":"2016-11-21T21:33:11Z","git_url":"git://github.com/cloudviz/agentless-system-crawler.git","ssh_url":"git@github.com:cloudviz/agentless-system-crawler.git","clone_url":"https://github.com/cloudviz/agentless-system-crawler.git","svn_url":"https://github.com/cloudviz/agentless-system-crawler","homepage":"","size":3511,"stargazers_count":48,"watchers_count":48,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":30,"mirror_url":null,"open_issues_count":25,"forks":30,"open_issues":25,"watchers":48,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/cloudviz/agentless-system-crawler/pulls/200"},"html":{"href":"https://github.com/cloudviz/agentless-system-crawler/pull/200"},"issue":{"href":"https://api.github.com/repos/cloudviz/agentless-system-crawler/issues/200"},"comments":{"href":"https://api.github.com/repos/cloudviz/agentless-system-crawler/issues/200/comments"},"review_comments":{"href":"https://api.github.com/repos/cloudviz/agentless-system-crawler/pulls/200/comments"},"review_comment":{"href":"https://api.github.com/repos/cloudviz/agentless-system-crawler/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/cloudviz/agentless-system-crawler/pulls/200/commits"},"statuses":{"href":"https://api.github.com/repos/cloudviz/agentless-system-crawler/statuses/434f30511f82f5ec0746954a38f27735bbecb0c4"}}}}
{"actor":{"display_login":"sahilsuneja1"}}