diff options
| -rw-r--r-- | LICENSE | 19 | ||||
| -rw-r--r-- | README.md | 99 | ||||
| -rw-r--r-- | config_example.txt | 6 | ||||
| -rwxr-xr-x | phrollo | 27 | 
4 files changed, 151 insertions, 0 deletions
@@ -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	- @@ -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  +  | 
