#!/bin/sh
#(c) Copyright Barry Kauler, Feb. 2017. License GPL v3 (usr/share/doc/legal)
#170523 name change /usr/local/easy_containers/extra-sfss to extra-sfss-ec

export TEXTDOMAIN=easy-containers
export OUTPUT_CHARSET=UTF-8

. /etc/rc.d/PUPSTATE
. /etc/DISTRO_SPECS
mkdir -p /tmp/easy_containers

#create a list of apps that could be run in a container...
APPSLIST1="$(grep '^Exec=' /usr/share/applications/*.desktop | cut -f 2 -d '=' | grep -v -E '/| ')"
#screen out already existing containers...
ls -1 /mnt/${WKG_DEV}/${WKG_DIR}containers > /tmp/easy_containers/current-containers
APPSLIST2="$(echo "$APPSLIST1" | grep -v -w -f /tmp/easy_containers/current-containers)"
echo "$APPSLIST2" > /tmp/easy_containers/apps-list

#defaults for the security checkboxes...
echo 'true' > /tmp/easy_containers/chkbx-XSOCKET_ABSTRACT
echo 'false' > /tmp/easy_containers/chkbx-XSOCKET_PIPE
echo 'false' > /tmp/easy_containers/chkbx-EC_NS_UNSHARE_MOUNT
echo 'true' > /tmp/easy_containers/chkbx-EC_NS_UNSHARE_UTS
echo 'false' > /tmp/easy_containers/chkbx-EC_NS_UNSHARE_IPC
echo 'false' > /tmp/easy_containers/chkbx-EC_NS_UNSHARE_NETWORK
echo 'false' > /tmp/easy_containers/chkbx-EC_NS_UNSHARE_PID
echo 'true' > /tmp/easy_containers/chkbx-EC_NS_UNSHARE_USER
echo 'false' > /tmp/easy_containers/chkbx-EC_UNSHARE_ENV_VARS

M_close="$(gettext 'Close')"
M_help1="......"
export DLG_HELP1="<window resizable=\"false\" title=\"$(gettext 'Help: Easy Containers')\" icon-name=\"gtk-index\" window_position=\"1\"><vbox><text use-markup=\"true\"><label>\"${M_help1}\"</label><variable>DLG_HELP1</variable></text><hbox><button><label>${M_close}</label><action type=\"closewindow\">DLG_HELP1</action></button></hbox></vbox></window>"

export EC_DLG1="<window title=\"$(gettext "Easy Containers")\" icon-name=\"gtk-convert\">
<vbox>

  <frame $(gettext 'Manage')>
    <hbox>
      <text><label>$(gettext 'Choose container to manage:')</label></text>
      <comboboxtext><variable>EC_MANAGE</variable><input>ls -1 /mnt/${WKG_DEV}/${WKG_DIR}containers</input></comboboxtext>
    </hbox>
    <hbox>
     <text><label>$(gettext 'Load extra SFS files:')</label></text>
     <button><label>$(gettext 'SFS')</label><action>/usr/local/easy_containers/extra-sfss-ec \${EC_MANAGE} </action></button>
    </hbox>
    <hbox>
      <text><label>$(gettext 'Edit configuration file:')</label></text>
      <button><label>$(gettext 'Edit')</label><action>defaulttexteditor /mnt/${WKG_DEV}/${WKG_DIR}containers/\${EC_MANAGE}/configuration & </action></button>
    </hbox>
    <hbox>
      <text><label>$(gettext 'Delete container:')</label></text>
      <button><label>$(gettext 'Delete')</label><action>exit:delete</action></button>
    </hbox>
  </frame>
  
  <frame $(gettext 'Create')>
    <frame $(gettext 'Security options')>
     <hbox>
       <vbox>
         <frame $(gettext 'Environment')>
          <text><label>$(gettext 'Unshare:')</label></text>
          <checkbox><variable>ENV_VARS</variable><label>variables</label><input file>/tmp/easy_containers/chkbx-EC_UNSHARE_ENV_VARS</input></checkbox>
         </frame>
       </vbox>
       <vbox>
         <frame $(gettext 'Namespaces')>
          <text><label>$(gettext 'Unshare:')</label></text>
          <checkbox><variable>NS_MOUNT</variable><label>mount</label><input file>/tmp/easy_containers/chkbx-EC_NS_UNSHARE_MOUNT</input></checkbox>
          <checkbox><variable>NS_UTS</variable><label>UTS</label><input file>/tmp/easy_containers/chkbx-EC_NS_UNSHARE_UTS</input></checkbox>
          <checkbox><variable>NS_IPC</variable><label>IPC</label><input file>/tmp/easy_containers/chkbx-EC_NS_UNSHARE_IPC</input></checkbox>
          <checkbox><variable>NS_NETWORK</variable><label>network</label><input file>/tmp/easy_containers/chkbx-EC_NS_UNSHARE_NETWORK</input></checkbox>
          <checkbox><variable>NS_PID</variable><label>PID</label><input file>/tmp/easy_containers/chkbx-EC_NS_UNSHARE_PID</input></checkbox>
          <checkbox><variable>NS_USER</variable><label>user</label><input file>/tmp/easy_containers/chkbx-EC_NS_UNSHARE_USER</input></checkbox>
         </frame>
       </vbox>
       <vbox>
        <text><label>Xorg socket</label></text>
        <radiobutton><variable>XSOCKET_ABSTRACT</variable><label>Abstract</label><input file>/tmp/easy_containers/chkbx-XSOCKET_ABSTRACT</input></radiobutton>
        <radiobutton><variable>XSOCKET_PIPE</variable><label>Pipe</label><input file>/tmp/easy_containers/chkbx-XSOCKET_PIPE</input></radiobutton>
       </vbox>
     </hbox>
    </frame>
    <text><label>$(gettext 'Choose an application to run in a container')</label></text>
    <hbox>
      <comboboxtext>
        <variable>EC_CREATE</variable>
        <input file>/tmp/easy_containers/apps-list</input>
        <action>/usr/local/easy_containers/create-selected \$EC_CREATE</action>
        <action>refresh:ENV_VARS</action>
        <action>refresh:NS_MOUNT</action>
        <action>refresh:NS_UTS</action>
        <action>refresh:NS_IPC</action>
        <action>refresh:NS_NETWORK</action>
        <action>refresh:NS_PID</action>
        <action>refresh:NS_USER</action>
        <action>refresh:XSOCKET_ABSTRACT</action>
        <action>refresh:XSOCKET_PIPE</action>
      </comboboxtext>
      <button>
        <label>$(gettext 'Create')</label>
        <action>exit:create</action>
      </button>
    </hbox>
  </frame>
  
  <hbox>
    <button><label>$(gettext 'Exit')</label><action>exit:quit</action></button>
    <button><input file>/usr/local/lib/X11/mini-icons/mini-question.xpm</input><action type=\"launch\">DLG_HELP1</action></button>
  </hbox>
