diff mbox series

procd: Adding support to detect Pantavisor Container Platform

Message ID 20210320144603.18318-1-gaurav.pathak@pantacor.com
State Superseded
Headers show
Series procd: Adding support to detect Pantavisor Container Platform | expand

Commit Message

Gaurav Pathak March 20, 2021, 2:46 p.m. UTC
Added a new file pv_platform.h having function is_pantavisor() to detect
the pantavisor container platform, as it runs a custom modified version
of LXC, so detecting LXC using is_container() is not returning expected
result.
pv_platform.h is derived from container.h to check if procd is running
in a pantavisor container environment.

Signed-off-by: Gaurav Pathak <gaurav.pathak@pantacor.com>
---
 initd/early.c   |  5 ++++-
 initd/zram.c    |  3 ++-
 plug/coldplug.c |  3 ++-
 pv_platform.h   | 37 +++++++++++++++++++++++++++++++++++++
 state.c         |  3 ++-
 5 files changed, 47 insertions(+), 4 deletions(-)
 create mode 100644 pv_platform.h

Comments

Paul Spooren March 20, 2021, 8:19 p.m. UTC | #1
On Sat, Mar 20, 2021 at 20:16, Gaurav Pathak 
<gaurav.pathak@pantacor.com> wrote:
> Added a new file pv_platform.h having function is_pantavisor() to 
> detect
> the pantavisor container platform, as it runs a custom modified 
> version
> of LXC, so detecting LXC using is_container() is not returning 
> expected
> result.
> pv_platform.h is derived from container.h to check if procd is running
> in a pantavisor container environment.
> 
> Signed-off-by: Gaurav Pathak <gaurav.pathak@pantacor.com>
> ---

Can't you merge the detection of `/pantavisor` into the 
`is_container()` function? I'd guess that no container ever needs /dev 
mounted as tmpfs, so you could replace is_pantavisor with is_container?

