Commit 8e3ac372 authored by Xavier Thompson's avatar Xavier Thompson

software/jupyter: Simplify password generation

parent ec1eba0b
...@@ -15,19 +15,15 @@ ...@@ -15,19 +15,15 @@
[instance] [instance]
filename = instance.cfg.in filename = instance.cfg.in
md5sum = 13fcabee7821bc4cdda2f99e4190be73 md5sum = f33fc954eba47b5ddbebc72c453304e3
[instance-jupyter] [instance-jupyter]
filename = instance-jupyter.cfg.in filename = instance-jupyter.cfg.in
md5sum = 521d5a742d5304a6f88c000db28d6e28 md5sum = 9340498841caa5771f40f8c9e561eacd
[jupyter-notebook-config] [jupyter-notebook-config]
filename = jupyter_notebook_config.py.jinja filename = jupyter_notebook_config.py.jinja
md5sum = 4514df152740dbd7990da9705f40e978 md5sum = 6e01da7d35c1d65d4a450b0f011b296d
[jupyter-set-password]
filename = jupyter_set_password.cgi.jinja
md5sum = b8d31441780b524a7e52d1710dd78385
[erp5-kernel] [erp5-kernel]
filename = ERP5kernel.py filename = ERP5kernel.py
......
...@@ -3,8 +3,6 @@ ...@@ -3,8 +3,6 @@
[buildout] [buildout]
parts = parts =
instance instance
jupyter_notebook
read-knowledge0
publish-connection-parameter publish-connection-parameter
jupyter-notebook-config jupyter-notebook-config
erp5-kernel erp5-kernel
...@@ -91,13 +89,17 @@ environment = ...@@ -91,13 +89,17 @@ environment =
JUPYTER_RUNTIME_DIR=${directory:jupyter_runtime_dir} JUPYTER_RUNTIME_DIR=${directory:jupyter_runtime_dir}
LANG=C.UTF-8 LANG=C.UTF-8
[jupyter-password]
recipe = slapos.cookbook:generate.password
bytes = 10
[jupyter-notebook-config] [jupyter-notebook-config]
<= dynamic-jinja2-template-base <= dynamic-jinja2-template-base
template = {{ jupyter_config_location }}/{{ jupyter_config_filename }} template = {{ jupyter_config_location }}/{{ jupyter_config_filename }}
rendered = ${directory:jupyter_config_dir}/jupyter_notebook_config.py rendered = ${directory:jupyter_config_dir}/jupyter_notebook_config.py
mode = 0744 mode = 0744
context = context =
raw config_cfg ${buildout:directory}/knowledge0.cfg key password jupyter-password:passwd
raw gcc_location {{ gcc_location }} raw gcc_location {{ gcc_location }}
raw cythonplus_repository {{ cythonplus_repository }} raw cythonplus_repository {{ cythonplus_repository }}
...@@ -119,18 +121,6 @@ jupyter_custom_dir = ${:jupyter_config_dir}/custom ...@@ -119,18 +121,6 @@ jupyter_custom_dir = ${:jupyter_config_dir}/custom
jupyter_nbextensions_dir = ${:jupyter_dir}/nbextensions jupyter_nbextensions_dir = ${:jupyter_dir}/nbextensions
erp5_kernel_dir = ${:jupyter_kernel_dir}/ERP5 erp5_kernel_dir = ${:jupyter_kernel_dir}/ERP5
[jupyter_notebook]
# This part is called like this because knowledge0.write uses the part name for
# the section name in the config file.
recipe = slapos.cookbook:zero-knowledge.write
password =
filename = knowledge0.cfg
[read-knowledge0]
recipe = slapos.cookbook:zero-knowledge.read
filename = knowledge0.cfg
password =
[request-slave-frontend-base] [request-slave-frontend-base]
recipe = slapos.cookbook:requestoptional recipe = slapos.cookbook:requestoptional
server-url = ${slap-connection:server-url} server-url = ${slap-connection:server-url}
...@@ -178,7 +168,7 @@ monitor-base-url = ${monitor-frontend-promise:url} ...@@ -178,7 +168,7 @@ monitor-base-url = ${monitor-frontend-promise:url}
# cors-domains = softinstXXXXX.host.vifib.net (or equivalent) # cors-domains = softinstXXXXX.host.vifib.net (or equivalent)
# interface-url = https://softinstXXXXX.host.vifib.net/erp5/web_site_module/monitoring_rjs_unsafe # interface-url = https://softinstXXXXX.host.vifib.net/erp5/web_site_module/monitoring_rjs_unsafe
instance-configuration = instance-configuration =
raw jupyter-password ${read-knowledge0:password} raw jupyter-password ${jupyter-password:passwd}
[publish-connection-parameter] [publish-connection-parameter]
recipe = slapos.cookbook:publish.serialised recipe = slapos.cookbook:publish.serialised
...@@ -190,7 +180,7 @@ jupyter-classic-url-additional = ${request-slave-frontend-additional:connection- ...@@ -190,7 +180,7 @@ jupyter-classic-url-additional = ${request-slave-frontend-additional:connection-
url-additional = ${:jupyter-classic-url-additional} url-additional = ${:jupyter-classic-url-additional}
jupyterlab-url-additional = ${request-slave-frontend-additional:connection-secure_access}/lab jupyterlab-url-additional = ${request-slave-frontend-additional:connection-secure_access}/lab
{% endif %} {% endif %}
password = ${read-knowledge0:password} password = ${jupyter-password:passwd}
[erp5-kernel] [erp5-kernel]
recipe = slapos.cookbook:symbolic.link recipe = slapos.cookbook:symbolic.link
......
...@@ -34,8 +34,6 @@ context = ...@@ -34,8 +34,6 @@ context =
raw python_executable ${jupyter:python_executable} raw python_executable ${jupyter:python_executable}
raw jupyter_config_location ${jupyter-notebook-config:location} raw jupyter_config_location ${jupyter-notebook-config:location}
raw jupyter_config_filename ${jupyter-notebook-config:filename} raw jupyter_config_filename ${jupyter-notebook-config:filename}
raw jupyter_set_password_location ${jupyter-set-password:location}
raw jupyter_set_password_filename ${jupyter-set-password:filename}
raw erp5_kernel_location ${erp5-kernel:location} raw erp5_kernel_location ${erp5-kernel:location}
raw erp5_kernel_filename ${erp5-kernel:filename} raw erp5_kernel_filename ${erp5-kernel:filename}
raw kernel_json_location ${kernel-json:location} raw kernel_json_location ${kernel-json:location}
......
...@@ -3,39 +3,12 @@ ...@@ -3,39 +3,12 @@
things. It is run by IPython hence why it can use functions like get_config(). things. It is run by IPython hence why it can use functions like get_config().
''' '''
import configparser import configparser
import random
from notebook.auth import passwd from notebook.auth import passwd
import os import os
def random_password(length = 10):
result = ""
for i in range(0, length):
result = result + chr(random.randint(0, 25) + ord('a'))
return result
knowledge_0 = '{{ config_cfg }}'
if not os.path.exists(knowledge_0):
print("Your software does <b>not</b> embed 0-knowledge. \
This interface is useless in this case</body></html>")
exit(0)
c = get_config() c = get_config()
parser = configparser.ConfigParser() c.NotebookApp.password = passwd("{{ password }}")
parser.read(knowledge_0)
if not parser.has_section("jupyter_notebook"):
parser.add_section("jupyter_notebook")
if not parser.has_option("jupyter_notebook", "password") or \
parser.get("jupyter_notebook", "password") == "":
parser.set("jupyter_notebook", "password", random_password())
c.NotebookApp.password = passwd(parser.get("jupyter_notebook", "password"))
with open(knowledge_0, 'w') as file:
parser.write(file)
os.environ['PATH'] = "{{ gcc_location }}/bin" + os.pathsep + os.environ['PATH'] os.environ['PATH'] = "{{ gcc_location }}/bin" + os.pathsep + os.environ['PATH']
os.environ['PYTHONPATH'] = "{{ cythonplus_repository }}" + os.pathsep + os.environ['PYTHONPATH'] os.environ['PYTHONPATH'] = "{{ cythonplus_repository }}" + os.pathsep + os.environ['PYTHONPATH']
#!{{ python_executable }}
import cgi
import cgitb
import ConfigParser
import os
import re
import subprocess
from IPython.lib import passwd
#cgitb.enable(display=0, logdir="/tmp/cgi.log")
cgitb.enable()
form = cgi.FieldStorage()
config_file = "{{ config_cfg }}"
if not os.path.exists(config_file):
print "Your software does <b>not</b> embed 0-knowledge. \
This interface is useless in this case</body></html>"
exit(0)
parser = ConfigParser.ConfigParser()
parser.read(config_file)
if not parser.has_section("jupyter_notebook"):
parser.add_section("jupyter_notebook")
if not parser.has_option("jupyter_notebook", "password"):
parser.set("jupyter_notebook", "password", "")
if "password" in form:
parser.set("jupyter_notebook", "password", passwd(form["password"].value))
# subprocess.call('{{ httpd_graceful }}')
# TODO: we should restart jupyter
with open(config_file, 'w') as file:
parser.write(file)
# TODO cleanup
print "<html><head>"
print "<link rel=\"stylesheet\" href=\"static/pure-min.css\">"
print "<link rel=\"stylesheet\" href=\"static/style.css\">"
print "</head><body>"
print "<h1>Jupyter Notebook Password :</h1>"
print "<form action=\"/index.cgi\" method=\"post\" class=\"pure-form-aligned\">"
print "<input type=\"hidden\" name=\"posting-script\" value=\"{{ pwd }}/{{ this_file }}\">"
print """<div class="pure-control-group">
<label for="password">Password*:</label>
<input placeholder="Set your password" type="password" name="password" id="password"></br>
</div><div class="pure-control-group">
<label for="password">Verify Password*:</label>
<input placeholder="Verify password" type="password" name="password_2" id="password_2"></br>
</div><p id="validate-status" style="color:red"></p>
<div class="pure-controls">
<button id="register-button" type="submit" class="pure-button pure-button-primary" disabled>Access</button></div>
</form>
<script type="text/javascript" src="static/jquery-1.10.2.min.js"></script>
<script type="text/javascript" src="static/monitor-register.js"></script>
</body></html>
"""
...@@ -31,9 +31,6 @@ mode = 0644 ...@@ -31,9 +31,6 @@ mode = 0644
[jupyter-notebook-config] [jupyter-notebook-config]
<= download-file-base <= download-file-base
[jupyter-set-password]
<= download-file-base
[erp5-kernel] [erp5-kernel]
<= download-file-base <= download-file-base
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment