Created attachment 201777 [details]
Add fetch_check_connection function to freebsd-update
Running freebsd-update in a system with limited resources (low power cpu and sd storage as disk for example) takes a long time (+5 hours in a RaspberryPi). If we also have a poor network link dependent to a mobile 3G network, is more difficult to complete it properly.
When freebsd-update execute the lines that calls phttpget, if the network is unavailable, it directly fails, throwing away the time spend previously.
There is a workaround tunning phttpget with the HTTP_TIMEOUT environment variable, but it only works before doing the tcp connection. If it can't resolve the dns, it fails ending the execution.
The solution that I include in the patch adds a call to the server previous the phttpget execution, checking if it was ok or not, looping on it waiting 60 seconds until the next try if it fails. If the executions is made from cron, it only loops once and fails.
If you are looking over the upgrade and see that is stuck on that point, you have a chance to fix it, restart the modem, wait until you receive better connectivity or whatever, but it can continue.
In the new function I use the fetch command because is used already on freebsd-update and its part of the base system. Also netcat or telnet can be used, but the environmental variables that can modify the fetch behaviour, like http_proxy, aren't available on those alternatives.
As well, I use for fetch the file latest.ssl because the other file that I found, pub.ssl, is a bit larger. I didn't find any other way to get a dumb file like a readme.txt or similar in the updateN.freebsd.org servers.
I tested it and works as expected.