It might not be the 'right' way to do things, but I've had no trouble upgrading machines remotely. YMMV, depending on how busy the thing is.
What I would do is: Download the relevant *37.tgz and bsd files. Comment stuff out of rc.conf.local and/or rc.local to reduce what gets started on boot. In particular, disable startup of anything out of packages. Copy the 3.7 bsd into /. Reboot. In /, use tar zxfp to unpack the relevant *37.tgz files, one at a time. Do not include etc37.tgz or xetc37.tgz. Repeat everything for 3.8. Repeat everything for 3.9. Reboot. Update your /etc stuff. I use mergemaster, but there are other ways of doing it. Update your packages to 3.9. Try the -i option on pkg_add. Reenable stuff in rc.conf.local and rc.local as appropriate. Reboot. You might want to remove cruft in the base system left over from superceded versions of the OS. -- Christopher

