Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-usbsdmux for openSUSE:Factory
checked in at 2022-03-17 17:01:42
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-usbsdmux (Old)
and /work/SRC/openSUSE:Factory/.python-usbsdmux.new.25692 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-usbsdmux"
Thu Mar 17 17:01:42 2022 rev:2 rq:962464 version:0.2.1
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-usbsdmux/python-usbsdmux.changes
2020-05-26 17:17:15.047707217 +0200
+++
/work/SRC/openSUSE:Factory/.python-usbsdmux.new.25692/python-usbsdmux.changes
2022-03-17 17:01:55.133704666 +0100
@@ -1,0 +2,15 @@
+Thu Mar 17 08:56:58 UTC 2022 - Guillaume GARDET <[email protected]>
+
+- Update to 0.2.1. Main changes:
+ * cli: Handle well-known Exceptions
+ * usb2642i2c: Do not create if device node does not exist
+ * commandline: 'get' must respect hardware signal priority
+- Main changes in 0.2.0:
+ * Remove the service/client split and access /dev/sg* directly
+ * usb2642i2c: Fix sg device open arguments
+ * Simplify the read-only to read-write mode transition
+ * usbsdmux: honor wait argument in mode_disconnect()
+ * main/service: add get action
+ * usdbsdmux: set/enable default output values only for writes
+
+-------------------------------------------------------------------
Old:
----
usbsdmux-0.1.8.tar.gz
New:
----
usbsdmux-0.2.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-usbsdmux.spec ++++++
--- /var/tmp/diff_new_pack.w8khmx/_old 2022-03-17 17:01:55.737705129 +0100
+++ /var/tmp/diff_new_pack.w8khmx/_new 2022-03-17 17:01:55.745705135 +0100
@@ -1,7 +1,7 @@
#
# spec file for package python-usbsdmux
#
-# Copyright (c) 2020 SUSE LLC
+# Copyright (c) 2022 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -20,7 +20,7 @@
%define skip_python2 1
%define orig_name usbsdmux
Name: python-usbsdmux
-Version: 0.1.8
+Version: 0.2.1
Release: 0
Summary: Tool to control an usb-sd-mux from the command line
License: LGPL-2.1-or-later
@@ -34,7 +34,7 @@
BuildRequires: pkgconfig(udev)
Requires: %{orig_name}-udev
Requires(post): update-alternatives
-Requires(postun): update-alternatives
+Requires(postun):update-alternatives
%python_subpackages
%description
++++++ usbsdmux-0.1.8.tar.gz -> usbsdmux-0.2.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/usbsdmux-0.1.8/.gitignore
new/usbsdmux-0.2.1/.gitignore
--- old/usbsdmux-0.1.8/.gitignore 2019-12-16 16:01:52.000000000 +0100
+++ new/usbsdmux-0.2.1/.gitignore 2021-07-21 10:29:57.000000000 +0200
@@ -5,3 +5,4 @@
*.egg-info
*.venv
.tox/
+envs/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/usbsdmux-0.1.8/LICENSE new/usbsdmux-0.2.1/LICENSE
--- old/usbsdmux-0.1.8/LICENSE 2019-12-16 16:01:52.000000000 +0100
+++ new/usbsdmux-0.2.1/LICENSE 1970-01-01 01:00:00.000000000 +0100
@@ -1,15 +0,0 @@
-Copyright (C) 2017 Pengutronix, Chris Fiege <[email protected]>
-
-This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Lesser General Public
-License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version.
-
-This library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public
-License along with this library; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/usbsdmux-0.1.8/MANIFEST.in
new/usbsdmux-0.2.1/MANIFEST.in
--- old/usbsdmux-0.1.8/MANIFEST.in 2019-12-16 16:01:52.000000000 +0100
+++ new/usbsdmux-0.2.1/MANIFEST.in 2021-07-21 10:29:57.000000000 +0200
@@ -1,5 +1,4 @@
include COPYING
-include LICENSE
include fastentrypoints.py
graft contrib
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/usbsdmux-0.1.8/Makefile new/usbsdmux-0.2.1/Makefile
--- old/usbsdmux-0.1.8/Makefile 1970-01-01 01:00:00.000000000 +0100
+++ new/usbsdmux-0.2.1/Makefile 2021-07-21 10:29:57.000000000 +0200
@@ -0,0 +1,32 @@
+PYTHON=python3
+
+PYTHON_ENV_ROOT=envs
+PYTHON_PACKAGING_VENV=$(PYTHON_ENV_ROOT)/$(PYTHON)-packaging-env
+
+.PHONY: clean
+
+# packaging environment #######################################################
+$(PYTHON_PACKAGING_VENV)/.created: REQUIREMENTS.packaging.txt
+ rm -rf $(PYTHON_PACKAGING_VENV) && \
+ $(PYTHON) -m venv $(PYTHON_PACKAGING_VENV) && \
+ . $(PYTHON_PACKAGING_VENV)/bin/activate && \
+ pip install --upgrade pip && \
+ pip install -r REQUIREMENTS.packaging.txt
+ date > $(PYTHON_PACKAGING_VENV)/.created
+
+packaging-env: $(PYTHON_PACKAGING_VENV)/.created
+
+sdist: packaging-env
+ . $(PYTHON_PACKAGING_VENV)/bin/activate && \
+ rm -rf dist *.egg-info && \
+ ./setup.py sdist
+
+_release: sdist
+ . $(PYTHON_PACKAGING_VENV)/bin/activate && \
+ twine upload dist/*
+
+# helper ######################################################################
+clean:
+ rm -rf $(PYTHON_ENV_ROOT)
+
+envs: env packaging-env
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/usbsdmux-0.1.8/README.rst
new/usbsdmux-0.2.1/README.rst
--- old/usbsdmux-0.1.8/README.rst 2019-12-16 16:01:52.000000000 +0100
+++ new/usbsdmux-0.2.1/README.rst 2021-07-21 10:29:57.000000000 +0200
@@ -2,6 +2,7 @@
===================
|license|
+|pypi|
Purpose
-------
@@ -30,12 +31,6 @@
Quickstart
----------
-Clone the git repository:
-
-.. code-block:: bash
-
- $ git clone https://github.com/pengutronix/usbsdmux.git
-
Create and activate a virtualenv for usbsdmux:
.. code-block:: bash
@@ -47,15 +42,28 @@
.. code-block:: bash
- $ python setup.py install
+ $ pip install usbsdmux
-Now you can run ``usbsdmux`` command by giving the appropriate /dev/sg* device,
-e.g.:
+Now you can run ``usbsdmux -h`` to get a list of possible
+command invocations:
-.. code-block:: bash
+.. code-block:: text
- $ usbsdmux /dev/sg1 dut
- $ usbsdmux /dev/sg1 host
+ $ usbsdmux -h
+ usage: usbsdmux [-h] SG {get,dut,client,host,off}
+
+ positional arguments:
+ SG /dev/sg* to use
+ {get,dut,client,host,off}
+ Action:
+ get - return selected mode
+ dut - set to dut mode
+ client - set to dut mode (alias for dut)
+ host - set to host mode
+ off - set to off mode
+
+ optional arguments:
+ -h, --help show this help message and exit
Using as root
-------------
@@ -63,61 +71,118 @@
can just use ``usbsdmux`` as root.
If you have installed this tool inside a virtualenv you can just call the
-shell-wrapper with something like
-``sudo /path/to/virtualenv/bin/usbsdmux /dev/sg1 DUT``.
+shell-wrapper along with the appropriate `/dev/sg*` device path:
+.. code-block:: bash
-Using as non-root user
-----------------------
-Access to /dev/sg* needs the `CAP_SYS_RAWIO
<http://man7.org/linux/man-pages/man7/capabilities.7.html>`_. By default all
processes created by root gain this capability.
+ sudo /path/to/virtualenv/bin/usbsdmux /dev/sg0 dut
+ sudo /path/to/virtualenv/bin/usbsdmux /dev/sg0 host
-Since you do not want to give this capability to the Python interpreter you
+Using as normal user / Reliable names
+-------------------------------------
-* either need to call the scripts as root
-* or use the systemd-service.
+The example udev-rule in ``contib/udev/99-usbsdmux.rules`` serves two purposes:
-The systemd-service is intended to be used with socket-activation.
-The service is present inside ``usbsdmux-service``.
+* Allow users currently logged into the system and users in the
+ ``plugdev`` group [1]_ to access connected USB-SD-Muxes.
+* Create a reliable path in the filesystem to access specific
+ USB-SD-Muxes based on their pre-programmed unique serial number.
+ This is useful when multiple USB-SD-Muxes are connect to a system,
+ as the enumeration-order, and thus the ``/dev/sg*`` numbering,
+ may differ between reboots.
+ The serial number is printed on a label attached to the device.
+
+Users of a Debian based distribution [1]_ can install the udev rule
+by cloning this repository and copying it to the appropriate location
+and reloading the active udev rules:
-The systemd-units provided in ``contrib/systemd/`` show an example of how to
-set up the service with systemd and socket-activation.
-You may adapt and copy them into your machine's local systemd service folder
-``/etc/systemd/system/``
+.. code-block:: bash
-To start the socket unit and let it create the required socket path
-(requires permissions), run::
+ $ git clone "https://github.com/linux-automation/usbsdmux.git"
+ $ sudo cp usbsdmux/contrib/udev/99-usbsdmux.rules /etc/udev/rules.d/
+ $ sudo udevadm control --reload-rules
+
+After reattaching the USB-SD-Mux you should get a list of connected
USB-SD-Muxes,
+based on their unique serial numbers, by listing the contents of
+the ``/dev/usb-sd-mux/`` directory:
- systemctl start usbsdmux.socket
+.. code-block:: bash
-Now you can use the ``usbsdmux`` tool from a non-root user by calling it with
-the client ``-c`` argument, e.g.::
+ $ ls -l /dev/usb-sd-mux/
+ total 0
+ lrwxrwxrwx 1 root plugdev 6 Mar 31 11:21 id-000000000042 -> ../sg3
+ lrwxrwxrwx 1 root plugdev 6 Mar 27 00:33 id-000000000078 -> ../sg2
+ lrwxrwxrwx 1 root plugdev 6 Mar 24 09:51 id-000000000378 -> ../sg1
+
+.. [1] The ``plugdev`` group is used in Debian and Debian based distributions
+ (like Ubuntu and Linux Mint) to grant access to pluggable gadgets.
+ Depending on your Linux distribution you may want to create/use another
+ group for this purpose and adapt the ``udev`` rule accordingly.
+
+Troubleshooting
+---------------
+
+* Some single board computers, especially Raspberry Pi model 4s, do not work
with
+ new/fast micro SD cards, due to drive strength issues at high frequencies.
+ Use old and slow micro SD cards with these devices.
+ Another workaround is the replacement of resistors ``R101`` and ``R102``
with 0??
+ parts. This modifications does however void the EMC compliance statement
provided
+ by the Linux Automation GmbH.
+* Some usecases, like hard to reach connectors or full-size SD cards,
necessitate the
+ use of adapters or extension cables, leading to the same drive strength
issues
+ and require the same workarounds as documented above.
+* In order for the ``/dev/sg*`` device to appear the ``sg`` kernel module
needs to be loaded
+ into the kernel. This is usually done automatically by ``udev`` once the
USB-SD-Mux is connected.
+ To manually load the kernel module run ``sudo modprobe sg``.
- usbsdmux -c /dev/sg1 DUT
+.. |license| image:: https://img.shields.io/badge/license-LGPLv2.1-blue.svg
+ :alt: LGPLv2.1
+ :target:
https://raw.githubusercontent.com/linux-automation/usbsdmux/master/COPYING
-If you use a non-standard socket path (i.e. not ``/tmp/sdmux.sock``) you also
-need to explicitly set the socket path::
+.. |pypi| image:: https://img.shields.io/pypi/v/usbsdmux.svg
+ :alt: pypi.org
+ :target: https://pypi.org/project/usbsdmux
- usbsdmux -c -s /path/to/sock.file /dev/sg1 DUT
+Contributing
+------------
-Reliable names for the USB-SD-Mux
----------------------------------
+Thank you for thinking about contributing to this project!
+Changes should be submitted via a
+`Github pull request <https://github.com/linux-automation/usbsdmux/pulls>`_.
-A USB-SD-Mux comes with a pre-programmed serial that is also printed on the
-device itself. With the udev-rule in ``contib/udev/99-usbsdmux.rules``
-the sg-device for every USB-SD-Mux is linked to a device in
-``/dev/usb-sd-mux/id-*``.
+This project uses the `Developer's Certificate of Origin 1.1
+<https://developercertificate.org/>`_ with the same `process
+<https://www.kernel.org/doc/html/latest/process/submitting-patches.html#sign-your-work-the-developer-s-certificate-of-origin>`_
+as used for the Linux kernel:
-This makes sure you can access a USB-SD-Mux with the same name - independent
-of the order they are connected or the USB or the USB-topology.
+ Developer's Certificate of Origin 1.1
-ToDo
-----
+ By making a contribution to this project, I certify that:
-* Access to /dev/sg* needs the
- `CAP_SYS_RAWIO <http://man7.org/linux/man-pages/man7/capabilities.7.html>`_.
- The service should drop all not needed capabilities after it is started.
+ (a) The contribution was created in whole or in part by me and I
+ have the right to submit it under the open source license
+ indicated in the file; or
+ (b) The contribution is based upon previous work that, to the best
+ of my knowledge, is covered under an appropriate open source
+ license and I have the right under that license to submit that
+ work with modifications, whether created in whole or in part
+ by me, under the same open source license (unless I am
+ permitted to submit under a different license), as indicated
+ in the file; or
-.. |license| image:: https://img.shields.io/badge/license-LGPLv2.1-blue.svg
- :alt: LGPLv2.1
- :target:
https://raw.githubusercontent.com/pengutronix/usb-sd-mux-ctl/master/LICENSE
+ (c) The contribution was provided directly to me by some other
+ person who certified (a), (b) or (c) and I have not modified
+ it.
+
+ (d) I understand and agree that this project and the contribution
+ are public and that a record of the contribution (including all
+ personal information I submit with it, including my sign-off) is
+ maintained indefinitely and may be redistributed consistent with
+ this project or the open source license(s) involved.
+
+Then you just add a line (using ``git commit -s``) saying:
+
+ Signed-off-by: Random J Developer <[email protected]>
+
+using your real name (sorry, no pseudonyms or anonymous contributions).
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/usbsdmux-0.1.8/REQUIREMENTS.packaging.txt
new/usbsdmux-0.2.1/REQUIREMENTS.packaging.txt
--- old/usbsdmux-0.1.8/REQUIREMENTS.packaging.txt 1970-01-01
01:00:00.000000000 +0100
+++ new/usbsdmux-0.2.1/REQUIREMENTS.packaging.txt 2021-07-21
10:29:57.000000000 +0200
@@ -0,0 +1,2 @@
+setuptools>=36.5.0
+twine
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/usbsdmux-0.1.8/contrib/systemd/usbsdmux.service
new/usbsdmux-0.2.1/contrib/systemd/usbsdmux.service
--- old/usbsdmux-0.1.8/contrib/systemd/usbsdmux.service 2019-12-16
16:01:52.000000000 +0100
+++ new/usbsdmux-0.2.1/contrib/systemd/usbsdmux.service 1970-01-01
01:00:00.000000000 +0100
@@ -1,11 +0,0 @@
-[Unit]
-Description=USB-SD-Mux Proxy-Service
-After=network.target usbsdmux.socket
-Requires=usbsdmux.socket
-
-[Service]
-Type=simple
-ExecStart=/path/to/usb-sd-mux/.venv/bin/usbsdmux-service
-
-[Install]
-WantedBy=multi-user.target
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/usbsdmux-0.1.8/contrib/systemd/usbsdmux.socket
new/usbsdmux-0.2.1/contrib/systemd/usbsdmux.socket
--- old/usbsdmux-0.1.8/contrib/systemd/usbsdmux.socket 2019-12-16
16:01:52.000000000 +0100
+++ new/usbsdmux-0.2.1/contrib/systemd/usbsdmux.socket 1970-01-01
01:00:00.000000000 +0100
@@ -1,9 +0,0 @@
-[Unit]
-Description=USB-SD-Mux Proxy-Service socket
-PartOf=usbsdmux.service
-
-[Socket]
-ListenSequentialPacket=/tmp/sdmux.sock
-
-[Install]
-WantedBy=sockets.target
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/usbsdmux-0.1.8/contrib/udev/99-usbsdmux.rules
new/usbsdmux-0.2.1/contrib/udev/99-usbsdmux.rules
--- old/usbsdmux-0.1.8/contrib/udev/99-usbsdmux.rules 2019-12-16
16:01:52.000000000 +0100
+++ new/usbsdmux-0.2.1/contrib/udev/99-usbsdmux.rules 2021-07-21
10:29:57.000000000 +0200
@@ -1,2 +1,3 @@
-ACTION=="add", SUBSYSTEM=="scsi_generic", KERNEL=="sg[0-9]",
ATTRS{manufacturer}=="Pengutronix", ATTRS{product}=="usb-sd-mux*",
SYMLINK="usb-sd-mux/id-$attr{serial}"
-ACTION=="add", SUBSYSTEM=="scsi_generic", KERNEL=="sg[0-9]",
ATTRS{manufacturer}=="Linux Automation GmbH", ATTRS{product}=="usb-sd-mux*",
SYMLINK="usb-sd-mux/id-$attr{serial}"
+# USB-SD-Mux
+ACTION=="add", SUBSYSTEM=="scsi_generic", KERNEL=="sg[0-9]",
ATTRS{manufacturer}=="Pengutronix", ATTRS{product}=="usb-sd-mux*",
SYMLINK="usb-sd-mux/id-$attr{serial}", TAG+="uaccess", GROUP="plugdev"
+ACTION=="add", SUBSYSTEM=="scsi_generic", KERNEL=="sg[0-9]",
ATTRS{manufacturer}=="Linux Automation GmbH", ATTRS{product}=="usb-sd-mux*",
SYMLINK="usb-sd-mux/id-$attr{serial}", TAG+="uaccess", GROUP="plugdev"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/usbsdmux-0.1.8/setup.py new/usbsdmux-0.2.1/setup.py
--- old/usbsdmux-0.1.8/setup.py 2019-12-16 16:01:52.000000000 +0100
+++ new/usbsdmux-0.2.1/setup.py 2021-07-21 10:29:57.000000000 +0200
@@ -1,12 +1,11 @@
#!/usr/bin/env python3
-import fastentrypoints
-
from setuptools import setup
+import fastentrypoints
setup(
name="usbsdmux",
- version="0.1.8",
+ version="0.2.1",
author="Chris Fiege",
author_email="[email protected]",
license="LGPL-2.1-or-later",
@@ -18,8 +17,9 @@
'usbsdmux = usbsdmux.__main__:main',
'usbsdmux-configure = usbsdmux.usb2642eeprom:main',
'usbsdmux-service = usbsdmux.service:main',
- ]
+ ],
},
classifiers=[
+ "License :: OSI Approved :: GNU Lesser General Public License v2 or
later (LGPLv2+)"
]
)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/usbsdmux-0.1.8/tox.ini new/usbsdmux-0.2.1/tox.ini
--- old/usbsdmux-0.1.8/tox.ini 2019-12-16 16:01:52.000000000 +0100
+++ new/usbsdmux-0.2.1/tox.ini 1970-01-01 01:00:00.000000000 +0100
@@ -1,11 +0,0 @@
-[testenv:release]
-whitelist_externals = rm
-
-deps =
- setuptools>=36.5.0
- twine
-
-commands =
- rm -rf dist build *.egg-info
- ./setup.py sdist
- twine upload dist/*
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/usbsdmux-0.1.8/usbsdmux/__main__.py
new/usbsdmux-0.2.1/usbsdmux/__main__.py
--- old/usbsdmux-0.1.8/usbsdmux/__main__.py 2019-12-16 16:01:52.000000000
+0100
+++ new/usbsdmux-0.2.1/usbsdmux/__main__.py 2021-07-21 10:29:57.000000000
+0200
@@ -1,85 +1,101 @@
#! /usr/bin/env python3
-from .usbsdmux import UsbSdMux
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+# Copyright (C) 2017 Pengutronix, Chris Fiege <[email protected]>
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
USA
+
import argparse
-import sys, errno
-import json
-import socket
-import os
-
-def direct_mode(sg, mode):
- ctl = UsbSdMux(sg)
-
- if mode.lower() == "off":
- ctl.mode_disconnect()
- elif mode.lower() == "dut" or mode.lower() == "client":
- ctl.mode_DUT()
- elif mode.lower() == "host":
- ctl.mode_host()
+import errno
+import sys
-def client_mode(sg, mode, socket_path):
- sock = socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET)
- try:
- sock.connect(socket_path)
- except FileNotFoundError:
- print("Socket path %s does not exist. Exiting." % socket_path,
file=sys.stderr)
- exit(1)
- except socket.error as ex:
- print("Failed opening socket %s : %s. Exiting." % (socket_path, ex),
file=sys.stderr)
- exit(1)
- payload = dict()
- payload["mode"] = mode
- payload["sg"] = sg
- sock.send(json.dumps(payload).encode())
- answer = json.loads(sock.recv(4096).decode())
- sock.close()
- if 'text' in answer:
- print(answer['text'])
- if not 'error' in answer or answer['error']:
- exit(1)
+from .usbsdmux import UsbSdMux
def main():
- parser = argparse.ArgumentParser()
+ parser = argparse.ArgumentParser(
+ formatter_class=argparse.RawTextHelpFormatter
+ )
parser.add_argument("sg", metavar="SG", help="/dev/sg* to use")
parser.add_argument(
"mode",
- help="mode to switch to",
- choices=["dut", "host", "off", "client"],
+ help="Action:\n"
+ "get - return selected mode\n"
+ "dut - set to dut mode\n"
+ "client - set to dut mode (alias for dut)\n"
+ "host - set to host mode\n"
+ "off - set to off mode",
+ choices=["get", "dut", "client", "host", "off"],
type=str.lower)
- parser.add_argument(
- "-d",
- "--direct",
- help="Forces to run in direct mode.",
- action="store_true",
- default=False)
- parser.add_argument(
- "-c",
- "--client",
- help="Force to run in client mode with socket /tmp/sdmux.sock",
- action="store_true",
- default=False)
- parser.add_argument(
- "-s",
- "--socket",
- help="Overrides the default socket for client mode.",
- default="/tmp/sdmux.sock")
+
+ # These arguments were previously used for the client/service
+ # based method to grant USB-SD-Mux access to non-root users.
+ # The client/service model is no longer needed due to new udev
+ # rules and a change to how the /dev/sg* devices are accessed.
+ # Display a warning but do not fail when these are used so
+ # existing scripts do not break and can be upgraded gracefully.
+ parser.add_argument("-d", "--direct", help=argparse.SUPPRESS,
+ action="store_true", default=None)
+ parser.add_argument("-c", "--client", help=argparse.SUPPRESS,
+ action="store_true", default=None)
+ parser.add_argument("-s", "--socket", help=argparse.SUPPRESS,
+ default=None)
args = parser.parse_args()
- if args.client is True and args.direct is True:
- print("Can not run in direct and client mode at the same time.
Exiting.", file=sys.stderr)
- exit(1)
-
- if args.client is True:
- client_mode(args.sg, args.mode, args.socket)
- elif args.direct is True:
- direct_mode(args.sg, args.mode)
- else:
- if os.getresuid()[0] == 0:
- direct_mode(args.sg, args.mode)
+ if any(arg is not None for arg in (args.direct, args.client, args.socket)):
+ print("usbsdmux: usage of -s/-c/-d arguments is deprecated "
+ "as the service/client split is no longer required. "
+ "Please upgrade your scripts to not supply either of these
arguments",
+ file=sys.stderr)
+
+ ctl = UsbSdMux(args.sg)
+ mode = args.mode.lower()
+
+ try:
+ if mode == "off":
+ ctl.mode_disconnect()
+
+ elif mode in ("dut", "client"):
+ ctl.mode_DUT()
+
+ elif mode == "host":
+ ctl.mode_host()
+
+ elif mode == "get":
+ print(ctl.get_mode())
+
+ except FileNotFoundError as fnfe:
+ print(fnfe, file=sys.stderr)
+ sys.exit(1)
+ except PermissionError as perr:
+ print(perr, file=sys.stderr)
+ sys.exit(1)
+ except OSError as ose:
+ if ose.errno == errno.ENOTTY:
+ # ENOTTY is raised when an error occured when calling an ioctl
+ print(ose, file=sys.stderr)
+ print(
+ f"Does '{args.sg}' really point to an USB-SD-Mux?",
+ file=sys.stderr,
+ )
+ sys.exit(1)
else:
- client_mode(args.sg, args.mode, args.socket)
+ raise ose
+
if __name__ == "__main__":
main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/usbsdmux-0.1.8/usbsdmux/ctypehelper.py
new/usbsdmux-0.2.1/usbsdmux/ctypehelper.py
--- old/usbsdmux-0.1.8/usbsdmux/ctypehelper.py 2019-12-16 16:01:52.000000000
+0100
+++ new/usbsdmux-0.2.1/usbsdmux/ctypehelper.py 2021-07-21 10:29:57.000000000
+0200
@@ -1,5 +1,23 @@
#!/usr/bin/env python3
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+# Copyright (C) 2017 Pengutronix, Chris Fiege <[email protected]>
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
USA
+
import ctypes
import string
"""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/usbsdmux-0.1.8/usbsdmux/pca9536.py
new/usbsdmux-0.2.1/usbsdmux/pca9536.py
--- old/usbsdmux-0.1.8/usbsdmux/pca9536.py 2019-12-16 16:01:52.000000000
+0100
+++ new/usbsdmux-0.2.1/usbsdmux/pca9536.py 2021-07-21 10:29:57.000000000
+0200
@@ -1,5 +1,23 @@
#!/usr/bin/env python3
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+# Copyright (C) 2017 Pengutronix, Chris Fiege <[email protected]>
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
USA
+
from .usb2642i2c import Usb2642I2C
@@ -48,6 +66,12 @@
self._usb.write_to(self._I2cAddr, [register, value])
+ def read_register(self, addr, len=1):
+ """
+ Returns a register of the Pca9536.
+ """
+ return self._usb.write_read_to(self._I2cAddr, [addr], len)
+
def set_pin_to_output(self, pins):
"""
Sets the corresponding pins as outputs.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/usbsdmux-0.1.8/usbsdmux/service.py
new/usbsdmux-0.2.1/usbsdmux/service.py
--- old/usbsdmux-0.1.8/usbsdmux/service.py 2019-12-16 16:01:52.000000000
+0100
+++ new/usbsdmux-0.2.1/usbsdmux/service.py 2021-07-21 10:29:57.000000000
+0200
@@ -1,146 +1,38 @@
#! /usr/bin/env python3
-from .usbsdmux import UsbSdMux
-import socket
-import time
-import argparse
-import json
-import os
-import sys
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+# Copyright (C) 2021 Pengutronix, Leonard G??hrs <[email protected]>
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
USA
"""
-This service is intended as systemd-socket-activated unit and provides an
+This service was intended as systemd-socket-activated unit and provided an
interface to the USB-SD-Mux without the need for root privileges.
-The service uses a SOCK_SEQPACKET UNIX-socket for communication with the a
-client. Packets always contain a JSON-encoded dict as payload.
-
-From client to service:
-The service expects the following parameter inside the payload:
-* 'sg' -- /dev/sg* - device to use to control the USB-SD-Mux
-* 'mode' -- Mode to set the USB-SD-Mux to
-
-For example:
-{"sg": "/dev/sg1", "mode": "dut"}
-
-From service to client:
-The service always answers with a payload like the following:
-* 'error' -- Boolean: True if an error occurred. False on success.
-* 'text' -- Text that describes the result.
- Contains the Text of an exception if one occurred.
+Usage of this service became obsolete in new releases that changed the
+way the /dev/sg* devices are accessed and that added new udev rules to
+directly grant device access to the users.
-For example:
-{"error": False, "text": "Success"}
+This file is kept here to notify users that have set up a systemd service.
"""
-# Default filedescriptor used by systemd to pass us a socket
-systemd_socket_fd = 3
-
-def create_answer(had_error=False, err_text=""):
- """
- Creates a JSON-formatted answer for socket-communication.
-
- Arguments:
- had_error -- Defines if the return value represents an error. Will be
- written into the 'error'-field of the answer.
- err_text -- Free Text that will be passed to the client along with the
- error state.
- """
- answer = dict()
- answer["error"] = had_error
- answer["text"] = err_text
- return json.dumps(answer)
-
-def process_request(raw_string):
- """
- Parses a message received from the communication-socket and tries to
execute
- the request.
-
- This function will try to parse the message as JSON and expects the
- following keys inside a dict:
-
- * 'sg' -- /dev/sg* - device to use to control the USB-SD-Mux
- * 'mode' -- Mode to set the USB-SD-Mux to
-
- Arguments:
- raw_string -- Message recieved as string."""
-
- try:
- payload = json.loads(raw_string)
- ctl = UsbSdMux(payload["sg"])
-
- if payload["mode"].lower() == "off":
- ctl.mode_disconnect()
-
- elif payload["mode"].lower() == "dut" or\
- payload["mode"].lower() == "client":
- ctl.mode_DUT()
-
- elif payload["mode"].lower() == "host":
- ctl.mode_host()
-
- else:
- return create_answer(had_error=True, err_text="Unknown mode")
-
- return create_answer(had_error=False, err_text="Success")
-
- except Exception as e:
- return create_answer(had_error=True, err_text=str(e))
+import sys
def main():
- parser = argparse.ArgumentParser()
-
- parser.add_argument(
- "-t",
- "--timeout",
- help="Time without connection before the service terminates in
seconds.",
- default=120,
- type=int)
- parser.add_argument(
- "--socket",
- help="Will use given socket for standalone-mode instead of
socket-activation with systemd.")
-
- args = parser.parse_args()
-
- if args.socket is not None:
- # try to create our own socket
- sock_name = args.socket
- try:
- os.remove(sock_name)
- except FileNotFoundError:
- pass
- except PermissionError as e:
- print(e, file=sys.stderr)
- print("Could not remove old socket. Correct access rights?",
file=sys.stderr)
- exit(-1)
- sock = socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET)
- sock.bind(sock_name)
- sock.listen(0)
- else:
- # get socket from systemd
- sock = socket.fromfd(
- systemd_socket_fd,
- socket.AF_UNIX,
- socket.SOCK_SEQPACKET)
-
-
- sock.settimeout(1)
- timeout = time.time() + args.timeout
-
- # connection loop
- while True:
- try:
- conn, addr = sock.accept()
- answer = process_request(conn.recv(4096).decode())
- conn.send(answer.encode())
- conn.close()
- timeout = time.time() + args.timeout
- except socket.timeout:
- pass
-
- if time.time() > timeout:
- break
-
- # we need to close the socket if the created it ourselves:
- if args.socket is not None:
- sock.close()
+ print("The usage of usbsdmux-service is deprecated.", file=sys.stderr)
+ print("Access to USB-SD-Mux devices is now controlled by a new set of udev
rules.", file=sys.stderr)
+ print("Please delete/deactivate the service calling this command.",
file=sys.stderr)
+ exit(-1)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/usbsdmux-0.1.8/usbsdmux/usb2642eeprom.py
new/usbsdmux-0.2.1/usbsdmux/usb2642eeprom.py
--- old/usbsdmux-0.1.8/usbsdmux/usb2642eeprom.py 2019-12-16
16:01:52.000000000 +0100
+++ new/usbsdmux-0.2.1/usbsdmux/usb2642eeprom.py 2021-07-21
10:29:57.000000000 +0200
@@ -1,11 +1,30 @@
#!/usr/bin/env python3
-import struct
-import ctypes
-from .usb2642i2c import Usb2642I2C
-import time
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+# Copyright (C) 2017 Pengutronix, Chris Fiege <[email protected]>
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
USA
+
import argparse
+import ctypes
+import struct
import sys
+import time
+
+from .usb2642i2c import Usb2642I2C
from .ctypehelper import string_to_microchip_unicode_uint8_array,\
string_to_uint8_array, list_to_uint8_array, to_pretty_hex
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/usbsdmux-0.1.8/usbsdmux/usb2642i2c.py
new/usbsdmux-0.2.1/usbsdmux/usb2642i2c.py
--- old/usbsdmux-0.1.8/usbsdmux/usb2642i2c.py 2019-12-16 16:01:52.000000000
+0100
+++ new/usbsdmux-0.2.1/usbsdmux/usb2642i2c.py 2021-07-21 10:29:57.000000000
+0200
@@ -1,5 +1,23 @@
#!/usr/bin/env python3
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+# Copyright (C) 2017 Pengutronix, Chris Fiege <[email protected]>
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
USA
+
import ctypes
import fcntl
from .ctypehelper import string_to_microchip_unicode_uint8_array,\
@@ -316,7 +334,7 @@
# print("SGIO:")
# print(self.to_pretty_hex(sgio))
- with open(self.sg, 'r') as fh:
+ with open(self.sg, 'r+b', buffering=0) as fh:
rc = fcntl.ioctl(fh, self._SG_IO, sgio)
if rc != 0:
raise IoctlFailed("SG_IO ioctl() failed with non-zero exit-code {}"\
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/usbsdmux-0.1.8/usbsdmux/usbsdmux.py
new/usbsdmux-0.2.1/usbsdmux/usbsdmux.py
--- old/usbsdmux-0.1.8/usbsdmux/usbsdmux.py 2019-12-16 16:01:52.000000000
+0100
+++ new/usbsdmux-0.2.1/usbsdmux/usbsdmux.py 2021-07-21 10:29:57.000000000
+0200
@@ -1,7 +1,25 @@
#!/usr/bin/env python3
-from .pca9536 import Pca9536
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+# Copyright (C) 2017 Pengutronix, Chris Fiege <[email protected]>
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
USA
+
import time
+from .pca9536 import Pca9536
class UsbSdMux(object):
@@ -30,14 +48,21 @@
"""
self._pca = Pca9536(sg)
- # setting the output-values to defaults before enabling outputs on the
- # GPIO-expander
- self.mode_disconnect(wait=False)
-
- # now enabling outputs
- self._pca.set_pin_to_output(
- Pca9536.gpio_0 | Pca9536.gpio_1 |
- Pca9536.gpio_2 | Pca9536.gpio_3)
+ def get_mode(self):
+ """
+ Returns currently selected mode as string
+ """
+ val = self._pca.read_register(1)[0]
+
+ # If the SD-Card is disabled we do not need to check for the selected mode.
+ # PWR_disable and DAT_disable are always switched at the same time.
+ # Let's assume it is sufficient to check one of both.
+ if val & self._PWR_disable:
+ return "off"
+
+ if val & self._select_DUT:
+ return "dut"
+ return "host"
def mode_disconnect(self, wait=True):
"""
@@ -48,10 +73,14 @@
the sd-card is known to be close to zero
"""
+ # Set the output registers to known values and activate them afterwards
self._pca.output_values(self._DAT_disable | self._PWR_disable |
self._select_HOST | self._card_removed)
+ self._pca.set_pin_to_output(Pca9536.gpio_0 | Pca9536.gpio_1 |
+ Pca9536.gpio_2 | Pca9536.gpio_3)
- time.sleep(1)
+ if wait:
+ time.sleep(1)
def mode_DUT(self, wait=True):
"""