On Sun, Jan 07, 2024 at 05:04:57PM +0000, Stuart Henderson wrote: > On 2024/01/07 01:15, Chaz Kettleson wrote: > > Hello, > > > > This is my first port. I'm looking for mentorship, testing, and feedback > > to eventually get this committed. I've read the porting guide, > > bsd.port.mk(5), rc.subr(8), and login.conf(5) when making this port. > > > > This is a port for open Home Automation Bus https://www.openhab.org/. > > From the project github and DESCR: > > > > The open Home Automation Bus (openHAB) project aims at providing a > > universal integration platform for all things around home automation. > > It is a pure Java solution, fully based on OSGi. > > > > It is designed to be vendor-neutral as well as hardware/protocol-agnostic. > > openHAB brings together different bus systems, hardware devices, > > and interface protocols by dedicated bindings. These bindings send > > and receive commands and status updates on the openHAB event bus. > > This concept allows designing user interfaces with a unique look&feel, > > but with the possibility to operate devices based on a big number > > of different technologies. Besides the user interfaces, it also > > brings the power of automation logic across different system > > > > I had a few challenges when making this port. > > > > Firstly, there is no archive root when extracting the distfile. Initially > > I had set ${WRKDIST}=${WRKDIR} and had do-install copy everything from > > ${WRKDIST}. This turned out to be a problem with 'make fake' since it was > > recursively trying to copy fake-amd64. I eventually opted to override > > EXTRACT_CASES for tar.gz to create a subdir and extract there. I was hoping > > for a variable that might let me set a directory instead, but I imagine most > > distfiles extract with an archive root. > > > > Secondly, I considered using the javaPathHelper within the rc file, but > > ultimately opted to use the scripts that come with Apache Karaf. The > > start.sh packaged with openHAB just calls these under the hood. They do > > a lot of bootstrapping for the environment, so calling java directly > > would cause a number of issues. Unfortunately, these scripts rely on > > the JAVA_HOME environment variable to be set. I packaged a openhab.login > > so I could set this variable via setenv. I was hoping the packaging process > > would allow me to substitute build variables similar to the rc file. This > > way > > I could do something like: > > > > :setenv=JAVA_HOME="$(${LOCALBASE}/bin/javaPathHelper -h openhab" > > > > I quickly realized it wasn't doing it when $ was substituted for the user > > per login.conf(5) and copied verbatim. This left me no choice but to > > hard-code the path (perhaps logic could be added for this case?) > > Here it is with a few tweaks; > > - handling extraction and JAVA_HOME in a bit more of a simple way, > no need for login.conf > - no need for a separate OPENHAB_HOME, we can just point PREFIX there > - don't repeat the name in COMMENT (where it's shown, PKGNAME is shown > too, so that's redundant information), instead try to provide more > of a brief description
Thank you! This is _much_ cleaner. I've been playing with this the last few days incorporating your feedback. The challenge now is that all of the configuration for openHAB happens through environment variables. This got a little messy in the rc file, for example, setting OPENHAB_HTTP_ADDRESS=127.0.0.1. Having users edit the rc file to control the program seemed wrong. I looked at the installation on debian and noticed they provide a /etc/default/openhab for configuration that is sourced via systemd or init.d. https://github.com/openhab/openhab-linuxpkg/blob/main/resources/etc/default/openhab My approach now is to provide this file for configuration and source it from the rc file. I will also update this to have 127.0.0.1 set by default. I have two questions: 1.) OpenBSD doesn't typically have a /etc/default/, I was considering just using /etc/openhab.conf thoughts? 2.) I've had a heck of time trying to get this copied there in do-install. I'm a bit confused on how to use PREFIX and get the PLIST updated during make fake/update-plist. For example something like cp ${FILESDIR}/openhab.conf ${SYSCONFDIR} does not work. More on this in my next comment. > > > Lastly, it's possible to patch this to break out configuration to /etc, > > logging to /var/log, as well as the data, cache, state, etc -- however, > > most Karaf-based applications don't typically change these, and most other > > Java-related ports I've looked at didn't either. This was mostly done > > for myself as I'm an experienced Java developer looking to contribute to > > openHAB (and use it!), however, I'm happy to make any changes to how it's > > installed based on feedback. > > Some thoughts: > > I think it probably would be helpful to at least put logs under /var/log > (perhaps with @sample /var/log/openhab and correct ownership, and > install a symlink as part of the package i.e. /var/openhab/userdata/logs > -> /var/log/openhab, which should avoid the need to patch anything). After reviewing the linux package I've decided to breakout all of the directories based on the default locations openHAB defines. I think this will be more natural for users anyway. Here is an excerpt from the link above: ######################### ## OPENHAB DEFAULTS PATHS ## The following settings override the default apt/rpm locations and should be used with caution. ## openHAB will fail to update itself if you're using different paths. ## Only set these if you are testing and are confident in debugging. #OPENHAB_HOME=/usr/share/openhab #OPENHAB_CONF=/etc/openhab #OPENHAB_RUNTIME=/usr/share/openhab/runtime #OPENHAB_USERDATA=/var/lib/openhab #OPENHAB_LOGDIR=/var/log/openhab So now I've been struggling with the same issue as copying /etc/openhab.conf for the above locations. For example, doing something like: cp ${WRKDIST}/userdata /var/lib/openhab is not going to work. I tried instead setting the PREFIX=/ and doing: cp ${WRKDIST}/conf ${PREFIX}etc/openhab cp ${WRKDIST}/userdata ${PREFIX}var/lib/openhab cp ${WRKDIST}/runtime ${PREFIX}usr/share/openhab/runtime but the fake framework does not update the PLIST. Setting PREFIX=/usr/local works for things like share/openhab, but I'm not sure how to handle when things are supposed to go to /usr, /etc, /var. I've reviewed documentation several times and clearly missing something. I intend to clean it up once I get it working correctly (i.e. using variables or even sourcing the files/openhab.conf to bootstrap locations to copy to). > > It could do with a pkg-readme (formatting based on the template under > /usr/ports/infrastructure/templates/README.template) at least indicating > that by default it runs with the web interface accessible to the world > on port 8080 and allows anyone with access to that to carry out the > initial setup. (If it's not too hard to do, it might be better to > restrict that to 127.0.0.1 by default and give info about how to change > it; if the web interface port can be changed it would be helpful to > show how to do that too, as 8080 is pretty often used by other > software). Done. > > Stopping the daemon doesn't seem to work very reliably. In particular > after I figured out that 8080 was conflicting and I stopped the other > daemon to test, "rcctl restart openhab" didn't stop/restart/get it to > pick up new config. I think I'd be happier to at least remove rc_check > and construct some pexp string to match. Not sure if that might also > be preferable for rc_stop (it didn't seem to respond all that well to > signals either - at least if pexp is set then the fallback that rc.d > uses for timeouts should kick in). I've looked into this deeper. The scripts need some seatbelts because there is time to spin up and shutdown the framework. It looks like this was handled in the init scripts for debian. I'll plan to port this over to the rc file on the next iteration. https://github.com/openhab/openhab-linuxpkg/blob/main/resources/etc/init.d/deb/openhab > > The package installs all files as writable by _openhab - that should be > ratcheted down so that only files/dirs which need to be changed at runtime > are writable the daemon user, otherwise have them owned by root. > But also, some places which the daemon tries to write to aren't > writable (need a dir creating with @sample perhaps?) > > 2024-01-07 16:39:58.803 [ERROR] [ficate.internal.CertificateGenerator] - > Failed to generate a new SSL Certificate. > java.security.cert.CertificateException: Failed to generate the new > certificate. > [...] > Caused by: java.io.FileNotFoundException: /var/openhab/userdata/etc/keystore > (Permission denied) > [...] > > and > > java.io.FileNotFoundException: /var/openhab/userdata/etc/users.properties > (Permission denied) I fixed all this. There was an odd situation where changing the owner/group resulted in files being 444 for certain subdirectories. For example the /var/openhab/userdata/etc directory had all files marked 444, but when the owner/group was not set it copied them over with correct permissions. I don't know if this is a protection when @owner/@group are set to default to 444 or an issue in the ports framework. Setting @mode fixed this, but I was surprised it didn't inherit the permissions from the tgz. Now all files are owned by root except those that will change during runtime. I did some testing to find out what broke and modified it manually. I didn't excercise every function of openHAB so there will likely be more to change with future testing. Thanks again for taking the time and helping during this process. > > > > > -- > > Chaz > > > > Index: user.list > > =================================================================== > > RCS file: /cvs/ports/infrastructure/db/user.list,v > > retrieving revision 1.436 > > diff -u -p -r1.436 user.list > > --- user.list 5 Jan 2024 14:40:32 -0000 1.436 > > +++ user.list 7 Jan 2024 04:58:41 -0000 > > @@ -404,3 +404,4 @@ id user group port > > 893 _azorius _azorius www/azorius > > 894 _gonic _gonic audio/gonic > > 895 _soju _soju net/soju > > +896 _openhab _openhab misc/openhab > > > > -- Chaz