This commit is contained in:
Joey Hess 2017-03-30 14:15:12 -04:00
parent 2f4af8ef93
commit 43d7862b44
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38

View file

@ -0,0 +1,91 @@
[[!comment format=mdwn
username="joey"
subject="""comment 1"""
date="2017-03-30T16:51:24Z"
content="""
Using a remote for this seems problimatic, because the remote is not
pointing at a single well-defined data store, but instead whatever peers
happen to exist on the network.
For one, `copy --to=udp-multicast` would not try to send files that it thinks
are already located in that remote. I suppose this could be dealt with by
making the transfers always seem to fail, so it never thinks that the
multicast remote has any files.
But then, `copy --from=udp-multicast` would not try to receive files,
unless it thinks they're in that remote. And we just established it should
not think any files are in that remote. So that's a problem.
Also, the copy from/to would need to be operating on the same file at the
same time, which seems problimatic. If a receiving git-annex is a little
slower than the sender, or is operating on a slightly different set of
files, it would then miss a file being broadcast by the sender.
These issues seem to point to this needing to use some other, more
special-purpose commands for muticast.
----
It probably needs encryption, both for privacy and to ensure that files
are being received from the sender you intended, and not someone else
who might be broadcasting the contents of a different repository.
Here's how to set up encryption and authentication with uftp,
so that both client and server actually encrypt and check that they're
talking with a known entity. It took a while to figure out.
Client:
uftp_keymgt -g rsa:512 ~/client_key
# Parse the fingerprint value from its output; does not
# seem to be a better way, except perhaps using openssl to examine
# the key file. This is CLIENT_FINGERPRINT
# Pick a UID for the client. This is an 8-diget hex number,
# which needs to be unique across clients. Default is based on IP
# adddres, but for git-annex it could be derived from the git-annex
# UUID. This is CLIENT_UID.
Server:
uftp_keymgt -g rsa:512 ~/servant_key
# Parse the SERVER_FINGERPRINT from its output.
# Pick a SERVER_UID for the server.
Client:
# create a file "authlist" that contains "$SERVER_UID|$SERVER_FINGERPRINT"
uftpd -E -d -D/tmp/xx -k ~/client_key -U $CLIENT_UID -S '@authlist'
Server:
# create file "authlist" that contains "$CLIENT_UID|$CLIENT_FINGERPRINT"
# lines for each allowed client
uftp -c -Y aes256-cbc -h sha1 -k ~/server_key -U $SERVER_UID -H '@authlist' file_to_send
----
Notice that the client and server UID and key generation steps above
are the same. So, a command like `git annex multicast --gen-address`
could be run on both the server and clients, and could store
the addresses in the git-annex branch.
The uftp authlist file would be derived from all known such addresses.
(Unlike `p2p --gen-address`, where the address allows connecting with
and authentication with a remote over TOR, these multicast addresses
are safe to make public.)
The process of setting up a multicast classroom would then be:
1. Teacher runs `git annex multicast --gen-address; git annex sync`
2. Students each run `git annex multicast --gen-address; git annex sync`
3. Teacher runs `git annex sync` once all the students have generated addresses.
(Now the students all have received the teacher's address, and the teacher
has received all the student's addresses.)
4. Students each run `git annex multicast-receive`, which listens for
files going by and stores them.
5. Once the students are listening (*ahem*), teacher runs
`git annex multicast-send [file]` to distribute files.