initial version
This commit is contained in:
68
jconf
Normal file
68
jconf
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
# JConf, a JupyterHub user manager. Manages system users and links them with jupyterhub accounts.
|
||||||
|
# Version 0.1 - 24th Nov, 2025
|
||||||
|
# MIT Licensed, by The Grammer Society
|
||||||
|
|
||||||
|
|
||||||
|
# required options:
|
||||||
|
# setup: must be run after downloaded. Will create a new venv in /opt, installs jupyterhub, lab and notebook. Checks if npm is installed, then installs configurable http server, installs itself to /usr/bin. Installs service file, enables and starts it. Adds root to admins.
|
||||||
|
# adduser: creates a system user, asks for password, calls jupyterhub api to create a new user, adds penv to user, su user, penv init and penv creates a default environment. Also copy some instructions in readme file.
|
||||||
|
# deluser: deletes jupyterhub user, deletes user home, deletes user profile from system.
|
||||||
|
# start: starts the server, systemd call
|
||||||
|
# stop: stops the server, systemd call
|
||||||
|
|
||||||
|
title() {
|
||||||
|
echo "JConf: JupyterHub Configuration Manager."
|
||||||
|
}
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
echo "Must run as root."
|
||||||
|
echo "Usage: jconf <command> <args>"
|
||||||
|
echo ""
|
||||||
|
echo "User Management Commands:"
|
||||||
|
echo " - adduser <name>"
|
||||||
|
echo " - deluser <name>"
|
||||||
|
echo " - listusers"
|
||||||
|
echo ""
|
||||||
|
echo "Server Management Commands:"
|
||||||
|
echo " - start"
|
||||||
|
echo " - stop"
|
||||||
|
echo " - install"
|
||||||
|
echo " - uninstall"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if [ "$#" -lt 1 ]; then
|
||||||
|
title
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
cmd=$1
|
||||||
|
case "$cmd" in
|
||||||
|
adduser)
|
||||||
|
echo
|
||||||
|
;;
|
||||||
|
deluser)
|
||||||
|
echo
|
||||||
|
;;
|
||||||
|
listusers)
|
||||||
|
echo
|
||||||
|
;;
|
||||||
|
start)
|
||||||
|
echo
|
||||||
|
;;
|
||||||
|
stop)
|
||||||
|
echo
|
||||||
|
;;
|
||||||
|
install)
|
||||||
|
echo
|
||||||
|
;;
|
||||||
|
uninstall)
|
||||||
|
echo
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo
|
||||||
|
;;
|
||||||
|
esac
|
||||||
218
penv
Executable file
218
penv
Executable file
@@ -0,0 +1,218 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# PEnv, dead simple python venv manager. Handles creating the env and installing the jupyter spec.
|
||||||
|
# Version 0.1 - 20th Nov, 2025
|
||||||
|
# MIT Licensed, by The Grammer Society
|
||||||
|
|
||||||
|
# Issues:
|
||||||
|
# names are fully lower case when installed as jupyterhub spec. convert name to lower case when deleting an env.
|
||||||
|
# when uninstalling, remove any jupyter specs. iterate through envs in .env, call jspec remove name.
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
echo ""
|
||||||
|
echo "Usage: penv <command> <args>"
|
||||||
|
echo "Commands:"
|
||||||
|
echo " - new <name> <opt:version> - Create a new environment, optional, defaults to system's default python"
|
||||||
|
echo " ex: penv new tools 3.13 -> creates new environment by the name tools, using Python 3.13"
|
||||||
|
echo " ex: penv new main -> creates new env with the name main, using the default Python version on the system"
|
||||||
|
echo " - del <name> - Delete existing environment"
|
||||||
|
# echo " - setdef <name> - Use an existing environment as the default kernel"
|
||||||
|
echo " - activate <name> - Activates an existing environment (depricated, use pact)"
|
||||||
|
echo " - list - List available environments"
|
||||||
|
echo " - install - Initialize user's profile"
|
||||||
|
echo " - uninstall - Remove ALL the environments installed using PENV"
|
||||||
|
echo " - help - Print this message"
|
||||||
|
echo
|
||||||
|
echo "Aliases:"
|
||||||
|
echo " - new -> mk"
|
||||||
|
echo " - del -> rm"
|
||||||
|
# echo " - setdef -> sd"
|
||||||
|
echo " - activate -> ac, act"
|
||||||
|
echo " - list -> ls"
|
||||||
|
}
|
||||||
|
|
||||||
|
title(){
|
||||||
|
echo "PEnv: Python Environment Manager for Local Jupyter Instances"
|
||||||
|
}
|
||||||
|
|
||||||
|
create(){
|
||||||
|
name=$1
|
||||||
|
vers=$2
|
||||||
|
if [[ -z "$name" ]]; then
|
||||||
|
echo Provide a name for the environment
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
if [[ -d "$HOME/.envs/$name" ]]; then
|
||||||
|
echo Environment \"$name\" already exists.
|
||||||
|
exit 4
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -z "$vers" ]]; then
|
||||||
|
if [ ! -f /usr/bin/python3 ]; then
|
||||||
|
echo "Base python3 not found on your system. Install it using your package manager"
|
||||||
|
exit 3
|
||||||
|
fi
|
||||||
|
vers=`/usr/bin/python3 -V | cut -d " " -f 2 | cut -d "." -f 1,2`
|
||||||
|
echo "No version mentioned, using Python $vers"
|
||||||
|
fi
|
||||||
|
if [ ! -f /usr/bin/python$vers ]; then
|
||||||
|
echo "Python $vers not installed on system."
|
||||||
|
exit 7
|
||||||
|
fi
|
||||||
|
mkdir -p $HOME/.envs
|
||||||
|
/usr/bin/python$vers -m venv $HOME/.envs/$name
|
||||||
|
source $HOME/.envs/$name/bin/activate
|
||||||
|
python -m pip install ipykernel ipywidgets > /dev/stderr
|
||||||
|
python -m ipykernel install --user --name $name > /dev/stderr
|
||||||
|
echo
|
||||||
|
echo "Created \"$name\". It should be available as a Jupyter Kernel."
|
||||||
|
echo "Use \"pact $name\" to activate in command line."
|
||||||
|
deactivate
|
||||||
|
}
|
||||||
|
|
||||||
|
delete(){
|
||||||
|
name=$1
|
||||||
|
if [ ! -d "$HOME/.envs/$name" ]; then
|
||||||
|
echo "Environment \"$name\" not found"
|
||||||
|
exit 5
|
||||||
|
fi
|
||||||
|
if [[ "$VIRTUAL_ENV" == "$HOME/.envs/$name" ]]; then
|
||||||
|
echo "Env still active, deactivate it before removing it."
|
||||||
|
echo "Run \"deactivate\" to deactivate it"
|
||||||
|
exit 6
|
||||||
|
fi
|
||||||
|
read -n 1 -p "Remove environment $name (y/N)? " choise
|
||||||
|
case $choise in
|
||||||
|
[yY])
|
||||||
|
source $HOME/.envs/$name/bin/activate
|
||||||
|
echo
|
||||||
|
echo Spec `jupyter-kernelspec remove -f -y $name`
|
||||||
|
deactivate
|
||||||
|
rm -r "$HOME/.envs/$name"
|
||||||
|
echo "Data Removed $HOME/.envs/$name"
|
||||||
|
;;
|
||||||
|
[nN])
|
||||||
|
echo ""
|
||||||
|
echo "Cancelled"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo ""
|
||||||
|
echo "Invalid input"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# setdef() {
|
||||||
|
# name=$1
|
||||||
|
# if [ ! -d "$HOME/.envs/$name" ]; then
|
||||||
|
# echo "Env $name doesn't exist."
|
||||||
|
# exit 9
|
||||||
|
# fi
|
||||||
|
# source $HOME/.envs/$name/bin/activate
|
||||||
|
# python -m ipykernel install --user
|
||||||
|
# deactivate
|
||||||
|
# }
|
||||||
|
|
||||||
|
activate() {
|
||||||
|
echo Use \"pact $1\"
|
||||||
|
}
|
||||||
|
|
||||||
|
list(){
|
||||||
|
if [ ! -d "$HOME/.envs" ]; then
|
||||||
|
echo "PENV not initialized. Run \"penv init\""
|
||||||
|
exit 8
|
||||||
|
fi
|
||||||
|
ls $HOME/.envs
|
||||||
|
}
|
||||||
|
|
||||||
|
install() {
|
||||||
|
if [[ $(realpath "$0") == "$HOME/.local/bin/penv" ]]; then
|
||||||
|
echo PENV already installed
|
||||||
|
exit 10
|
||||||
|
fi
|
||||||
|
cp $(realpath "$0") $HOME/.local/bin/
|
||||||
|
mkdir -p $HOME/.envs/
|
||||||
|
echo "
|
||||||
|
pact () {
|
||||||
|
if [[ -z \"\$1\" ]]; then
|
||||||
|
echo \"Usage: pact \<name\>\"
|
||||||
|
return;
|
||||||
|
fi;
|
||||||
|
if [ ! -d \"\$HOME/.envs/\$1\" ]; then
|
||||||
|
echo \"Env \$1 not found\"
|
||||||
|
return;
|
||||||
|
fi
|
||||||
|
. \$HOME/.envs/\$1/bin/activate
|
||||||
|
}
|
||||||
|
" > $HOME/.envs/.penv.funcs
|
||||||
|
grep -qxF "source \$HOME/.envs/.penv.funcs" $HOME/.bashrc || echo "source \$HOME/.envs/.penv.funcs" >> $HOME/.bashrc
|
||||||
|
echo "Initialized PENV. Restart the shell"
|
||||||
|
}
|
||||||
|
|
||||||
|
uninstall() {
|
||||||
|
if [[ ! -z "$VIRTUAL_ENV" ]]; then
|
||||||
|
echo "Deactivate the existing environment before uninstalling"
|
||||||
|
exit 11
|
||||||
|
fi
|
||||||
|
read -n 1 -p "REALLY UNINSTALL ALL THE ENVIRONMENTS?(y/N) " ans
|
||||||
|
case $ans in
|
||||||
|
[yY])
|
||||||
|
echo
|
||||||
|
;;
|
||||||
|
[nN])
|
||||||
|
echo
|
||||||
|
echo "Cancelled"
|
||||||
|
return;
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo
|
||||||
|
echo "Invalid response"
|
||||||
|
return;
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
sed -i "/source \$HOME\/.envs\/.penv.funcs/d" $HOME/.bashrc
|
||||||
|
rm -r $HOME/.envs
|
||||||
|
rm $HOME/.local/bin/penv
|
||||||
|
echo "Uninstalled PENV"
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ "$#" -lt 1 ]; then
|
||||||
|
title
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
cmd=$1
|
||||||
|
|
||||||
|
case "$cmd" in
|
||||||
|
new|mk)
|
||||||
|
create $2 $3
|
||||||
|
;;
|
||||||
|
del|rm)
|
||||||
|
delete $2
|
||||||
|
;;
|
||||||
|
# setdef|sd)
|
||||||
|
# setdef $2
|
||||||
|
# ;;
|
||||||
|
act|ac)
|
||||||
|
activate $2
|
||||||
|
;;
|
||||||
|
list|ls)
|
||||||
|
list
|
||||||
|
;;
|
||||||
|
help)
|
||||||
|
title
|
||||||
|
usage
|
||||||
|
;;
|
||||||
|
install)
|
||||||
|
install
|
||||||
|
;;
|
||||||
|
uninstall)
|
||||||
|
uninstall
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "invalid command: \"$1\"" >&2
|
||||||
|
echo $SCRIPT
|
||||||
|
usage
|
||||||
|
;;
|
||||||
|
esac
|
||||||
Reference in New Issue
Block a user