headless: add basic build environments for headless server 22/207122/1
authorSung-Jin Park <sj76.park@samsung.com>
Mon, 15 Apr 2019 10:57:24 +0000 (19:57 +0900)
committerSung-Jin Park <sj76.park@samsung.com>
Thu, 30 May 2019 08:26:48 +0000 (17:26 +0900)
Change-Id: Idb5b04fbea0194d864d12afa574eaf10d6f04c2f
Signed-off-by: Sung-Jin Park <sj76.park@samsung.com>
configure.ac
data/headless/units/display-manager-ready.path [new file with mode: 0644]
data/headless/units/display-manager-ready.service [new file with mode: 0644]
data/headless/units/display-manager.env [new file with mode: 0644]
data/headless/units/display-manager.service [new file with mode: 0644]
data/headless/units/display-user.service [new file with mode: 0644]
data/headless/units/display_env.sh [new file with mode: 0644]
packaging/pepper.spec
src/Makefile.am
src/bin/headless/Makefile.am [new file with mode: 0644]
src/bin/headless/headless_server.c [new file with mode: 0644]

index 3057e7d..f83c362 100644 (file)
@@ -306,6 +306,15 @@ SAMPLES_LIBS="$PEPPER_X11_LIB $PEPPER_X11_LIBS $SAMPLES_LIBS"
 AC_SUBST(SAMPLES_CFLAGS)
 AC_SUBST(SAMPLES_LIBS)
 
+# headless server
+HEADLESS_SERVER_REQUIRES="wayland-server"
+PKG_CHECK_MODULES(HEADLESS_SERVER, $[HEADLESS_SERVER_REQUIRES])
+HEADLESS_SERVER_CFLAGS="$PEPPER_DIR $HEADLESS_SERVER_CFLAGS"
+HEADLESS_SERVER_LIBS="$PEPPER_LIB $PEPPER_LIBS $HEADLESS_SERVER_LIBS"
+
+AC_SUBST(HEADLESS_SERVER_CFLAGS)
+AC_SUBST(HEADLESS_SERVER_LIBS)
+
 # doctor (headless server) and headless client samples
 DOCTOR_SERVER_REQUIRES="wayland-server libtbm"
 PKG_CHECK_MODULES(DOCTOR_SERVER, $[DOCTOR_SERVER_REQUIRES])
@@ -392,6 +401,7 @@ src/lib/drm/Makefile
 src/lib/fbdev/Makefile
 src/lib/wayland/Makefile
 src/bin/doctor/Makefile
+src/bin/headless/Makefile
 src/samples/Makefile
 pkgconfig/pepper.pc
 pkgconfig/pepper-render.pc