</vbox>
</window>"

RETSTRING1="$(gtkdialog --program=EC_DLG1 --center)"
[ $? -ne 0 ] && exit
eval "$RETSTRING1"

if [ "$EXIT" == "delete" ];then
 pupdialog --backtitle "$(gettext 'Easy Containers: delete')" --yesno "$(gettext 'Confirm whether you want to delete. This folder and all of the contents will be deleted:')
 /mnt/${WKG_DEV}/${WKG_DIR}containers/${EC_MANAGE}" 0 0
 if [ $? -eq 0 ];then
  rm -rf /mnt/${WKG_DEV}/${WKG_DIR}containers/${EC_MANAGE}
  rm -f /usr/share/pixmaps/ec-${EC_MANAGE}.png 2>/dev/null
  rm -f /usr/share/applications/ec-${EC_MANAGE}.desktop 2>/dev/null
  sync
  #now update the jwm menu...
  cd /
  fixmenus
  jwm -reload
  pupdialog --timeout 5 --background '#80FF80' --backtitle "$(gettext 'Deleted:') ${EC_DELETE}" --msgbox "$(gettext 'The container has been deleted')" 0 0
 else
  pupdialog --timeout 5 --background '#80C080' --backtitle "$(gettext 'Deletion canceled')" --msgbox "$(gettext 'You have chosen not to delete the container')" 0 0
 fi
fi

