Merge pull request #22 from kuba/setuptools-script

Setuptools magic
This commit is contained in:
James Kasten 2014-11-19 11:39:33 -08:00
commit 74994a36c4
8 changed files with 155 additions and 137 deletions

3
.gitignore vendored
View file

@ -1,2 +1,5 @@
*.pyc
*.egg-info
build/
dist/
m3

View file

@ -1 +1,6 @@
recursive-include letsencrypt/ *
recursive-include letsencrypt *.json
recursive-include letsencrypt *.sh
recursive-include letsencrypt *.conf
recursive-include letsencrypt *.cnf
include letsencrypt/client/ca_offerings
include letsencrypt/client/.ca_offerings

View file

@ -6,32 +6,34 @@ This code intended for testing, demonstration, and integration engineering
with OSes and hosting platforms. Currently the code works with Linux and
Apache, though we will be expanding it to other platforms.
## Running the demo code on Ubuntu
## Running the demo code on Ubuntu
`sudo apt-get install python-pip python-crypto python-dev python-jsonschema python-augeas gcc python-m2crypto python-dialog`
`sudo apt-get install python python-setuptools python-dev python-augeas gcc`
`sudo pip install jose`
`python setup.py install --user`
`sudo ./letsencrypt.py`
`sudo ./letsencrypt.py` (or `~/.local/bin/letsencrypt`)
Hint: on Debian testing/unstable, python-dialog is unavailable and you may
need to do `sudo pip install python2-pythondialog` (lets-encrypt does not yet
handle debian unstable's Apache2 conf layout, either...)
Note, that letsencrypt does not yet handle Debian unstable's Apache2
conf layout.
## Developing
`python setup.py develop --user`
## Command line usage
```
sudo ./letsencrypt.py (default authentication mode using pythondialog) options
sudo ./letsencrypt.py (default authentication mode using pythondialog) options
--text (text mode)
--privkey= (specify privatekey file to use to generate the certificate)
--csr= (Use a specific CSR. If this is specified, privkey must also be specified with the correct private key for the CSR)
--text (text mode)
--privkey= (specify privatekey file to use to generate the certificate)
--csr= (Use a specific CSR. If this is specified, privkey must also be specified with the correct private key for the CSR)
--server (list the ACME CA server address)
--revoke (revoke a certificate)
--view-checkpoints (Used to view available checkpoints and see what configuration changes have been made)
--rollback=X (Revert the configuration X number of checkpoints)
--redirect (Automatically redirect all HTTP traffic to HTTPS for the newly authenticated vhost)
--rollback=X (Revert the configuration X number of checkpoints)
--redirect (Automatically redirect all HTTP traffic to HTTPS for the newly authenticated vhost)
--no-redirect (Skip the HTTPS redirect question, allowing both HTTP and HTTPS)
--agree-eula (Skip the end user agreement screen)
```

View file

@ -1,121 +0,0 @@
#!/usr/bin/env python
# This file parses the command line and calls the appropriate functions
import getopt
import os
import sys
from letsencrypt.client import client
from letsencrypt.client import display
from letsencrypt.client.CONFIG import ACME_SERVER
def main():
# Check to make sure user is root
if not os.geteuid() == 0:
sys.exit("\nOnly root can run letsencrypt.\n")
# Parse options
try:
opts, args = getopt.getopt(sys.argv[1:], "", ["text", "test",
"view-checkpoints",
"privkey=", "csr=",
"server=", "rollback=",
"revoke", "agree-eula",
"redirect",
"no-redirect",
"help"])
except getopt.GetoptError as err:
# print help info and exit
print str(err)
usage()
sys.exit(2)
server = None
csr = None
privkey = None
curses = True
names = args
flag_revoke = False
redirect = None
eula = False
for o, a in opts:
if o == "--text":
curses = False
elif o == "--csr":
csr = a
elif o == "--privkey":
privkey = a
elif o == "--server":
server = a
elif o == "--rollback":
from letsencrypt.client import configurator, logger
logger.setLogger(logger.FileLogger(sys.stdout))
logger.setLogLevel(logger.INFO)
config = configurator.Configurator()
config.rollback_checkpoints(a)
config.restart()
sys.exit(0)
elif o == "--view-checkpoints":
from letsencrypt.client import configurator, logger
logger.setLogger(logger.FileLogger(sys.stdout))
logger.setLogLevel(logger.INFO)
config = configurator.Configurator()
config.display_checkpoints()
sys.exit(0)
elif o == "--revoke":
# Do Stuff
flag_revoke = True
elif o == "--redirect":
redirect = True
elif o == "--no-redirect":
redirect = False
elif o == "--agree-eula":
eula = True
elif o == "--help":
print_options()
elif o == "--test":
#put any temporary tests in here
continue
if curses:
display.setDisplay(display.NcursesDisplay())
else:
display.setDisplay(display.FileDisplay(sys.stdout))
if not server:
server = ACME_SERVER
c = client.Client(server, csr, privkey, curses)
if flag_revoke:
c.list_certs_keys()
else:
c.authenticate(args, redirect, eula)
def usage():
s = "Available options: --text, --privkey=, --csr=, --server=, "
s += "--rollback=, --view-checkpoints, --revoke, --agree-eula, --redirect,"
s += " --no-redirect, --help"
print s
def print_options():
print "\nsudo ./letsencrypt.py (default authentication mode using pythondialog)"
options = [ "privkey= (specify privatekey file to use to generate the certificate)",
"csr= (Use a specific CSR. If this is specified, privkey " +
"must also be specified with the correct private key for the CSR)",
"server (list the ACME CA server address)",
"revoke (revoke a certificate)",
"view-checkpoints (Used to view available checkpoints and " +
"see what configuration changes have been made)",
"rollback=X (Revert the configuration X number of checkpoints)",
"redirect (Automatically redirect all HTTP traffic to " +
"HTTPS for the newly authenticated vhost)",
"no-redirect (Skip the HTTPS redirect question, " +
"allowing both HTTP and HTTPS)",
"agree-eula (Skip the end user agreement screen)" ]
for o in options:
print " --%s" % o
sys.exit(0)
if __name__ == "__main__":
main()

1
letsencrypt.py Symbolic link
View file

@ -0,0 +1 @@
letsencrypt/scripts/main.py

View file

@ -4,8 +4,10 @@
# validate JSON objects as ACME protocol messages
import json, jsonschema
import pkg_resources
schemata = {schema: json.load(open("letsencrypt/client/schemata/%s.json" % schema)) for schema in [
schemata = {schema: json.load(open(pkg_resources.resource_filename(
__name__, "schemata/%s.json" % schema))) for schema in [
"authorization", "authorizationRequest", "certificate", "certificateRequest",
"challenge", "challengeRequest", "defer", "error", "revocation",
"revocationRequest", "statusRequest"]

View file

121
letsencrypt/scripts/main.py Executable file
View file

@ -0,0 +1,121 @@
#!/usr/bin/env python
# This file parses the command line and calls the appropriate functions
import getopt
import os
import sys
from letsencrypt.client import client
from letsencrypt.client import display
from letsencrypt.client.CONFIG import ACME_SERVER
def main():
# Check to make sure user is root
if not os.geteuid() == 0:
sys.exit("\nOnly root can run letsencrypt.\n")
# Parse options
try:
opts, args = getopt.getopt(sys.argv[1:], "", ["text", "test",
"view-checkpoints",
"privkey=", "csr=",
"server=", "rollback=",
"revoke", "agree-eula",
"redirect",
"no-redirect",
"help"])
except getopt.GetoptError as err:
# print help info and exit
print str(err)
usage()
sys.exit(2)
server = None
csr = None
privkey = None
curses = True
names = args
flag_revoke = False
redirect = None
eula = False
for o, a in opts:
if o == "--text":
curses = False
elif o == "--csr":
csr = a
elif o == "--privkey":
privkey = a
elif o == "--server":
server = a
elif o == "--rollback":
from letsencrypt.client import configurator, logger
logger.setLogger(logger.FileLogger(sys.stdout))
logger.setLogLevel(logger.INFO)
config = configurator.Configurator()
config.rollback_checkpoints(a)
config.restart()
sys.exit(0)
elif o == "--view-checkpoints":
from letsencrypt.client import configurator, logger
logger.setLogger(logger.FileLogger(sys.stdout))
logger.setLogLevel(logger.INFO)
config = configurator.Configurator()
config.display_checkpoints()
sys.exit(0)
elif o == "--revoke":
# Do Stuff
flag_revoke = True
elif o == "--redirect":
redirect = True
elif o == "--no-redirect":
redirect = False
elif o == "--agree-eula":
eula = True
elif o == "--help":
print_options()
elif o == "--test":
#put any temporary tests in here
continue
if curses:
display.setDisplay(display.NcursesDisplay())
else:
display.setDisplay(display.FileDisplay(sys.stdout))
if not server:
server = ACME_SERVER
c = client.Client(server, csr, privkey, curses)
if flag_revoke:
c.list_certs_keys()
else:
c.authenticate(args, redirect, eula)
def usage():
s = "Available options: --text, --privkey=, --csr=, --server=, "
s += "--rollback=, --view-checkpoints, --revoke, --agree-eula, --redirect,"
s += " --no-redirect, --help"
print s
def print_options():
print "\nsudo ./letsencrypt.py (default authentication mode using pythondialog)"
options = [ "privkey= (specify privatekey file to use to generate the certificate)",
"csr= (Use a specific CSR. If this is specified, privkey " +
"must also be specified with the correct private key for the CSR)",
"server (list the ACME CA server address)",
"revoke (revoke a certificate)",
"view-checkpoints (Used to view available checkpoints and " +
"see what configuration changes have been made)",
"rollback=X (Revert the configuration X number of checkpoints)",
"redirect (Automatically redirect all HTTP traffic to " +
"HTTPS for the newly authenticated vhost)",
"no-redirect (Skip the HTTPS redirect question, " +
"allowing both HTTP and HTTPS)",
"agree-eula (Skip the end user agreement screen)" ]
for o in options:
print " --%s" % o
sys.exit(0)
if __name__ == "__main__":
main()

View file

@ -1,5 +1,7 @@
#!/usr/bin/env python
from setuptools import setup
setup(
name="letsencrypt",
version="0.1",
@ -10,6 +12,7 @@ setup(
packages=[
'letsencrypt',
'letsencrypt.client',
'letsencrypt.scripts',
],
install_requires=[
#'dialog',
@ -23,7 +26,9 @@ setup(
],
entry_points={
'console_scripts': [
'letsencrypt = letsencrypt.client.client:authenticate'
'letsencrypt = letsencrypt.scripts.main:main'
]
},
zip_safe=False,
include_package_data=True,
)