diff --git a/data/headless/units/display-manager-ready.path b/data/headless/units/display-manager-ready.path
new file mode 100644 (file)
index 0000000..bbbe8fb
--- /dev/null
@@ -0,0 +1,6 @@
+[Unit]
+Description=Path activation for display manager ready service
+After=tmp.mount display-manager.service
+
+[Path]
+PathExists=/run/headless-0
diff --git a/data/headless/units/display-manager-ready.service b/data/headless/units/display-manager-ready.service
new file mode 100644 (file)
index 0000000..43779e3
--- /dev/null
@@ -0,0 +1,13 @@
+[Unit]
+Description=Headless Display Manager Ready Service
+After=tmp.mount display-manager.service
+
+[Service]
+Type=oneshot
+EnvironmentFile=/etc/sysconfig/display-manager.env
+SmackProcessLabel=System
+ExecStart=/usr/bin/sh -c "while [ ! -e /run/headless-0 ] ; do /usr/bin/sleep .1 ; done ;/bin/chown -f root:display /run/headless-0;/bin/chmod 775 /run/headless-0"
+ExecStartPost=/usr/bin/sh -c "/usr/bin/touch /run/.wm_ready"
+
+[Install]
+WantedBy=graphical.target
diff --git a/data/headless/units/display-manager.env b/data/headless/units/display-manager.env
new file mode 100644 (file)
index 0000000..2c356e3
--- /dev/null
@@ -0,0 +1,3 @@
+TBM_DISPLAY_SERVER=1
+WAYLAND_DISPLAY="headless-0"
+XDG_RUNTIME_DIR=/run
diff --git a/data/headless/units/display-manager.service b/data/headless/units/display-manager.service
new file mode 100644 (file)
index 0000000..35ecc6b
--- /dev/null
@@ -0,0 +1,11 @@
+[Unit]
+Description=Headless Display Manager
+
+[Service]
+Type=simple
+EnvironmentFile=/etc/sysconfig/display-manager.env
+SmackProcessLabel=System
+ExecStart=/usr/bin/headless_server
+
+[Install]
+WantedBy=graphical.target
diff --git a/data/headless/units/display-user.service b/data/headless/units/display-user.service
new file mode 100644 (file)
index 0000000..9c55463
--- /dev/null
@@ -0,0 +1,7 @@
+[Unit]
+Description=Creating a link file for user to access display manager socket
+DefaultDependencies=no
+
+[Service]
+Type=oneshot
+ExecStart=/usr/bin/sh -c "while [ ! -e /run/headless-0 ] ; do /usr/bin/sleep .1 ; done ;/usr/bin/ln -sf /run/headless-0 /run/user/%U/"
diff --git a/data/headless/units/display_env.sh b/data/headless/units/display_env.sh
new file mode 100644 (file)
index 0000000..56a32a9
--- /dev/null
@@ -0,0 +1,8 @@
+if [ "$USER" == "root" ]; then
+        export XDG_RUNTIME_DIR=/run
+else
+        export XDG_RUNTIME_DIR=/run/user/$UID
+fi
+if [ "$WAYALND_DISPLAY" = "" ]; then
+        export WAYLAND_DISPLAY=headless-0
+fi
index f4213ab..866a6f1 100644 (file)
@@ -235,6 +235,14 @@ Requires: libtbm
 %description doctor
 This package includes doctor server files.
 
+###### headless server
+%package headless
+Summary: Headless server for pepper package
+Requires: pepper
+
+%description headless
+This package includes headless server files.
+
 ###### samples
 %package samples
 Summary: samples for pepper package
@@ -277,16 +285,22 @@ make %{?_smp_mflags}
 install -m 644 data/doctor/units/display-manager.service %{buildroot}%{_unitdir}
 install -m 644 data/doctor/units/display-manager-ready.path %{buildroot}%{_unitdir}
 install -m 644 data/doctor/units/display-manager-ready.service %{buildroot}%{_unitdir}
+install -m 644 data/headless/units/display-manager.service %{buildroot}%{_unitdir}
+install -m 644 data/headless/units/display-manager-ready.path %{buildroot}%{_unitdir}
+install -m 644 data/headless/units/display-manager-ready.service %{buildroot}%{_unitdir}
 
 # install user session service
 %__mkdir_p %{buildroot}%{_unitdir_user}
 install -m 644 data/doctor/units/display-user.service %{buildroot}%{_unitdir_user}
+install -m 644 data/headless/units/display-user.service %{buildroot}%{_unitdir_user}
 
 # install env file and scripts for service
 %__mkdir_p %{buildroot}%{_sysconfdir}/sysconfig
 install -m 0644 data/doctor/units/display-manager.env %{buildroot}%{_sysconfdir}/sysconfig
+install -m 0644 data/headless/units/display-manager.env %{buildroot}%{_sysconfdir}/sysconfig
 %__mkdir_p %{buildroot}%{_sysconfdir}/profile.d
 install -m 0644 data/doctor/units/display_env.sh %{buildroot}%{_sysconfdir}/profile.d
+install -m 0644 data/headless/units/display_env.sh %{buildroot}%{_sysconfdir}/profile.d
 
 %post -n %{name} -p /sbin/ldconfig
 %postun -n %{name} -p /sbin/ldconfig
