<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/pysim/+/23578">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Use sphinx for generating documentation<br><br>This adds sphinx based documentation generation.  For now,<br>this manily renders some introduction and the autodoc-genreated<br>class/method reference from the source code for our libraries.<br><br>Actual user-level documentation for pySim-{prog,shell,read} remains<br>to be added separately<br><br>Change-Id: I52603e93c2c129a9e79687da6c534fa56a40a649<br>---<br>A docs/Makefile<br>A docs/conf.py<br>A docs/index.rst<br>A docs/legacy.rst<br>A docs/library.rst<br>A docs/make.bat<br>A docs/shell.rst<br>7 files changed, 258 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/pysim refs/changes/78/23578/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/docs/Makefile b/docs/Makefile</span><br><span>new file mode 100644</span><br><span>index 0000000..d4bb2cb</span><br><span>--- /dev/null</span><br><span>+++ b/docs/Makefile</span><br><span>@@ -0,0 +1,20 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Minimal makefile for Sphinx documentation</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# You can set these variables from the command line, and also</span><br><span style="color: hsl(120, 100%, 40%);">+# from the environment for the first two.</span><br><span style="color: hsl(120, 100%, 40%);">+SPHINXOPTS    ?=</span><br><span style="color: hsl(120, 100%, 40%);">+SPHINXBUILD   ?= sphinx-build</span><br><span style="color: hsl(120, 100%, 40%);">+SOURCEDIR     = .</span><br><span style="color: hsl(120, 100%, 40%);">+BUILDDIR      = _build</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Put it first so that "make" without argument is like "make help".</span><br><span style="color: hsl(120, 100%, 40%);">+help:</span><br><span style="color: hsl(120, 100%, 40%);">+      @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+.PHONY: help Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Catch-all target: route all unknown targets to Sphinx using the new</span><br><span style="color: hsl(120, 100%, 40%);">+# "make mode" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).</span><br><span style="color: hsl(120, 100%, 40%);">+%: Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+   @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)</span><br><span>diff --git a/docs/conf.py b/docs/conf.py</span><br><span>new file mode 100644</span><br><span>index 0000000..1fb06da</span><br><span>--- /dev/null</span><br><span>+++ b/docs/conf.py</span><br><span>@@ -0,0 +1,57 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Configuration file for the Sphinx documentation builder.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# This file only contains a selection of the most common options. For a full</span><br><span style="color: hsl(120, 100%, 40%);">+# list see the documentation:</span><br><span style="color: hsl(120, 100%, 40%);">+# https://www.sphinx-doc.org/en/master/usage/configuration.html</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# -- Path setup --------------------------------------------------------------</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# If extensions (or modules to document with autodoc) are in another directory,</span><br><span style="color: hsl(120, 100%, 40%);">+# add these directories to sys.path here. If the directory is relative to the</span><br><span style="color: hsl(120, 100%, 40%);">+# documentation root, use os.path.abspath to make it absolute, like shown here.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+import os</span><br><span style="color: hsl(120, 100%, 40%);">+import sys</span><br><span style="color: hsl(120, 100%, 40%);">+sys.path.insert(0, os.path.abspath('..'))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# -- Project information -----------------------------------------------------</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+project = 'pysim'</span><br><span style="color: hsl(120, 100%, 40%);">+copyright = '2021, Sylvain Munaut, Harald Welte, Philipp Maier'</span><br><span style="color: hsl(120, 100%, 40%);">+author = 'Sylvain Munaut, Harald Welte, Philipp Maier'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# -- General configuration ---------------------------------------------------</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Add any Sphinx extension module names here, as strings. They can be</span><br><span style="color: hsl(120, 100%, 40%);">+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom</span><br><span style="color: hsl(120, 100%, 40%);">+# ones.</span><br><span style="color: hsl(120, 100%, 40%);">+extensions = [</span><br><span style="color: hsl(120, 100%, 40%);">+        "sphinx.ext.autodoc",</span><br><span style="color: hsl(120, 100%, 40%);">+        "sphinx.ext.autosectionlabel",</span><br><span style="color: hsl(120, 100%, 40%);">+        "sphinx.ext.napoleon"</span><br><span style="color: hsl(120, 100%, 40%);">+]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Add any paths that contain templates here, relative to this directory.</span><br><span style="color: hsl(120, 100%, 40%);">+templates_path = ['_templates']</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# List of patterns, relative to source directory, that match files and</span><br><span style="color: hsl(120, 100%, 40%);">+# directories to ignore when looking for source files.</span><br><span style="color: hsl(120, 100%, 40%);">+# This pattern also affects html_static_path and html_extra_path.</span><br><span style="color: hsl(120, 100%, 40%);">+exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# -- Options for HTML output -------------------------------------------------</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# The theme to use for HTML and HTML Help pages.  See the documentation for</span><br><span style="color: hsl(120, 100%, 40%);">+# a list of builtin themes.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+html_theme = 'alabaster'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Add any paths that contain custom static files (such as style sheets) here,</span><br><span style="color: hsl(120, 100%, 40%);">+# relative to this directory. They are copied after the builtin static files,</span><br><span style="color: hsl(120, 100%, 40%);">+# so a file named "default.css" will overwrite the builtin "default.css".</span><br><span style="color: hsl(120, 100%, 40%);">+html_static_path = ['_static']</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+autoclass_content = 'both'</span><br><span>diff --git a/docs/index.rst b/docs/index.rst</span><br><span>new file mode 100644</span><br><span>index 0000000..c647880</span><br><span>--- /dev/null</span><br><span>+++ b/docs/index.rst</span><br><span>@@ -0,0 +1,50 @@</span><br><span style="color: hsl(120, 100%, 40%);">+.. pysim documentation master file</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Welcome to Osmocom pySim</span><br><span style="color: hsl(120, 100%, 40%);">+========================</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Introduction</span><br><span style="color: hsl(120, 100%, 40%);">+------------</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+pySim is a python implementation of various software that helps you with</span><br><span style="color: hsl(120, 100%, 40%);">+managing subscriber identity cards for cellular networks, so-called SIM</span><br><span style="color: hsl(120, 100%, 40%);">+cards.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Many Osmocom (Open Source Mobile Communications) projects relate to operating</span><br><span style="color: hsl(120, 100%, 40%);">+private / custom cellular networks, and provisioning SIM cards for said networks</span><br><span style="color: hsl(120, 100%, 40%);">+is in many cases a requirement to operate such networks.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+To make use of most of pySim's features, you will need a `programmable` SIM card,</span><br><span style="color: hsl(120, 100%, 40%);">+i.e. a card where you are the owner/operator and have sufficient credentials (such</span><br><span style="color: hsl(120, 100%, 40%);">+as the `ADM PIN`) in order to write to many if not most of the files on the card.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Such cards are, for example, available from sysmocom, a major contributor to pySim.</span><br><span style="color: hsl(120, 100%, 40%);">+See https://www.sysmocom.de/products/lab/sysmousim/ for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+pySim supports classic GSM SIM cards as well as ETSI UICC with 3GPP USIM and ISIM</span><br><span style="color: hsl(120, 100%, 40%);">+applications.  It is easily extensible, so support for additional files, card</span><br><span style="color: hsl(120, 100%, 40%);">+applications, etc. can be added easily by any python developer.  We do encourage you</span><br><span style="color: hsl(120, 100%, 40%);">+to submit your contributions to help this collaborative development project.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+pySim consists of several parts:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+* a python :ref:`library<pySim library>` containing plenty of objects and methods that can be used for</span><br><span style="color: hsl(120, 100%, 40%);">+  writing custom programs interfacing with SIM cards.</span><br><span style="color: hsl(120, 100%, 40%);">+* the [new] :ref:`interactive pySim-shell command line program<pySim-shell>`</span><br><span style="color: hsl(120, 100%, 40%);">+* the [legacy] :ref:`pySim-prog and pySim-read tools<Legacy tools>`</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+.. toctree::</span><br><span style="color: hsl(120, 100%, 40%);">+   :maxdepth: 2</span><br><span style="color: hsl(120, 100%, 40%);">+   :caption: Contents:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   shell</span><br><span style="color: hsl(120, 100%, 40%);">+   legacy</span><br><span style="color: hsl(120, 100%, 40%);">+   library</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Indices and tables</span><br><span style="color: hsl(120, 100%, 40%);">+==================</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+* :ref:`genindex`</span><br><span style="color: hsl(120, 100%, 40%);">+* :ref:`modindex`</span><br><span style="color: hsl(120, 100%, 40%);">+* :ref:`search`</span><br><span>diff --git a/docs/legacy.rst b/docs/legacy.rst</span><br><span>new file mode 100644</span><br><span>index 0000000..492be46</span><br><span>--- /dev/null</span><br><span>+++ b/docs/legacy.rst</span><br><span>@@ -0,0 +1,2 @@</span><br><span style="color: hsl(120, 100%, 40%);">+Legacy tools</span><br><span style="color: hsl(120, 100%, 40%);">+============</span><br><span>diff --git a/docs/library.rst b/docs/library.rst</span><br><span>new file mode 100644</span><br><span>index 0000000..ae027ff</span><br><span>--- /dev/null</span><br><span>+++ b/docs/library.rst</span><br><span>@@ -0,0 +1,92 @@</span><br><span style="color: hsl(120, 100%, 40%);">+pySim library</span><br><span style="color: hsl(120, 100%, 40%);">+=============</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+pySim filesystem abstraction</span><br><span style="color: hsl(120, 100%, 40%);">+----------------------------</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+.. automodule:: pySim.filesystem</span><br><span style="color: hsl(120, 100%, 40%);">+   :members:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+pySim commands abstraction</span><br><span style="color: hsl(120, 100%, 40%);">+--------------------------</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+.. automodule:: pySim.commands</span><br><span style="color: hsl(120, 100%, 40%);">+   :members:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+pySim Transport</span><br><span style="color: hsl(120, 100%, 40%);">+---------------</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+The pySim.transport classes implement specific ways how to</span><br><span style="color: hsl(120, 100%, 40%);">+communicate with a SIM card.  A "transport" provides ways</span><br><span style="color: hsl(120, 100%, 40%);">+to transceive APDUs with the card.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+The most commonly used transport uses the PC/SC interface to</span><br><span style="color: hsl(120, 100%, 40%);">+utilize a variety of smart card interfaces ("readers").</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Transport base class</span><br><span style="color: hsl(120, 100%, 40%);">+~~~~~~~~~~~~~~~~~~~~</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+.. automodule:: pySim.transport</span><br><span style="color: hsl(120, 100%, 40%);">+   :members:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+calypso / OsmocomBB transport</span><br><span style="color: hsl(120, 100%, 40%);">+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+This allows the use of the SIM slot of an an OsmocomBB compatible phone with the TI Calypso chipset,</span><br><span style="color: hsl(120, 100%, 40%);">+using the L1CTL interface to talk to the layer1.bin firmware on the phone.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+.. automodule:: pySim.transport.calypso</span><br><span style="color: hsl(120, 100%, 40%);">+   :members:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AT-command Modem transport</span><br><span style="color: hsl(120, 100%, 40%);">+~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+This transport uses AT commands of a cellular modem in order to get access to the SIM card inserted</span><br><span style="color: hsl(120, 100%, 40%);">+in such a modem.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+.. automodule:: pySim.transport.modem_atcmd</span><br><span style="color: hsl(120, 100%, 40%);">+   :members:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+PC/SC transport</span><br><span style="color: hsl(120, 100%, 40%);">+~~~~~~~~~~~~~~~</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+PC/SC is the standard API for accessing smart card interfaces</span><br><span style="color: hsl(120, 100%, 40%);">+on all major operating systems, including the MS Windows Family,</span><br><span style="color: hsl(120, 100%, 40%);">+OS X as well as Linux / Unix OSs.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+.. automodule:: pySim.transport.pcsc</span><br><span style="color: hsl(120, 100%, 40%);">+   :members:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Serial/UART transport</span><br><span style="color: hsl(120, 100%, 40%);">+~~~~~~~~~~~~~~~~~~~~~</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+This transport implements interfacing smart cards via</span><br><span style="color: hsl(120, 100%, 40%);">+very simplistic UART readers.  These readers basically</span><br><span style="color: hsl(120, 100%, 40%);">+wire together the Rx+Tx pins of a RS232 UART, provide</span><br><span style="color: hsl(120, 100%, 40%);">+a fixed crystal oscilator for clock, and operate the UART</span><br><span style="color: hsl(120, 100%, 40%);">+at 9600 bps.  These readers are sometimes called `Phoenix`.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+.. automodule:: pySim.transport.serial</span><br><span style="color: hsl(120, 100%, 40%);">+   :members:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+pySim utility functions</span><br><span style="color: hsl(120, 100%, 40%);">+-----------------------</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+.. automodule:: pySim.utils</span><br><span style="color: hsl(120, 100%, 40%);">+   :members:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+pySim exceptions</span><br><span style="color: hsl(120, 100%, 40%);">+----------------</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+.. automodule:: pySim.exceptions</span><br><span style="color: hsl(120, 100%, 40%);">+   :members:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+pySim card_handler</span><br><span style="color: hsl(120, 100%, 40%);">+------------------</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+.. automodule:: pySim.card_handler</span><br><span style="color: hsl(120, 100%, 40%);">+   :members:</span><br><span>diff --git a/docs/make.bat b/docs/make.bat</span><br><span>new file mode 100644</span><br><span>index 0000000..2119f51</span><br><span>--- /dev/null</span><br><span>+++ b/docs/make.bat</span><br><span>@@ -0,0 +1,35 @@</span><br><span style="color: hsl(120, 100%, 40%);">+@ECHO OFF </span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+pushd %~dp0 </span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+REM Command file for Sphinx documentation </span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+if "%SPHINXBUILD%" == "" ( </span><br><span style="color: hsl(120, 100%, 40%);">+      set SPHINXBUILD=sphinx-build </span><br><span style="color: hsl(120, 100%, 40%);">+) </span><br><span style="color: hsl(120, 100%, 40%);">+set SOURCEDIR=. </span><br><span style="color: hsl(120, 100%, 40%);">+set BUILDDIR=_build </span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+if "%1" == "" goto help </span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+%SPHINXBUILD% >NUL 2>NUL </span><br><span style="color: hsl(120, 100%, 40%);">+if errorlevel 9009 ( </span><br><span style="color: hsl(120, 100%, 40%);">+      echo. </span><br><span style="color: hsl(120, 100%, 40%);">+      echo.The 'sphinx-build' command was not found. Make sure you have Sphinx </span><br><span style="color: hsl(120, 100%, 40%);">+      echo.installed, then set the SPHINXBUILD environment variable to point </span><br><span style="color: hsl(120, 100%, 40%);">+      echo.to the full path of the 'sphinx-build' executable. Alternatively you </span><br><span style="color: hsl(120, 100%, 40%);">+      echo.may add the Sphinx directory to PATH. </span><br><span style="color: hsl(120, 100%, 40%);">+      echo. </span><br><span style="color: hsl(120, 100%, 40%);">+      echo.If you don't have Sphinx installed, grab it from </span><br><span style="color: hsl(120, 100%, 40%);">+      echo.http://sphinx-doc.org/ </span><br><span style="color: hsl(120, 100%, 40%);">+      exit /b 1 </span><br><span style="color: hsl(120, 100%, 40%);">+) </span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% </span><br><span style="color: hsl(120, 100%, 40%);">+goto end </span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+:help </span><br><span style="color: hsl(120, 100%, 40%);">+%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% </span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+:end </span><br><span style="color: hsl(120, 100%, 40%);">+popd </span><br><span>diff --git a/docs/shell.rst b/docs/shell.rst</span><br><span>new file mode 100644</span><br><span>index 0000000..f9a2c82</span><br><span>--- /dev/null</span><br><span>+++ b/docs/shell.rst</span><br><span>@@ -0,0 +1,2 @@</span><br><span style="color: hsl(120, 100%, 40%);">+pySim-shell</span><br><span style="color: hsl(120, 100%, 40%);">+===========</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/pysim/+/23578">change 23578</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/pysim/+/23578"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: pysim </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I52603e93c2c129a9e79687da6c534fa56a40a649 </div>
<div style="display:none"> Gerrit-Change-Number: 23578 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>