{"action":"created","comment":{"url":"https://api.github.com/repos/carbonblack/bit9platform/pulls/comments/45748362","id":45748362,"diff_hunk":"@@ -0,0 +1,247 @@\n+\"\"\"\n+First off, I'm not a programmer so any issues that you have in running this script in your environment are not my fault!\n+I've borrowed HEAVILY from the script written for VirusTotal so I'm going to leave IN the disclaimer that Bit9 placed on\n+the original script. Hopefully this will indemnify both Bit9 and me from any issues encountered by you if you use this\n+script.\n+\n+If you can find a better way to work any of this, go for it. I'd ask that you update the script in GitHub if you do though.\n+Thanks and enjoy!\n+\n+-Patrick\n+\n+Disclaimer\n++++++++++++++++++++\n+By accessing and/or using the samples scripts provided on this site (the \"Scripts\"), you hereby agree to the following terms:\n+The Scripts are exemplars provided for purposes of illustration only and are not intended to represent specific\n+recommendations or solutions for API integration activities as use cases can vary widely.\n+THE SCRIPTS ARE PROVIDED \"AS IS\" WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED.  BIT9 MAKES NO REPRESENTATION\n+OR OTHER AFFIRMATION OF FACT, INCLUDING BUT NOT LIMITED TO STATEMENTS REGARDING THE SCRIPTS' SUITABILITY FOR USE OR PERFORMANCE.\n+IN NO EVENT SHALL BIT9 BE LIABLE FOR SPECIAL, INCIDENTAL, CONSEQUENTIAL, EXEMPLARY OR OTHER INDIRECT DAMAGES OR FOR DIRECT\n+DAMAGES ARISING OUT OF OR RESULTING FROM YOUR ACCESS OR USE OF THE SCRIPTS, EVEN IF BIT9 IS ADVISED OF OR AWARE OF THE\n+POSSIBILITY OF SUCH DAMAGES.\n+\n+Requirements\n++++++++++++++++++++\n+\n+- Bit9 API client (included) which requires requests Python module\n+\n+- Metascan API Key\n+\n+- Bit9 Platform Server 7.2.1 or later\n+- Bit9 API Token (generated in Bit9 Console)\n+- Bit9 RBAC permission enabled for 'Extend connectors through API'\n+\n+Required python modules can be installed using tools such as easy_install or pip, e.g.\n+    easy_install requests\n+\n+Configuring Connector\n++++++++++++++++++++++++\n+\n+Please update the script with appropriate vt_token, Bit9 server address and Bit9 token at the bottom of the script.\n+\n+\n+Start the script. No parameters are required. It will process analysis requests from teh Bit9 Platform as long as it is running.\n+Script execution can be terminated with ctrl+c.\n+\"\"\"\n+\n+import requests\n+import datetime\n+import sys\n+import bit9api\n+\n+# -------------------------------------------------------------------------------------------------\n+# MS connector class. Initialization where keys are specified is done at the bottom of the script\n+class metascanConnector(object):\n+    def __init__(self, bit9, ms_token=None, download_location=None):\n+        \"\"\" Requires:\n+                server -    URL to the Bit9Platform server.  Usually the same as\n+                            the web GUI.\n+                sslVerify - verify server SSL certificate\n+                token - this is for CLI API interface\n+        \"\"\"\n+\n+        if ms_token is None:\n+            raise TypeError(\"Missing required MetaScan authentication token.\")\n+        #My test system does not require a API token so I'm not adding it to the JSON call\n+        self.ms_token = ms_token\n+        self.ms_url = 'http://yourMetaScanServer/metascan_rest/'\n+        self.bit9 = bit9\n+        self.polling_frequency = 30 # seconds\n+        self.msresults = 0\n+        self.msavtotal = 0\n+\n+        # Global dictionary to track our MS scheduled scans. We need this since it takes MS a while to process results\n+        # and we don't want to keep polling MS too often\n+        # Any pending results will be kept here, together with next polling time\n+        self.scheduledScans = {}\n+        self.download_location = download_location.rstrip(\"\\\\\")\n+\n+    def start(self):\n+        # Register or update our connector (can be done multiple times - will be treated as update on subsequent times)\n+        r = self.bit9.create('v1/connector', {'name': 'MetaScan', 'analysisName': 'MetaScan',\n+                            'connectorVersion': '1.0', 'canAnalyze': 'true', 'analysisEnabled': 'true'})\n+        connectorId = str(r['id'])\n+\n+        # Loop forever (until killed)\n+        while True:\n+            try:\n+                # Check with Bit9 Platform if we have any analysis still pending\n+                for i in self.bit9.retrieve(\"v1/pendingAnalysis\", url_params=\"connectorId=\" + connectorId):\n+                    self.processOneAnalysisRequest(i)\n+            except:\n+                print(sys.exc_info()[0])\n+                print(\"\\n*** Exception processing requests. Will try again in %d seconds.\" % (self.polling_frequency))\n+            # Sleep N seconds, and then all over again\n+            time.sleep(self.polling_frequency)\n+\n+    def uploadFileToMS(self, pa):\n+        isError = False\n+        if self.download_location is not None:\n+            # This is if we want to locally download file from Bit9\n+            # (in the case shared folder is not accessible)\n+            localFilePath = self.download_location + \"\\\\temp.zip\"\n+            self.bit9.retrieve_analyzed_file(pa['id'], localFilePath)\n+        else:\n+            # Easier option, if Bit9 shared folder can be accessed directly\n+            localFilePath = pa['uploadPath']\n+\n+        dataId = None\n+        data = open(localFilePath, 'rb').read()\n+        try:\n+            headers = {'filename':pa['fileName']}\n+            r = requests.post(self.ms_url + \"file\", data=data, headers=headers)\n+            uploadResults = r.json()\n+            if uploadResults.get(\"err\") == 'Failed to upload':\n+                isError = True\n+                print (uploadResults.get(\"err\"))\n+            # we got MS dataId. We will need it to check status of the scan at later time\n+            if isError != True:\n+                data_id = r.json()[\"data_id\"]\n+        except:\n+            isError = True\n+\n+        if isError:\n+            # Report to Bit9 that we had error analyzing this file. This means we will not try analysis again.\n+            pa['analysisStatus'] = 4  # (status: Error)\n+            pa['analysisError'] = 'MetaScan returned error when attempting to send file for scanning'\n+        else:\n+            # Tell Bit9 that we are waiting for the scan to finish\n+            pa['analysisStatus'] = 1 # (status: Analyzing)\n+\n+        # Update Bit9 status for this file\n+        self.bit9.update('v1/pendingAnalysis', pa)\n+        return dataId\n+\n+    def reportResultToBit9(self, fileAnalysisId, scanResults):\n+        # We have results. Create our Bit9 notification\n+        notification = {\n+            'fileAnalysisId': fileAnalysisId,\n+            'product': 'MetaScan',\n+            'malwareName': '',\n+            'malwareType': ''\n+        }\n+        # Enumerate scan results that have detected the issue and build our\n+        # 'malwareName' string for the Bit9 notification\n+        y=scanResults.get(\"scan_results\")\n+        scans = y.get(\"scan_details\", {})\n+        n = 0\n+        for key in scans:\n+            s = scans[key]\n+            if s['scan_result_i']:\n+                if n != 0:\n+                    notification['malwareType'] += '; '\n+                notification['malwareName'] += '; '\n+                notification['malwareType'] += key + ':' + s['threat_found']\n+                notification['malwareName'] += s['threat_found']\n+                n += 1\n+# Let's see if it is malicious. Use some fancy heuristics...\n+        positivesPerc = 100 * n / self.msavtotal\n+        if positivesPerc > 50:\n+            notification['analysisResult'] = 3  # ...malicious\n+            notification['severity'] = 'critical';\n+            notification['type'] = 'malicious_file';\n+        elif positivesPerc > 0:\n+            notification['analysisResult'] = 2  # ...could be malicious\n+            notification['severity'] = 'high';\n+            notification['type'] = 'potential_risk_file';\n+        else:\n+            notification['analysisResult'] = 1  # clean!\n+            notification['severity'] = 'low';\n+            notification['type'] = 'clean_file';\n+        # Send notification\n+        self.bit9.create(\"v1/notification\", notification)\n+        print(\"MS analysis for fileAnalysis %d completed. MS result is %d%% malware (%s). Reporting status: %s\" % (fileAnalysisId, positivesPerc, notification['malwareName'], notification['type']))\n+\n+    def processOneAnalysisRequest(self, pa):\n+        # Use md5 hash if we have one. If not, use Sha256\n+        fileHash = pa['md5'].strip()\n+        if fileHash == '':\n+            fileHash = pa['sha256'].strip()\n+\n+        lastAttempt = None\n+        dataId = None\n+        # Check our cache if we already sent this file for scan\n+        if fileHash in self.scheduledScans.keys():\n+            lastAttempt = self.scheduledScans[fileHash]\n+            # Be polite and don't keep asking MS for status too often. If we already tried recently, bail\n+            if lastAttempt['nextCheck'] > datetime.datetime.now():\n+                return\n+            # Get our dataId we got from MS last time around\n+            print(\"Now attempting to send the data ID\")\n+            dataId = lastAttempt['data_id']\n+            r = requests.get(self.ms_url + \"/file/\" + dataId, params={'':''})\n+            print(\"This is the URL being sent %s\" % (self.ms_url + \"/file/\" + dataId))\n+            print(r)\n+        else:\n+            # we have not asked MS yet. Try with file hash\n+            r = requests.get(self.ms_url + \"/hash/\" + fileHash, params={'':''})\n+\n+        r.raise_for_status()\n+        if r.status_code == 204:\n+            # no results from MS because rate limit was reached. We will try again later.\n+            return\n+\n+        scanResults = r.json()\n+        x=scanResults.get(\"scan_results\",{})\n+        # Check if we got results...\n+        self.msresults=x.get('scan_all_result_i')\n+        self.msavtotal=x.get('total_avs')\n+        if self.msresults is not None:\n+            # Yes, MS has them. Report results and we are done with the file\n+            self.reportResultToBit9(pa['id'], scanResults)\n+            dataId =  None\n+        elif scanResults.get('data_id') is not None:\n+            # MS already knows about the file, but scan is not complete. We got dataId for future reference\n+            dataId = scanResults['data_id'];\n+        elif pa['uploaded'] == 1:\n+            # We have file and now we will upload it to MS\n+            dataId = self.uploadFileToMS(pa)\n+        else:\n+            # if we end here, it means that MS doesn't have file, and Bit9 hasn't uploaded it yet from the agent\n+            # we will come back again in 30 seconds\n+            dataId = None\n+\n+        if dataId is not None:\n+            # Remember dataId since MS wants use to use it for future references to the file\n+            # We will try again in 1 hour\n+            self.scheduledScans[fileHash] = {'fileID': dataId, 'nextCheck': datetime.datetime.now()\n+                                                                      + datetime.timedelta(0, 3600)}\n+\n+# -------------------------------------------------------------------------------------------------\n+# Main body of the script\n+\n+bit9 = bit9api.bit9Api(\n+    \"https://yourbit9serverurl.domain.com\",  # Replace with actual Bit9 server URL\n+    token=\"\",  # Replace with actual Bit9 user token for integration\n+    ssl_verify=False  # Don't validate server's SSL certificate. Set to True unless using self-signed cert on IIS\n+)\n+\n+msConnector = metascanConnector(\n+    bit9,\n+    ms_token='123456',  # Replace with your VT key\n+    download_location= \"C:\\YourDownloadLocation\"  # Replace with actual local file location. If not set,","path":"bit9PlatformAPI/examples/connectors/Metascan.py","position":242,"original_position":242,"commit_id":"abe91a269981fd620e742666e124ef3d8e271894","original_commit_id":"abe91a269981fd620e742666e124ef3d8e271894","user":{"login":"jgarman","id":3229292,"avatar_url":"https://avatars.githubusercontent.com/u/3229292?v=3","gravatar_id":"","url":"https://api.github.com/users/jgarman","html_url":"https://github.com/jgarman","followers_url":"https://api.github.com/users/jgarman/followers","following_url":"https://api.github.com/users/jgarman/following{/other_user}","gists_url":"https://api.github.com/users/jgarman/gists{/gist_id}","starred_url":"https://api.github.com/users/jgarman/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jgarman/subscriptions","organizations_url":"https://api.github.com/users/jgarman/orgs","repos_url":"https://api.github.com/users/jgarman/repos","events_url":"https://api.github.com/users/jgarman/events{/privacy}","received_events_url":"https://api.github.com/users/jgarman/received_events","type":"User","site_admin":false},"body":"For Windows paths you will want to use a Python raw string literal `r\"c:\\YourDownloadLocation\"` so it won't interpret `\"\\X\"` as an escape character. Add `r` before the first quote character.","created_at":"2015-11-24T15:20:57Z","updated_at":"2015-11-24T15:20:57Z","html_url":"https://github.com/carbonblack/bit9platform/pull/4#discussion_r45748362","pull_request_url":"https://api.github.com/repos/carbonblack/bit9platform/pulls/4","_links":{"self":{"href":"https://api.github.com/repos/carbonblack/bit9platform/pulls/comments/45748362"},"html":{"href":"https://github.com/carbonblack/bit9platform/pull/4#discussion_r45748362"},"pull_request":{"href":"https://api.github.com/repos/carbonblack/bit9platform/pulls/4"}}},"pull_request":{"url":"https://api.github.com/repos/carbonblack/bit9platform/pulls/4","id":51591670,"html_url":"https://github.com/carbonblack/bit9platform/pull/4","diff_url":"https://github.com/carbonblack/bit9platform/pull/4.diff","patch_url":"https://github.com/carbonblack/bit9platform/pull/4.patch","issue_url":"https://api.github.com/repos/carbonblack/bit9platform/issues/4","number":4,"state":"open","locked":false,"title":"MetaScanConnector.py","user":{"login":"pmcdonn1","id":12765662,"avatar_url":"https://avatars.githubusercontent.com/u/12765662?v=3","gravatar_id":"","url":"https://api.github.com/users/pmcdonn1","html_url":"https://github.com/pmcdonn1","followers_url":"https://api.github.com/users/pmcdonn1/followers","following_url":"https://api.github.com/users/pmcdonn1/following{/other_user}","gists_url":"https://api.github.com/users/pmcdonn1/gists{/gist_id}","starred_url":"https://api.github.com/users/pmcdonn1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pmcdonn1/subscriptions","organizations_url":"https://api.github.com/users/pmcdonn1/orgs","repos_url":"https://api.github.com/users/pmcdonn1/repos","events_url":"https://api.github.com/users/pmcdonn1/events{/privacy}","received_events_url":"https://api.github.com/users/pmcdonn1/received_events","type":"User","site_admin":false},"body":"This is a script I wrote to send hashes and files to a local MetaScan server. This is heavily borrowed from the VirusTotal script and I'm not really a programmer so if anyone can make it better, please have at it.\r\n-Patrick","created_at":"2015-11-23T22:43:12Z","updated_at":"2015-11-24T15:20:57Z","closed_at":null,"merged_at":null,"merge_commit_sha":"7f27c7ef1faa668754d9e6bd29a1218a937809e4","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/carbonblack/bit9platform/pulls/4/commits","review_comments_url":"https://api.github.com/repos/carbonblack/bit9platform/pulls/4/comments","review_comment_url":"https://api.github.com/repos/carbonblack/bit9platform/pulls/comments{/number}","comments_url":"https://api.github.com/repos/carbonblack/bit9platform/issues/4/comments","statuses_url":"https://api.github.com/repos/carbonblack/bit9platform/statuses/abe91a269981fd620e742666e124ef3d8e271894","head":{"label":"pmcdonn1:patch-1","ref":"patch-1","sha":"abe91a269981fd620e742666e124ef3d8e271894","user":{"login":"pmcdonn1","id":12765662,"avatar_url":"https://avatars.githubusercontent.com/u/12765662?v=3","gravatar_id":"","url":"https://api.github.com/users/pmcdonn1","html_url":"https://github.com/pmcdonn1","followers_url":"https://api.github.com/users/pmcdonn1/followers","following_url":"https://api.github.com/users/pmcdonn1/following{/other_user}","gists_url":"https://api.github.com/users/pmcdonn1/gists{/gist_id}","starred_url":"https://api.github.com/users/pmcdonn1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pmcdonn1/subscriptions","organizations_url":"https://api.github.com/users/pmcdonn1/orgs","repos_url":"https://api.github.com/users/pmcdonn1/repos","events_url":"https://api.github.com/users/pmcdonn1/events{/privacy}","received_events_url":"https://api.github.com/users/pmcdonn1/received_events","type":"User","site_admin":false},"repo":{"id":46072533,"name":"bit9platform","full_name":"pmcdonn1/bit9platform","owner":{"login":"pmcdonn1","id":12765662,"avatar_url":"https://avatars.githubusercontent.com/u/12765662?v=3","gravatar_id":"","url":"https://api.github.com/users/pmcdonn1","html_url":"https://github.com/pmcdonn1","followers_url":"https://api.github.com/users/pmcdonn1/followers","following_url":"https://api.github.com/users/pmcdonn1/following{/other_user}","gists_url":"https://api.github.com/users/pmcdonn1/gists{/gist_id}","starred_url":"https://api.github.com/users/pmcdonn1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pmcdonn1/subscriptions","organizations_url":"https://api.github.com/users/pmcdonn1/orgs","repos_url":"https://api.github.com/users/pmcdonn1/repos","events_url":"https://api.github.com/users/pmcdonn1/events{/privacy}","received_events_url":"https://api.github.com/users/pmcdonn1/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/pmcdonn1/bit9platform","description":"Bit9 Platform","fork":true,"url":"https://api.github.com/repos/pmcdonn1/bit9platform","forks_url":"https://api.github.com/repos/pmcdonn1/bit9platform/forks","keys_url":"https://api.github.com/repos/pmcdonn1/bit9platform/keys{/key_id}","collaborators_url":"https://api.github.com/repos/pmcdonn1/bit9platform/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/pmcdonn1/bit9platform/teams","hooks_url":"https://api.github.com/repos/pmcdonn1/bit9platform/hooks","issue_events_url":"https://api.github.com/repos/pmcdonn1/bit9platform/issues/events{/number}","events_url":"https://api.github.com/repos/pmcdonn1/bit9platform/events","assignees_url":"https://api.github.com/repos/pmcdonn1/bit9platform/assignees{/user}","branches_url":"https://api.github.com/repos/pmcdonn1/bit9platform/branches{/branch}","tags_url":"https://api.github.com/repos/pmcdonn1/bit9platform/tags","blobs_url":"https://api.github.com/repos/pmcdonn1/bit9platform/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/pmcdonn1/bit9platform/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/pmcdonn1/bit9platform/git/refs{/sha}","trees_url":"https://api.github.com/repos/pmcdonn1/bit9platform/git/trees{/sha}","statuses_url":"https://api.github.com/repos/pmcdonn1/bit9platform/statuses/{sha}","languages_url":"https://api.github.com/repos/pmcdonn1/bit9platform/languages","stargazers_url":"https://api.github.com/repos/pmcdonn1/bit9platform/stargazers","contributors_url":"https://api.github.com/repos/pmcdonn1/bit9platform/contributors","subscribers_url":"https://api.github.com/repos/pmcdonn1/bit9platform/subscribers","subscription_url":"https://api.github.com/repos/pmcdonn1/bit9platform/subscription","commits_url":"https://api.github.com/repos/pmcdonn1/bit9platform/commits{/sha}","git_commits_url":"https://api.github.com/repos/pmcdonn1/bit9platform/git/commits{/sha}","comments_url":"https://api.github.com/repos/pmcdonn1/bit9platform/comments{/number}","issue_comment_url":"https://api.github.com/repos/pmcdonn1/bit9platform/issues/comments{/number}","contents_url":"https://api.github.com/repos/pmcdonn1/bit9platform/contents/{+path}","compare_url":"https://api.github.com/repos/pmcdonn1/bit9platform/compare/{base}...{head}","merges_url":"https://api.github.com/repos/pmcdonn1/bit9platform/merges","archive_url":"https://api.github.com/repos/pmcdonn1/bit9platform/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/pmcdonn1/bit9platform/downloads","issues_url":"https://api.github.com/repos/pmcdonn1/bit9platform/issues{/number}","pulls_url":"https://api.github.com/repos/pmcdonn1/bit9platform/pulls{/number}","milestones_url":"https://api.github.com/repos/pmcdonn1/bit9platform/milestones{/number}","notifications_url":"https://api.github.com/repos/pmcdonn1/bit9platform/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/pmcdonn1/bit9platform/labels{/name}","releases_url":"https://api.github.com/repos/pmcdonn1/bit9platform/releases{/id}","created_at":"2015-11-12T18:32:46Z","updated_at":"2015-11-12T18:32:46Z","pushed_at":"2015-11-23T22:42:53Z","git_url":"git://github.com/pmcdonn1/bit9platform.git","ssh_url":"git@github.com:pmcdonn1/bit9platform.git","clone_url":"https://github.com/pmcdonn1/bit9platform.git","svn_url":"https://github.com/pmcdonn1/bit9platform","homepage":null,"size":4737,"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":"carbonblack:master","ref":"master","sha":"40ce4156ad1f797c01cf8e80a2f9e96f83328ae0","user":{"login":"carbonblack","id":2071378,"avatar_url":"https://avatars.githubusercontent.com/u/2071378?v=3","gravatar_id":"","url":"https://api.github.com/users/carbonblack","html_url":"https://github.com/carbonblack","followers_url":"https://api.github.com/users/carbonblack/followers","following_url":"https://api.github.com/users/carbonblack/following{/other_user}","gists_url":"https://api.github.com/users/carbonblack/gists{/gist_id}","starred_url":"https://api.github.com/users/carbonblack/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/carbonblack/subscriptions","organizations_url":"https://api.github.com/users/carbonblack/orgs","repos_url":"https://api.github.com/users/carbonblack/repos","events_url":"https://api.github.com/users/carbonblack/events{/privacy}","received_events_url":"https://api.github.com/users/carbonblack/received_events","type":"Organization","site_admin":false},"repo":{"id":30942437,"name":"bit9platform","full_name":"carbonblack/bit9platform","owner":{"login":"carbonblack","id":2071378,"avatar_url":"https://avatars.githubusercontent.com/u/2071378?v=3","gravatar_id":"","url":"https://api.github.com/users/carbonblack","html_url":"https://github.com/carbonblack","followers_url":"https://api.github.com/users/carbonblack/followers","following_url":"https://api.github.com/users/carbonblack/following{/other_user}","gists_url":"https://api.github.com/users/carbonblack/gists{/gist_id}","starred_url":"https://api.github.com/users/carbonblack/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/carbonblack/subscriptions","organizations_url":"https://api.github.com/users/carbonblack/orgs","repos_url":"https://api.github.com/users/carbonblack/repos","events_url":"https://api.github.com/users/carbonblack/events{/privacy}","received_events_url":"https://api.github.com/users/carbonblack/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/carbonblack/bit9platform","description":"Bit9 Platform","fork":false,"url":"https://api.github.com/repos/carbonblack/bit9platform","forks_url":"https://api.github.com/repos/carbonblack/bit9platform/forks","keys_url":"https://api.github.com/repos/carbonblack/bit9platform/keys{/key_id}","collaborators_url":"https://api.github.com/repos/carbonblack/bit9platform/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/carbonblack/bit9platform/teams","hooks_url":"https://api.github.com/repos/carbonblack/bit9platform/hooks","issue_events_url":"https://api.github.com/repos/carbonblack/bit9platform/issues/events{/number}","events_url":"https://api.github.com/repos/carbonblack/bit9platform/events","assignees_url":"https://api.github.com/repos/carbonblack/bit9platform/assignees{/user}","branches_url":"https://api.github.com/repos/carbonblack/bit9platform/branches{/branch}","tags_url":"https://api.github.com/repos/carbonblack/bit9platform/tags","blobs_url":"https://api.github.com/repos/carbonblack/bit9platform/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/carbonblack/bit9platform/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/carbonblack/bit9platform/git/refs{/sha}","trees_url":"https://api.github.com/repos/carbonblack/bit9platform/git/trees{/sha}","statuses_url":"https://api.github.com/repos/carbonblack/bit9platform/statuses/{sha}","languages_url":"https://api.github.com/repos/carbonblack/bit9platform/languages","stargazers_url":"https://api.github.com/repos/carbonblack/bit9platform/stargazers","contributors_url":"https://api.github.com/repos/carbonblack/bit9platform/contributors","subscribers_url":"https://api.github.com/repos/carbonblack/bit9platform/subscribers","subscription_url":"https://api.github.com/repos/carbonblack/bit9platform/subscription","commits_url":"https://api.github.com/repos/carbonblack/bit9platform/commits{/sha}","git_commits_url":"https://api.github.com/repos/carbonblack/bit9platform/git/commits{/sha}","comments_url":"https://api.github.com/repos/carbonblack/bit9platform/comments{/number}","issue_comment_url":"https://api.github.com/repos/carbonblack/bit9platform/issues/comments{/number}","contents_url":"https://api.github.com/repos/carbonblack/bit9platform/contents/{+path}","compare_url":"https://api.github.com/repos/carbonblack/bit9platform/compare/{base}...{head}","merges_url":"https://api.github.com/repos/carbonblack/bit9platform/merges","archive_url":"https://api.github.com/repos/carbonblack/bit9platform/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/carbonblack/bit9platform/downloads","issues_url":"https://api.github.com/repos/carbonblack/bit9platform/issues{/number}","pulls_url":"https://api.github.com/repos/carbonblack/bit9platform/pulls{/number}","milestones_url":"https://api.github.com/repos/carbonblack/bit9platform/milestones{/number}","notifications_url":"https://api.github.com/repos/carbonblack/bit9platform/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/carbonblack/bit9platform/labels{/name}","releases_url":"https://api.github.com/repos/carbonblack/bit9platform/releases{/id}","created_at":"2015-02-17T23:00:03Z","updated_at":"2015-09-15T17:54:19Z","pushed_at":"2015-11-24T00:18:08Z","git_url":"git://github.com/carbonblack/bit9platform.git","ssh_url":"git@github.com:carbonblack/bit9platform.git","clone_url":"https://github.com/carbonblack/bit9platform.git","svn_url":"https://github.com/carbonblack/bit9platform","homepage":null,"size":4883,"stargazers_count":9,"watchers_count":9,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":8,"mirror_url":null,"open_issues_count":2,"forks":8,"open_issues":2,"watchers":9,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/carbonblack/bit9platform/pulls/4"},"html":{"href":"https://github.com/carbonblack/bit9platform/pull/4"},"issue":{"href":"https://api.github.com/repos/carbonblack/bit9platform/issues/4"},"comments":{"href":"https://api.github.com/repos/carbonblack/bit9platform/issues/4/comments"},"review_comments":{"href":"https://api.github.com/repos/carbonblack/bit9platform/pulls/4/comments"},"review_comment":{"href":"https://api.github.com/repos/carbonblack/bit9platform/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/carbonblack/bit9platform/pulls/4/commits"},"statuses":{"href":"https://api.github.com/repos/carbonblack/bit9platform/statuses/abe91a269981fd620e742666e124ef3d8e271894"}}}}