@@ -327,6 +341,12 @@ getent group %{display_group} >/dev/null || %{_sbindir}/groupadd -r -o %{display
 # create user 'display'
 getent passwd %{display_user} >/dev/null || %{_sbindir}/useradd -r -g %{display_group} -d /run/display -s /bin/false -c "Display" %{display_user}
 
+%pre headless
+# create groups 'display'
+getent group %{display_group} >/dev/null || %{_sbindir}/groupadd -r -o %{display_group}
+# create user 'display'
+getent passwd %{display_user} >/dev/null || %{_sbindir}/useradd -r -g %{display_group} -d /run/display -s /bin/false -c "Display" %{display_user}
+
 # create links within systemd's target(s)
 %__mkdir_p %{_unitdir}/graphical.target.wants/
 %__mkdir_p %{_unitdir_user}/basic.target.wants/
@@ -339,6 +359,11 @@ rm -f %{_unitdir}/graphical.target.wants/display-manager.service
 rm -f %{_unitdir}/graphical.target.wants/display-manager-ready.service
 rm -f %{_unitdir_user}/basic.target.wants/display-user.service
 
+%postun headless
+rm -f %{_unitdir}/graphical.target.wants/display-manager.service
+rm -f %{_unitdir}/graphical.target.wants/display-manager-ready.service
+rm -f %{_unitdir_user}/basic.target.wants/display-user.service
+
 %files -n %{name}
 %manifest %{name}.manifest
 %defattr(-,root,root,-)
@@ -532,6 +557,18 @@ rm -f %{_unitdir_user}/basic.target.wants/display-user.service
 %config %{_sysconfdir}/sysconfig/display-manager.env
 %config %{_sysconfdir}/profile.d/display_env.sh
 
+%files headless
+%manifest %{name}.manifest
+%defattr(-,root,root,-)
+%license COPYING
+%{_bindir}/headless*
+%{_unitdir}/display-manager-ready.path
+%{_unitdir}/display-manager-ready.service
+%{_unitdir}/display-manager.service
+%{_unitdir_user}/display-user.service
+%config %{_sysconfdir}/sysconfig/display-manager.env
+%config %{_sysconfdir}/profile.d/display_env.sh
+
 %files samples
 %manifest %{name}.manifest
 %defattr(-,root,root,-)
index 800689f..af24127 100644 (file)
@@ -20,4 +20,5 @@ SUBDIRS += lib/x11
 endif
 
 SUBDIRS += samples          \
-           bin/doctor
+           bin/doctor       \
+           bin/headless
diff --git a/src/bin/headless/Makefile.am b/src/bin/headless/Makefile.am
new file mode 100644 (file)
index 0000000..50c1ba0
--- /dev/null
@@ -0,0 +1,8 @@
+bin_PROGRAMS =
+
+bin_PROGRAMS += headless_server
+
+headless_server_CFLAGS = $(HEADLESS_SERVER_CFLAGS)
+headless_server_LDADD  = $(HEADLESS_SERVER_LIBS)
+
+headless_server_SOURCES = headless_server.c
diff --git a/src/bin/headless/headless_server.c b/src/bin/headless/headless_server.c
new file mode 100644 (file)
index 0000000..dda6ddd
--- /dev/null
@@ -0,0 +1,23 @@
+#include <pepper.h>
+
+int main(int argc, char *argv[])
+{
+       const char *socket_name = NULL;
+       pepper_compositor_t *compositor = NULL;
+
+       socket_name = getenv("WAYLAND_DISPLAY");
+
+       if (!socket_name)
+               socket_name = "headless-0";
+
+       /* create pepper compositir */
+       compositor = pepper_compositor_create(socket_name);
+       PEPPER_CHECK(compositor, return EXIT_FAILURE, "Failed to create compositor !");
+
+       /* run event loop */
+       wl_display_run(pepper_compositor_get_display(compositor));
+
+       pepper_compositor_destroy(compositor);
+
+       return EXIT_SUCCESS;
+}