from uuid import uuid4
from pecan import jsonify, make_app
+from OpenSSL import crypto
from pecan.rest import RestController
from werkzeug.serving import make_server, make_ssl_devcert
"desc": "List all API keys",
"perm": "rw"
},
+ {
+ "cmd": "restful create-self-signed-cert",
+ "desc": "Create localized self signed certificate",
+ "perm": "rw"
+ },
]
def __init__(self, *args, **kwargs):
self.server = None
+ self.stop_server = False
+ self.serve_event = threading.Event()
+
def serve(self):
- try:
- self._serve()
- except:
- self.log.error(str(traceback.format_exc()))
+ while not self.stop_server:
+ try:
+ self._serve()
+ self.server.socket.close()
+ except:
+ self.log.error(str(traceback.format_exc()))
+
+ # Wait and clear the threading event
+ self.serve_event.wait()
+ self.serve_event.clear()
def get_localized_config(self, key):
r = self.get_config(self.get_mgr_id() + '/' + key)
def shutdown(self):
+ try:
+ self.stop_server = True
+ if self.server:
+ self.server.shutdown()
+ self.serve_event.set()
+ except:
+ self.log.error(str(traceback.format_exc()))
+ raise
+
+
+ def restart(self):
try:
if self.server:
self.server.shutdown()
+ self.serve_event.set()
except:
self.log.error(str(traceback.format_exc()))
self.log.debug("Unhandled notification type '%s'" % notify_type)
+ def create_self_signed_cert(self):
+ # create a key pair
+ pkey = crypto.PKey()
+ pkey.generate_key(crypto.TYPE_RSA, 2048)
+
+ # create a self-signed cert
+ cert = crypto.X509()
+ cert.get_subject().O = "IT"
+ cert.get_subject().CN = "ceph-restful"
+ cert.set_serial_number(int(uuid4()))
+ cert.gmtime_adj_notBefore(0)
+ cert.gmtime_adj_notAfter(10*365*24*60*60)
+ cert.set_issuer(cert.get_subject())
+ cert.set_pubkey(pkey)
+ cert.sign(pkey, 'sha512')
+
+ return (
+ crypto.dump_certificate(crypto.FILETYPE_PEM, cert),
+ crypto.dump_privatekey(crypto.FILETYPE_PEM, pkey)
+ )
+
+
def handle_command(self, command):
self.log.warn("Handling command: '%s'" % str(command))
if command['prefix'] == "restful create-key":
"",
)
+ elif command['prefix'] == "restful create-self-signed-cert":
+ cert, pkey = self.create_self_signed_cert()
+
+ self.set_config(self.get_mgr_id() + '/crt', cert)
+ self.set_config(self.get_mgr_id() + '/key', pkey)
+
+ self.restart()
+ return (
+ 0,
+ "Restarting RESTful API server...",
+ ""
+ )
+
else:
return (
-errno.EINVAL,
DASH_URLS+="http://$IP:$MGR_PORT/"
MGR_PORT=$(($MGR_PORT + 1000))
- CERT=`mktemp`
- PKEY=`mktemp`
- openssl req -new -nodes -x509 \
- -subj "/O=IT/CN=ceph-mgr-restful" \
- -days 3650 -keyout "$PKEY" -out "$CERT" -extensions v3_ca
ceph_adm config-key put mgr/restful/$name/server_addr $IP
ceph_adm config-key put mgr/restful/$name/server_port $MGR_PORT
- ceph_adm config-key put mgr/restful/$name/crt -i $CERT
- ceph_adm config-key put mgr/restful/$name/key -i $PKEY
- rm $CERT $PKEY
RESTFUL_URLS+="https://$IP:$MGR_PORT"
MGR_PORT=$(($MGR_PORT + 1000))
done
SF=`mktemp`
- ceph_adm tell mgr.x restful create-key admin -o $SF
+ ceph_adm tell mgr restful create-self-signed-cert
+ ceph_adm tell mgr restful create-key admin -o $SF
RESTFUL_SECRET=`cat $SF`
rm $SF
}