{"action":"created","comment":{"url":"https://api.github.com/repos/hhru/ssl-cert-check/pulls/comments/70067195","id":70067195,"diff_hunk":"@@ -0,0 +1,325 @@\n+#!/usr/bin/env python\n+# encoding: utf-8\n+from __future__ import unicode_literals, print_function\n+import sys\n+import argparse\n+import os\n+import subprocess\n+from collections import namedtuple\n+import datetime\n+import smtplib\n+import socket\n+from email.mime.text import MIMEText\n+\n+RETURN_CODE_OK = 0\n+RETURN_CODE_WRONG_PARAMS = 1\n+RETURN_CODE_WARNING = 2\n+\n+\n+def to_bytes(value):\n+    if isinstance(value, unicode):\n+        return value.encode(encoding='utf-8')\n+    elif isinstance(value, str):\n+        return value\n+    else:\n+        return str(value)\n+\n+\n+def warning(message):\n+    sys.stderr.write(message + '\\n')\n+\n+\n+info = print\n+\n+\n+class EmailReporter(object):\n+\n+    def __init__(self):\n+        self._info = []\n+\n+    def add_additional_info(self, content):\n+        self._info.append(content)\n+\n+    def send(self, to):\n+        subject = 'Warn! Certificate has expired or is about to expire'\n+        msg = MIMEText('\\n'.join(self._info), _charset=\"utf-8\")\n+\n+        hostname = socket.gethostname()\n+        me = '{}@{}'.format(os.getlogin(), hostname)\n+\n+        msg[b'Subject'] = subject\n+        msg[b'From'] = me\n+        msg[b'To'] = to\n+        msg[b'list-id'] = b'certificates warnings <certificates-warnings.{}>'.format(hostname)\n+\n+        s = smtplib.SMTP(b'localhost')  # TODO: additional smtp settings\n+        s.sendmail(me, [to], msg.as_string())\n+        s.quit()\n+\n+\n+def is_executable_found(bin):\n+\n+    def _is_exe(file_path):\n+        return os.path.isfile(file_path) and os.access(file_path, os.X_OK)\n+\n+    dirname, basename = os.path.split(bin)\n+    if dirname:\n+        return _is_exe(bin)\n+    else:\n+        for path_item in os.environ.get('PATH', '').split(os.pathsep):\n+            path_item = path_item.strip('\"')\n+            full_path = os.path.join(path_item, basename)\n+            if _is_exe(full_path):\n+                return True\n+    return False\n+\n+\n+CallProcessResult = namedtuple('CallProcessResult', ['bin_exists', 'return_code', 'stdout', 'stderr'])\n+\n+\n+def call_process(bin, args=None, stdin=None):\n+    \"\"\"\n+    :return CallProcessResult\n+    \"\"\"\n+    if not is_executable_found(bin):\n+        error = ('''not found \"{}\", check if it's installed and exists somewhere in PATH ({})'''\n+                 .format(bin, os.environ.get('PATH', '')))\n+        return CallProcessResult(bin_exists=False, return_code=None, stdout=None, stderr=error)\n+    args = args or []\n+    call_args = [bin] + args\n+    process = subprocess.Popen(call_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE,\n+                               stdin=subprocess.PIPE if stdin is not None else None)\n+    stdin_bytes = to_bytes(stdin) if stdin is not None else None\n+    (stdout, stderr) = process.communicate(input=stdin_bytes)\n+    return CallProcessResult(bin_exists=True, return_code=process.returncode, stdout=stdout, stderr=stderr)\n+\n+\n+def openssl(args=None, stdin=None):\n+    \"\"\"\n+    :return CallProcessResult\n+    \"\"\"\n+    return call_process(bin='openssl', args=args, stdin=stdin)\n+\n+\n+def pkcs12(args, stdin=None):\n+    \"\"\"\n+    :return CallProcessResult\n+    \"\"\"\n+    return openssl(args=['pkcs12'] + args if args is not None else [], stdin=stdin)\n+\n+\n+def x509(args, stdin=None):\n+    \"\"\"\n+    :return CallProcessResult\n+    \"\"\"\n+    return openssl(args=['x509'] + args if args is not None else [], stdin=stdin)\n+\n+\n+def s_client(args, stdin=b''):\n+    \"\"\"\n+    :return CallProcessResult\n+    \"\"\"\n+    return openssl(args=['s_client'] + args if args is not None else [], stdin=stdin)\n+\n+\n+def parse_certificate_fields(content):\n+    fields = {}\n+    for line in (l for l in content.split('\\n') if l.strip() != ''):\n+        key, _, value = line.partition('=')\n+        fields[key] = value\n+    return fields\n+\n+\n+def parse_date_field(value):\n+    try:\n+        # ex: Aug 30 23:59:59 2016 GMT\n+        return datetime.datetime.strptime(value, '%b %d %H:%M:%S %Y %Z')\n+    except ValueError:\n+        return None\n+\n+\n+def is_safe_expire_date(expire_date, expiration_interval, now=None):\n+    delta = expire_date - now\n+    return delta >= datetime.timedelta(days=expiration_interval)\n+\n+\n+def parse_and_check_certificate_info(content, env, certificate_description, warning_func=warning):\n+    info_fields = parse_certificate_fields(content)\n+    if 'notAfter' not in info_fields:\n+        warning_func('Unable to read expire date for {}'.format(certificate_description))\n+        return RETURN_CODE_WARNING\n+\n+    raw_expire_date = info_fields['notAfter']\n+    expire_date = parse_date_field(raw_expire_date)\n+    cert_subject = info_fields.get('subject', '<unknown>')\n+\n+    if not is_safe_expire_date(expire_date, env.expiration_interval, now=env.now):\n+        warning_func(\n+            (\n+                'Certificate has expired or is about to expire!\\n\\n'\n+                'Certificate: {description}\\n'\n+                'Certificate subject: {subj}\\n'\n+                'Expire date: {expire}'\n+            ).format(description=certificate_description, subj=cert_subject, expire=raw_expire_date)\n+        )\n+        return RETURN_CODE_WARNING","path":"hh-ssl-cert-check","position":165,"original_position":165,"commit_id":"22160274b1cf10a3b2239ef87f3d5d419c2c4014","original_commit_id":"22160274b1cf10a3b2239ef87f3d5d419c2c4014","user":{"login":"nmiroshnichenko","id":1862458,"avatar_url":"https://avatars.githubusercontent.com/u/1862458?v=3","gravatar_id":"","url":"https://api.github.com/users/nmiroshnichenko","html_url":"https://github.com/nmiroshnichenko","followers_url":"https://api.github.com/users/nmiroshnichenko/followers","following_url":"https://api.github.com/users/nmiroshnichenko/following{/other_user}","gists_url":"https://api.github.com/users/nmiroshnichenko/gists{/gist_id}","starred_url":"https://api.github.com/users/nmiroshnichenko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nmiroshnichenko/subscriptions","organizations_url":"https://api.github.com/users/nmiroshnichenko/orgs","repos_url":"https://api.github.com/users/nmiroshnichenko/repos","events_url":"https://api.github.com/users/nmiroshnichenko/events{/privacy}","received_events_url":"https://api.github.com/users/nmiroshnichenko/received_events","type":"User","site_admin":false},"body":"RC_WARNING :)","created_at":"2016-07-08T12:38:54Z","updated_at":"2016-07-08T12:38:54Z","html_url":"https://github.com/hhru/ssl-cert-check/pull/1#discussion_r70067195","pull_request_url":"https://api.github.com/repos/hhru/ssl-cert-check/pulls/1","_links":{"self":{"href":"https://api.github.com/repos/hhru/ssl-cert-check/pulls/comments/70067195"},"html":{"href":"https://github.com/hhru/ssl-cert-check/pull/1#discussion_r70067195"},"pull_request":{"href":"https://api.github.com/repos/hhru/ssl-cert-check/pulls/1"}}},"pull_request":{"url":"https://api.github.com/repos/hhru/ssl-cert-check/pulls/1","id":76736647,"html_url":"https://github.com/hhru/ssl-cert-check/pull/1","diff_url":"https://github.com/hhru/ssl-cert-check/pull/1.diff","patch_url":"https://github.com/hhru/ssl-cert-check/pull/1.patch","issue_url":"https://api.github.com/repos/hhru/ssl-cert-check/issues/1","number":1,"state":"open","locked":false,"title":"HH-57981 скрипт проверки сертификатов - MVP","user":{"login":"maizy","id":789623,"avatar_url":"https://avatars.githubusercontent.com/u/789623?v=3","gravatar_id":"","url":"https://api.github.com/users/maizy","html_url":"https://github.com/maizy","followers_url":"https://api.github.com/users/maizy/followers","following_url":"https://api.github.com/users/maizy/following{/other_user}","gists_url":"https://api.github.com/users/maizy/gists{/gist_id}","starred_url":"https://api.github.com/users/maizy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/maizy/subscriptions","organizations_url":"https://api.github.com/users/maizy/orgs","repos_url":"https://api.github.com/users/maizy/repos","events_url":"https://api.github.com/users/maizy/events{/privacy}","received_events_url":"https://api.github.com/users/maizy/received_events","type":"User","site_admin":false},"body":"https://jira.hh.ru/browse/HH-57981\r\n\r\nподдерживаются такие фичи:\r\n\r\n- проверка сертификата на время жизни, можно задать за сколько дней начинать ругаться\r\n- проверка p12 (pkcs12 контейнера) с возможностью передачи пароя - используются в Apple Push нотификациях\r\n- проверка сертификата выдаваемого по https соединению, с поддержкой SNI\r\n- проверка pem сертификатов - то, что кушает nginx\r\n- код результата 0 - всё ок, 1 - параметры не правильные, 2 - что-то не так\r\n- в stderr будет написаны подробности, что не так с сертификатом\r\n- если передать параметр приложения `--info` то в stdout при успешной проверке будет выведена информация о сертификате\r\n- можно передать параметр приложения `--email` и тогда будет отправлено письмо на этот адрес. отправка прибита гвоздями на smtp сервер в localhost без авторизации (у нас такое везде, где нужно будет работать, но в целом можно будет добавить разных опций в дальнейшем)\r\n\r\nЗависимости только python 2.7, openssl (используется вызов сабпроцесса).\r\nРаботает на os x, linux. Остальное не проверял.\r\n\r\nDeploy:\r\n* Будет deb пакет `hh-ssl-cert-check`\r\n* положу на публичный pypi\r\n* можно просто взять hh-ssl-cert-check и запускать его.\r\n\r\nЗапуск\r\n```\r\nhh-ssl-cert-check [параметры приложения] команда [параметры команды]\r\n\r\n# справка по параметрам приложения\r\nhh-ssl-cert-check -h\r\n\r\n# справка по параметрам команды\r\nhh-ssl-cert-check команда -h\r\n```\r\n\r\n\r\nПримеры запуска\r\n```\r\nhh-ssl-cert-check --info --expiration-interval=14 pem --cert=my.crt\r\nhh-ssl-cert-check --expiration-interval=14 https --host=expired.badssl.com --sni=expired.badssl.com\r\nhh-ssl-cert-check --expiration-interval=14 https --host=hh.ru\r\nhh-ssl-cert-check --expiration-interval=14 p12 --password=123123 --cert ios-push.p12\r\n```\r\n\r\nПример вывода:\r\n```\r\n> hh-ssl-cert-check --expiration-interval=14 https --host=hh.ru\r\n> echo $?\r\n0\r\n```\r\n\r\n```\r\n> hh-ssl-cert-check --expiration-interval=14 --info https --host=hh.ru\r\nCertificate: host hh.ru:443\r\nCertificate subject:  /C=RU/ST=Moscow/L=Moscow/O=OOO HEADHUNTER/OU=IT Department/CN=*.hh.ru\r\nExpire date: Apr 22 23:59:59 2017 GMT\r\nValid after: Feb 22 00:00:00 2016 GMT\r\n> echo $?\r\n0\r\n```\r\n\r\n```\r\n> hh-ssl-cert-check --expiration-interval=14 https --host=expired.badssl.com --sni=expired.badssl.com\r\nCertificate has expired or is about to expire!\r\n\r\nCertificate: host expired.badssl.com:443 (SNI expired.badssl.com)\r\nCertificate subject:  /OU=Domain Control Validated/OU=PositiveSSL Wildcard/CN=*.badssl.com\r\nExpire date: Apr 12 23:59:59 2015 GMT\r\n\r\n> echo $?\r\n2\r\n```","created_at":"2016-07-08T11:08:04Z","updated_at":"2016-07-08T12:38:54Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c5a075d6c96107953eefdbf2bbd6e10a3cb57f3a","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/hhru/ssl-cert-check/pulls/1/commits","review_comments_url":"https://api.github.com/repos/hhru/ssl-cert-check/pulls/1/comments","review_comment_url":"https://api.github.com/repos/hhru/ssl-cert-check/pulls/comments{/number}","comments_url":"https://api.github.com/repos/hhru/ssl-cert-check/issues/1/comments","statuses_url":"https://api.github.com/repos/hhru/ssl-cert-check/statuses/22160274b1cf10a3b2239ef87f3d5d419c2c4014","head":{"label":"hhru:HH-57981","ref":"HH-57981","sha":"22160274b1cf10a3b2239ef87f3d5d419c2c4014","user":{"login":"hhru","id":152753,"avatar_url":"https://avatars.githubusercontent.com/u/152753?v=3","gravatar_id":"","url":"https://api.github.com/users/hhru","html_url":"https://github.com/hhru","followers_url":"https://api.github.com/users/hhru/followers","following_url":"https://api.github.com/users/hhru/following{/other_user}","gists_url":"https://api.github.com/users/hhru/gists{/gist_id}","starred_url":"https://api.github.com/users/hhru/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hhru/subscriptions","organizations_url":"https://api.github.com/users/hhru/orgs","repos_url":"https://api.github.com/users/hhru/repos","events_url":"https://api.github.com/users/hhru/events{/privacy}","received_events_url":"https://api.github.com/users/hhru/received_events","type":"Organization","site_admin":false},"repo":{"id":62619285,"name":"ssl-cert-check","full_name":"hhru/ssl-cert-check","owner":{"login":"hhru","id":152753,"avatar_url":"https://avatars.githubusercontent.com/u/152753?v=3","gravatar_id":"","url":"https://api.github.com/users/hhru","html_url":"https://github.com/hhru","followers_url":"https://api.github.com/users/hhru/followers","following_url":"https://api.github.com/users/hhru/following{/other_user}","gists_url":"https://api.github.com/users/hhru/gists{/gist_id}","starred_url":"https://api.github.com/users/hhru/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hhru/subscriptions","organizations_url":"https://api.github.com/users/hhru/orgs","repos_url":"https://api.github.com/users/hhru/repos","events_url":"https://api.github.com/users/hhru/events{/privacy}","received_events_url":"https://api.github.com/users/hhru/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/hhru/ssl-cert-check","description":null,"fork":false,"url":"https://api.github.com/repos/hhru/ssl-cert-check","forks_url":"https://api.github.com/repos/hhru/ssl-cert-check/forks","keys_url":"https://api.github.com/repos/hhru/ssl-cert-check/keys{/key_id}","collaborators_url":"https://api.github.com/repos/hhru/ssl-cert-check/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/hhru/ssl-cert-check/teams","hooks_url":"https://api.github.com/repos/hhru/ssl-cert-check/hooks","issue_events_url":"https://api.github.com/repos/hhru/ssl-cert-check/issues/events{/number}","events_url":"https://api.github.com/repos/hhru/ssl-cert-check/events","assignees_url":"https://api.github.com/repos/hhru/ssl-cert-check/assignees{/user}","branches_url":"https://api.github.com/repos/hhru/ssl-cert-check/branches{/branch}","tags_url":"https://api.github.com/repos/hhru/ssl-cert-check/tags","blobs_url":"https://api.github.com/repos/hhru/ssl-cert-check/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/hhru/ssl-cert-check/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/hhru/ssl-cert-check/git/refs{/sha}","trees_url":"https://api.github.com/repos/hhru/ssl-cert-check/git/trees{/sha}","statuses_url":"https://api.github.com/repos/hhru/ssl-cert-check/statuses/{sha}","languages_url":"https://api.github.com/repos/hhru/ssl-cert-check/languages","stargazers_url":"https://api.github.com/repos/hhru/ssl-cert-check/stargazers","contributors_url":"https://api.github.com/repos/hhru/ssl-cert-check/contributors","subscribers_url":"https://api.github.com/repos/hhru/ssl-cert-check/subscribers","subscription_url":"https://api.github.com/repos/hhru/ssl-cert-check/subscription","commits_url":"https://api.github.com/repos/hhru/ssl-cert-check/commits{/sha}","git_commits_url":"https://api.github.com/repos/hhru/ssl-cert-check/git/commits{/sha}","comments_url":"https://api.github.com/repos/hhru/ssl-cert-check/comments{/number}","issue_comment_url":"https://api.github.com/repos/hhru/ssl-cert-check/issues/comments{/number}","contents_url":"https://api.github.com/repos/hhru/ssl-cert-check/contents/{+path}","compare_url":"https://api.github.com/repos/hhru/ssl-cert-check/compare/{base}...{head}","merges_url":"https://api.github.com/repos/hhru/ssl-cert-check/merges","archive_url":"https://api.github.com/repos/hhru/ssl-cert-check/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/hhru/ssl-cert-check/downloads","issues_url":"https://api.github.com/repos/hhru/ssl-cert-check/issues{/number}","pulls_url":"https://api.github.com/repos/hhru/ssl-cert-check/pulls{/number}","milestones_url":"https://api.github.com/repos/hhru/ssl-cert-check/milestones{/number}","notifications_url":"https://api.github.com/repos/hhru/ssl-cert-check/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/hhru/ssl-cert-check/labels{/name}","releases_url":"https://api.github.com/repos/hhru/ssl-cert-check/releases{/id}","deployments_url":"https://api.github.com/repos/hhru/ssl-cert-check/deployments","created_at":"2016-07-05T08:28:09Z","updated_at":"2016-07-05T08:28:09Z","pushed_at":"2016-07-08T11:08:05Z","git_url":"git://github.com/hhru/ssl-cert-check.git","ssh_url":"git@github.com:hhru/ssl-cert-check.git","clone_url":"https://github.com/hhru/ssl-cert-check.git","svn_url":"https://github.com/hhru/ssl-cert-check","homepage":null,"size":15,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"hhru:master","ref":"master","sha":"ffe144ec28d98730b27ef2241345f0c56d8dab15","user":{"login":"hhru","id":152753,"avatar_url":"https://avatars.githubusercontent.com/u/152753?v=3","gravatar_id":"","url":"https://api.github.com/users/hhru","html_url":"https://github.com/hhru","followers_url":"https://api.github.com/users/hhru/followers","following_url":"https://api.github.com/users/hhru/following{/other_user}","gists_url":"https://api.github.com/users/hhru/gists{/gist_id}","starred_url":"https://api.github.com/users/hhru/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hhru/subscriptions","organizations_url":"https://api.github.com/users/hhru/orgs","repos_url":"https://api.github.com/users/hhru/repos","events_url":"https://api.github.com/users/hhru/events{/privacy}","received_events_url":"https://api.github.com/users/hhru/received_events","type":"Organization","site_admin":false},"repo":{"id":62619285,"name":"ssl-cert-check","full_name":"hhru/ssl-cert-check","owner":{"login":"hhru","id":152753,"avatar_url":"https://avatars.githubusercontent.com/u/152753?v=3","gravatar_id":"","url":"https://api.github.com/users/hhru","html_url":"https://github.com/hhru","followers_url":"https://api.github.com/users/hhru/followers","following_url":"https://api.github.com/users/hhru/following{/other_user}","gists_url":"https://api.github.com/users/hhru/gists{/gist_id}","starred_url":"https://api.github.com/users/hhru/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hhru/subscriptions","organizations_url":"https://api.github.com/users/hhru/orgs","repos_url":"https://api.github.com/users/hhru/repos","events_url":"https://api.github.com/users/hhru/events{/privacy}","received_events_url":"https://api.github.com/users/hhru/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/hhru/ssl-cert-check","description":null,"fork":false,"url":"https://api.github.com/repos/hhru/ssl-cert-check","forks_url":"https://api.github.com/repos/hhru/ssl-cert-check/forks","keys_url":"https://api.github.com/repos/hhru/ssl-cert-check/keys{/key_id}","collaborators_url":"https://api.github.com/repos/hhru/ssl-cert-check/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/hhru/ssl-cert-check/teams","hooks_url":"https://api.github.com/repos/hhru/ssl-cert-check/hooks","issue_events_url":"https://api.github.com/repos/hhru/ssl-cert-check/issues/events{/number}","events_url":"https://api.github.com/repos/hhru/ssl-cert-check/events","assignees_url":"https://api.github.com/repos/hhru/ssl-cert-check/assignees{/user}","branches_url":"https://api.github.com/repos/hhru/ssl-cert-check/branches{/branch}","tags_url":"https://api.github.com/repos/hhru/ssl-cert-check/tags","blobs_url":"https://api.github.com/repos/hhru/ssl-cert-check/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/hhru/ssl-cert-check/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/hhru/ssl-cert-check/git/refs{/sha}","trees_url":"https://api.github.com/repos/hhru/ssl-cert-check/git/trees{/sha}","statuses_url":"https://api.github.com/repos/hhru/ssl-cert-check/statuses/{sha}","languages_url":"https://api.github.com/repos/hhru/ssl-cert-check/languages","stargazers_url":"https://api.github.com/repos/hhru/ssl-cert-check/stargazers","contributors_url":"https://api.github.com/repos/hhru/ssl-cert-check/contributors","subscribers_url":"https://api.github.com/repos/hhru/ssl-cert-check/subscribers","subscription_url":"https://api.github.com/repos/hhru/ssl-cert-check/subscription","commits_url":"https://api.github.com/repos/hhru/ssl-cert-check/commits{/sha}","git_commits_url":"https://api.github.com/repos/hhru/ssl-cert-check/git/commits{/sha}","comments_url":"https://api.github.com/repos/hhru/ssl-cert-check/comments{/number}","issue_comment_url":"https://api.github.com/repos/hhru/ssl-cert-check/issues/comments{/number}","contents_url":"https://api.github.com/repos/hhru/ssl-cert-check/contents/{+path}","compare_url":"https://api.github.com/repos/hhru/ssl-cert-check/compare/{base}...{head}","merges_url":"https://api.github.com/repos/hhru/ssl-cert-check/merges","archive_url":"https://api.github.com/repos/hhru/ssl-cert-check/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/hhru/ssl-cert-check/downloads","issues_url":"https://api.github.com/repos/hhru/ssl-cert-check/issues{/number}","pulls_url":"https://api.github.com/repos/hhru/ssl-cert-check/pulls{/number}","milestones_url":"https://api.github.com/repos/hhru/ssl-cert-check/milestones{/number}","notifications_url":"https://api.github.com/repos/hhru/ssl-cert-check/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/hhru/ssl-cert-check/labels{/name}","releases_url":"https://api.github.com/repos/hhru/ssl-cert-check/releases{/id}","deployments_url":"https://api.github.com/repos/hhru/ssl-cert-check/deployments","created_at":"2016-07-05T08:28:09Z","updated_at":"2016-07-05T08:28:09Z","pushed_at":"2016-07-08T11:08:05Z","git_url":"git://github.com/hhru/ssl-cert-check.git","ssh_url":"git@github.com:hhru/ssl-cert-check.git","clone_url":"https://github.com/hhru/ssl-cert-check.git","svn_url":"https://github.com/hhru/ssl-cert-check","homepage":null,"size":15,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/hhru/ssl-cert-check/pulls/1"},"html":{"href":"https://github.com/hhru/ssl-cert-check/pull/1"},"issue":{"href":"https://api.github.com/repos/hhru/ssl-cert-check/issues/1"},"comments":{"href":"https://api.github.com/repos/hhru/ssl-cert-check/issues/1/comments"},"review_comments":{"href":"https://api.github.com/repos/hhru/ssl-cert-check/pulls/1/comments"},"review_comment":{"href":"https://api.github.com/repos/hhru/ssl-cert-check/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/hhru/ssl-cert-check/pulls/1/commits"},"statuses":{"href":"https://api.github.com/repos/hhru/ssl-cert-check/statuses/22160274b1cf10a3b2239ef87f3d5d419c2c4014"}}}}
{"actor":{"display_login":"nmiroshnichenko"}}