anon hace 7 años
padre
commit
67fe6335df
Se han modificado 4 ficheros con 105 adiciones y 0 borrados
  1. 3 0
      Dockerfile
  2. 27 0
      ipns_directory_sync_daemon
  3. 46 0
      sync_ipns
  4. 29 0
      wait_for_ipns_change

+ 3 - 0
Dockerfile

@@ -40,5 +40,8 @@ RUN mkdir /root/ipfs && \
 
 
 ADD ipfs.supervisor.conf /etc/supervisor/conf.d/
 ADD ipfs.supervisor.conf /etc/supervisor/conf.d/
 ADD start_ipfs /usr/local/bin/start_ipfs
 ADD start_ipfs /usr/local/bin/start_ipfs
+ADD wait_for_ipns_change /usr/local/bin/wait_for_ipns_change
+ADD ipns_directory_sync_daemon /usr/local/bin/ipns_directory_sync_daemon
+ADD sync_ipns /usr/local/bin/sync_ipns
 
 
 CMD ["supervisord", "-c", "/etc/supervisor.conf"]
 CMD ["supervisord", "-c", "/etc/supervisor.conf"]

+ 27 - 0
ipns_directory_sync_daemon

@@ -0,0 +1,27 @@
+#!/bin/bash
+
+set -e
+set -x
+
+id="$1"
+src="$2"
+dest="$3"
+
+base="$( cd "$(dirname "$0")" ; pwd -P )"
+
+if [ -z "$dest" ]; then
+	echo >&2 "usage: $0 id src dest"
+	exit 1
+fi
+
+last=$(ipfs files cat "/last$id" || echo "X")
+
+while true; do
+    $base/wait_for_ipns_change "$src" "$last" 10 && {
+        last=$($base/sync_ipns "$src" "$dest")
+        echo "$last" | ipfs files write "/last$id"
+    } || {
+        :
+    }
+    sleep 1
+done

+ 46 - 0
sync_ipns

@@ -0,0 +1,46 @@
+#!/bin/bash
+
+set -e
+#set -x
+
+src="$1"
+dest="$2"
+
+if [ -z "$dest" ]; then
+	echo >&2 "usage: $0 src dest"
+	exit 1
+fi
+
+seen_files=$(mktemp)
+
+mkdir -p "$dest" || true
+
+cur=$(ipfs name resolve --nocache "$src")
+
+ipfs ls "$cur" | while read HASH SIZE FILENAME; do
+	FILENAME="${FILENAME%$'\r'}"
+	dest_file="$dest/$FILENAME"
+
+	if [ -e "$dest_file" ]; then
+		ipfs_file_size=$(ipfs files stat --format='<size>' "/ipfs/$HASH")
+		if [ $( stat -c %s "$dest_file") -eq "$ipfs_file_size" ]; then
+			echo $FILENAME >> "$seen_files"
+			continue
+		fi
+	fi
+	echo >&2 "Retrieving $HASH => $dest_file"
+	ipfs cat "$HASH" > "$dest_file"
+	echo $FILENAME >> "$seen_files"
+done
+
+after_files=$(mktemp)
+ls "$dest" > "$after_files"
+
+comm --nocheck-order -13 "$seen_files" "$after_files" | while read INTRUDER; do
+	rm -f "$dest/$INTRUDER"
+done
+
+rm -f "$seen_files"
+rm -f "$after_files"
+
+echo "$cur"

+ 29 - 0
wait_for_ipns_change

@@ -0,0 +1,29 @@
+#!/bin/bash
+
+set -x
+
+topic="$1"
+last="$2"
+timeout="$3"
+
+cur=$(ipfs name resolve --nocache "$topic")
+
+if [ "$cur" != "$last" ]; then
+	exit 1
+fi
+
+timeout "${timeout}s" ipfs pubsub sub "$topic" 2>/dev/null | while read VALUE; do
+	pkill -P $$
+	cur=$(ipfs name resolve --nocache "$topic")
+	if [ "$cur" != "$last" ]; then
+		exit 1
+	fi
+	exit 0
+done
+
+cur=$(ipfs name resolve --nocache "$topic")
+if [ "$cur" != "$last" ]; then
+	exit 1
+fi
+
+exit 0