diff options
Diffstat (limited to 'core/modules')
32 files changed, 1300 insertions, 42 deletions
diff --git a/core/modules/kiosk-chromium/data/opt/openslx/scripts/kiosk-launch.d/00-chromium b/core/modules/kiosk-chromium/data/opt/openslx/scripts/kiosk-launch.d/00-chromium new file mode 100644 index 00000000..8221cadb --- /dev/null +++ b/core/modules/kiosk-chromium/data/opt/openslx/scripts/kiosk-launch.d/00-chromium @@ -0,0 +1,91 @@ +#!/bin/bash +# prepares and run chromium as kiosk browser + +. /opt/openslx/config + +# swallow keyboard shortcuts of chromium +cat <<- EOF > "$HOME/.xbindkeysrc" +"true" + Control+d +"true" + Control+t +"true" + Control+s +"true" + Control+n +"true" + Control+j +"true" + Control+p +"true" + Control+h +"true" + Control+Shift+o +EOF +# xbinkeys requires a daemon, run it +xbindkeys_autostart & + +[ -n "$SLX_BROWSER_INSECURE" ] && SLX_BROWSER_INSECURE="--allow-running-insecure-content --ignore-certificate-errors" + +# clear state of previous sessions +[ -e "$HOME/.config/chromium" ] && rm -rf -- "$HOME/.config/chromium" +mkdir -p "$HOME/.config/chromium/Default" + +bookmark_template="$(mktemp)" +cat <<-EOF > "$bookmark_template" +{ + "roots": { + "bookmark_bar": { + "children": [ ], + "id": "1", + "name": "Lesezeichenleiste", + "type": "folder" + }, + "other": { + "children": [ ], + "id": "2", + "name": "Weitere Lesezeichen", + "type": "folder" + }, + "synced": { + "children": [ ], + "id": "3", + "name": "Mobile Lesezeichen", + "type": "folder" + } + }, + "version": 1 +} +EOF + +# copy the Bookmark json template and fill in our bookmarks +json_bookmarks() { + cur=0 + echo -n '[' + while [ $# -ne 0 ]; do + local bb="$1" + shift + awk -F, '{printf "%s","{\"id\": \"'$cur'\", \"type\": \"url\", \"name\": \""$1"\", \"url\": \""$2"\"}"}' <<< "$bb" + [ $# -ne 0 ] && echo -n ',' + (( cur ++ )) + done + echo -n ']' +} + +# set the bookmarks in the user's home directory +jq ".roots.bookmark_bar.children += $(json_bookmarks $SLX_BROWSER_BOOKMARKS)" \ + "$bookmark_template" > "$HOME/.config/chromium/Default/Bookmarks" + +if [ -n "$SLX_BROWSER_INTERACTIVE" ]; then + SLX_KIOSK='' +else + SLX_KIOSK='--kiosk' +fi + +# finally start chromium +exec chromium-browser \ + --noerrdialogs \ + --disable-infobars \ + $SLX_KIOSK \ + $SLX_BROWSER_INSECURE \ + "$SLX_BROWSER_URL" diff --git a/core/modules/kiosk-chromium/data/opt/openslx/scripts/systemd-setup_kiosk.d/00-chromium-policies b/core/modules/kiosk-chromium/data/opt/openslx/scripts/systemd-setup_kiosk.d/00-chromium-policies new file mode 100644 index 00000000..8b6a15d9 --- /dev/null +++ b/core/modules/kiosk-chromium/data/opt/openslx/scripts/systemd-setup_kiosk.d/00-chromium-policies @@ -0,0 +1,33 @@ +#!/bin/bash +# ^SOURCED + +. /opt/openslx/config + +chromium_policies() { + # create managed policy file, those settings cannot be changed by the user + # (if he even gets to the settings dialog in the first place) + local chromium_policy_file="/etc/chromium-browser/policies/managed/kiosk-mode.json" + [ -e "$chromium_policy_file" ] && rm -f "$chromium_policy_file" + + mkdir -p ${chromium_policy_file%/*} + + if [ -n "$SLX_BROWSER_BOOKMARKS" ]; then + bookmarkbar=true + else + bookmarkbar=false + fi + + cat <<- EOF > "$chromium_policy_file" + { + "BackgroundModeEnabled": false, + "BookmarkBarEnabled": $bookmarkbar, + "DefaultBrowserSettingEnabled": true, + "DownloadRestrictions": 3, + "ShowAppsShortcutInBookmarkBar": false, + "TranslateEnabled": false + } + EOF +} + +chromium_policies +true diff --git a/core/modules/kiosk-chromium/module.build b/core/modules/kiosk-chromium/module.build new file mode 100644 index 00000000..a5cbb6b6 --- /dev/null +++ b/core/modules/kiosk-chromium/module.build @@ -0,0 +1,12 @@ +#!/bin/bash +fetch_source() { + : +} + +build() { + : +} + +post_copy() { + : +} diff --git a/core/modules/kiosk-chromium/module.conf b/core/modules/kiosk-chromium/module.conf new file mode 100644 index 00000000..613d6d21 --- /dev/null +++ b/core/modules/kiosk-chromium/module.conf @@ -0,0 +1,5 @@ +#!/bin/bash +REQUIRED_MODULES="kiosk-common" +REQUIRED_BINARIES="" +REQUIRED_LIBRARIES="" +REQUIRED_DIRECTORIES="" diff --git a/core/modules/slxbrowser/data/etc/systemd/system/kiosk-mode.target b/core/modules/kiosk-common/data/etc/systemd/system/kiosk-mode.target index fb95249c..fb95249c 100644 --- a/core/modules/slxbrowser/data/etc/systemd/system/kiosk-mode.target +++ b/core/modules/kiosk-common/data/etc/systemd/system/kiosk-mode.target diff --git a/core/modules/slxbrowser/data/etc/systemd/system/kiosk-mode.target.wants/graphical.target b/core/modules/kiosk-common/data/etc/systemd/system/kiosk-mode.target.wants/graphical.target index 949b0756..949b0756 120000 --- a/core/modules/slxbrowser/data/etc/systemd/system/kiosk-mode.target.wants/graphical.target +++ b/core/modules/kiosk-common/data/etc/systemd/system/kiosk-mode.target.wants/graphical.target diff --git a/core/modules/slxbrowser/data/etc/systemd/system/kiosk-mode.target.wants/kiosk.service b/core/modules/kiosk-common/data/etc/systemd/system/kiosk-mode.target.wants/kiosk.service index a6e3a110..a6e3a110 120000 --- a/core/modules/slxbrowser/data/etc/systemd/system/kiosk-mode.target.wants/kiosk.service +++ b/core/modules/kiosk-common/data/etc/systemd/system/kiosk-mode.target.wants/kiosk.service diff --git a/core/modules/slxbrowser/data/etc/systemd/system/kiosk.service b/core/modules/kiosk-common/data/etc/systemd/system/kiosk.service index dba49864..dba49864 100644 --- a/core/modules/slxbrowser/data/etc/systemd/system/kiosk.service +++ b/core/modules/kiosk-common/data/etc/systemd/system/kiosk.service diff --git a/core/modules/kiosk-common/data/etc/xdg/openbox/rc.xml.kiosk b/core/modules/kiosk-common/data/etc/xdg/openbox/rc.xml.kiosk new file mode 100644 index 00000000..65e09cb5 --- /dev/null +++ b/core/modules/kiosk-common/data/etc/xdg/openbox/rc.xml.kiosk @@ -0,0 +1,345 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<!-- Do not edit this file, it will be overwritten on install. + Copy the file to $HOME/.config/openbox/ instead. --> + +<openbox_config xmlns="http://openbox.org/3.4/rc" + xmlns:xi="http://www.w3.org/2001/XInclude"> + +<resistance> + <strength>10</strength> + <screen_edge_strength>20</screen_edge_strength> +</resistance> + +<focus> + <focusNew>yes</focusNew> + <!-- always try to focus new windows when they appear. other rules do + apply --> + <followMouse>no</followMouse> + <!-- move focus to a window when you move the mouse into it --> + <focusLast>yes</focusLast> + <!-- focus the last used window when changing desktops, instead of the one + under the mouse pointer. when followMouse is enabled --> + <underMouse>no</underMouse> + <!-- move focus under the mouse, even when the mouse is not moving --> + <focusDelay>200</focusDelay> + <!-- when followMouse is enabled, the mouse must be inside the window for + this many milliseconds (1000 = 1 sec) before moving focus to it --> + <raiseOnFocus>no</raiseOnFocus> + <!-- when followMouse is enabled, and a window is given focus by moving the + mouse into it, also raise the window --> +</focus> + +<placement> + <policy>Smart</policy> + <!-- 'Smart' or 'UnderMouse' --> + <center>yes</center> + <!-- whether to place windows in the center of the free area found or + the top left corner --> + <monitor>Primary</monitor> + <!-- with Smart placement on a multi-monitor system, try to place new windows + on: 'Any' - any monitor, 'Mouse' - where the mouse is, 'Active' - where + the active window is, 'Primary' - only on the primary monitor --> + <primaryMonitor>1</primaryMonitor> + <!-- The monitor where Openbox should place popup dialogs such as the + focus cycling popup, or the desktop switch popup. It can be an index + from 1, specifying a particular monitor. Or it can be one of the + following: 'Mouse' - where the mouse is, or + 'Active' - where the active window is --> +</placement> + +<theme> + <name>Orion</name> + <titleLayout>LC</titleLayout> + <!-- + available characters are NDSLIMC, each can occur at most once. + N: window icon + L: window label (AKA title). + I: iconify + M: maximize + C: close + S: shade (roll up/down) + D: omnipresent (on all desktops). + --> + <keepBorder>yes</keepBorder> + <animateIconify>yes</animateIconify> + <font place="ActiveWindow"> + <name>sans</name> + <size>8</size> + <!-- font size in points --> + <weight>bold</weight> + <!-- 'bold' or 'normal' --> + <slant>normal</slant> + <!-- 'italic' or 'normal' --> + </font> + <font place="InactiveWindow"> + <name>sans</name> + <size>8</size> + <!-- font size in points --> + <weight>bold</weight> + <!-- 'bold' or 'normal' --> + <slant>normal</slant> + <!-- 'italic' or 'normal' --> + </font> + <font place="MenuHeader"> + <name>sans</name> + <size>9</size> + <!-- font size in points --> + <weight>normal</weight> + <!-- 'bold' or 'normal' --> + <slant>normal</slant> + <!-- 'italic' or 'normal' --> + </font> + <font place="MenuItem"> + <name>sans</name> + <size>9</size> + <!-- font size in points --> + <weight>normal</weight> + <!-- 'bold' or 'normal' --> + <slant>normal</slant> + <!-- 'italic' or 'normal' --> + </font> + <font place="ActiveOnScreenDisplay"> + <name>sans</name> + <size>9</size> + <!-- font size in points --> + <weight>bold</weight> + <!-- 'bold' or 'normal' --> + <slant>normal</slant> + <!-- 'italic' or 'normal' --> + </font> + <font place="InactiveOnScreenDisplay"> + <name>sans</name> + <size>9</size> + <!-- font size in points --> + <weight>bold</weight> + <!-- 'bold' or 'normal' --> + <slant>normal</slant> + <!-- 'italic' or 'normal' --> + </font> +</theme> + +<desktops> + <!-- this stuff is only used at startup, pagers allow you to change them + during a session + + these are default values to use when other ones are not already set + by other applications, or saved in your session + + use obconf if you want to change these without having to log out + and back in --> + <number>1</number> + <firstdesk>1</firstdesk> + <names> + <!-- set names up here if you want to, like this: + <name>desktop 1</name> + <name>desktop 2</name> + --> + </names> + <popupTime>875</popupTime> + <!-- The number of milliseconds to show the popup for when switching + desktops. Set this to 0 to disable the popup. --> +</desktops> + +<resize> + <drawContents>yes</drawContents> + <popupShow>Nonpixel</popupShow> + <!-- 'Always', 'Never', or 'Nonpixel' (xterms and such) --> + <popupPosition>Center</popupPosition> + <!-- 'Center', 'Top', or 'Fixed' --> + <popupFixedPosition> + <!-- these are used if popupPosition is set to 'Fixed' --> + + <x>10</x> + <!-- positive number for distance from left edge, negative number for + distance from right edge, or 'Center' --> + <y>10</y> + <!-- positive number for distance from top edge, negative number for + distance from bottom edge, or 'Center' --> + </popupFixedPosition> +</resize> + +<!-- You can reserve a portion of your screen where windows will not cover when + they are maximized, or when they are initially placed. + Many programs reserve space automatically, but you can use this in other + cases. --> +<margins> + <top>0</top> + <bottom>0</bottom> + <left>0</left> + <right>0</right> +</margins> + +<dock> + <position>TopLeft</position> + <!-- (Top|Bottom)(Left|Right|)|Top|Bottom|Left|Right|Floating --> + <floatingX>0</floatingX> + <floatingY>0</floatingY> + <noStrut>no</noStrut> + <stacking>Above</stacking> + <!-- 'Above', 'Normal', or 'Below' --> + <direction>Vertical</direction> + <!-- 'Vertical' or 'Horizontal' --> + <autoHide>no</autoHide> + <hideDelay>300</hideDelay> + <!-- in milliseconds (1000 = 1 second) --> + <showDelay>300</showDelay> + <!-- in milliseconds (1000 = 1 second) --> + <moveButton>Middle</moveButton> + <!-- 'Left', 'Middle', 'Right' --> +</dock> + +<keyboard> +</keyboard> + +<mouse> + <dragThreshold>1</dragThreshold> + <!-- number of pixels the mouse must move before a drag begins --> + <doubleClickTime>500</doubleClickTime> + <!-- in milliseconds (1000 = 1 second) --> + <screenEdgeWarpTime>400</screenEdgeWarpTime> + <!-- Time before changing desktops when the pointer touches the edge of the + screen while moving a window, in milliseconds (1000 = 1 second). + Set this to 0 to disable warping --> + <screenEdgeWarpMouse>false</screenEdgeWarpMouse> + <!-- Set this to TRUE to move the mouse pointer across the desktop when + switching due to hitting the edge of the screen --> + <context name="Close"> + <mousebind button="Left" action="Press"> + <action name="Focus"/> + <action name="Raise"/> + <action name="Unshade"/> + </mousebind> + <mousebind button="Left" action="Click"> + <action name="Close"/> + </mousebind> + </context> +</mouse> + +<menu> + <!-- You can specify more than one menu file in here and they are all loaded, + just don't make menu ids clash or, well, it'll be kind of pointless --> + + <!-- default menu file (or custom one in $HOME/.config/openbox/) --> + <!-- system menu files on Debian systems --> + <file>/var/lib/openbox/debian-menu.xml</file> + <file>menu.xml</file> + <hideDelay>200</hideDelay> + <!-- if a press-release lasts longer than this setting (in milliseconds), the + menu is hidden again --> + <middle>no</middle> + <!-- center submenus vertically about the parent entry --> + <submenuShowDelay>100</submenuShowDelay> + <!-- time to delay before showing a submenu after hovering over the parent + entry. + if this is a negative value, then the delay is infinite and the + submenu will not be shown until it is clicked on --> + <submenuHideDelay>400</submenuHideDelay> + <!-- time to delay before hiding a submenu when selecting another + entry in parent menu + if this is a negative value, then the delay is infinite and the + submenu will not be hidden until a different submenu is opened --> + <showIcons>yes</showIcons> + <!-- controls if icons appear in the client-list-(combined-)menu --> + <manageDesktops>yes</manageDesktops> + <!-- show the manage desktops section in the client-list-(combined-)menu --> +</menu> + +<applications> +<!-- + # this is an example with comments through out. use these to make your + # own rules, but without the comments of course. + # you may use one or more of the name/class/role/title/type rules to specify + # windows to match + + <application name="the window's _OB_APP_NAME property (see obxprop)" + class="the window's _OB_APP_CLASS property (see obxprop)" + groupname="the window's _OB_APP_GROUP_NAME property (see obxprop)" + groupclass="the window's _OB_APP_GROUP_CLASS property (see obxprop)" + role="the window's _OB_APP_ROLE property (see obxprop)" + title="the window's _OB_APP_TITLE property (see obxprop)" + type="the window's _OB_APP_TYPE property (see obxprob).. + (if unspecified, then it is 'dialog' for child windows)"> + # you may set only one of name/class/role/title/type, or you may use more + # than one together to restrict your matches. + + # the name, class, role, and title use simple wildcard matching such as those + # used by a shell. you can use * to match any characters and ? to match + # any single character. + + # the type is one of: normal, dialog, splash, utility, menu, toolbar, dock, + # or desktop + + # when multiple rules match a window, they will all be applied, in the + # order that they appear in this list + + + # each rule element can be left out or set to 'default' to specify to not + # change that attribute of the window + + <decor>yes</decor> + # enable or disable window decorations + + <shade>no</shade> + # make the window shaded when it appears, or not + + <position force="no"> + # the position is only used if both an x and y coordinate are provided + # (and not set to 'default') + # when force is "yes", then the window will be placed here even if it + # says you want it placed elsewhere. this is to override buggy + # applications who refuse to behave + <x>center</x> + # a number like 50, or 'center' to center on screen. use a negative number + # to start from the right (or bottom for <y>), ie -50 is 50 pixels from + # the right edge (or bottom). use 'default' to specify using value + # provided by the application, or chosen by openbox, instead. + <y>200</y> + <monitor>1</monitor> + # specifies the monitor in a xinerama setup. + # 1 is the first head, or 'mouse' for wherever the mouse is + </position> + + <size> + # the size to make the window. + <width>20</width> + # a number like 20, or 'default' to use the size given by the application. + # you can use fractions such as 1/2 or percentages such as 75% in which + # case the value is relative to the size of the monitor that the window + # appears on. + <height>30%</height> + </size> + + <focus>yes</focus> + # if the window should try be given focus when it appears. if this is set + # to yes it doesn't guarantee the window will be given focus. some + # restrictions may apply, but Openbox will try to + + <desktop>1</desktop> + # 1 is the first desktop, 'all' for all desktops + + <layer>normal</layer> + # 'above', 'normal', or 'below' + + <iconic>no</iconic> + # make the window iconified when it appears, or not + + <skip_pager>no</skip_pager> + # asks to not be shown in pagers + + <skip_taskbar>no</skip_taskbar> + # asks to not be shown in taskbars. window cycling actions will also + # skip past such windows + + <fullscreen>yes</fullscreen> + # make the window in fullscreen mode when it appears + + <maximized>true</maximized> + # 'Horizontal', 'Vertical' or boolean (yes/no) + </application> + + # end of the example +--> +</applications> + +</openbox_config> diff --git a/core/modules/kiosk-common/data/opt/openslx/lightdm/autologin.d/10-kiosk-mode b/core/modules/kiosk-common/data/opt/openslx/lightdm/autologin.d/10-kiosk-mode new file mode 100644 index 00000000..b740496b --- /dev/null +++ b/core/modules/kiosk-common/data/opt/openslx/lightdm/autologin.d/10-kiosk-mode @@ -0,0 +1,9 @@ +#!/bin/ash +# ^SOURCED + +# kiosk mode? +if [ -n "$SLX_BROWSER_URL" ]; then + exec /opt/openslx/scripts/kiosk-launch +fi + +true diff --git a/core/modules/kiosk-common/data/opt/openslx/lightdm/guest-account.d/00-iptables b/core/modules/kiosk-common/data/opt/openslx/lightdm/guest-account.d/00-iptables new file mode 100644 index 00000000..38e4893a --- /dev/null +++ b/core/modules/kiosk-common/data/opt/openslx/lightdm/guest-account.d/00-iptables @@ -0,0 +1,26 @@ +#!/bin/ash +# ^ SOURCED + +kiosk_rules="/opt/openslx/iptables/rules.d/90-kiosk" +cat <<-EOF > "$kiosk_rules" + #!/bin/ash + + iptables -w -A ipt-helper-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT + iptables -w -I ipt-helper-OUTPUT 1 -o br0 -d 132.230.0.0/16 -j ACCEPT + iptables -w -I ipt-helper-INPUT 1 -i br0 -d 132.230.0.0/16 -j ACCEPT + iptables -w -I ipt-helper-OUTPUT 1 -o br0 -d 10.0.0.0/8 -j ACCEPT + iptables -w -I ipt-helper-INPUT 1 -i br0 -d 10.0.0.0/8 -j ACCEPT + + iptables -P INPUT DROP + iptables -P FORWARD DROP + iptables -P OUTPUT DROP +EOF + +chmod +x "$kiosk_rules" + +# HACK: wait for iptables helper to setup the rules... +sleep 2 + +# make sure it is cleared on session close +echo "rm -f \"$kiosk_rules\"" > "/etc/X11/Xreset.d/clear-kiosk-iptables" +true diff --git a/core/modules/kiosk-common/data/opt/openslx/scripts/kiosk-launch b/core/modules/kiosk-common/data/opt/openslx/scripts/kiosk-launch new file mode 100755 index 00000000..43af3640 --- /dev/null +++ b/core/modules/kiosk-common/data/opt/openslx/scripts/kiosk-launch @@ -0,0 +1,26 @@ +#!/bin/bash +# generic kiosk mode launcher + +. /opt/openslx/config + +[ -z "$SLX_BROWSER_URL" ] && exit 1 + +# disable power management features +xset s off +xset -dpms + +# start openbox window manager +openbox --config-file "/etc/xdg/openbox/rc.xml.kiosk" & + +# move the mouse away +xdotool mousemove 20000 20000 & + +# run browser +for file in "$0".d/*; do + . "$file" || slxlog "kiosk-launch" "Failed to source '$file'." +done + +# should not come to this point as above sources should +# exec away +slxlog "kiosk-launch" "No kiosk browser configured!" +exit 1 diff --git a/core/modules/kiosk-common/data/opt/openslx/scripts/systemd-setup_kiosk b/core/modules/kiosk-common/data/opt/openslx/scripts/systemd-setup_kiosk new file mode 100755 index 00000000..a19e2bc3 --- /dev/null +++ b/core/modules/kiosk-common/data/opt/openslx/scripts/systemd-setup_kiosk @@ -0,0 +1,57 @@ +#!/bin/bash + +. /opt/openslx/config + +configure_fullscreen() { + # TODO having two variants of the rc.xml is quite bad, better to prune it with xmlstarlet? + local openbox_rc_file="/etc/xdg/openbox/rc.xml.kiosk" + local openbox_namespace="http://openbox.org/3.4/rc" + # for fullscreen functionality, use openbox + if [ ! -e "$openbox_rc_file" ]; then + echo "Could not find global openbox configuration" + return 1 + fi + local browser_node="//x:applications/x:application[@role='browser']" + local -i browser_node_count="$(xmlstarlet sel -N x="$openbox_namespace" -t -c "count($browser_node)" "$openbox_rc_file")" + if [ "$browser_node_count" -gt 1 ]; then + echo "More than one node for '$browser_node' found. Removing them all..." + xmlstarlet ed -L -N x="$openbox_namespace" -d "$browser_node" "$openbox_rc_file" + fi + # either we removed everything, or we had none to start with + if [ "$browser_node_count" -eq 0 ] ; then + local tmpname="application$RANDOM" + xmlstarlet ed -L -N x="$openbox_namespace" -s "//x:applications" -t elem -n "$tmpname" -i "//$tmpname" -t attr -n "role" -v "browser" "$openbox_rc_file" + browser_node="//x:applications/x:$tmpname" + fi + # Fullscreen or maximized depends on whether we should start an interactive session or not + # For now use SLX_BROWSER_INTERACTIVE + local state + if [ -n "$SLX_BROWSER_INTERACTIVE" ]; then + state="maximized" + xmlstarlet ed -L -N x="$openbox_namespace" -d "$browser_node/x:fullscreen" "$openbox_rc_file" + else + state="fullscreen" + xmlstarlet ed -L -N x="$openbox_namespace" -d "$browser_node/x:maximized" "$openbox_rc_file" + fi + + if ! xmlstarlet sel -Q -N x="$openbox_namespace" -t -c "$browser_node/x:$state" "$openbox_rc_file"; then + xmlstarlet ed -L -N x="$openbox_namespace" -s "$browser_node" -t elem -n "$state" -v "yes" "$openbox_rc_file" + elif [ "$(xmlstarlet sel -N x="$openbox_namespace" -t -v "$browser_node/x:$state" "$openbox_rc_file")" != "yes" ]; then + xmlstarlet ed -L -N x="$openbox_namespace" -u "$browser_node/x:$state" -v "yes" "$openbox_rc_file" + fi + xmlstarlet ed -L -N x="$openbox_namespace" -r "$browser_node" -v "application" "$openbox_rc_file" +} + +## MAIN +configure_fullscreen + +# Disable logout delay for demo user on shutdown/reboot/... +mkdir -p "/run/openslx" +touch "/run/openslx/demo-no-logout-delay" + +for file in "$0".d/*; do + # hooks for browser-related stuff + . "$file" || slxlog "kiosk-setup" "Failed to source '$file'." +done + +exit 0 diff --git a/core/modules/kiosk-common/module.build b/core/modules/kiosk-common/module.build new file mode 100644 index 00000000..a5cbb6b6 --- /dev/null +++ b/core/modules/kiosk-common/module.build @@ -0,0 +1,12 @@ +#!/bin/bash +fetch_source() { + : +} + +build() { + : +} + +post_copy() { + : +} diff --git a/core/modules/kiosk-common/module.conf b/core/modules/kiosk-common/module.conf new file mode 100644 index 00000000..8811668a --- /dev/null +++ b/core/modules/kiosk-common/module.conf @@ -0,0 +1,4 @@ +#!/bin/bash +REQUIRED_BINARIES="" +REQUIRED_LIBRARIES="" +REQUIRED_DIRECTORIES="" diff --git a/core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/ff-google-small.png b/core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/ff-google-small.png Binary files differnew file mode 100644 index 00000000..d89c5d7c --- /dev/null +++ b/core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/ff-google-small.png diff --git a/core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/ff-rz-small.png b/core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/ff-rz-small.png Binary files differnew file mode 100644 index 00000000..a340b9b2 --- /dev/null +++ b/core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/ff-rz-small.png diff --git a/core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/netpoint.css b/core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/netpoint.css new file mode 100644 index 00000000..68ebbe46 --- /dev/null +++ b/core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/netpoint.css @@ -0,0 +1,17 @@ +#main { + background-color: white; +} +#sep { + -GtkWidget-wide-separators: 1; + -GtkWidget-separator-width: 5; + border-style: solid; + border-width: 2px; + color: grey; +} +#title { + border-top-style: solid; + border-bottom-style: double; + border-width: 3px; + border-color: grey; + +} diff --git a/core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/netpoint.glade b/core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/netpoint.glade new file mode 100644 index 00000000..396d4a53 --- /dev/null +++ b/core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/netpoint.glade @@ -0,0 +1,359 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.18.3 --> +<interface> + <requires lib="gtk+" version="3.10"/> + <object class="GtkWindow" id="main"> + <property name="name">main</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="window_position">center-always</property> + <property name="default_width">800</property> + <property name="default_height">600</property> + <property name="decorated">False</property> + <property name="gravity">center</property> + <child> + <object class="GtkBox" id="box2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkLabel" id="label1"> + <property name="name">title</property> + <property name="height_request">100</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Kioskswitcher</property> + <attributes> + <attribute name="font-desc" value="Sans Bold 18"/> + </attributes> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkGrid" id="grid1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">False</property> + <property name="vexpand">True</property> + <child> + <object class="GtkSeparator" id="separator1"> + <property name="name">sep</property> + <property name="width_request">10</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkGrid" id="grid2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">False</property> + <property name="row_homogeneous">True</property> + <child> + <object class="GtkBox" id="box1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">False</property> + <property name="vexpand">False</property> + <property name="orientation">vertical</property> + <property name="homogeneous">True</property> + <child> + <object class="GtkBox" id="box4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkLabel" id="guest_text"> + <property name="height_request">100</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">center</property> + <property name="valign">center</property> + <property name="vexpand">False</property> + <property name="label" translatable="yes">Gastzugang</property> + <property name="justify">center</property> + <attributes> + <attribute name="font-desc" value="Sans Bold 14"/> + </attributes> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">center</property> + <property name="hexpand">False</property> + <property name="vexpand">False</property> + <property name="label" translatable="yes">Hier können Sie sich ohne RZ-Zugang als Gast anmelden. +Es können nur Seiten innerhalb des Universitätsnetzes aufgerufen werden. + +Zum Abmelden bitte den Browser schließen.</property> + <property name="justify">center</property> + <property name="wrap">True</property> + <property name="width_chars">0</property> + <property name="max_width_chars">0</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="guest_button"> + <property name="label" translatable="yes">Als Gast anmelden</property> + <property name="use_action_appearance">False</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="halign">center</property> + <property name="valign">center</property> + <signal name="clicked" handler="guest_cb" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkImage" id="guest_image"> + <property name="name">guest_image</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="pixbuf">ff-rz-small.png</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkGrid" id="grid4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="row_homogeneous">True</property> + <child> + <object class="GtkBox" id="box3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="orientation">vertical</property> + <property name="homogeneous">True</property> + <child> + <object class="GtkBox" id="box5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkLabel" id="login_text"> + <property name="height_request">100</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">center</property> + <property name="valign">center</property> + <property name="vexpand">False</property> + <property name="label" translatable="yes">RZ-Zugang</property> + <property name="justify">center</property> + <attributes> + <attribute name="font-desc" value="Sans Bold 14"/> + </attributes> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="login_info"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="valign">start</property> + <property name="vexpand">False</property> + <property name="label" translatable="yes">Melden Sie sich mit Ihrem RZ-Konto an.</property> + <property name="justify">center</property> + <property name="wrap">True</property> + <property name="width_chars">0</property> + <property name="max_width_chars">30</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkGrid" id="grid3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">center</property> + <property name="valign">center</property> + <property name="row_spacing">3</property> + <property name="column_spacing">3</property> + <child> + <object class="GtkEntry" id="pass_password"> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can_focus">True</property> + <property name="progress_pulse_step">0</property> + <signal name="activate" handler="login_cb" swapped="no"/> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="pass_text"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">start</property> + <property name="label" translatable="yes">Passwort:</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="user_text"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">start</property> + <property name="label" translatable="yes">Username:</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="user_username"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <signal name="activate" handler="login_cb" swapped="no"/> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="login_button"> + <property name="label" translatable="yes">Login</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <signal name="clicked" handler="login_cb" swapped="no"/> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">2</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="feedback_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">3</property> + </packing> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkImage" id="login_image"> + <property name="name">login_image</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="pixbuf">ff-google-small.png</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">2</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> +</interface> diff --git a/core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/netpoint.py b/core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/netpoint.py new file mode 100755 index 00000000..36a0a16b --- /dev/null +++ b/core/modules/kiosk-netpoint/data/opt/openslx/lightdm/netpoint-greeter/netpoint.py @@ -0,0 +1,221 @@ +#!/usr/bin/env python2 +# +# Author: Matt Fischer <matthew.fischer@canonical.com> +# Copyright (C) 2012 Canonical, Ltd +# +# This program is free software: you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation, either version 3 of the License, or (at your option) any later +# version. See http://www.gnu.org/copyleft/gpl.html the full text of the +# license. +# +# This code is based on the LightDM GTK Greeter which was written by: +# Robert Ancell <robert.ancell@canonical.com> + +# required packages: +# liblightdm-gobject-1-0 +# gir1.2-lightdm-1 +# python-gobject +# gir1.2-glib-2.0 +# gir1.2-gtk-3.0 + +from gi.repository import GObject +from gi.repository import GLib +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import GdkPixbuf +from gi.repository.GdkPixbuf import InterpType +from gi.repository import LightDM +import os +import sys +import threading +import subprocess + +greeter = None + +main = None +split = None + +guest_box = None +guest_text = None +guest_button = None +guest_image = None + +login_box = None +login_text = None +user_box = None +user_text = None +user_username = None +pass_box = None +pass_text = None +pass_password = None + +prompt_box = None +prompt_label = None +prompt_entry = None + +# For auto login +auto_login_count = 30 +last_login_text = "" +last_password_text = "" + + + + +# This Gtk signal is called when the user hits enter after entering a +# username/password or clicks the login button. Since we re-purposed +# the text entry box, we have 3 possible cases to handle here. +# 1) the user is already authenticated, if for example, they don't have +# a password set. +# 2) The username has been passed into LightDM and now we need to pass +# the password +# 3) The username has been entered, but not passed in. We pass it in +# and start the authentication process. +def login_cb(widget): + print >> sys.stderr, "login_cb" + if greeter.get_is_authenticated(): + print >> sys.stderr, "user is already authenticated, starting session" + #start_session() + elif greeter.get_in_authentication(): + print >> sys.stderr, "username was passed in already, send password to LightDM" + print >> sys.stderr, greeter.get_authentication_user() + greeter.respond(pass_password.get_text()) + feedback_label.set_text("Authenticating...") + else: + print >> sys.stderr, "Initial entry of username, send it to LightDM" + greeter.authenticate(user_username.get_text()) + feedback_label.set_text("Authenticating...") + +def guest_cb(widget): + print >> sys.stderr, "guest_cb" + if greeter.get_has_guest_account_hint(): + print >> sys.stderr, "Guest accounts supported" + greeter.authenticate_as_guest() + else: + print >> sys.stderr, "Guest accounts not supported" + + +# Gtk Signal Handlers +handlers = { + "login_cb": login_cb, + "guest_cb": guest_cb +} + +# The show_prompt callback is oddly named, but when you get this +# callback you are supposed to send the password to LightDM next. In +# our example, we re-purpose the prompt and ask the user for the +# password which is then sent the next time the user hits the Login +# button or presses enter. +def show_prompt_cb(greeter, text, promptType): + print >> sys.stderr, "prompt type: " + str(promptType) + # if this is a password prompt, we want to hide the characters + if promptType == LightDM.PromptType.SECRET: + pass_password.set_visibility(False) + else: + pass_password.set_visibility(True) + greeter.respond(pass_password.get_text()) + + +# If LightDM sends a message back to the greeter, for example, "Login +# failed" or "invalid password" we display it in our message box. +def show_message_cb(text, message_type): + feedback_label.set_visibility(True) + feedback_label.set_text(text) + +# Callback for after we send LightDM the password, this method +# has to handle a successful login, in which case we start the session +# or a failed login, in which case we tell the user +def authentication_complete_cb(greeter): + if greeter.get_is_authenticated(): + if not greeter.start_session_sync("default"): + print >> sys.stderr, "Failed to start session" + else: + feedback_label.set_text("Login failed!") + pass_password.set_text(""); + print >> sys.stderr, "Login failed" + +if __name__ == '__main__': + print >> sys.stderr, "Starting up..." + main_loop = GObject.MainLoop () + builder = Gtk.Builder() + greeter = LightDM.Greeter() + styler = Gtk.CssProvider() + css = open(os.path.dirname(os.path.abspath(__file__)) + '/netpoint.css', 'r') + + css_data = css.read() + css.close() + styler.load_from_data(css_data) + Gtk.StyleContext.add_provider_for_screen( + Gdk.Screen.get_default(), + styler, + Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION + ) + + # connect signal handlers to LightDM + greeter.connect ("authentication-complete", authentication_complete_cb) + greeter.connect ("show-message", show_message_cb) + greeter.connect ("show-prompt", show_prompt_cb) + + # connect builder and widgets + # you probably really want to put your .UI file somewhere else + builder.add_from_file(os.path.dirname(os.path.abspath(__file__)) + "/netpoint.glade") + + main = builder.get_object("main") + split = builder.get_object("split") + sep = builder.get_object("sep") + guest_box = builder.get_object("guest_box") + guest_outer_box = builder.get_object("guest_outer_box") + guest_internal_box = builder.get_object("guest_internal_box") + guest_text = builder.get_object("guest_text") + guest_button = builder.get_object("guest_button") + guest_image = builder.get_object("guest_image") + login_image = builder.get_object("login_image") + checkbox = builder.get_object("checkbutton1") + pixbuf = guest_image.get_pixbuf() + pixbuf = pixbuf.scale_simple(pixbuf.get_width() * 0.75, pixbuf.get_height() * 0.75, InterpType.HYPER) + guest_image.set_from_pixbuf(pixbuf) + pixbuf = login_image.get_pixbuf() + pixbuf = pixbuf.scale_simple(pixbuf.get_width() * 0.75, pixbuf.get_height() * 0.75, InterpType.BILINEAR) + login_image.set_from_pixbuf(pixbuf) + + login_box = builder.get_object("login_box") + login_text = builder.get_object("login_text") + + user_box = builder.get_object("user_box") + user_text = builder.get_object("user_text") + user_username = builder.get_object("user_username") + + pass_box = builder.get_object("pass_box") + pass_text = builder.get_object("pass_text") + pass_password = builder.get_object("pass_password") + feedback_label = builder.get_object("feedback_label") + + # connect signals to Gtk UI + builder.connect_signals(handlers) + + # connect to greeter + greeter.connect_sync() + + # check for autologin + rc = subprocess.call("/opt/openslx/lightdm/is-autologin-enabled", shell=True) + if rc == 0: + greeter.authenticate_as_guest() + # setup the GUI + main.set_decorated(True) + main.get_root_window().set_cursor(Gdk.Cursor.new(Gdk.CursorType.LEFT_PTR)) + main.show() + guest_text.show() + guest_button.show() + login_text.show() + user_text.show() + user_username.grab_focus() + user_username.show() + pass_text.show() + pass_password.set_sensitive(True) + pass_password.set_visibility(False) + pass_password.show() + + # fullscreen it + main.resize(Gdk.Screen.width(), Gdk.Screen.height()) + + main_loop.run () diff --git a/core/modules/kiosk-netpoint/data/opt/openslx/scripts/systemd-setup_kiosk.d/10-netpoint b/core/modules/kiosk-netpoint/data/opt/openslx/scripts/systemd-setup_kiosk.d/10-netpoint new file mode 100644 index 00000000..b172dd7e --- /dev/null +++ b/core/modules/kiosk-netpoint/data/opt/openslx/scripts/systemd-setup_kiosk.d/10-netpoint @@ -0,0 +1,10 @@ +#!/bin/ash + +# cause why not ... +mkdir -p "/etc/lightdm/lightdm.conf.d/" +cat <<-EOF > /etc/lightdm/lightdm.conf.d/20-netpoint-greeter.conf + [SeatDefaults] + greeter-session=netpoint +EOF + +true diff --git a/core/modules/kiosk-netpoint/data/usr/share/xgreeters/netpoint.desktop b/core/modules/kiosk-netpoint/data/usr/share/xgreeters/netpoint.desktop new file mode 100644 index 00000000..e6f340b9 --- /dev/null +++ b/core/modules/kiosk-netpoint/data/usr/share/xgreeters/netpoint.desktop @@ -0,0 +1,5 @@ +[Desktop Entry] +Name=Netpoint Greeter +Comment=Netpoint Greeter +Exec=/opt/openslx/lightdm/netpoint-greeter/netpoint.py +Type=Application diff --git a/core/modules/kiosk-netpoint/module.build b/core/modules/kiosk-netpoint/module.build new file mode 100644 index 00000000..a5cbb6b6 --- /dev/null +++ b/core/modules/kiosk-netpoint/module.build @@ -0,0 +1,12 @@ +#!/bin/bash +fetch_source() { + : +} + +build() { + : +} + +post_copy() { + : +} diff --git a/core/modules/kiosk-netpoint/module.conf b/core/modules/kiosk-netpoint/module.conf new file mode 100644 index 00000000..613d6d21 --- /dev/null +++ b/core/modules/kiosk-netpoint/module.conf @@ -0,0 +1,5 @@ +#!/bin/bash +REQUIRED_MODULES="kiosk-common" +REQUIRED_BINARIES="" +REQUIRED_LIBRARIES="" +REQUIRED_DIRECTORIES="" diff --git a/core/modules/kiosk-netpoint/module.conf.ubuntu b/core/modules/kiosk-netpoint/module.conf.ubuntu new file mode 100644 index 00000000..f69c2445 --- /dev/null +++ b/core/modules/kiosk-netpoint/module.conf.ubuntu @@ -0,0 +1,10 @@ +#!/bin/bash +REQUIRED_CONTENT_PACKAGES=" + gir1.2-lightdm-1 + liblightdm-gobject-1-0 + liblightdm-qt5-3-0 +" +REQUIRED_INSTALLED_PACKAGES="$REQUIRED_CONTENT_PACKAGES" +REQUIRED_BINARIES="" +REQUIRED_LIBRARIES="" +REQUIRED_DIRECTORIES="" diff --git a/core/modules/slxbrowser/data/opt/openslx/scripts/kiosk-launch b/core/modules/kiosk-slxbrowser/data/opt/openslx/scripts/kiosk-launch.d/00-slxbrowser index 566bbb16..5a9196c4 100755..100644 --- a/core/modules/slxbrowser/data/opt/openslx/scripts/kiosk-launch +++ b/core/modules/kiosk-slxbrowser/data/opt/openslx/scripts/kiosk-launch.d/00-slxbrowser @@ -1,18 +1,10 @@ #!/bin/ash +# ^ sourced! -. /opt/openslx/config - -[ -z "$SLX_BROWSER_URL" ] && exit 1 - -xset s off -xset -dpms - -openbox & +export PATH=$PATH:/opt/openslx/sbin:/opt/openslx/bin [ -n "$SLX_BROWSER_INSECURE" ] && SLX_BROWSER_INSECURE="--insecure" RELOAD= [ -n "$SLX_BROWSER_RELOAD_SECS" ] && [ "$SLX_BROWSER_RELOAD_SECS" -gt 0 ] && RELOAD="--reload-interval $SLX_BROWSER_RELOAD_SECS" -xdotool mousemove 20000 20000 & exec slxbrowser $SLX_BROWSER_INSECURE $RELOAD --fullscreen "$SLX_BROWSER_URL" - diff --git a/core/modules/kiosk-slxbrowser/module.build b/core/modules/kiosk-slxbrowser/module.build new file mode 100644 index 00000000..a5cbb6b6 --- /dev/null +++ b/core/modules/kiosk-slxbrowser/module.build @@ -0,0 +1,12 @@ +#!/bin/bash +fetch_source() { + : +} + +build() { + : +} + +post_copy() { + : +} diff --git a/core/modules/kiosk-slxbrowser/module.conf b/core/modules/kiosk-slxbrowser/module.conf new file mode 100644 index 00000000..c90b91dd --- /dev/null +++ b/core/modules/kiosk-slxbrowser/module.conf @@ -0,0 +1,8 @@ +#!/bin/bash +REQUIRED_MODULES=" + kiosk-common + slxbrowser +" +REQUIRED_BINARIES="" +REQUIRED_LIBRARIES="" +REQUIRED_DIRECTORIES="" diff --git a/core/modules/lightdm-greeter-bwlp/data/opt/openslx/lightdm/guest-account b/core/modules/lightdm-greeter-bwlp/data/opt/openslx/lightdm/guest-account index 30a23f24..2de5343f 100755 --- a/core/modules/lightdm-greeter-bwlp/data/opt/openslx/lightdm/guest-account +++ b/core/modules/lightdm-greeter-bwlp/data/opt/openslx/lightdm/guest-account @@ -1,5 +1,16 @@ #!/bin/ash # Run as root, intended to setup the guest account -# and echo its name at the end. -# we use the existing demo user, so not much to do +# and echo its name, demo in our case, at the end. +# Further we allow for hooks to execute stuff here. + +( +hook_dir="$(readlink -f $0)" +if [ -d "$hook_dir" ]; then + for hook in "$hook_dir"/*; do + [ -s "$hook" ] || continue + . "$hook" || slxlog "kiosk-guest-account" "Failed to source '$hook'." + done +fi +) > /dev/null 2>&1 +# finish by echoing the guest account name echo "demo" diff --git a/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/vmchooser_runvirt_functions.inc b/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/vmchooser_runvirt_functions.inc index b4f87d11..28f18a3f 100644 --- a/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/vmchooser_runvirt_functions.inc +++ b/core/modules/run-virt/data/opt/openslx/vmchooser/run-virt-includes/vmchooser_runvirt_functions.inc @@ -482,6 +482,12 @@ dir_on_tmpfs() { [ "x$(cut -d' ' -f3 <<< ${mount_line})" == "xtmpfs" ] return $? done + # NG: check if / is fully backed by hard drive + local dmsetup_conf="/run/openslx/dmsetup.conf" + if [ -s "$dmsetup_conf" ]; then + return $( ! grep -qE '^/dev/mapper/root\s+/\s+type=1' "$dmsetup_conf" ) + fi + # else assume old-gen were / was in RAM return 0 } diff --git a/core/modules/slxbrowser/data/opt/openslx/lightdm/autologin.d/00-check-slxbrowser b/core/modules/slxbrowser/data/opt/openslx/lightdm/autologin.d/00-check-slxbrowser deleted file mode 100644 index 4fe45c02..00000000 --- a/core/modules/slxbrowser/data/opt/openslx/lightdm/autologin.d/00-check-slxbrowser +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/ash -# This file is SOURCED - -# Kiosk mode? -if [ -n "$SLX_BROWSER_URL" ]; then - exec /opt/openslx/scripts/kiosk-launch -fi - -true - diff --git a/core/modules/slxbrowser/data/opt/openslx/scripts/systemd-setup_kiosk b/core/modules/slxbrowser/data/opt/openslx/scripts/systemd-setup_kiosk deleted file mode 100755 index b8761aab..00000000 --- a/core/modules/slxbrowser/data/opt/openslx/scripts/systemd-setup_kiosk +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/ash - -# Autologin -sed -i '/^AutoLoginDelay=/d;/^AutoLoginUser=/d;s/^AutoLoginEnable=.*$/AutoLoginEnable=true\nAutoLoginUser=demo\nAutoLoginDelay=0/' "/etc/kde4/kdm/kdmrc" - -# Disable logout delay for demo user on shutdown/reboot/... -mkdir -p "/run/openslx" -touch "/run/openslx/demo-no-logout-delay" - -# desktop session -cat > /opt/openslx/xsessions/default.desktop <<EOF -[Desktop Entry] -Name=SLXbrowser -Comment=Minimalistic browser -Exec=/opt/openslx/scripts/kiosk-launch -Type=Application -X-LightDM-DesktopName=SLXbrowser -DesktopNames=SLXbrowser -EOF - |