summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--LICENSE19
-rw-r--r--README.md99
-rw-r--r--config_example.txt6
-rwxr-xr-xphrollo27
4 files changed, 151 insertions, 0 deletions
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..6957959
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2019 Vincenzo 'KatolaZ' Nicosia <katolaz@freaknet.org>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..4b7cb99
--- /dev/null
+++ b/README.md
@@ -0,0 +1,99 @@
+ phrollo: a phlogroll in a shellscript
+=============================================
+
+`phrollo` is a simple tool to manage a phlog roll. It uses a simple
+configuration file and outputs the relevant selectors to be added to a
+gophermap. The list of selectors of updated phlogs is sorted in
+decreasing order of update time (meaning that more recent updates appear
+at the top of the list). `phrollo` also outputs an updaterd config file,
+to be used for future calls.
+
+`phrollo` detects updates by using `shasum -a 256`, i.e. by computing
+a hash of the resource and comparing it with the hash obtained when the
+resource was last seen.
+
+ Usage
+===========
+
+1)
+```
+./phrollo status.txt
+```
+
+In this case, `phrollo` will put a new config file in `status.txt.new`,
+and output the sorted list of gopher selectors. The config file received
+on input will also be saved in `status.txt.bak`.
+2)
+
+```
+ cat config.txt | ./phrollo
+```
+
+In this case, the new config file will be put in `phrollo.out`, and
+output the sorted list of gopher selectors.
+
+IMPORTANT: The next time `phrollo` is run, it must be given the last
+config file generated.
+
+ Configuration file
+========================
+
+The format of the `phrollo` config file is as follows:
+
+DATE \t DESCRIPTION \t URI \t HOST \t PORT \t SHASUM
+
+where:
+
+ - DATE: is the last time the phlog was updated, or an empty string for
+ a new phlog;
+ - DESCRIPTION: is the description of the phlog (e.g., the name of the
+ author)
+ - URI: is the path of the phlog
+ - HOST: well, the host
+ - PORT: normally 70
+ - SHASUM: the shasum of the phlog at the time of the latest change, or
+ an empty string for a new phlog
+
+ Example
+=============
+
+Let us construct an initial `phrollo` config file containing all the
+phlogs we would like to follow. Since `phrollo` has never seen any of
+those phlogs, both DATE and SHASUM will be ignored. We will indicated
+them with a "-" dash. Notice that fields are separated by actual TABs:
+
+```
+- Slugmax /~slugmax/cgi-bin/slerm zaibatsu.circumlunar.space 70 -
+- RPDO /Phlog 1436.ninja 70 -
+- Alex Shroeder / alexschroeder.ch 70 -
+- Solderpunk /~solderpunk/phlog zaibatsu.circumlunar.space 70 -
+- Tomasino /phlog gopher.black 70 -
+- KatolaZ /~katolaz/phlog republic.circumlunar.space 70 -
+```
+
+Now we can feed this file to `phrollo` to get:
+
+```
+1(20190126) Alex Shroeder / alexschroeder.ch 70
+1(20190126) KatolaZ /~katolaz/phlog republic.circumlunar.space 70
+1(20190126) RPDO /Phlog 1436.ninja 70
+1(20190126) Slugmax /~slugmax/cgi-bin/slerm zaibatsu.circumlunar.space 70
+1(20190126) Solderpunk /~solderpunk/phlog zaibatsu.circumlunar.space 70
+1(20190126) Tomasino /phlog gopher.black 70
+```
+
+which is a list of selectors corresponding to the phlogs specified in
+the config file. Moreover, `phrollo` will also create the updated
+config file `phrollo.out`:
+
+```
+20190126 Tomasino /phlog gopher.black 70 bd141abfc29522e3e2b5d00f1a656212201ae5def60de90a7ce847cddeb6d0db
+20190126 Solderpunk /~solderpunk/phlog zaibatsu.circumlunar.space 70 4df8feff5237db12a4fb1c43d95f254dc26b0e35e3b008d53cc5004ad2c6acb9
+20190126 Slugmax /~slugmax/cgi-bin/slerm zaibatsu.circumlunar.space 70 bfd0e14e2c5b08fff6b968804dd253e488c5e0bfd9d80cec4ca7599928fac53f
+20190126 RPDO /Phlog 1436.ninja 70 d61e34dfc71a10f5b45c6ccf7f6d96e4f976832efdd179e71a0981695b317dc9
+20190126 KatolaZ /~katolaz/phlog republic.circumlunar.space 70 af9b99199b344b027addeb09ba71621123bf799605b6190a65be145221bcefde
+20190126 Alex Shroeder / alexschroeder.ch 70 36d66161d096c5c729a6433c411fad9da978931cdfab40e9bd57787aa0e0b1f6
+```
+
+Then, we can run `phrollo` again using the latest updated config file
+(i.e., `phrollo.out`) to detect updates.
diff --git a/config_example.txt b/config_example.txt
new file mode 100644
index 0000000..bcf109b
--- /dev/null
+++ b/config_example.txt
@@ -0,0 +1,6 @@
+- Slugmax /~slugmax/cgi-bin/slerm zaibatsu.circumlunar.space 70 -
+- RPDO /Phlog 1436.ninja 70 -
+- Alex Shroeder / alexschroeder.ch 70 -
+- Solderpunk /~solderpunk/phlog zaibatsu.circumlunar.space 70 -
+- Tomasino /phlog gopher.black 70 -
+- KatolaZ /~katolaz/phlog republic.circumlunar.space 70 -
diff --git a/phrollo b/phrollo
new file mode 100755
index 0000000..1e2ff91
--- /dev/null
+++ b/phrollo
@@ -0,0 +1,27 @@
+#!/bin/sh
+# (c) 2019 KatolaZ <katolaz@freaknet.org>
+# MIT License
+
+FILEIN="${1:-/dev/stdin}"
+TODAY="$(date +%Y%m%d)"
+if [ "${FILEIN}" != '/dev/stdin' ]; then {
+ cat "${FILEIN}" | tee "${FILEIN}".bak > "${FILEIN}".new
+ FILEOUT="${FILEIN}".new
+} else {
+ FILEOUT="$(basename $0).out"
+}
+fi
+
+IFS=' '
+while read -r D T S H P SH; do
+ NSH="$(printf "$S\r\n" | nc $H $P | shasum -a 256 | cut -d " " -f 1)"
+ [ $? -eq 0 ] &&
+ [ "${SH}" != "${NSH}" ] && {
+ D="${TODAY}"
+ SH="${NSH}"
+ }
+ printf "%s\t%s\t%s\t%s\t%s\t%s\n" "$D" "$T" "$S" "$H" "$P" "$SH"
+done < "${FILEIN}" | sort -rnk1 -k2 | tee "${FILEOUT}" | \
+ sed -r "s/^([0-9][0-9]*) /1(\1) /g;s/ [a-f0-9][a-f0-9]*$//g" |\
+ sort -k1 -k2
+