5 Commits

Author SHA1 Message Date
Shin'ichiro Kawasaki
0f9ccd3b63 Tag version 0.2.7
Signed-off-by: Shin'ichiro Kawasaki <kawasaki@juno.dti.ne.jp>
2023-03-21 17:17:31 +09:00
Shin'ichiro Kawasaki
d1f7f58ca2 README.md: Add description about -r option for scan failure
Add an item to "In Case You Fail to Connect" section to describe that
the "-r" option may help to address device scan failure.

Signed-off-by: Shin'ichiro Kawasaki <kawasaki@juno.dti.ne.jp>
2023-03-21 16:54:59 +09:00
Shin'ichiro Kawasaki
7050016ee6 scratch_link.py: Add -r option to retry BLE scan
Recently, scratch link connection failure is reported. Similar failure
is observed with my environment. I found BTLEDisconnectError happens at
scanner.scan(). Though the true cause of the failure is not yet known, I
found simple retry of scanner.scan() avoids the failure. As a temporary
work around, implement -r or --scan_retry option which specify how many
times to retry the scan. I confirmed that "-r 2" option avoided the
failure.

Signed-off-by: Shin'ichiro Kawasaki <kawasaki@juno.dti.ne.jp>
2023-03-21 15:53:34 +09:00
Shin'ichiro Kawasaki
d845d69bb8 gencert.py: Support Snap Firefox and Chromium
Recently Ubuntu provides Firefox and Chromium in the form of Snap
package, and they place NSS DB at different path from non-Snap package.
However, current gencert.py implementation supports only the NSS DB
paths for non-Snap packages. This results in HTTPS communication failure
between the browsers and scratch_link.

Support the NSS DB paths for the Snap packages. Add a new function
prep_cert_for_app() which takes application name and its NSS DB search
path. Call this function for list of browsers, covering both non-Snap
and Snap packages.

Signed-off-by: Shin'ichiro Kawasaki <kawasaki@juno.dti.ne.jp>
2023-03-19 20:59:58 +09:00
Shin'ichiro Kawasaki
751190935a release.sh: add example command lines
I tend to forget the command lines to release new packages. Record it in
the release script.

Signed-off-by: Shin'ichiro Kawasaki <kawasaki@juno.dti.ne.jp>
2022-07-18 11:12:46 +09:00
5 changed files with 68 additions and 34 deletions

View File

