Browse Source

live (#6)

set service paths via make

use more make vars

fix session & desktop detection

move liveuser declare

shellcheck

update sysusers

make the live user configurable with make

cleanup log

properly copy user skel

create live home

add sysusers file

refactor

v0.10

update live.conf

artix-live: remove some config

use m4_include()

Reviewed-on: #6
Co-Authored-By: artoo <artoo@artixlinux.org>
Co-Committed-By: artoo <artoo@artixlinux.org>
pull/7/head 0.10
artoo 1 year ago
parent
commit
e9e2ec9d9e
  1. 49
      Makefile
  2. 36
      bin/artix-live
  3. 23
      bin/artix-live.in
  4. 6
      bin/desktop-items.in
  5. 2
      data/desktop.map
  6. 6
      data/live.conf
  7. 0
      data/rc/artix-live.in
  8. 0
      data/rc/gnupg-mount.in
  9. 0
      data/rc/pacman-init.in
  10. 2
      data/runit/live.in
  11. 0
      data/s6/artix-live/type.in
  12. 3
      data/s6/artix-live/up
  13. 2
      data/s6/artix-live/up.in
  14. 2
      data/s6/pacman-init/down.in
  15. 0
      data/s6/pacman-init/type.in
  16. 2
      data/s6/pacman-init/up.in
  17. 12
      data/sysusers.in
  18. 233
      lib/util-live.sh

49
Makefile

@ -1,4 +1,4 @@
VERSION = 0.8
VERSION = 0.10
PKG = live-services
TOOLS = artools
@ -8,6 +8,8 @@ PREFIX ?= /usr
BINDIR = $(PREFIX)/bin
LIBDIR = $(PREFIX)/lib
DATADIR = $(PREFIX)/share
SYSUSERSDIR = $(PREFIX)/lib/sysusers.d
LIVEUSER ?= artix
FMODE = -m0644
DMODE = -dm0755
@ -16,8 +18,6 @@ BMODE = -m0755
BIN = \
bin/artix-live
LIBS = $(wildcard lib/*.sh)
SHARED = \
$(wildcard data/*.map) \
data/live.conf
@ -34,28 +34,55 @@ RUNIT_SV = \
data/runit/pacman-init.run
S6_LIVE = \
$(wildcard data/s6/artix-live/*)
data/s6/artix-live/up \
data/s6/artix-live/type
S6_PI = \
$(wildcard data/s6/pacman-init/*)
data/s6/pacman-init/type \
data/s6/pacman-init/up \
data/s6/pacman-init/down
S6_BUNDLE = \
$(wildcard data/s6/live/*)
S6_SV = \
data/s6/pacman-init.run
data/s6/live/type \
data/s6/live/contents
XDG = $(wildcard data/*.desktop)
XBIN = bin/desktop-items
SYSUSERS = \
data/sysusers
RM = rm -f
M4 = m4 -P
CHMODAW = chmod a-w
CHMODX = chmod +x
all: $(BIN) $(SYSUSERS) $(XBIN) $(RC) $(RUNIT_SVD) $(S6_PI) $(S6_LIVE)
EDIT = sed -e "s|@datadir[@]|$(DATADIR)|g" \
-e "s|@sysconfdir[@]|$(SYSCONFDIR)|g" \
-e "s|@bindir[@]|$(BINDIR)|g" \
-e "s|@libdir[@]|$(LIBDIR)|g" \
-e "s|@live[@]|$(LIVEUSER)|g"
%: %.in Makefile lib/util-live.sh
@echo "GEN $@"
@$(RM) "$@"
@{ echo -n 'm4_changequote([[[,]]])'; cat $@.in; } | $(M4) | $(EDIT) >$@
@$(CHMODAW) "$@"
@$(CHMODX) "$@"
@bash -O extglob -n "$@"
clean:
$(RM) $(BIN) $(SYSUSERS) $(XBIN) $(RC) $(RUNIT_SVD) $(S6_PI) $(S6_LIVE)
install_base:
install $(DMODE) $(DESTDIR)$(BINDIR)
install $(BMODE) $(BIN) $(DESTDIR)$(BINDIR)
install $(DMODE) $(DESTDIR)$(LIBDIR)/$(TOOLS)
install $(FMODE) $(LIBS) $(DESTDIR)$(LIBDIR)/$(TOOLS)
install $(DMODE) $(DESTDIR)$(SYSUSERSDIR)
install $(FMODE) $(SYSUSERS) $(DESTDIR)$(SYSUSERSDIR)/live-artix.conf
install $(DMODE) $(DESTDIR)$(DATADIR)/$(TOOLS)
install $(FMODE) $(SHARED) $(DESTDIR)$(DATADIR)/$(TOOLS)

36
bin/artix-live

@ -1,36 +0,0 @@
#!/bin/sh
LOGFILE='/var/log/artix-live.log'
. /usr/lib/artools/util-live.sh
load_live_config "/etc/artools/live.conf" || load_live_config "/usr/share/artools/live.conf"
CONSOLEFONT="$(kernel_cmdline vconsole.font)"
CONSOLEMAP="$(kernel_cmdline vconsole.font.map)"
echo "Got consolefont ${CONSOLEFONT} and consolemap ${CONSOLEMAP}" >> "${LOGFILE}"
# Activate swap
configure_swap
echo "Activated swap and added to fstab" >> "${LOGFILE}"
configure_language
echo "Finished localization" >> "${LOGFILE}"
configure_user 'root'
echo "Configured root user" >> "${LOGFILE}"
configure_user "${USER_NAME}"
echo "Created user ${USER_NAME} with password ${PASSWORD}" >> "${LOGFILE}"
detect_desktop_env
echo "Detected ${DEFAULT_DESKTOP_EXECUTABLE} ${DEFAULT_DESKTOP_FILE}" >> "${LOGFILE}"
configure_accountsservice "${USER_NAME}"
echo "Configured accountsservice" >> "${LOGFILE}"
configure_displaymanager
echo "Configured displaymanager" >> "${LOGFILE}"
configure_branding
echo "Configured branding" >> "${LOGFILE}"

23
bin/artix-live.in

@ -0,0 +1,23 @@
#!/bin/bash
m4_include(lib/util-live.sh)
LOGFILE='/var/log/artix-live.log'
CONSOLEFONT="$(kernel_cmdline vconsole.font)"
CONSOLEMAP="$(kernel_cmdline vconsole.font.map)"
#echo "Got consolefont ${CONSOLEFONT} and consolemap ${CONSOLEMAP}" >> "${LOGFILE}"
configure_swap
configure_language
configure_user
detect_desktop_env
configure_accountsservice
configure_displaymanager
configure_branding

6
bin/desktop-items → bin/desktop-items.in

@ -5,20 +5,20 @@
xdg-user-dirs-update --force
xdg=$(xdg-user-dir DESKTOP)
src=/usr/share/applications
src=@datadir@/applications
# if [[ -f $src/org.kde.konversation.desktop ]]; then
# install -m644 $src/org.kde.konversation.desktop \
# $xdg/org.kde.konversation.desktop
# fi
if [[ -f /usr/bin/calamares ]]; then
if [[ -f @bindir@/calamares ]]; then
cp -f $src/calamares.desktop "$xdg/"
sed -i s/Icon.*=calamares/Icon=artixlinux-logo/g "$xdg"/calamares.desktop
chmod +x "$xdg/calamares.desktop"
fi
docs=/usr/share/doc/artix
docs=@datadir@/doc/artix
for f in {Configuration,Troubleshooting}.pdf; do
ln -s $docs/$f "$xdg"/$f

2
data/desktop.map

@ -7,7 +7,7 @@ pekwm:pekwm
enlightenment:enlightenment_start
Lumina-DE:start-lumina-desktop
LXDE:lxsession
plasma:startkde
plasma:startplasma-x11
lxqt:lxqt-session
pantheon:pantheon-session
budgie-desktop:budgie-desktop

6
data/live.conf

@ -3,11 +3,5 @@
# autologin
AUTOLOGIN=true
# live username
USER_NAME=artix
# live password
PASSWORD=artix
# live group membership
ADDGROUPS='video,power,cdrom,network,lp,scanner,wheel'

0
data/rc/artix-live → data/rc/artix-live.in

0
data/rc/gnupg-mount → data/rc/gnupg-mount.in

0
data/rc/pacman-init → data/rc/pacman-init.in

2
data/runit/live → data/runit/live.in

@ -1,6 +1,6 @@
#!/bin/bash
. /usr/lib/rc/functions
. @libdir@/rc/functions
case "$1" in
start)

0
data/s6/artix-live/type → data/s6/artix-live/type.in

3
data/s6/artix-live/up

@ -1,3 +0,0 @@
#!/usr/bin/execlineb -P
if { echo "Initializing artix live system" }
foreground { /usr/bin/artix-live }

2
data/s6/artix-live/up.in

@ -0,0 +1,2 @@
#!@bindir@/execlineb -P
exec @bindir@/artix-live

2
data/s6/pacman-init/down → data/s6/pacman-init/down.in

@ -1,2 +1,2 @@
#!/usr/bin/execline -P
#!@bindir@/execlineb -P
umount -l /etc/pacman.d/gnupg

0
data/s6/pacman-init/type → data/s6/pacman-init/type.in

2
data/s6/pacman-init/up → data/s6/pacman-init/up.in

@ -1,4 +1,4 @@
#!/usr/bin/execlineb -P
#!@bindir@/execlineb -P
foreground { mkdir -p /etc/pacman.d/gnupg }
foreground { mount -t tmpfs -o size=10M,mode=0755 tmpfs /etc/pacman.d/gnupg }
fdmove -c 2 1

12
data/sysusers.in

@ -0,0 +1,12 @@
# artix live user
u @live@ 1000 - /home/@live@ /bin/bash
m @live@ video
m @live@ power
m @live@ cdrom
m @live@ network
m @live@ lp
m @live@ scanner
m @live@ wheel
m @live@ log
m @live@ users

233
lib/util-live.sh

@ -1,22 +1,15 @@
#!/bin/bash
#
# 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; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#!/hint/bash
export LC_MESSAGES=C
export LANG=C
# {{{ functions
kernel_cmdline(){
for param in $(cat /proc/cmdline); do
case "${param}" in
$1=*) echo "${param##*=}"; return 0 ;;
$1) return 0 ;;
"$1") return 0 ;;
*) continue ;;
esac
done
@ -25,86 +18,63 @@ kernel_cmdline(){
}
get_lang(){
echo $(kernel_cmdline lang)
kernel_cmdline lang
}
get_keytable(){
echo $(kernel_cmdline keytable)
kernel_cmdline keytable
}
get_tz(){
echo $(kernel_cmdline tz)
}
load_live_config(){
[[ -f $1 ]] || return 1
local live_conf="$1"
[[ -r ${live_conf} ]] && source ${live_conf}
AUTOLOGIN=${AUTOLOGIN:-true}
USER_NAME=${USER_NAME:-"artix"}
PASSWORD=${PASSWORD:-"artix"}
ADDGROUPS=${ADDGROUPS:-"video,power,cdrom,network,lp,scanner,wheel,users,log"}
return 0
kernel_cmdline tz
}
is_valid_de(){
if [[ ${DEFAULT_DESKTOP_EXECUTABLE} != "none" ]] && \
[[ ${DEFAULT_DESKTOP_FILE} != "none" ]]; then
return 0
else
return 1
fi
}
load_desktop_map(){
local _space="s| ||g" _clean=':a;N;$!ba;s/\n/ /g' _com_rm="s|#.*||g" \
file=/usr/share/artools/desktop.map
local desktop_map=$(sed "$_com_rm" "$file" | sed "$_space" | sed "$_clean")
echo ${desktop_map}
return 1
}
detect_desktop_env(){
local key val map=( $(load_desktop_map) )
local key val map
map="${DATADIR}"/artools/desktop.map
DEFAULT_DESKTOP_FILE="none"
DEFAULT_DESKTOP_EXECUTABLE="none"
for item in "${map[@]}";do
while read -r item; do
key=${item%:*}
val=${item#*:}
if [[ -f /usr/share/xsessions/$key.desktop ]] && [[ -f /usr/bin/$val ]];then
if [[ -f "${DATADIR}"/xsessions/$key.desktop ]] && [[ -f ${BINDIR}/$val ]];then
DEFAULT_DESKTOP_FILE="$key"
DEFAULT_DESKTOP_EXECUTABLE="$val"
fi
done
done < "$map"
echo "Detected ${DEFAULT_DESKTOP_EXECUTABLE} ${DEFAULT_DESKTOP_FILE}" >> "${LOGFILE}"
}
configure_accountsservice(){
local path=/var/lib/AccountsService/users
local path=/var/lib/AccountsService/users user="${1:-${LIVEUSER}}"
if [ -d "${path}" ] ; then
echo "[User]" > ${path}/$1
echo "XSession=${DEFAULT_DESKTOP_FILE}" >> ${path}/$1
if [[ -f "/var/lib/AccountsService/icons/$1.png" ]];then
echo "Icon=/var/lib/AccountsService/icons/$1.png" >> ${path}/$1
echo "[User]" > ${path}/"$user"
echo "XSession=${DEFAULT_DESKTOP_FILE}" >> ${path}/"$user"
if [[ -f "/var/lib/AccountsService/icons/$user.png" ]];then
echo "Icon=/var/lib/AccountsService/icons/$user.png" >> ${path}/"$user"
fi
fi
echo "Configured accountsservice" >> "${LOGFILE}"
}
set_lightdm_greeter(){
local greeters=$(ls /usr/share/xgreeters/*greeter.desktop) name
for g in ${greeters[@]};do
local name
for g in "${DATADIR}"/xgreeters/*.desktop;do
name=${g##*/}
name=${name%%.*}
case ${name} in
lightdm-gtk-greeter) break ;;
lightdm-*-greeter)
sed -i -e "s/^.*greeter-session=.*/greeter-session=${name}/" /etc/lightdm/lightdm.conf
sed -e "s/^.*greeter-session=.*/greeter-session=${name}/" \
-i /etc/lightdm/lightdm.conf
;;
esac
done
@ -113,53 +83,50 @@ configure_accountsservice(){
configure_displaymanager(){
# Try to detect desktop environment
# Configure display manager
if [[ -f /usr/bin/lightdm ]];then
if [[ -f "${BINDIR}"/lightdm ]];then
groupadd -r autologin
sed -i -e 's/^.*minimum-vt=.*/minimum-vt=7/' /etc/lightdm/lightdm.conf
gpasswd -a "${LIVEUSER}" autologin &> /dev/null
set_lightdm_greeter
if $(is_valid_de); then
sed -i -e "s/^.*user-session=.*/user-session=$DEFAULT_DESKTOP_FILE/" /etc/lightdm/lightdm.conf
if is_valid_de; then
sed -e "s/^.*user-session=.*/user-session=$DEFAULT_DESKTOP_FILE/" \
-e 's/^.*minimum-vt=.*/minimum-vt=7/' \
-i /etc/lightdm/lightdm.conf
fi
if ${AUTOLOGIN};then
gpasswd -a ${USER_NAME} autologin &> /dev/null
sed -i -e "s/^.*autologin-user=.*/autologin-user=${USER_NAME}/" /etc/lightdm/lightdm.conf
sed -i -e "s/^.*autologin-user-timeout=.*/autologin-user-timeout=0/" /etc/lightdm/lightdm.conf
sed -i -e "s/^.*pam-autologin-service=.*/pam-autologin-service=lightdm-autologin/" /etc/lightdm/lightdm.conf
fi
elif [[ -f /usr/bin/gdm ]];then
${AUTOLOGIN} && sed -e "s/^.*autologin-user=.*/autologin-user=${LIVEUSER}/" \
-e "s/^.*autologin-user-timeout=.*/autologin-user-timeout=0/" \
-e "s/^.*pam-autologin-service=.*/pam-autologin-service=lightdm-autologin/" \
-i /etc/lightdm/lightdm.conf
elif [[ -f "${BINDIR}"/gdm ]];then
configure_accountsservice "gdm"
if ${AUTOLOGIN};then
sed -i -e "s/\[daemon\]/\[daemon\]\nAutomaticLogin=${USER_NAME}\nAutomaticLoginEnable=True/" /etc/gdm/custom.conf
fi
elif [[ -f /usr/bin/sddm ]];then
if $(is_valid_de); then
sed -i -e "s|^Session=.*|Session=$DEFAULT_DESKTOP_FILE.desktop|" /etc/sddm.conf
${AUTOLOGIN} && sed -e "s/\[daemon\]/\[daemon\]\nAutomaticLogin=${LIVEUSER}\nAutomaticLoginEnable=True/" \
-i /etc/gdm/custom.conf
elif [[ -f "${BINDIR}"/sddm ]];then
if is_valid_de; then
sed -e "s|^Session=.*|Session=$DEFAULT_DESKTOP_FILE.desktop|" \
-i /etc/sddm.conf
fi
if ${AUTOLOGIN};then
sed -i -e "s|^User=.*|User=${USER_NAME}|" /etc/sddm.conf
fi
elif [[ -f /usr/bin/lxdm ]];then
if $(is_valid_de); then
sed -i -e "s|^.*session=.*|session=/usr/bin/${DEFAULT_DESKTOP_EXECUTABLE}|" /etc/lxdm/lxdm.conf
fi
if ${AUTOLOGIN};then
sed -i -e "s/^.*autologin=.*/autologin=${USER_NAME}/" /etc/lxdm/lxdm.conf
${AUTOLOGIN} && sed -e "s|^User=.*|User=${LIVEUSER}|" \
-i /etc/sddm.conf
elif [[ -f "${BINDIR}"/lxdm ]];then
if is_valid_de; then
sed -e "s|^.*session=.*|session=${BINDIR}/${DEFAULT_DESKTOP_EXECUTABLE}|" \
-i /etc/lxdm/lxdm.conf
fi
${AUTOLOGIN} && sed -e "s/^.*autologin=.*/autologin=${LIVEUSER}/" \
-i /etc/lxdm/lxdm.conf
fi
}
gen_pw(){
echo $(perl -e 'print crypt($ARGV[0], "password")' ${PASSWORD})
echo "Configured displaymanager" >> "${LOGFILE}"
}
find_legacy_keymap(){
local file="/usr/share/artools/kbd-model.map" kt="$1"
local file="${DATADIR}/artools/kbd-model.map" kt="$1"
while read -r line || [[ -n $line ]]; do
if [[ -z $line ]] || [[ $line == \#* ]]; then
continue
fi
local mapping=( $line ); # parses columns
local mapping=( "$line" ); # parses columns
if [[ ${#mapping[@]} != 5 ]]; then
continue
fi
@ -175,7 +142,7 @@ find_legacy_keymap(){
X11_LAYOUT=${mapping[1]}
X11_MODEL=${mapping[2]}
X11_VARIANT=${mapping[3]}
x11_OPTIONS=${mapping[4]}
X11_OPTIONS=${mapping[4]}
done < $file
}
@ -201,64 +168,92 @@ write_x11_config(){
local XORGKBLAYOUT="/etc/X11/xorg.conf.d/00-keyboard.conf"
echo "" >> "$XORGKBLAYOUT"
echo "Section \"InputClass\"" > "$XORGKBLAYOUT"
echo " Identifier \"system-keyboard\"" >> "$XORGKBLAYOUT"
echo " MatchIsKeyboard \"on\"" >> "$XORGKBLAYOUT"
echo " Option \"XkbLayout\" \"$X11_LAYOUT\"" >> "$XORGKBLAYOUT"
echo " Option \"XkbModel\" \"$X11_MODEL\"" >> "$XORGKBLAYOUT"
echo " Option \"XkbVariant\" \"$X11_VARIANT\"" >> "$XORGKBLAYOUT"
echo " Option \"XkbOptions\" \"$X11_OPTIONS\"" >> "$XORGKBLAYOUT"
echo "EndSection" >> "$XORGKBLAYOUT"
{
echo " Identifier \"system-keyboard\""
echo " MatchIsKeyboard \"on\""
echo " Option \"XkbLayout\" \"$X11_LAYOUT\""
echo " Option \"XkbModel\" \"$X11_MODEL\""
echo " Option \"XkbVariant\" \"$X11_VARIANT\""
echo " Option \"XkbOptions\" \"$X11_OPTIONS\""
echo "EndSection"
} >> "$XORGKBLAYOUT"
}
configure_language(){
# hack to be able to set the locale on bootup
local lang=$(get_lang)
local keytable=$(get_keytable)
local timezone=$(get_tz)
local lang keytable timezone
lang=$(get_lang)
keytable=$(get_keytable)
timezone=$(get_tz)
sed -e "s/#${lang}.UTF-8/${lang}.UTF-8/" -i /etc/locale.gen
if [[ -d /run/openrc ]]; then
sed -i "s/keymap=.*/keymap=\"${keytable}\"/" /etc/conf.d/keymaps
fi
echo "KEYMAP=${keytable}" > /etc/vconsole.conf
echo "LANG=${lang}.UTF-8" > /etc/locale.conf
ln -sf /usr/share/zoneinfo/${timezone} /etc/localtime
ln -sf "${DATADIR}"/zoneinfo/"${timezone}" /etc/localtime
write_x11_config "${keytable}"
loadkeys "${keytable}"
locale-gen ${lang}
echo "Configured language: ${lang}" >> "${LOGFILE}"
echo "Configured keymap: ${keytable}" >> "${LOGFILE}"
echo "Configured timezone: ${timezone}" >> "${LOGFILE}"
locale-gen "${lang}"
{
echo "Configured language: ${lang}"
echo "Configured keymap: ${keytable}"
echo "Configured timezone: ${timezone}"
echo "Finished localization"
} >> "${LOGFILE}"
}
configure_swap(){
local swapdev="$(fdisk -l 2>/dev/null | grep swap | cut -d' ' -f1)"
local swapdev
swapdev="$(fdisk -l 2>/dev/null | grep swap | cut -d' ' -f1)"
if [ -e "${swapdev}" ]; then
swapon ${swapdev}
swapon "${swapdev}"
fi
echo "Activated swap and added to fstab" >> "${LOGFILE}"
}
configure_branding(){
if [[ -f /usr/bin/neofetch ]]; then
if [[ -f "${BINDIR}"/neofetch ]]; then
neofetch >| /etc/issue
echo "Configured branding" >> "${LOGFILE}"
fi
}
configure_user(){
local user="$1"
if [[ "$user" == 'root' ]];then
echo "root:${PASSWORD}" | chroot / chpasswd
cp /etc/skel/.{bash_profile,bashrc,bash_logout} /root/
else
local args=(-m -G ${ADDGROUPS} -s /bin/bash $user)
# set up user and password
[[ -n ${PASSWORD} ]] && args+=(-p $(gen_pw))
useradd "${args[@]}"
fi
echo "root:${PASSWORD}" | chroot / chpasswd
cp /etc/skel/.{bash_profile,bashrc,bash_logout} /root/
mkdir /home/${LIVEUSER}
chown ${LIVEUSER}:${LIVEUSER} /home/${LIVEUSER}
echo "${LIVEUSER}:${PASSWORD}" | chroot / chpasswd
cp -r /etc/skel/.[^.]* /home/${LIVEUSER}
chown -R ${LIVEUSER}:${LIVEUSER} /home/${LIVEUSER}
echo "Configured live user ${LIVEUSER} with password ${PASSWORD}" >> "${LOGFILE}"
}
# }}}
load_live_config(){
[[ -f $1 ]] || return 1
local live_conf="$1"
[[ -r "${live_conf}" ]] && source "${live_conf}"
AUTOLOGIN=${AUTOLOGIN:-true}
PASSWORD=${PASSWORD:-artix}
return 0
}
load_live_config "@sysconfdir@/artools/live.conf" || load_live_config "@datadir@/artools/live.conf"
LIVEUSER=@live@
DATADIR=@datadir@
BINDIR=@bindir@

Loading…
Cancel
Save