if [ "$EXIT" == "create" ];then
 pupdialog --backtitle "$(gettext 'Easy Containers: create')" --yesno "$(gettext 'Confirm whether you want to create a container. This folder will be created:')
 /mnt/${WKG_DEV}/${WKG_DIR}containers/${EC_CREATE}" 0 0
 if [ $? -eq 0 ];then
  #create skeleton folders/files for container...
  mkdir /mnt/${WKG_DEV}/${WKG_DIR}containers/${EC_CREATE}
  mkdir /mnt/${WKG_DEV}/${WKG_DIR}containers/${EC_CREATE}/.session #rw layer
  mkdir /mnt/${WKG_DEV}/${WKG_DIR}containers/${EC_CREATE}/.ro0
  mkdir /mnt/${WKG_DEV}/${WKG_DIR}containers/${EC_CREATE}/.work
  mkdir /mnt/${WKG_DEV}/${WKG_DIR}containers/${EC_CREATE}/container
  echo '#Information for setting up and running the container' > /mnt/${WKG_DEV}/${WKG_DIR}containers/${EC_CREATE}/configuration
  
  #write security options to configuration file...
  echo "#Connect to Xorg by abstract socket or pipe. Former not work if Xorg started with '-nolisten local'. Piped socket will still work if '-nolisten tcp'" >> /mnt/${WKG_DEV}/${WKG_DIR}containers/${EC_CREATE}/configuration
  [ "$XSOCKET_ABSTRACT" == "true" ] && echo "EC_XORG_SOCKET='abstract'" >> /mnt/${WKG_DEV}/${WKG_DIR}containers/${EC_CREATE}/configuration
  [ "$XSOCKET_PIPE" == "true" ] && echo "EC_XORG_SOCKET='pipe'" >> /mnt/${WKG_DEV}/${WKG_DIR}containers/${EC_CREATE}/configuration
  #namespaces...
  echo '#For security, unshare these namespaces:' >> /mnt/${WKG_DEV}/${WKG_DIR}containers/${EC_CREATE}/configuration
  echo "EC_NS_UNSHARE_MOUNT='${NS_MOUNT}'" >> /mnt/${WKG_DEV}/${WKG_DIR}containers/${EC_CREATE}/configuration
  echo "EC_NS_UNSHARE_UTS='${NS_UTS}'" >> /mnt/${WKG_DEV}/${WKG_DIR}containers/${EC_CREATE}/configuration
  echo "EC_NS_UNSHARE_IPC='${NS_IPC}'" >> /mnt/${WKG_DEV}/${WKG_DIR}containers/${EC_CREATE}/configuration
  echo "EC_NS_UNSHARE_NETWORK='${NS_NETWORK}'" >> /mnt/${WKG_DEV}/${WKG_DIR}containers/${EC_CREATE}/configuration
  echo "EC_NS_UNSHARE_PID='${NS_PID}'" >> /mnt/${WKG_DEV}/${WKG_DIR}containers/${EC_CREATE}/configuration
  echo "EC_NS_UNSHARE_USER='${NS_USER}'" >> /mnt/${WKG_DEV}/${WKG_DIR}containers/${EC_CREATE}/configuration
  #environment...
  echo '#Clear environment variables, except some such as TERM and DISPLAY:' >> /mnt/${WKG_DEV}/${WKG_DIR}containers/${EC_CREATE}/configuration
  echo "EC_UNSHARE_ENV_VARS='${ENV_VARS}'" >> /mnt/${WKG_DEV}/${WKG_DIR}containers/${EC_CREATE}/configuration
  
  #finish creating the container...
  /usr/local/easy_containers/setup-container ${EC_CREATE}
  
  #want to modify the jwm menu, to run app in container...
  #first, find the .desktop file...
  DTFILE="$(grep "^Exec=${EC_CREATE}" /usr/share/applications/*.desktop | cut -f 1 -d ':' | head -n 1 | rev | cut -f 1 -d '/' | rev)"
  cp -f /usr/share/applications/${DTFILE} /usr/share/applications/ec-${EC_CREATE}.desktop
  sed -i -e "s%^Exec=[^ ]*%Exec=ec-chroot ${EC_CREATE}%" /usr/share/applications/ec-${EC_CREATE}.desktop
  
  #now modify the icon...
  #170221 pngoverlay wants base and overlay the same size. remove this, just use a standard icon...
  #ICON="$(grep '^Icon=' /usr/share/applications/ec-${EC_CREATE}.desktop | cut -f 2 -d '=')"
  #[ -f "$ICON" ] && fndICON="$ICON"
  #[ ! "$fndICON" ] && [ -f /usr/share/pixmaps/$ICON ] && fndICON="/usr/share/pixmaps/$ICON"
  #[ ! "$fndICON" ] && [ -f /usr/local/lib/X11/mini-icons/$ICON ] && fndICON="/usr/local/lib/X11/mini-icons/$ICON"
  #[ ! "$fndICON" ] && [ -f /usr/local/lib/X11/pixmaps/$ICON ] && fndICON="/usr/local/lib/X11/pixmaps/$ICON"
  #[ ! "$fndICON" ] && fndICON="/usr/local/lib/X11/mini-icons/Executable.xpm" #fallback.
  #IMGTYPE="$(echo -n "$fndICON" | rev | cut -f 1 -d '.' | rev)" #ex: xpm
  #IMGBASE="$(basename "${fndICON}" .${IMGTYPE})"
  #cp -f "$fndICON" /tmp/easy_containers/
  #cd /tmp/easy_containers
  #[ "$IMGTYPE" == "xpm" ] && xpmtoppm ${IMGBASE}.${IMGTYPE} | pnmtopng > ${IMGBASE}.png
  #cp -f /usr/sbin/pngoverlay ./
  #cp -f /usr/local/lib/X11/pixmaps/container-overlay48.png ./
  #sync
  #./pngoverlay ${IMGBASE}.png container-overlay48.png /usr/share/pixmaps/ec-${EC_CREATE}.png
  #sed -i -e "s%^Icon=.*%Icon=ec-${EC_CREATE}.png%" /usr/share/applications/ec-${EC_CREATE}.desktop
  sed -i -e "s%^Icon=.*%Icon=container48.png%" /usr/share/applications/ec-${EC_CREATE}.desktop
  
  #now update the jwm menu...
  cd /
  fixmenus
  jwm -reload
  pupdialog --timeout 5 --background '#80FF80' --backtitle "$(gettext 'Creation completed')" --msgbox "$(gettext 'Container created, and new menu entry created')" 0 0
 else
  pupdialog --timeout 5 --background '#80C080' --backtitle "$(gettext 'Creation canceled')" --msgbox "$(gettext 'You have chosen not to create the container')" 0 0
 fi
fi