@@ -141,10 +141,22 @@ In Case You Fail to Connect
* If the service is not working, refer guide of your distro to set it up.
* If the service is working, also check that /etc/bluetooth/main.conf sets AutoEnable=true.
3. If scratch_link.py says "failed to connect to BT device: [Errno 13] Permission denied",
3. If device scan still fails, use -r option to retry device scan.
The command line below does device scan twice. Each scan takes 10 seconds.
```
$ scratch_link -r 2
```
It would be good to use -s option together to reduce each scan duration.
The command line below does 3 seconds device scan twice.
```
$ scratch_link -r 2 -s 3
```
4. If scratch_link.py says "failed to connect to BT device: [Errno 13] Permission denied",
make sure to pair the bluetooth device to your PC before connecting to Scratch.
4. To connect to multiple devices at the same time, make all the target devices
5. To connect to multiple devices at the same time, make all the target devices
ready for scan at the first device scan. This is important for toio. The toio
allows a single project to connect to two toio devices.
* When the second device was prepared after the first device was connected, device scan can not find the second device.
@@ -158,6 +170,11 @@ Please file issues to [GitHub issue tracker](https://github.com/kawasaki/pyscrli
Releases
--------
Release 0.2.7
* Supported Snap Firefox and Chromium
* Added -r option to retry BLE scan
Release 0.2.6
* Removed Bluetooth Classic and LEGO Mindstorm EV3 support

View File

@@ -152,36 +152,37 @@ def prep_nss_cert(dir, cert, nickname):
remove_cert(dir, nickname)
add_cert(dir, cert, nickname)
def prep_cert():
# Generate certification and key
gen_cert(cert_file_path, key_file_path)
# Add certificate to FireFox
def prep_cert_for_app(cert, app, search_path):
"""
Find a NSS DB in the search_path for the app and prepare the cert in the DB.
"""
nssdb = None
firefox_nss_path = os.path.join(homedir, ".mozilla/firefox/")
for root, dirs, files in os.walk(firefox_nss_path):
for root, dirs, files in os.walk(os.path.join(homedir, search_path)):
for name in files:
if not re.match("key.*\.db", name):
continue
nssdb = root
if prep_nss_cert(nssdb, cert_file_path, SCRATCH_CERT_NICKNAME):
logger.error(f"Failed to add certificate to FireFox NSS DB: {nssdb}")
if prep_nss_cert(nssdb, cert, SCRATCH_CERT_NICKNAME):
logger.error(f"Failed to add certificate to {app}: {nssdb}")
sys.exit(3)
else:
logger.info(f"Certificate is ready in FireFox NSS DB: {nssdb}")
logger.info(f"Certificate is ready in {app} NSS DB: {nssdb}")
if not nssdb:
logger.info("FireFox NSS DB not found. Do not add certificate.")
logger.debug(f"NSS DB for {app} not found. Do not add certificate.")
# Add certificate to Chrome
nssdb = os.path.join(homedir, ".pki/nssdb")
if os.path.isdir(nssdb):
if prep_nss_cert(nssdb, cert_file_path, SCRATCH_CERT_NICKNAME):
logger.error(f"Failed to add certificate to Chrome")
sys.exit(4)
else:
logger.info("Certificate is ready for Chrome")
else:
logger.info("Chrome NSS DB not found. Do not add certificate.")
def prep_cert():
# Generate certification and key
gen_cert(cert_file_path, key_file_path)
nss_dbs = {
"FireFox": ".mozilla/firefox/",
"FireFox(Snap)": "snap/firefox/common/.mozilla/firefox/",
"Chrome": ".pki",
"Chromium(Snap)": "snap/chromium",
}
[ prep_cert_for_app(cert_file_path, k, nss_dbs[k]) for k in nss_dbs ]
if __name__ == "__main__":
prep_cert()

View File

@@ -318,16 +318,23 @@ class BLESession(Session):
BLESession.found_devices.clear()
for i in range(self.MAX_SCANNER_IF):
scanner = Scanner(iface=i)
try:
logger.debug(f"start BLE scan: {scan_seconds} seconds")
devices = scanner.scan(scan_seconds)
for dev in devices:
if self.matches(dev, params['filters']):
BLESession.found_devices.append(dev)
found = True
logger.debug(f"BLE device found with iface #{i}");
except BTLEManagementError as e:
logger.debug(f"BLE iface #{i}: {e}");
for j in range(scan_retry):
try:
logger.debug(f"start BLE scan: {scan_seconds} seconds")
devices = scanner.scan(scan_seconds)
for dev in devices:
if self.matches(dev, params['filters']):
BLESession.found_devices.append(dev)
found = True
logger.debug(f"BLE device found with iface #{i}");
if found:
break
except BTLEDisconnectError as de:
logger.debug(f"BLE iface #{i}: {de}");
except BTLEManagementError as me:
logger.debug(f"BLE iface #{i}: {me}");
if found:
break
else:
found = len(BLESession.found_devices) > 0
return found
@@ -534,11 +541,14 @@ def stack_trace():
def main():
global scan_seconds
global scan_retry
parser = argparse.ArgumentParser(description='start Scratch-link')
parser.add_argument('-d', '--debug', action='store_true',
help='print debug messages')
parser.add_argument('-s', '--scan_seconds', type=float, default=10.0,
help='specifiy duration to scan BLE devices in seconds')
parser.add_argument('-r', '--scan_retry', type=int, default=1,
help='specifiy retry times to scan BLE devices')
args = parser.parse_args()
if args.debug:
print("Print debug messages")
@@ -546,7 +556,9 @@ def main():
handler.setLevel(logLevel)
logger.setLevel(logLevel)
scan_seconds = args.scan_seconds
scan_retry = args.scan_retry
logger.debug(f"set scan_seconds: {scan_seconds}")
logger.debug(f"set scan_retry: {scan_retry}")
# Prepare certificate of the WSS server
gencert.prep_cert()

View File

@@ -4,7 +4,11 @@ usage() {
echo "Usage: ${0} COMMAND"
echo -e "COMMAND:"
echo -e "\tbuild"
echo -e "\tupload FILES"
echo -e "\tupload-testpypi FILES"
echo -e "examples:"
echo -e "\t${0} build"
echo -e "\t${0} upload dist/*0.2.6*"
exit 1
}

View File

@@ -5,7 +5,7 @@ with open("README.md", "r") as fh:
setuptools.setup(
name="pyscrlink",
version="0.2.6",
version="0.2.7",
author="Shin'ichiro Kawasaki",
author_email='kawasaki@juno.dti.ne.jp',
description='Scratch-link for Linux with Python',