openairplay / airplay2-receiver

AirPlay 2 Receiver - Python implementation
2.12k stars 131 forks source link

No such file or directory: './pairings/accessory-secret' #43

Closed joni15 closed 2 years ago

joni15 commented 3 years ago

Hello,

when i run the docker container on rpi 4 :

[....] Starting Avahi mDNS/DNS-SD Daemon: avahi-daemo[.ok Traceback (most recent call last): File "ap2-receiver.py", line 190, in LTPK = LTPK() File "ap2-receiver.py", line 164, in init announce_id, self.ltpk = Hap(PI).configure() File "/airplay2/ap2/pairing/hap.py", line 170, in init with open("./pairings/accessory-secret", "wb") as secret_file: FileNotFoundError: [Errno 2] No such file or directory: './pairings/accessory-secret'

systemcrash commented 3 years ago

Interesting. It's attempting to write the file to that path. Permissions to be able to write to that folder pairings and that file in the folder are necessary. Can you touch the file and create an empty binary file? Does it work then?

thebeater commented 3 years ago

Hi systemcrash,

I have the same error and after touch ./pairings/accessory-secret the file is generated but the error is always:

docker run -it --rm --device /dev/snd --net host invano/ap2-receiver [ ok ] Starting Avahi mDNS/DNS-SD Daemon: avahi-daemon. Traceback (most recent call last): File "ap2-receiver.py", line 190, in LTPK = LTPK() File "ap2-receiver.py", line 164, in init announce_id, self.ltpk = Hap(PI).configure() File "/airplay2/ap2/pairing/hap.py", line 170, in init with open("./pairings/accessory-secret", "wb") as secret_file: FileNotFoundError: [Errno 2] No such file or directory: './pairings/accessory-secret'

systemcrash commented 3 years ago

OK - then I think the docker image needs extending slightly to understand that the pairings dir should be mapped. Think you could pull together a docker-compose.yaml file with that in?

thebeater commented 3 years ago

then I think the docker image needs extending slightly to understand that the pairings dir should be mapped.

I‘m not very familiar with docker. If you can guide me a little bit this should be no Problem…

systemcrash commented 2 years ago

I learned a ton about docker from google and stack overflow. 😎 Try something like this after ports:

   volumes:
     - ./pairings:/pairings
Shaquu commented 2 years ago

For me, compose alone did not solve the issue. I did a "fix" in code, though.

        if not path.exists('./pairings/accessory-secret'):
            accessory_secret = random(nacl.bindings.crypto_sign_SEEDBYTES)
            try:
                with open("./pairings/accessory-secret", "wb") as secret_file:
                    secret_file.write(accessory_secret)
            except FileNotFoundError:
                print("Could not open './pairings/accessory-secret'")
                print("accessory_secret will not be persisted")
        else:
            with open("./pairings/accessory-secret", "rb") as secret_file:
                accessory_secret = secret_file.read()
            self.accessory_ltsk = nacl.signing.SigningKey(accessory_secret)
joni15 commented 2 years ago

Thank you for your help. I will test as soon as possible. I'm on holiday and have little time to play with my raspberry pi 😅

systemcrash commented 2 years ago

Can one of you try with the docker-compose.yaml file with e.g.:

version: '3.8'
services:
 ap2:
   restart: unless-stopped
   network_mode: host
   build: .
   # ports:
     # - "7000:7000"
     # - "10000-10100:10000-10100/udp"
   volumes:
     - ./pairings:/airplay2/pairings/
   devices:
     - "/dev/snd"
   environment: # All variables are optional.
     - AP2HOSTNAME=Airplay2
     - AP2IFACE=eth0
systemcrash commented 2 years ago

See 2aa2613

Shaquu commented 2 years ago

Thanks, as you speak about docker love. @systemcrash would you mind optimizing build? Some steps are not cached, which makes rebuild very slow.

systemcrash commented 2 years ago

Use docker-compose or avoid the build step.