[tor-commits] [stem/master] Adding module to check for requirements
atagar at torproject.org
atagar at torproject.org
Wed Jun 13 16:29:46 UTC 2012
commit b84a75638942e61a58b2af8edd97448ea72857d7
Author: Damian Johnson <atagar at torproject.org>
Date: Wed Jun 13 09:20:34 2012 -0700
Adding module to check for requirements
Stem requires at least python 2.5, and beyond that our python version and
modules does impact what functionality we have available (yay). Adding a module
for tracking what we have available.
---
run_tests.py | 9 +++
stem/__init__.py | 2 +-
stem/descriptor/server_descriptor.py | 11 +---
stem/prereq.py | 86 +++++++++++++++++++++++++++++
test/unit/descriptor/server_descriptor.py | 5 +-
5 files changed, 102 insertions(+), 11 deletions(-)
diff --git a/run_tests.py b/run_tests.py
index a6d604c..5c41f40 100755
--- a/run_tests.py
+++ b/run_tests.py
@@ -45,6 +45,7 @@ import test.integ.util.system
import test.integ.process
import test.integ.version
+import stem.prereq
import stem.util.conf
import stem.util.enum
import stem.util.log as log
@@ -218,6 +219,14 @@ def load_user_configuration(test_config):
sys.exit(1)
if __name__ == '__main__':
+ try:
+ stem.prereq.check_requriements()
+ except ImportError, exc:
+ print exc
+ print
+
+ sys.exit(1)
+
start_time = time.time()
# override flag to indicate at the end that testing failed somewhere
diff --git a/stem/__init__.py b/stem/__init__.py
index 61374a6..8f5add1 100644
--- a/stem/__init__.py
+++ b/stem/__init__.py
@@ -8,5 +8,5 @@ __contact__ = 'atagar at torproject.org'
__url__ = 'http://www.atagar.com/stem/'
__license__ = 'LGPLv3'
-__all__ = ["descriptor", "response", "util", "connection", "control", "process", "socket", "version"]
+__all__ = ["descriptor", "response", "util", "connection", "control", "prereq", "process", "socket", "version"]
diff --git a/stem/descriptor/server_descriptor.py b/stem/descriptor/server_descriptor.py
index 99080ab..765a5ba 100644
--- a/stem/descriptor/server_descriptor.py
+++ b/stem/descriptor/server_descriptor.py
@@ -32,6 +32,7 @@ import base64
import hashlib
import datetime
+import stem.prereq
import stem.descriptor
import stem.descriptor.extrainfo_descriptor
import stem.version
@@ -39,13 +40,6 @@ import stem.util.log as log
import stem.util.connection
import stem.util.tor_tools
-try:
- import rsa
- IS_RSA_AVAILABLE = True
-except ImportError:
- log.info("Unable to import the rsa module. Because of this we'll be unable to verify descriptor signature integrity.")
- IS_RSA_AVAILABLE = False
-
# relay descriptors must have exactly one of the following
REQUIRED_FIELDS = (
"router",
@@ -572,7 +566,8 @@ class RelayDescriptor(ServerDescriptor):
# if we have a fingerprint then checks that our fingerprint is a hash of
# our signing key
- if IS_RSA_AVAILABLE and validate and self.fingerprint:
+ if validate and self.fingerprint and stem.prereq.is_rsa_available():
+ import rsa
pubkey = rsa.PublicKey.load_pkcs1(self.signing_key)
der_encoded = pubkey.save_pkcs1(format = "DER")
key_hash = hashlib.sha1(der_encoded).hexdigest()
diff --git a/stem/prereq.py b/stem/prereq.py
new file mode 100644
index 0000000..e443078
--- /dev/null
+++ b/stem/prereq.py
@@ -0,0 +1,86 @@
+"""
+Checks for stem dependencies. We require python 2.5 or greater (in the 2.x
+series). Other requirements for complete functionality are...
+
+* Python 2.6
+
+ * os.walk's followlinks argument
+
+* rsa module
+
+ * validating descriptor signagure integrity
+
+::
+
+ check_requriements - checks for minimum requirements for running stem
+
+ is_python_26 - checks if python 2.6 or later is available
+ is_python_27 - checks if python 2.7 or later is available
+
+ is_rsa_available - checks if the rsa module is available
+"""
+
+import sys
+
+import stem.util.log as log
+
+IS_RSA_AVAILABLE = None
+
+def check_requriements():
+ """
+ Checks that we meet the minimum requirements to run stem. If we don't then
+ this raises an ImportError with the issue.
+
+ :raises: ImportError with the problem if we don't meet stem's requirements
+ """
+
+ major_version, minor_version = sys.version_info[0:2]
+
+ if major_version > 2:
+ raise ImportError("stem isn't compatible beyond the python 2.x series")
+ elif major_version < 2 or minor_version < 5:
+ raise ImportError("stem requires python version 2.5 or greater")
+
+def is_python_26():
+ """
+ Checks if we're in the 2.6 - 2.x range.
+
+ :returns: bool that is True if we meet this requirement and False otherwise
+ """
+
+ return _check_version(6)
+
+def is_python_27():
+ """
+ Checks if we're in the 2.7 - 2.x range.
+
+ :returns: bool that is True if we meet this requirement and False otherwise
+ """
+
+ return _check_version(7)
+
+def is_rsa_available():
+ global IS_RSA_AVAILABLE
+
+ if IS_RSA_AVAILABLE == None:
+ try:
+ import rsa
+ IS_RSA_AVAILABLE = True
+ except ImportError:
+ IS_RSA_AVAILABLE = False
+
+ msg = "Unable to import the rsa module. Because of this we'll be unable to verify descriptor signature integrity."
+ log.log_once("stem.prereq.is_rsa_availabe", log.INFO, msg)
+
+ return IS_RSA_AVAILABLE
+
+def _check_version(minor_req):
+ major_version, minor_version = sys.version_info[0:2]
+
+ if major_version > 2:
+ return False
+ elif major_version < 2 or minor_version < minor_req:
+ return False
+
+ return True
+
diff --git a/test/unit/descriptor/server_descriptor.py b/test/unit/descriptor/server_descriptor.py
index 3bb2c7a..8502b56 100644
--- a/test/unit/descriptor/server_descriptor.py
+++ b/test/unit/descriptor/server_descriptor.py
@@ -6,6 +6,7 @@ import datetime
import StringIO
import unittest
+import stem.prereq
import stem.descriptor.server_descriptor
from stem.descriptor.server_descriptor import RelayDescriptor, BridgeDescriptor
@@ -312,7 +313,7 @@ class TestServerDescriptor(unittest.TestCase):
Checks that a fingerprint matching the hash of our signing key will validate.
"""
- if not stem.descriptor.server_descriptor.IS_RSA_AVAILABLE:
+ if not stem.prereq.is_rsa_available():
self.skipTest("(rsa module unavailable)")
fingerprint = "4F0C 867D F0EF 6816 0568 C826 838F 482C EA7C FE44"
@@ -326,7 +327,7 @@ class TestServerDescriptor(unittest.TestCase):
it doesn't match the hash of our signing key.
"""
- if not stem.descriptor.server_descriptor.IS_RSA_AVAILABLE:
+ if not stem.prereq.is_rsa_available():
self.skipTest("(rsa module unavailable)")
fingerprint = "4F0C 867D F0EF 6816 0568 C826 838F 482C EA7C FE45"
More information about the tor-commits
mailing list