blog for the day
This commit is contained in:
parent
c28b54c469
commit
38c679d0c8
1 changed files with 50 additions and 0 deletions
50
doc/design/assistant/blog/day_75__zeromq_and_pairing.mdwn
Normal file
50
doc/design/assistant/blog/day_75__zeromq_and_pairing.mdwn
Normal file
|
@ -0,0 +1,50 @@
|
|||
Started reading about ZeroMQ with the hope that it could do some firewall
|
||||
traversal thing, to connect mutually-unroutable nodes. Well, it could, but
|
||||
it'd need a proxy to run on a server both can contact, and lots of
|
||||
users won't have a server to run that on. The XMPP approach used by
|
||||
dvcs-autosync is looking like the likeliest way for git-annex to handle
|
||||
that use case.
|
||||
|
||||
However, ZeroMQ did point in promising directions to handle another use
|
||||
case I need to support: Local [[pairing]]. In fairly short order, I got
|
||||
ZeroMQ working over IP Multicast (PGM), with multiple publishers sending
|
||||
messages that were all seen by multiple clients on the LAN (actually the
|
||||
WAN; works over OpenVPN too). I had been thinking about using
|
||||
Avahi/ZeroConf for discovery of systems to pair with, but ZeroMQ is rather
|
||||
more portable and easy to work with.
|
||||
|
||||
Unfortunatly, I wasn't able to get ZeroMQ to behave reliably enough.
|
||||
It seems to have some timeout issues the way I'm trying to use it,
|
||||
or perhaps its haskell bindings are buggy? Anyway, it's really overkill
|
||||
to use PGM when all I need for git-annex pairing discovery is lossy
|
||||
UDP Multicast. Haskell has a simple `network-multicast` library for that,
|
||||
and it works great.
|
||||
|
||||
With discovery out of the way (theoretically), the hard part about
|
||||
[[pairing]] is going to be verifying that the desired repository is being
|
||||
paired with, and not some imposter. My plan to deal with this involves a
|
||||
shared secret, that can be communicated out of band, and HMAC. The webapp
|
||||
will prompt both parties to enter the same agreed upon secret (which could
|
||||
be any phrase, ideally with 64 bytes of entropy), and will then use it as
|
||||
the key for HMAC on the ssh public key. The digest will be sent over the
|
||||
wire, along with the ssh public key, and the other side can use the shared
|
||||
secret to verifiy the key is correct.
|
||||
|
||||
The other hard part about [[pairing]] will be finding the best address to
|
||||
use for git, etc to connect to the other host. If MDNS is available, it's
|
||||
ideal, but if not the pair may have to rely on local DNS, or even
|
||||
hard-coded IPs, which will be much less robust. Or, the assistant could
|
||||
broadcast queries for a peer's current IP address itself, as a poor man's
|
||||
MDNS.
|
||||
|
||||
All right then! That looks like a good week's worth of work to embark on.
|
||||
|
||||
---
|
||||
|
||||
Slight detour to package the haskell network-multicast library and upload
|
||||
to Debian unstable.
|
||||
|
||||
Roughed out a data type that models the whole pairing conversation,
|
||||
and can be serialized to implement it. And a state machine to run
|
||||
that conversation. Not yet hooked up to any transport such as multicast
|
||||
UDP.
|
Loading…
Reference in a new issue