Advertisement
Guest User

Untitled

a guest
May 28th, 2012
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.39 KB | None | 0 0
  1. import urllib2
  2. import pickle
  3. import pianoparser
  4. import os
  5. import sys
  6.  
  7. BASE_KEY_URL = "https://raw.github.com/PromyLOPh/pianobar/Commit:94c1eec169db66bb4ad9d633342aead3b0f35b9f/src/libpiano/"
  8.  
  9. class Key:
  10. def __init__( self, proto, key ):
  11. self._key = {}
  12. ( n, p, s ) = key
  13. self._proto = proto
  14. self._key["n"] = n
  15. self._key["p"] = p
  16. self._key["s"] = s
  17.  
  18. def __getitem__( self, key ):
  19. return self._key[key]
  20.  
  21. def _toDict( self ):
  22. return { 'proto' : self._proto,
  23. 'key' : (self._key['n'],self._key['p'],self._key['s']) }
  24.  
  25. class Keys:
  26. _keys = None
  27.  
  28. def __init__( self, dataDir, proto ):
  29. self._proto = proto
  30. self._dataDir = dataDir
  31. self._keys = {}
  32.  
  33. def __getitem__( self, key ):
  34. return self._keys[key]
  35.  
  36. def loadKeys( self, save=True ):
  37. fromFile = 0
  38. key_in = self._loadKeyFromFile( os.path.join( self._dataDir,\
  39. "key_in" ) )
  40. if key_in and key_in._proto == self._proto:
  41. fromFile += 1
  42. else:
  43. key_in = self._loadKeyFromURL( BASE_KEY_URL + \
  44. "crypt_key_input.h" )
  45. if key_in:
  46. key_in = Key( self._proto, key_in )
  47. else:
  48. print "PANDORA: No valid Input key"
  49. return False
  50.  
  51. key_out = self._loadKeyFromFile( os.path.join( self._dataDir,\
  52. "key_out" ) )
  53. if key_out and key_out._proto == self._proto:
  54. fromFile += 1
  55. else:
  56. key_out = self._loadKeyFromURL( BASE_KEY_URL + \
  57. "crypt_key_output.h" )
  58. if key_out:
  59. key_out = Key( self._proto, key_out )
  60. else:
  61. print "PANDORA: No valid Output key"
  62. return False
  63.  
  64. self._keys['in'] = key_in
  65. self._keys['out'] = key_out
  66. if save and fromFile < 2:
  67. self.saveKeys()
  68. return True
  69.  
  70. def saveKeys( self ):
  71. print "PANDORA: Saving keys"
  72. f = None
  73. print "PANDORA: dataDir = \"%s\"" %self._dataDir
  74. print "PANDORA: dataDir.isDir? %s" %os.path.isdir( self._dataDir )
  75. try:
  76. f = open( os.path.join( self._dataDir, "key_in" ), "wb" )
  77. pickle.dump( self._keys['in']._toDict(), f, -1 )
  78. finally:
  79. if f: f.close()
  80.  
  81. try:
  82. f = open( os.path.join( self._dataDir, "key_out" ), "wb" )
  83. pickle.dump( self._keys['out']._toDict(), f, -1 )
  84. finally:
  85. if f: f.close()
  86.  
  87. def forceReFetch( self ):
  88. print "PANDORA: Forcing key ReDownload"
  89. if os.path.exists( os.path.join( self._dataDir, "key_in" ) ):
  90. os.remove( os.path.join( self._dataDir, "key_in" ) )
  91. if os.path.exists( os.path.join( self._dataDir, "key_out" ) ):
  92. os.remove( os.path.join( self._dataDir, "key_out" ) )
  93. return self.loadKeys( True );
  94.  
  95. def _loadKeyFromFile( self, keyFile ):
  96. print "PANDORA: Loading key from file \"%s\"" %keyFile
  97. if not os.path.isfile( keyFile ):
  98. return False
  99.  
  100. try:
  101. try:
  102. f = open( keyFile, "rb" )
  103. tmp = pickle.load( f )
  104. key = Key( tmp['proto'], tmp['key'] )
  105. except IOError, e:
  106. print "PANDORA: IOError %d:%s" %( e.errno, e.stderror )
  107. return False
  108. except pickle.UnpicklingError, e:
  109. print "PANDORA: UnpicklingError: %s" %e
  110. return False
  111. except:
  112. print "PANDORA: Unexpected error:%s:%s" %sys.exc_info()[0:2]
  113. raise
  114. finally:
  115. f.close()
  116.  
  117. return key
  118.  
  119. def _loadKeyFromURL( self, keyUrl ):
  120. print "PANDORA: Downloading key from url \"%s\"" %keyUrl
  121. try:
  122. f = urllib2.urlopen( keyUrl )
  123. except urllib2.URLError, e:
  124. print "PANDORA: URLError: %s" %e.reason
  125. return False
  126. key = pianoparser.parse_file( f )
  127. f.close()
  128. return key
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement