A gopher phlogroll in a POSIX shell script
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
KatolaZ 5dcc2807cd fix a printf 4 years ago
LICENSE initial commit 4 years ago
README.md new config file on stderr + amend README 4 years ago
config_example.txt initial commit 4 years ago
phrollo fix a printf 4 years ago


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 prints on stderr 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.


Either :

./phrollo status.txt


 cat status.txt | ./phrollo

will print the sorted list of gopher selectors on stdout, and the updated config file on stderr.

IMPORTANT: The next time phrollo is run, it must be given the last config file generated, so be sure to redirect stderr appropriately. A fully working example is given below.

Configuration file

The format of the phrollo config file is as follows:



  • 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


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:

cat config.txt | ./phrollo 2> config_updated.txt > gophermap

and we will get the following output in gophermap:

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, and the updated config file in config_updated.txt:

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 to detect updates and generate the new gophermap. It is possible to automate the update procedure by something like:


cp config.txt config.txt."$(date +%Y%m%d)"
cat config.txt | ./phrollo 2> config.txt.new  > gophermap.new

[ $? -eq 0 ] && {
	mv config.txt.new config.txt
	mv gophermap.new gophermap