--- /srv/reproducible-results/rbuild-debian/r-b-build.Fe8T220W/b1/jupyterhub_5.2.1+ds1-4_amd64.changes +++ /srv/reproducible-results/rbuild-debian/r-b-build.Fe8T220W/b2/jupyterhub_5.2.1+ds1-4_amd64.changes ├── Files │ @@ -1,2 +1,2 @@ │ │ - ad17678dc07a20c6f72edba3214a67b0 2021932 python optional jupyterhub_5.2.1+ds1-4_all.deb │ + 2eeaf96bdbe8d65c739320510a5eb956 2022496 python optional jupyterhub_5.2.1+ds1-4_all.deb ├── jupyterhub_5.2.1+ds1-4_all.deb │ ├── file list │ │ @@ -1,3 +1,3 @@ │ │ -rw-r--r-- 0 0 0 4 2025-05-28 09:40:25.000000 debian-binary │ │ --rw-r--r-- 0 0 0 59492 2025-05-28 09:40:25.000000 control.tar.xz │ │ --rw-r--r-- 0 0 0 1962248 2025-05-28 09:40:25.000000 data.tar.xz │ │ +-rw-r--r-- 0 0 0 59496 2025-05-28 09:40:25.000000 control.tar.xz │ │ +-rw-r--r-- 0 0 0 1962808 2025-05-28 09:40:25.000000 data.tar.xz │ ├── control.tar.xz │ │ ├── control.tar │ │ │ ├── ./md5sums │ │ │ │ ├── ./md5sums │ │ │ │ │┄ Files differ │ ├── data.tar.xz │ │ ├── data.tar │ │ │ ├── ./usr/share/jupyterhub/jupyterhub_config.py │ │ │ │ @@ -997,14 +997,842 @@ │ │ │ │ # │ │ │ │ # It should return the new URL to redirect to, or None to preserve current │ │ │ │ # behavior. │ │ │ │ # Default: None │ │ │ │ # c.JupyterHub.user_redirect_hook = None │ │ │ │ │ │ │ │ #------------------------------------------------------------------------------ │ │ │ │ +# Spawner(LoggingConfigurable) configuration │ │ │ │ +#------------------------------------------------------------------------------ │ │ │ │ +## Base class for spawning single-user notebook servers. │ │ │ │ +# │ │ │ │ +# Subclass this, and override the following methods: │ │ │ │ +# │ │ │ │ +# - load_state - get_state - start - stop - poll │ │ │ │ +# │ │ │ │ +# As JupyterHub supports multiple users, an instance of the Spawner subclass is │ │ │ │ +# created for each user. If there are 20 JupyterHub users, there will be 20 │ │ │ │ +# instances of the subclass. │ │ │ │ + │ │ │ │ +## Extra arguments to be passed to the single-user server. │ │ │ │ +# │ │ │ │ +# Some spawners allow shell-style expansion here, allowing you to use │ │ │ │ +# environment variables here. Most, including the default, do not. Consult the │ │ │ │ +# documentation for your spawner to verify! │ │ │ │ +# Default: [] │ │ │ │ +# c.Spawner.args = [] │ │ │ │ + │ │ │ │ +## An optional hook function that you can implement to pass `auth_state` to the │ │ │ │ +# spawner after it has been initialized but before it starts. The `auth_state` │ │ │ │ +# dictionary may be set by the `.authenticate()` method of the authenticator. │ │ │ │ +# This hook enables you to pass some or all of that information to your spawner. │ │ │ │ +# │ │ │ │ +# Example:: │ │ │ │ +# │ │ │ │ +# def userdata_hook(spawner, auth_state): │ │ │ │ +# spawner.userdata = auth_state["userdata"] │ │ │ │ +# │ │ │ │ +# c.Spawner.auth_state_hook = userdata_hook │ │ │ │ +# Default: None │ │ │ │ +# c.Spawner.auth_state_hook = None │ │ │ │ + │ │ │ │ +## The command used for starting the single-user server. │ │ │ │ +# │ │ │ │ +# Provide either a string or a list containing the path to the startup script │ │ │ │ +# command. Extra arguments, other than this path, should be provided via `args`. │ │ │ │ +# │ │ │ │ +# This is usually set if you want to start the single-user server in a different │ │ │ │ +# python environment (with virtualenv/conda) than JupyterHub itself. │ │ │ │ +# │ │ │ │ +# Some spawners allow shell-style expansion here, allowing you to use │ │ │ │ +# environment variables. Most, including the default, do not. Consult the │ │ │ │ +# documentation for your spawner to verify! │ │ │ │ +# Default: ['jupyterhub-singleuser'] │ │ │ │ +# c.Spawner.cmd = ['jupyterhub-singleuser'] │ │ │ │ + │ │ │ │ +## Maximum number of consecutive failures to allow before shutting down │ │ │ │ +# JupyterHub. │ │ │ │ +# │ │ │ │ +# This helps JupyterHub recover from a certain class of problem preventing │ │ │ │ +# launch in contexts where the Hub is automatically restarted (e.g. systemd, │ │ │ │ +# docker, kubernetes). │ │ │ │ +# │ │ │ │ +# A limit of 0 means no limit and consecutive failures will not be tracked. │ │ │ │ +# Default: 0 │ │ │ │ +# c.Spawner.consecutive_failure_limit = 0 │ │ │ │ + │ │ │ │ +## Minimum number of cpu-cores a single-user notebook server is guaranteed to │ │ │ │ +# have available. │ │ │ │ +# │ │ │ │ +# If this value is set to 0.5, allows use of 50% of one CPU. If this value is │ │ │ │ +# set to 2, allows use of up to 2 CPUs. │ │ │ │ +# │ │ │ │ +# **This is a configuration setting. Your spawner must implement support for the │ │ │ │ +# limit to work.** The default spawner, `LocalProcessSpawner`, does **not** │ │ │ │ +# implement this support. A custom spawner **must** add support for this setting │ │ │ │ +# for it to be enforced. │ │ │ │ +# Default: None │ │ │ │ +# c.Spawner.cpu_guarantee = None │ │ │ │ + │ │ │ │ +## Maximum number of cpu-cores a single-user notebook server is allowed to use. │ │ │ │ +# │ │ │ │ +# If this value is set to 0.5, allows use of 50% of one CPU. If this value is │ │ │ │ +# set to 2, allows use of up to 2 CPUs. │ │ │ │ +# │ │ │ │ +# The single-user notebook server will never be scheduled by the kernel to use │ │ │ │ +# more cpu-cores than this. There is no guarantee that it can access this many │ │ │ │ +# cpu-cores. │ │ │ │ +# │ │ │ │ +# **This is a configuration setting. Your spawner must implement support for the │ │ │ │ +# limit to work.** The default spawner, `LocalProcessSpawner`, does **not** │ │ │ │ +# implement this support. A custom spawner **must** add support for this setting │ │ │ │ +# for it to be enforced. │ │ │ │ +# Default: None │ │ │ │ +# c.Spawner.cpu_limit = None │ │ │ │ + │ │ │ │ +## Enable debug-logging of the single-user server │ │ │ │ +# Default: False │ │ │ │ +# c.Spawner.debug = False │ │ │ │ + │ │ │ │ +## The URL the single-user server should start in. │ │ │ │ +# │ │ │ │ +# `{username}` will be expanded to the user's username │ │ │ │ +# │ │ │ │ +# Example uses: │ │ │ │ +# │ │ │ │ +# - You can set `notebook_dir` to `/` and `default_url` to `/tree/home/{username}` to allow people to │ │ │ │ +# navigate the whole filesystem from their notebook server, but still start in their home directory. │ │ │ │ +# - Start with `/notebooks` instead of `/tree` if `default_url` points to a notebook instead of a directory. │ │ │ │ +# - You can set this to `/lab` to have JupyterLab start by default, rather than Jupyter Notebook. │ │ │ │ +# Default: '' │ │ │ │ +# c.Spawner.default_url = '' │ │ │ │ + │ │ │ │ +## Disable per-user configuration of single-user servers. │ │ │ │ +# │ │ │ │ +# When starting the user's single-user server, any config file found in the │ │ │ │ +# user's $HOME directory will be ignored. │ │ │ │ +# │ │ │ │ +# Note: a user could circumvent this if the user modifies their Python │ │ │ │ +# environment, such as when they have their own conda environments / virtualenvs │ │ │ │ +# / containers. │ │ │ │ +# Default: False │ │ │ │ +# c.Spawner.disable_user_config = False │ │ │ │ + │ │ │ │ +## List of environment variables for the single-user server to inherit from the │ │ │ │ +# JupyterHub process. │ │ │ │ +# │ │ │ │ +# This list is used to ensure that sensitive information in the JupyterHub │ │ │ │ +# process's environment (such as `CONFIGPROXY_AUTH_TOKEN`) is not passed to the │ │ │ │ +# single-user server's process. │ │ │ │ +# Default: ['JUPYTERHUB_SINGLEUSER_APP'] │ │ │ │ +# c.Spawner.env_keep = ['JUPYTERHUB_SINGLEUSER_APP'] │ │ │ │ + │ │ │ │ +## Extra environment variables to set for the single-user server's process. │ │ │ │ +# │ │ │ │ +# Environment variables that end up in the single-user server's process come from 3 sources: │ │ │ │ +# - This `environment` configurable │ │ │ │ +# - The JupyterHub process' environment variables that are listed in `env_keep` │ │ │ │ +# - Variables to establish contact between the single-user notebook and the hub (such as JUPYTERHUB_API_TOKEN) │ │ │ │ +# │ │ │ │ +# The `environment` configurable should be set by JupyterHub administrators to │ │ │ │ +# add installation specific environment variables. It is a dict where the key is │ │ │ │ +# the name of the environment variable, and the value can be a string or a │ │ │ │ +# callable. If it is a callable, it will be called with one parameter (the │ │ │ │ +# spawner instance), and should return a string fairly quickly (no blocking │ │ │ │ +# operations please!). │ │ │ │ +# │ │ │ │ +# Note that the spawner class' interface is not guaranteed to be exactly same │ │ │ │ +# across upgrades, so if you are using the callable take care to verify it │ │ │ │ +# continues to work after upgrades! │ │ │ │ +# │ │ │ │ +# .. versionchanged:: 1.2 │ │ │ │ +# environment from this configuration has highest priority, │ │ │ │ +# allowing override of 'default' env variables, │ │ │ │ +# such as JUPYTERHUB_API_URL. │ │ │ │ +# Default: {} │ │ │ │ +# c.Spawner.environment = {} │ │ │ │ + │ │ │ │ +## Override specific traitlets based on group membership of the user. │ │ │ │ +# │ │ │ │ +# This can be a dict, or a callable that returns a dict. The keys of the dict │ │ │ │ +# are *only* used for lexicographical sorting, to guarantee consistent ordering │ │ │ │ +# of the overrides. If it is a callable, it may be async, and will be passed one │ │ │ │ +# parameter - the spawner instance. It should return a dictionary. │ │ │ │ +# │ │ │ │ +# The values of the dict are dicts with the following keys: │ │ │ │ +# │ │ │ │ +# - `"groups"` - If the user belongs to *any* of these groups, these overrides are │ │ │ │ +# applied to their server before spawning. │ │ │ │ +# - `"spawner_override"` - a dictionary with overrides to apply to the Spawner │ │ │ │ +# settings. Each value can be either the final value to change or a callable that │ │ │ │ +# take the `Spawner` instance as parameter and returns the final value. │ │ │ │ +# If the traitlet being overriden is a *dictionary*, the dictionary │ │ │ │ +# will be *recursively updated*, rather than overriden. If you want to │ │ │ │ +# remove a key, set its value to `None`. │ │ │ │ +# │ │ │ │ +# Example: │ │ │ │ +# │ │ │ │ +# The following example config will: │ │ │ │ +# │ │ │ │ +# 1. Add the environment variable "AM_I_GROUP_ALPHA" to everyone in the "group-alpha" group │ │ │ │ +# 2. Add the environment variable "AM_I_GROUP_BETA" to everyone in the "group-beta" group. │ │ │ │ +# If a user is part of both "group-beta" and "group-alpha", they will get *both* these env │ │ │ │ +# vars, due to the dictionary merging functionality. │ │ │ │ +# 3. Add a higher memory limit for everyone in the "group-beta" group. │ │ │ │ +# │ │ │ │ +# :: │ │ │ │ +# │ │ │ │ +# c.Spawner.group_overrides = { │ │ │ │ +# "01-group-alpha-env-add": { │ │ │ │ +# "groups": ["group-alpha"], │ │ │ │ +# "spawner_override": {"environment": {"AM_I_GROUP_ALPHA": "yes"}}, │ │ │ │ +# }, │ │ │ │ +# "02-group-beta-env-add": { │ │ │ │ +# "groups": ["group-beta"], │ │ │ │ +# "spawner_override": {"environment": {"AM_I_GROUP_BETA": "yes"}}, │ │ │ │ +# }, │ │ │ │ +# "03-group-beta-mem-limit": { │ │ │ │ +# "groups": ["group-beta"], │ │ │ │ +# "spawner_override": {"mem_limit": "2G"} │ │ │ │ +# } │ │ │ │ +# } │ │ │ │ +# Default: traitlets.Undefined │ │ │ │ +# c.Spawner.group_overrides = traitlets.Undefined │ │ │ │ + │ │ │ │ +## Timeout (in seconds) before giving up on a spawned HTTP server │ │ │ │ +# │ │ │ │ +# Once a server has successfully been spawned, this is the amount of time we │ │ │ │ +# wait before assuming that the server is unable to accept connections. │ │ │ │ +# Default: 30 │ │ │ │ +# c.Spawner.http_timeout = 30 │ │ │ │ + │ │ │ │ +## The URL the single-user server should connect to the Hub. │ │ │ │ +# │ │ │ │ +# If the Hub URL set in your JupyterHub config is not reachable from spawned │ │ │ │ +# notebooks, you can set differnt URL by this config. │ │ │ │ +# │ │ │ │ +# Is None if you don't need to change the URL. │ │ │ │ +# Default: None │ │ │ │ +# c.Spawner.hub_connect_url = None │ │ │ │ + │ │ │ │ +## The IP address (or hostname) the single-user server should listen on. │ │ │ │ +# │ │ │ │ +# Usually either '127.0.0.1' (default) or '0.0.0.0'. │ │ │ │ +# │ │ │ │ +# The JupyterHub proxy implementation should be able to send packets to this │ │ │ │ +# interface. │ │ │ │ +# │ │ │ │ +# Subclasses which launch remotely or in containers should override the default │ │ │ │ +# to '0.0.0.0'. │ │ │ │ +# │ │ │ │ +# .. versionchanged:: 2.0 │ │ │ │ +# Default changed to '127.0.0.1', from ''. │ │ │ │ +# In most cases, this does not result in a change in behavior, │ │ │ │ +# as '' was interpreted as 'unspecified', │ │ │ │ +# which used the subprocesses' own default, itself usually '127.0.0.1'. │ │ │ │ +# Default: '127.0.0.1' │ │ │ │ +# c.Spawner.ip = '127.0.0.1' │ │ │ │ + │ │ │ │ +## Minimum number of bytes a single-user notebook server is guaranteed to have │ │ │ │ +# available. │ │ │ │ +# │ │ │ │ +# Allows the following suffixes: │ │ │ │ +# - K -> Kilobytes │ │ │ │ +# - M -> Megabytes │ │ │ │ +# - G -> Gigabytes │ │ │ │ +# - T -> Terabytes │ │ │ │ +# │ │ │ │ +# **This is a configuration setting. Your spawner must implement support for the │ │ │ │ +# limit to work.** The default spawner, `LocalProcessSpawner`, does **not** │ │ │ │ +# implement this support. A custom spawner **must** add support for this setting │ │ │ │ +# for it to be enforced. │ │ │ │ +# Default: None │ │ │ │ +# c.Spawner.mem_guarantee = None │ │ │ │ + │ │ │ │ +## Maximum number of bytes a single-user notebook server is allowed to use. │ │ │ │ +# │ │ │ │ +# Allows the following suffixes: │ │ │ │ +# - K -> Kilobytes │ │ │ │ +# - M -> Megabytes │ │ │ │ +# - G -> Gigabytes │ │ │ │ +# - T -> Terabytes │ │ │ │ +# │ │ │ │ +# If the single user server tries to allocate more memory than this, it will │ │ │ │ +# fail. There is no guarantee that the single-user notebook server will be able │ │ │ │ +# to allocate this much memory - only that it can not allocate more than this. │ │ │ │ +# │ │ │ │ +# **This is a configuration setting. Your spawner must implement support for the │ │ │ │ +# limit to work.** The default spawner, `LocalProcessSpawner`, does **not** │ │ │ │ +# implement this support. A custom spawner **must** add support for this setting │ │ │ │ +# for it to be enforced. │ │ │ │ +# Default: None │ │ │ │ +# c.Spawner.mem_limit = None │ │ │ │ + │ │ │ │ +## Path to the notebook directory for the single-user server. │ │ │ │ +# │ │ │ │ +# The user sees a file listing of this directory when the notebook interface is │ │ │ │ +# started. The current interface does not easily allow browsing beyond the │ │ │ │ +# subdirectories in this directory's tree. │ │ │ │ +# │ │ │ │ +# `~` will be expanded to the home directory of the user, and {username} will be │ │ │ │ +# replaced with the name of the user. │ │ │ │ +# │ │ │ │ +# Note that this does *not* prevent users from accessing files outside of this │ │ │ │ +# path! They can do so with many other means. │ │ │ │ +# Default: '' │ │ │ │ +# c.Spawner.notebook_dir = '' │ │ │ │ + │ │ │ │ +## Allowed scopes for oauth tokens issued by this server's oauth client. │ │ │ │ +# │ │ │ │ +# This sets the maximum and default scopes │ │ │ │ +# assigned to oauth tokens issued by a single-user server's │ │ │ │ +# oauth client (i.e. tokens stored in browsers after authenticating with the server), │ │ │ │ +# defining what actions the server can take on behalf of logged-in users. │ │ │ │ +# │ │ │ │ +# Default is an empty list, meaning minimal permissions to identify users, │ │ │ │ +# no actions can be taken on their behalf. │ │ │ │ +# │ │ │ │ +# If callable, will be called with the Spawner as a single argument. │ │ │ │ +# Callables may be async. │ │ │ │ +# Default: traitlets.Undefined │ │ │ │ +# c.Spawner.oauth_client_allowed_scopes = traitlets.Undefined │ │ │ │ + │ │ │ │ +## Allowed roles for oauth tokens. │ │ │ │ +# │ │ │ │ +# Deprecated in 3.0: use oauth_client_allowed_scopes │ │ │ │ +# │ │ │ │ +# This sets the maximum and default roles │ │ │ │ +# assigned to oauth tokens issued by a single-user server's │ │ │ │ +# oauth client (i.e. tokens stored in browsers after authenticating with the server), │ │ │ │ +# defining what actions the server can take on behalf of logged-in users. │ │ │ │ +# │ │ │ │ +# Default is an empty list, meaning minimal permissions to identify users, │ │ │ │ +# no actions can be taken on their behalf. │ │ │ │ +# Default: traitlets.Undefined │ │ │ │ +# c.Spawner.oauth_roles = traitlets.Undefined │ │ │ │ + │ │ │ │ +## An HTML form for options a user can specify on launching their server. │ │ │ │ +# │ │ │ │ +# The surrounding `