Greetings everyone.
Is there a way to automatically run a script upon booting a device? More specifically, is there a way to bundle said script with the Legato platform installation?
I’m using cURL in my application, and it needs to bind against /etc/resolv.conf
. The issue is that resolv.conf isn’t created until a data connection is established, so my app ends up faulting because there’s nothing to bind to. Then my app can’t establish a data connection as it can’t start in the first place. Bit of a catch-22.
I figured I would just make a shell script that creates a blank resolv.conf which will then get updated when my app establishes a data connection. But, this is for a production device, so I can’t be manually creating init.d scripts; I need it to be automatically added when I install the Legato platform. This is the part I’m stuck on.
Is this possible? Or is there perhaps a better way of reasoning about this problem? Thank you very much in advance for any help/advice!
Well you should be able to add the script in a .adef file and mark it to be executed when legato starts. I have, however, tried this myself for an external application that I would like to bundle into my legato installation and thereby make it an external .cwe file from the yocto installation. However, for me the limitations that legato puts on a script running in that context, even if it is marked as non-sandboxed, made it a dealbreaker for me and I did therefore add it into the yocto image with in init script instead
Hi andcor, thank you so much for your response! It gave me inspiration for how to proceed.
I tried adding (touch /etc/resolv.conf)
to my project’s .adef under processes: { run: { ... } }
, but since it tries to link everything before running the processes I run into the same issue. I even tried moving the resolv.conf file link from the application’s .adef to the component’s .cdef, but that had the same issue.
Instead what I ended up doing is creating a separate app that functions as a launcher.
The first thing it does is creates resolv.conf if it doesn’t exist, like so:
system("touch /etc/resolv.conf");
Afterwards, it starts the main app:
le_result_t result = le_appCtrl_Start("mainApp");
Then I kill the launcher since I don’t need it anymore:
le_appCtrl_Stop("mainAppLauncher");
And that’s it! Seems to work like a charm.
Also, another bit of semi-related info in case it helps anyone: I also needed to check if a particular process is running first. This can be done via le_appInfo_GetState(const char * appName)
, which can then be compared against LE_APPINFO_STOPPED
and LE_APPINFO_RUNNING
. I wanted to add this since it took me a moment of searching to actually find this.