Basically, it uses configd, so you have to create a service definition for your new script.
ls /usr/local/opnsense/service/conf/actions.d
Create a file with the name actions_NAME.conf, where NAME is something meaningful to you. The file should have a basic win ini format, with the action needed, then a bunch of lines describing what to do.
After creating the file, you will need to restart configd, then test your configuration
service configd restart
configctl COMMANDNAME start # or reload, or whatever
COMMANDNAME is the command you created. The filename, without the preceeding actions_ or the extension
Once this is done, the string after message (or description, I don't know which) will show up as a possible cron job in the opnSense GUI for cron.
You can create multiple actions (stop,start) in the same file with different scripts and/or parameters.
The log files are stored in /var/log/configd.log
This will execute the script /root/updateDNS. The file /usr/local/opnsense/service/conf/actions.d/actions_updatedns.conf is created with the following contents
[reload] command:/root/updateDNS parameter: type:script message:update Daily Data DNS description:Update Daily Data DNS
Note that this uses the reload parameter.
Now that you have added a new config, you need to reload configd so it will read it, then test it (we are passing reload to it since that is the action we are using)
service configd restart configctl updatedns reload
I ran into a problem where suricata would randomly die on rule rule reload, so I set up a cron job to see if it was running and, if not, start it up
First, I created the file /usr/local/opnsense/service/conf/actions.d/actions_suricata_watchdog.conf
[start] command:/usr/sbin/service suricata status >/dev/null 2>&1 || /usr/sbin/service suricata start type:script message:Suricata watchdog: start Suricata if not running description:Suricata watchdog: start Suricata if not running
Reloaded configd and tested my config file
service configd restart configctl suricata_watchdog start
Then, I went to the opnSense GUI and made a new entry in System | Settings | Cron to run at 14 minutes after the hour, every hour (I can lose a little bit of monitoring, and did not want it running every minute).
Note that I built this totally inside of the config file; no external files to access and run. I just told it to use the command:
/usr/sbin/service suricata status >/dev/null 2>&1 || /usr/sbin/service suricata start
This is basic shell magic. By calling service suricata status, I'll check the status of suricata. I don't care about the output, so I send STDOUT and STDERR to /dev/null. What I want is the return status, which is false if the service is not running. In that case, the || (OR) will execute the other command, which will start suricata back up.