>  initd/early.c   |  5 ++++-
>  initd/zram.c    |  3 ++-
>  plug/coldplug.c |  3 ++-
>  pv_platform.h   | 37 +++++++++++++++++++++++++++++++++++++
>  state.c         |  3 ++-
>  5 files changed, 47 insertions(+), 4 deletions(-)
>  create mode 100644 pv_platform.h
> 
> diff --git a/initd/early.c b/initd/early.c
> index 7b281b2..a564861 100644
> --- a/initd/early.c
> +++ b/initd/early.c
> @@ -26,6 +26,7 @@
>  #include "init.h"
>  #include "../libc-compat.h"
>  #include "../container.h"
> +#include "../pv_platform.h"
> 
>  static void
>  early_dev(void)
> @@ -61,7 +62,9 @@ early_mounts(void)
>  		mount("proc", "/proc", "proc", MS_NOATIME | MS_NODEV | MS_NOEXEC | 
> MS_NOSUID, 0);
>  		mount("sysfs", "/sys", "sysfs", MS_NOATIME | MS_NODEV | MS_NOEXEC 
> | MS_NOSUID, 0);
>  		mount("cgroup", "/sys/fs/cgroup", "cgroup",  MS_NODEV | MS_NOEXEC 
> | MS_NOSUID, 0);
> -		mount("tmpfs", "/dev", "tmpfs", MS_NOATIME | MS_NOSUID, 
> "mode=0755,size=512K");
> +		if (!is_pantavisor()) {
> +			mount("tmpfs", "/dev", "tmpfs", MS_NOATIME | MS_NOSUID, 
> "mode=0755,size=512K");
> +		}
>  		ignore(symlink("/tmp/shm", "/dev/shm"));
>  		mkdir("/dev/pts", 0755);
>  		mount("devpts", "/dev/pts", "devpts", MS_NOATIME | MS_NOEXEC | 
> MS_NOSUID, "mode=600");
> diff --git a/initd/zram.c b/initd/zram.c
> index 380fe0e..21bb3a5 100644
> --- a/initd/zram.c
> +++ b/initd/zram.c
> @@ -13,6 +13,7 @@
> 
>  #include "../log.h"
>  #include "../container.h"
> +#include "../pv_platform.h"
> 
>  #include "init.h"
> 
> @@ -117,7 +118,7 @@ mount_zram_on_tmp(void)
>  		waitpid(pid, NULL, 0);
>  	}
> 
> -	if (!is_container()) {
> +	if (!is_container() && !is_pantavisor()) {
>  		ret = mount("/dev/zram0", "/tmp", "ext4", MS_NOSUID | MS_NODEV | 
> MS_NOATIME, "errors=continue,noquota");
>  		if (ret < 0) {
>  			ERROR("Can't mount /dev/zram0 on /tmp: %m\n");
> diff --git a/plug/coldplug.c b/plug/coldplug.c
> index b185083..37edba4 100644
> --- a/plug/coldplug.c
> +++ b/plug/coldplug.c
> @@ -24,6 +24,7 @@
> 
>  #include "hotplug.h"
>  #include "../container.h"
> +#include "../pv_platform.h"
> 
>  static struct uloop_process udevtrigger;
> 
> @@ -45,7 +46,7 @@ void procd_coldplug(void)
>  	char *argv[] = { "udevtrigger", NULL };
>  	unsigned int oldumask = umask(0);
> 
> -	if (!is_container()) {
> +	if (!is_container() && !is_pantavisor()) {
>  		umount2("/dev/pts", MNT_DETACH);
>  		umount2("/dev/", MNT_DETACH);
>  		mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755,size=512K");
> diff --git a/pv_platform.h b/pv_platform.h
> new file mode 100644
> index 0000000..4045875
> --- /dev/null
> +++ b/pv_platform.h
> @@ -0,0 +1,37 @@
> +/*
> +* Copyright (c) 2017 Pantacor Ltd.
> +*
> +* Permission is hereby granted, free of charge, to any person 
> obtaining a copy
> +* of this software and associated documentation files (the 
> "Software"), to deal
> +* in the Software without restriction, including without limitation 
> the rights
> +* to use, copy, modify, merge, publish, distribute, sublicense, 
> and/or sell
> +* copies of the Software, and to permit persons to whom the Software 
> is
> +* furnished to do so, subject to the following conditions:
> +*
> +* The above copyright notice and this permission notice shall be 
> included in all
> +* copies or substantial portions of the Software.
> +*
> +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
> EXPRESS OR
> +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
> MERCHANTABILITY,
> +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT 
> SHALL THE
> +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 
> OTHER
> +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 
> ARISING FROM,
> +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
> DEALINGS IN THE
> +* SOFTWARE.
> +*/
> +
> +#ifndef __PV_PLATFORM_H
> +#define __PV_PLATFORM_H
> +
> +#include <stdlib.h>
> +#include <stdbool.h>
> +#include <sys/stat.h>
> +
> +static inline bool is_pantavisor() {
> +	struct stat s;
> +	int pv_r = stat("/pantavisor", &s);
> +	return pv_r == 0;
> +}
> +
> +#endif
> +
> diff --git a/state.c b/state.c
> index e117ea3..d72a971 100644
> --- a/state.c
> +++ b/state.c
> @@ -21,6 +21,7 @@
>  #include <signal.h>
> 
>  #include "container.h"
> +#include "pv_platform.h"
>  #include "procd.h"
>  #include "syslog.h"
>  #include "plug/hotplug.h"
> @@ -104,7 +105,7 @@ static void perform_halt()
>  	/* Allow time for last message to reach serial console, etc */
>  	sleep(1);
> 
> -	if (is_container()) {
> +	if (is_container() || is_pantavisor()) {
>  		reboot(reboot_event);
>  		exit(EXIT_SUCCESS);
>  		return;
> --
> 2.25.1
> 
> 
> _______________________________________________
> openwrt-devel mailing list
> openwrt-devel@lists.openwrt.org
> https://lists.openwrt.org/mailman/listinfo/openwrt-devel
John Crispin March 20, 2021, 8:59 p.m. UTC | #2
On 20.03.21 15:46, Gaurav Pathak wrote:
>   as it runs a custom modified version
> of LXC

I assume that if this is a custom downstream version then the change is 
not applicable for merge into upstream owrt. please explain what "custom 
version" means.

     John
Gaurav Pathak March 21, 2021, 1:14 p.m. UTC | #3
I have merged the detection of /pantavisor into the is_container()
function.
diff mbox series

Patch

diff --git a/initd/early.c b/initd/early.c
index 7b281b2..a564861 100644
--- a/initd/early.c
+++ b/initd/early.c
@@ -26,6 +26,7 @@ 
 #include "init.h"
 #include "../libc-compat.h"
 #include "../container.h"
+#include "../pv_platform.h"
 
 static void
 early_dev(void)
@@ -61,7 +62,9 @@  early_mounts(void)
 		mount("proc", "/proc", "proc", MS_NOATIME | MS_NODEV | MS_NOEXEC | MS_NOSUID, 0);
 		mount("sysfs", "/sys", "sysfs", MS_NOATIME | MS_NODEV | MS_NOEXEC | MS_NOSUID, 0);
 		mount("cgroup", "/sys/fs/cgroup", "cgroup",  MS_NODEV | MS_NOEXEC | MS_NOSUID, 0);
-		mount("tmpfs", "/dev", "tmpfs", MS_NOATIME | MS_NOSUID, "mode=0755,size=512K");
+		if (!is_pantavisor()) {
+			mount("tmpfs", "/dev", "tmpfs", MS_NOATIME | MS_NOSUID, "mode=0755,size=512K");
+		}
 		ignore(symlink("/tmp/shm", "/dev/shm"));
 		mkdir("/dev/pts", 0755);
 		mount("devpts", "/dev/pts", "devpts", MS_NOATIME | MS_NOEXEC | MS_NOSUID, "mode=600");
diff --git a/initd/zram.c b/initd/zram.c
index 380fe0e..21bb3a5 100644
--- a/initd/zram.c
+++ b/initd/zram.c
@@ -13,6 +13,7 @@ 
 
 #include "../log.h"
 #include "../container.h"
+#include "../pv_platform.h"
 
 #include "init.h"
 
@@ -117,7 +118,7 @@  mount_zram_on_tmp(void)
 		waitpid(pid, NULL, 0);
 	}
 
-	if (!is_container()) {
+	if (!is_container() && !is_pantavisor()) {
 		ret = mount("/dev/zram0", "/tmp", "ext4", MS_NOSUID | MS_NODEV | MS_NOATIME, "errors=continue,noquota");
 		if (ret < 0) {
 			ERROR("Can't mount /dev/zram0 on /tmp: %m\n");
diff --git a/plug/coldplug.c b/plug/coldplug.c
index b185083..37edba4 100644
--- a/plug/coldplug.c
+++ b/plug/coldplug.c
@@ -24,6 +24,7 @@ 
 
 #include "hotplug.h"
 #include "../container.h"
+#include "../pv_platform.h"
 
 static struct uloop_process udevtrigger;
 
@@ -45,7 +46,7 @@  void procd_coldplug(void)
 	char *argv[] = { "udevtrigger", NULL };
 	unsigned int oldumask = umask(0);
 
-	if (!is_container()) {
+	if (!is_container() && !is_pantavisor()) {
 		umount2("/dev/pts", MNT_DETACH);
 		umount2("/dev/", MNT_DETACH);
 		mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755,size=512K");
diff --git a/pv_platform.h b/pv_platform.h
new file mode 100644
index 0000000..4045875
--- /dev/null
+++ b/pv_platform.h
@@ -0,0 +1,37 @@ 
+/*
+* Copyright (c) 2017 Pantacor Ltd.
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy
+* of this software and associated documentation files (the "Software"), to deal
+* in the Software without restriction, including without limitation the rights
+* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+* copies of the Software, and to permit persons to whom the Software is
+* furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all
+* copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+* SOFTWARE.
+*/
+
+#ifndef __PV_PLATFORM_H
+#define __PV_PLATFORM_H
+
+#include <stdlib.h>
+#include <stdbool.h>
+#include <sys/stat.h>
+
+static inline bool is_pantavisor() {
+	struct stat s;
+	int pv_r = stat("/pantavisor", &s);
+	return pv_r == 0;
+}
+
+#endif
+
diff --git a/state.c b/state.c
index e117ea3..d72a971 100644
--- a/state.c
+++ b/state.c
@@ -21,6 +21,7 @@ 
 #include <signal.h>
 
 #include "container.h"
+#include "pv_platform.h"
 #include "procd.h"
 #include "syslog.h"
 #include "plug/hotplug.h"
@@ -104,7 +105,7 @@  static void perform_halt()
 	/* Allow time for last message to reach serial console, etc */
 	sleep(1);
 
-	if (is_container()) {
+	if (is_container() || is_pantavisor()) {
 		reboot(reboot_event);
 		exit(EXIT_SUCCESS);
 		return;