fe92a6
#!/usr/bin/python
fe92a6
# -*- coding: utf-8 -*-
fe92a6
fe92a6
import os
108032
import pwd
fe92a6
import sys
fe92a6
import optparse
fe92a6
import urlparse
fe92a6
import requests
fe92a6
fe92a6
from getpass import getpass
fe92a6
fe92a6
from centos import CentOSUserCert
fe92a6
from centos import defaults
fe92a6
6d79d7
c8d20e
def download_cert(username, password, topurl=None):
fe92a6
    if not topurl:
fe92a6
        topurl = defaults.FAS_TOPURL
fe92a6
fe92a6
    splittopurl = urlparse.urlsplit(topurl)
fe92a6
fe92a6
    usercertpath = os.path.join(splittopurl.path, 'user/dogencert')
6d79d7
    params = {'user_name': username, 'password': password, 'login': 'Login'}
fe92a6
fe92a6
    userspliturl = urlparse.SplitResult(splittopurl.scheme,
fe92a6
                                        splittopurl.netloc,
fe92a6
                                        usercertpath,
fe92a6
                                        None,
fe92a6
                                        None)
fe92a6
108032
    servercapath = os.path.join(splittopurl.path, 'ca/ca-cert.pem')
fe92a6
    servercaspliturl = urlparse.SplitResult(splittopurl.scheme,
fe92a6
                                            splittopurl.netloc,
fe92a6
                                            servercapath,
fe92a6
                                            None,
fe92a6
                                            None)
fe92a6
fe92a6
    userurl = urlparse.urlunsplit(userspliturl)
fe92a6
    servercaurl = urlparse.urlunsplit(servercaspliturl)
fe92a6
fe92a6
    with open(os.path.expanduser(defaults.USER_CERT_FILE), 'w') as usercertfile:
137162
        r = requests.post(userurl, params=params)
137162
        try:
137162
            r.raise_for_status()
137162
        except requests.exceptions.HTTPError as e:
7948a5
            print("""Could not generate certificate!
7948a5
Response Code: {0}
7948a5
Message: {1}""".format(e.response.status_code, e.response.reason)).strip()
137162
            sys.exit(1)
108032
137162
        response = r.text
137162
        usercertfile.write(response)
fe92a6
fe92a6
    with open(os.path.expanduser(defaults.SERVER_CA_CERT_FILE), 'w') as servercacertfile:
503aa6
        r = requests.get(servercaurl)
137162
        try:
137162
            r.raise_for_status()
137162
        except requests.exceptions.HTTPError as e:
7948a5
            print("""Could not download CA Certificate!
7948a5
Response Code: {0}
7948a5
Message: {1}""".format(e.response.status_code, e.response.reason)).strip()
137162
            sys.exit(1)
108032
137162
        response = r.text
137162
        servercacertfile.write(response)
fe92a6
108032
    # for now upload-ca.cert is the same as the server-ca cert. let's link them here
108032
    if os.path.exists(os.path.expanduser(defaults.UPLOAD_CA_CERT_FILE)):
108032
        os.unlink(os.path.expanduser(defaults.UPLOAD_CA_CERT_FILE))
108032
108032
    os.symlink(os.path.expanduser(defaults.SERVER_CA_CERT_FILE),
108032
               os.path.expanduser(defaults.UPLOAD_CA_CERT_FILE))
108032
faf598
    os.chmod(os.path.expanduser(defaults.USER_CERT_FILE), 0o600)
faf598
fe92a6
fe92a6
def main(opts):
fe92a6
fe92a6
    if not opts.certfile:
fe92a6
        certfile = defaults.USER_CERT_FILE
fe92a6
    else:
fe92a6
        certfile = opts.certfile
fe92a6
fe92a6
    if opts.username and not opts.verifycert:
fe92a6
        username = opts.username
fe92a6
    else:
fe92a6
        try:
fe92a6
            cert = CentOSUserCert(certfile)
fe92a6
            username = cert.CN
fe92a6
        except IOError, e:
108032
            if opts.verifycert:
108032
                print "{0}: {1}".format(os.path.expanduser(certfile), e.strerror)
108032
                exit(1)
108032
            username = pwd.getpwuid(os.geteuid())[0]
fe92a6
fe92a6
    if opts.verifycert:
fe92a6
        if not cert.valid:
fe92a6
            print "Your certificate is not valid"
fe92a6
            sys.exit(1)
fe92a6
        else:
fe92a6
            print "Your certificate is valid"
fe92a6
            sys.exit(0)
fe92a6
fe92a6
    if opts.newcert:
4ec805
        password = getpass('ACO Password: ')
fe92a6
        download_cert(username, password)
fe92a6
fe92a6
if __name__ == '__main__':
fe92a6
fe92a6
    parser = optparse.OptionParser(usage="%prog [OPTIONS] ")
fe92a6
    parser.add_option('-u', '--username', action='store', dest='username',
0224b4
                      default=False, help="ACO Username.")
fe92a6
    parser.add_option('-n', '--new-cert', action='store_true', dest='newcert',
0224b4
                      default=False, help="Generate a new User Certificate.")
fe92a6
    parser.add_option('-f', '--file', action='store', dest='certfile',
6d79d7
                      default=None, help="User Certificate.")
fe92a6
    parser.add_option('-v', '--verify-cert', action='store_true', dest='verifycert',
6d79d7
                      default=False, help="Verify Certificate.")
6d79d7
    opts, args = parser.parse_args()
fe92a6
108032
    if not opts.newcert and not opts.verifycert:
108032
        print "Must specify one of arguments: -v or -n"
108032
        parser.print_help()
108032
        sys.exit(1)
108032
fe92a6
    main(opts)