#!/usr/bin/python
import urllib
import hashlib
import base64
import sys
from optparse import OptionParser

def escape(s):
    return urllib.quote(s, safe='~')

parser = OptionParser()
parser.add_option("-H", "--hostname", dest="hostname",
                  help="pokersocial hostname")
parser.add_option("-c", "--container", dest="container",
                  help="pokersocial container path")
(options, args) = parser.parse_args()

if options.hostname == None or options.container == None:
    parser.print_help()
    sys.exit(1)

host = options.hostname
container_path = options.container

path = '/POKER_REST'
method = 'POST'
key_values = [('auth', ['BC03972677ECA61C71B2457DD915F23C25FE25D8']), ('container', ['default']), ('oauth_consumer_key', [host]), ('oauth_nonce', ['4db6ff89ddb083541fb2164ff00eaad2']), ('oauth_signature_method', ['RSA-SHA1']), ('oauth_timestamp', ['1268657888']), ('oauth_token', ['']), ('opensocial_app_id', ['15']), ('opensocial_owner_id', ['1']), ('opensocial_viewer_id', ['1']), ('packet', ['{"type":"PacketPing"}']), ('uid', ['8E771F2FBBEF1D2CC49ACEB418DCCEBE007D05DE']), ('xoauth_signature_publickey', ['http://%s%s/sites/all/modules/shindig_integrator/shindig/php/public.cer' % (host, container_path) ])]
normalized_parameters = '&'.join('%s=%s' % (escape(k), escape(v[0])) for k, v in key_values)
scheme = 'http'
url = scheme + '://' + host + path
hash_base_string = '&'.join((escape(method), escape(url), escape(normalized_parameters)))
local_hash = hashlib.sha1(hash_base_string).digest()

private = """
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,C69E69BF4D533880

iKwTHIFruW1Dt7ASm2xnNgtA2G2WJMwwxICxAu06K75gvi7Kj6BNra5rMlhi2fbR
7tp+425xbaykOZETSAfT70fwcpRQzifRM5HEBmEnRu5I7POEkgDyPvWlS9Kq8lgB
zPlbxkSWGnPk/r6f71fNupo2gAU+gdbQQnoliQKCG2DtUvkBIgsJWDsMFYyD364b
UzZubrsT8iaNbSb4oDYPsgrHXbmTQcw8bWoly/nNqtunR1VEqgzxWeJIG02ThaLm
SMijbxCTgZKvQtf7vKHWxP3kMQQiqfgxxUA0OJ4Ym6zmkijEC57PjdKYQUo85M++
eZEWXgDk6qEC2nNyROjyZPyTYwDuxrFs4KujsqdQyzUIm+FHbnU0WmGEfzP2D3Ai
gla64RTIJHsSVWlcYL4bCGUplZvklzNNGzDSLwIBPJPXS5hzsjoh4ScFisSP7Myc
Vc6xJpw5vjZetZQLQ77h8XObBxODiSEGt7cOF88eGJkK8/hsPTJVB+JZdioRxRZB
4ErZzfJNZp8nPmoxhLh2zMMYyyfo4l7TRr6/0GnOW/63L6iR3zrqKmkp2c4VBIih
nOu8iT/CNzTsEBEM0nUuc1y6r/JEB8m9S9OS7gVQTl8Zq12NpUeZ3FYHVBI7yavI
GJiObLyvzAOMbL7PaJnjnIPHeKUHlIPi0H+z3q9lHThmjigo1NtJLCIF2v09ZGCe
AF9e1AjXqB/PiQ/mA1yRYbSTkekyBNx43pmjXeCaqa+vfXACFn4DXwNa81LsRCqV
aOTCsbAqOWhTOZDegqxERzEuNdBFDXZQQAAOBzaRsI5KTOwefHPOow==
-----END RSA PRIVATE KEY-----
"""

public = """
-----BEGIN CERTIFICATE-----
MIICsDCCAhmgAwIBAgIJAPISjQewTBhAMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV
BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX
aWRnaXRzIFB0eSBMdGQwHhcNMDkwODIxMTUzMDI4WhcNMTAwODIxMTUzMDI4WjBF
MQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50
ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB
gQC06xOEe7T1n4E/6tO2yQv6ICnXQG5b6JnfSbwe8YhNMaGo5vladgPG6BdxwOh3
NRPBqCy/AnZ02vU5Bk+f0J0C8sVDvUUw1/jaeBm6r6RuiDJK2y2jvVgp8+lZEwLh
uwbOBt5f5xuHVap3pMRq5XGKUjczNNGSx5YPW70Mtth/pQIDAQABo4GnMIGkMB0G
A1UdDgQWBBTAA1jLJMtZz4RLDOHDLoqSeznfZDB1BgNVHSMEbjBsgBTAA1jLJMtZ
z4RLDOHDLoqSeznfZKFJpEcwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUt
U3RhdGUxITAfBgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZIIJAPISjQew
TBhAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAKcS/VxIq5L6TVOol
z0Xs2+p3DN7ik6zJ5IENVJD1G/3M38mSkDhe4NqV4MQfZ8jrwp/2BpFK5HhYEyXT
baFLnX+FizCiN4S912pEsbBAjeJpv8i0CRKsg75DxrfqRlLfBbHE6JIO1Sc7CP0h
56q/kG2SE7m2xo1AMZaNzcY8EpM=
-----END CERTIFICATE-----
"""

import M2Crypto.RSA
rsa = M2Crypto.RSA.load_key_string(private, callback=lambda v: 'drupal')

signature = rsa.sign(local_hash)

args = normalized_parameters[:] + '&oauth_signature=%s' % escape(base64.encodestring(signature))

exponent = 65537L
hex_cert = "0xB4EB13847BB4F59F813FEAD3B6C90BFA2029D7406E5BE899DF49BC1EF1884D31A1A8E6F95A7603C6E81771C0E8773513C1A82CBF027674DAF539064F9FD09D02F2C543BD4530D7F8DA7819BAAFA46E88324ADB2DA3BD5829F3E9591302E1BB06CE06DE5FE71B8755AA77A4C46AE5718A52373334D192C7960F5BBD0CB6D87FA5"
public_key_long = long(hex_cert, 16)
import Crypto.PublicKey.RSA
public_key = Crypto.PublicKey.RSA.construct((public_key_long, exponent))
remote_hash = public_key.encrypt(signature, '')[0][-20:]

uri = "%s?%s" % (url, args)
result = urllib.urlopen(uri, data='').read()
if result == '[]':
    print 'OK: PacketPing returns: %s' % result
    sys.exit(0)
else:
    print 'CRITICAL: PacketPing returns: %s' % result
    sys.exit(2)
    
#print "curl -d '' '%s?%s'" % (url, args)
