Add an informative __main__.py (#620)

* Add an informative __main__.py

Give users an easy way to figure out what versions they're running.

* Why not more info!

* Add test

* No empty last line

* Make @alex happy

* DIAF Python 2.6

* Add cffi's version

* Make debug a module

* Add cryptography's compile-time OpenSSL
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 1c7a69d..ae9e359 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -24,7 +24,8 @@
 Changes:
 ^^^^^^^^
 
-*none*
+- Added ``OpenSSL.debug`` that allows to get an overview of used library versions (including linked OpenSSL) and other useful runtime information using ``python -m OpenSSL.debug``.
+  `#620 <https://github.com/pyca/pyopenssl/pull/620>`_
 
 
 ----
diff --git a/INSTALL.rst b/INSTALL.rst
index d6c9410..71fe1ed 100644
--- a/INSTALL.rst
+++ b/INSTALL.rst
@@ -29,12 +29,13 @@
 - 1.0.2
 - 1.1.0
 
-
 If you need support for older releases, the following pinned versions will work:
 
 - **OpenSSL 0.9.8**: ``'pyOpenSSL<17.0' 'cryptography<1.4'``
 - **OpenSSL 1.0.0**: ``'pyOpenSSL<17.1' 'cryptography<1.7'``
 
+You can always find out the versions of pyOpenSSL, cryptography, and the linked OpenSSL by running ``python -m OpenSSL.debug``.
+
 
 Documentation
 -------------
diff --git a/src/OpenSSL/debug.py b/src/OpenSSL/debug.py
new file mode 100644
index 0000000..0d37bf5
--- /dev/null
+++ b/src/OpenSSL/debug.py
@@ -0,0 +1,42 @@
+from __future__ import print_function
+
+import ssl
+import sys
+
+import OpenSSL.SSL
+import cffi
+import cryptography
+
+from . import version
+
+
+_env_info = u"""\
+pyOpenSSL: {pyopenssl}
+cryptography: {cryptography}
+cffi: {cffi}
+cryptography's compiled against OpenSSL: {crypto_openssl_compile}
+cryptography's linked OpenSSL: {crypto_openssl_link}
+Pythons's OpenSSL: {python_openssl}
+Python executable: {python}
+Python version: {python_version}
+Platform: {platform}
+sys.path: {sys_path}""".format(
+    pyopenssl=version.__version__,
+    crypto_openssl_compile=OpenSSL._util.ffi.string(
+        OpenSSL._util.lib.OPENSSL_VERSION_TEXT,
+    ).decode("ascii"),
+    crypto_openssl_link=OpenSSL.SSL.SSLeay_version(
+        OpenSSL.SSL.SSLEAY_VERSION
+    ).decode("ascii"),
+    python_openssl=getattr(ssl, "OPENSSL_VERSION", "n/a"),
+    cryptography=cryptography.__version__,
+    cffi=cffi.__version__,
+    python=sys.executable,
+    python_version=sys.version,
+    platform=sys.platform,
+    sys_path=sys.path,
+)
+
+
+if __name__ == "__main__":
+    print(_env_info)
diff --git a/tests/test_debug.py b/tests/test_debug.py
new file mode 100644
index 0000000..2d62a3a
--- /dev/null
+++ b/tests/test_debug.py
@@ -0,0 +1,10 @@
+from OpenSSL.debug import _env_info
+from OpenSSL import version
+
+
+def test_debug_info():
+    """
+    Debug info contains correct data.
+    """
+    # Just check a sample we control.
+    assert version.__version__ in _env_info
diff --git a/tests/test_util.py b/tests/test_util.py
index 78c97b5..91847e0 100644
--- a/tests/test_util.py
+++ b/tests/test_util.py
@@ -1,7 +1,7 @@
-from OpenSSL._util import exception_from_error_queue, lib
-
 import pytest
 
+from OpenSSL._util import exception_from_error_queue, lib
+
 
 class TestErrors(object):
     """
@@ -9,7 +9,7 @@
     """
     def test_exception_from_error_queue_nonexistent_reason(self):
         """
-        :py:func:`exception_from_error_queue` raises ``ValueError`` when it
+        :func:`exception_from_error_queue` raises ``ValueError`` when it
         encounters an OpenSSL error code which does not have a reason string.
         """
         lib.ERR_put_error(lib.ERR_LIB_EVP, 0, 1112, b"", 10)
diff --git a/tox.ini b/tox.ini
index 5098d6f..723562e 100644
--- a/tox.ini
+++ b/tox.ini
@@ -17,6 +17,7 @@
     PIP_NO_BINARY=cryptography
 commands =
     openssl version
+    coverage run --parallel -m OpenSSL.debug
     coverage run --parallel -m pytest -v {posargs}
 
 [testenv:py27-twistedMaster]