Sevral bug fix
[re6stnet.git] / re6st-conf
1 #!/usr/bin/env python
2 import argparse, os, subprocess, sqlite3, sys, xmlrpclib
3 from OpenSSL import crypto
4
5 def main():
6     parser = argparse.ArgumentParser(
7             description='Setup script for re6stnet')
8     _ = parser.add_argument
9     _('--ca-only', action='store_true',
10             help='To only get CA form server')
11     _('--server', required=True,
12             help='Address of the server delivering certifiactes')
13     _('--port', required=True, type=int,
14             help='Port to which connect on the server')
15     _('-d', '--dir', default='/etc/re6stnet',
16             help='Directory where the key and certificate will be stored')
17     _('-r', '--req', nargs=2, action='append',
18             help='Name and value of certificate request additional arguments')
19     _('--email', help='Your email address')
20     _('--token', help='The token you received')
21     config = parser.parse_args()
22     ca_path = os.path.join(config.dir, 'ca.pem')
23     cert_path = os.path.join(config.dir, 'cert.crt')
24     key_path = os.path.join(config.dir, 'cert.key')
25
26     # Establish connection with server
27     s = xmlrpclib.ServerProxy('http://%s:%u' % (config.server, config.port))
28
29     # Get CA
30     ca = s.getCa()
31     with open(ca_path, 'w') as f:
32         f.write(ca)
33
34     if config.ca_only:
35         sys.exit(0)
36
37     # Get token
38     if not config.token:
39         if not config.email:
40             config.email = raw_input('Please enter your email address : ')
41         _ = s.requestToken(config.email)
42         config.token = raw_input('Please enter your token : ')
43
44     # Generate key and cert request
45     pkey = crypto.PKey()
46     pkey.generate_key(crypto.TYPE_RSA, 2048)
47     key = crypto.dump_privatekey(crypto.FILETYPE_PEM, pkey)
48
49     req = crypto.X509Req()
50     subj = req.get_subject()
51     if config.req:
52         for arg in config.req:
53             setattr(subj, arg[0], arg[1])
54     req.set_pubkey(pkey)
55     req.sign(pkey, 'sha1')
56     req = crypto.dump_certificate_request(crypto.FILETYPE_PEM, req)
57
58     # Get certificate
59     cert = s.requestCertificate(config.token, req)
60
61     # Store cert and key
62     with open(key_path, 'w') as f:
63         f.write(key)
64     with open(cert_path, 'w') as f:
65         f.write(cert)
66
67     # Generating dh file
68     if not os.access(os.path.join(config.dir, 'dh2048.pem'), os.F_OK):
69         subprocess.call(['openssl', 'dhparam', '-out', os.path.join(config.dir, 'dh2048.pem'), '2048'])
70
71     print "Certificate setup complete."
72
73     network = utils.networkFromCa(ca_path)
74     internal_ip, prefix = utils.ipFromCert(network, cert_path)
75     print "Your re6st ip : %s" % internal_ip
76     print "Your prefix : %s" % prefix
77
78 if __name__ == "__main__":
79     main()