Recently I started seeing this message in the production logs for FreshPorts:
Oct 13 15:35:38 aws-1-nginx01 FreshPorts[75290]: _pkgmessage_UCL found a type is it not prepared for : Array
What code produces that message?
GitHub makes searching for that message easy. I found it here:
syslog(LOG_ERR, '_pkgmessage_UCL found a type is it not prepared for : ' . $thing->type);
What port has this issue?
Searching the webserver logs, I find:
$ grep 15:35:38 /var/log/nginx/freshports.org-access.log.0 92.220.10.100 - - [13/Oct/2021:15:35:38 +0000] "GET /graphics/rawtherapee/?branch=2021Q3 HTTP/1.1" 200 13068 "-" "Mozilla/5.0 (compatible; MJ12bot/v1.4.8; http://mj12bot.com/)"
Always be able to reproduce the issue
If I cannot reproduce the issue myself, I cannot be confident that any changes I make have fixed it.
After clearing the cache for that port I was able to reproduce the error message:
$ sudo rm -rf ~freshports/cache/ports/graphics/rawtherapee
Analysis of the problem
Looking at the code I can see it is saving the pkgmessage column (from the ports table) into a file. It then converts that to JSON and parses the output to create HTML.
The code is prepared to find various action values, such as upgrade, install, and remove.
But it’s getting an array.
Duplicating the issue from the command line
Let’s look at what ucl is bringing back. This is where some command line use of psql helps. I will abbreviate the output to reduce your scrolling.
freshports.devgit=# select pkgmessage from ports_active where name = 'rawtherapee'; pkgmessage ------------------------------------------------------------------------- [ + {type: [install, upgrade], message=<<EOD + LENSFUN INFORMATION: + + This package uses lensfun to correct lens aberrations. In case + your camera or lens seem unsupported, try running + lensfun-update-data - this will download new lensfun databases. + + .... remove older cache directories. + + Also, after configurations have been moved to the new version's + directory, older $HOME/.config/RawTherapee* directories may be removed.+ EOD + }, + ] (5 rows)
I can not use that output in a file and run it through UCL. I need to get ride of the column header (—) and the field separators (+++).
I read the output of psql –help and came up with this:
[dan@pg02:~]: $ psql --no-align --tuples-only freshports.devgit -c "select pkgmessage from ports_active where name = 'rawtherapee'" [ {type: [install, upgrade], message=<<EOD LENSFUN INFORMATION: This package uses lensfun to correct lens aberrations. In case your camera or lens seem unsupported, try running lensfun-update-data - this will download new lensfun databases. DISK SPACE WARNING: ... Also, after configurations have been moved to the new version's directory, older $HOME/.config/RawTherapee* directories may be removed. EOD }, ]
That is much better.
Let’s feed that into a file:
[dan@pg02:~]: $ psql --no-align --tuples-only freshports.devgit -c "select pkgmessage from ports_active where name = 'rawtherapee'" > rawtherapee.ucl
Now run ucl on it (the output has been wrapped to ease reading):
[dan@pg02:~]: $ /usr/local/bin/ucl_tool --in rawtherapee.ucl --format json [ { "type": [ "install", "upgrade" ], "message": "LENSFUN INFORMATION:\n\nThis package uses lensfun to correct lens aberrations. In case\nyour camera or lens seem unsupported, try running\nlensfun-update-data - this will download new lensfun databases.\n\nDISK SPACE WARNING:\n\nNote that RawTherapee uses version-dependent cache and configuration\ndirectories. Please be advised that cache directories can grow large,\nso be sure to check all users' $HOME/.cache/RawTherapee* and have them\nremove older cache directories.\n\nAlso, after configurations have been moved to the new version's\ndirectory, older $HOME/.config/RawTherapee* directories may be removed." } ]
There it is. type is an array in this case. The code always assumes it is a string.
Now it’s just a matter of adjusting the code to cater for this.