nix-tools/lib/util.sh
Ramon Buldó 49f97c862a Rework desktop environment autodetection
Add default_desktop_executable and default_desktop_file options in profile.conf
Setting both options will bypass displaymanager autodetection and use provided values to configure the displaymanager.
If one or both are not set it will use diplaymanager autodetection and configuration.
Configure displaymanager.conf for calamares.
2015-05-31 01:26:28 +02:00

483 lines
10 KiB
Bash

#!/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.
import(){
[[ -r $1 ]] && source $1
}
get_timer(){
echo $(date +%s)
}
# $1: start timer
elapsed_time(){
echo $(echo $1 $(get_timer) | awk '{ printf "%0.2f",($2-$1)/60 }')
}
##
# usage : in_array( $needle, $haystack )
# return : 0 - found
# 1 - not found
##
in_array() {
local needle=$1; shift
local item
for item in "$@"; do
[[ $item = $needle ]] && return 0 # Found
done
return 1 # Not Found
}
# $1: sofile
# $2: soarch
process_sofile() {
# extract the library name: libfoo.so
local soname="${1%.so?(+(.+([0-9])))}".so
# extract the major version: 1
soversion="${1##*\.so\.}"
if [[ "$soversion" = "$1" ]] && (($IGNORE_INTERNAL)); then
continue
fi
if ! in_array "${soname}=${soversion}-$2" ${soobjects[@]}; then
# libfoo.so=1-64
msg "${soname}=${soversion}-$2"
soobjects+=("${soname}=${soversion}-$2")
fi
}
##
# usage : get_full_version( [$pkgname] )
# return : full version spec, including epoch (if necessary), pkgver, pkgrel
##
get_full_version() {
# set defaults if they weren't specified in buildfile
pkgbase=${pkgbase:-${pkgname[0]}}
epoch=${epoch:-0}
if [[ -z $1 ]]; then
if [[ $epoch ]] && (( ! $epoch )); then
echo $pkgver-$pkgrel
else
echo $epoch:$pkgver-$pkgrel
fi
else
for i in pkgver pkgrel epoch; do
local indirect="${i}_override"
eval $(declare -f package_$1 | sed -n "s/\(^[[:space:]]*$i=\)/${i}_override=/p")
[[ -z ${!indirect} ]] && eval ${indirect}=\"${!i}\"
done
if (( ! $epoch_override )); then
echo $pkgver_override-$pkgrel_override
else
echo $epoch_override:$pkgver_override-$pkgrel_override
fi
fi
}
##
# usage: find_cached_package( $pkgname, $pkgver, $arch )
#
# $pkgver can be supplied with or without a pkgrel appended.
# If not supplied, any pkgrel will be matched.
##
find_cached_package() {
local searchdirs=("$PWD" "$PKGDEST") results=()
local targetname=$1 targetver=$2 targetarch=$3
local dir pkg pkgbasename pkgparts name ver rel arch size r results
for dir in "${searchdirs[@]}"; do
[[ -d $dir ]] || continue
for pkg in "$dir"/*.pkg.tar.xz; do
[[ -f $pkg ]] || continue
# avoid adding duplicates of the same inode
for r in "${results[@]}"; do
[[ $r -ef $pkg ]] && continue 2
done
# split apart package filename into parts
pkgbasename=${pkg##*/}
pkgbasename=${pkgbasename%.pkg.tar?(.?z)}
arch=${pkgbasename##*-}
pkgbasename=${pkgbasename%-"$arch"}
rel=${pkgbasename##*-}
pkgbasename=${pkgbasename%-"$rel"}
ver=${pkgbasename##*-}
name=${pkgbasename%-"$ver"}
if [[ $targetname = "$name" && $targetarch = "$arch" ]] &&
pkgver_equal "$targetver" "$ver-$rel"; then
results+=("$pkg")
fi
done
done
case ${#results[*]} in
0)
return 1
;;
1)
printf '%s\n' "$results"
return 0
;;
*)
error 'Multiple packages found:'
printf '\t%s\n' "${results[@]}" >&2
return 1
;;
esac
}
##
# usage: pkgver_equal( $pkgver1, $pkgver2 )
##
pkgver_equal() {
local left right
if [[ $1 = *-* && $2 = *-* ]]; then
# if both versions have a pkgrel, then they must be an exact match
[[ $1 = "$2" ]]
else
# otherwise, trim any pkgrel and compare the bare version.
[[ ${1%%-*} = "${2%%-*}" ]]
fi
}
check_root() {
(( EUID == 0 )) && return
if type -P sudo >/dev/null; then
exec sudo -- "$@"
else
exec su root -c "$(printf ' %q' "$@")"
fi
}
# $1: section
parse_section() {
local is_section=0
while read line; do
[[ $line =~ ^\ {0,}# ]] && continue
[[ -z "$line" ]] && continue
if [ $is_section == 0 ]; then
if [[ $line =~ ^\[.*?\] ]]; then
line=${line:1:$((${#line}-2))}
section=${line// /}
if [[ $section == $1 ]]; then
is_section=1
continue
fi
continue
fi
elif [[ $line =~ ^\[.*?\] && $is_section == 1 ]]; then
break
else
pc_key=${line%%=*}
pc_key=${pc_key// /}
pc_value=${line##*=}
pc_value=${pc_value## }
eval "$pc_key='$pc_value'"
fi
done < "${pacman_conf}"
}
get_repos() {
local section repos=() filter='^\ {0,}#'
while read line; do
[[ $line =~ "${filter}" ]] && continue
[[ -z "$line" ]] && continue
if [[ $line =~ ^\[.*?\] ]]; then
line=${line:1:$((${#line}-2))}
section=${line// /}
case ${section} in
"options") continue ;;
*) repos+=("${section}") ;;
esac
fi
done < "${pacman_conf}"
echo ${repos[@]}
}
clean_pacman_conf(){
local repositories=$(get_repos) uri='file://'
msg "Cleaning [$1/etc/pacman.conf] ..."
for repo in ${repositories[@]}; do
case ${repo} in
'options'|'core'|'extra'|'community'|'multilib') continue ;;
*)
msg2 "parsing [${repo}] ..."
parse_section ${repo}
if [[ ${pc_value} == $uri* ]]; then
msg2 "Removing local repo [${repo}] ..."
sed -i "/^\[${repo}/,/^Server/d" $1/etc/pacman.conf
fi
;;
esac
done
msg "Done cleaning [$1/etc/pacman.conf]"
}
load_vars() {
local var
[[ -f $1 ]] || return 1
for var in {SRC,SRCPKG,PKG,LOG}DEST MAKEFLAGS PACKAGER CARCH GPGKEY; do
[[ -z ${!var} ]] && eval $(grep "^${var}=" "$1")
done
return 0
}
load_config(){
[[ -f $1 ]] || return 1
manjaro_tools_conf="$1"
[[ -r ${manjaro_tools_conf} ]] && source ${manjaro_tools_conf}
######################
# common
######################
[[ -z ${branch} ]] && branch='stable'
[[ -z ${arch} ]] && arch=$(uname -m)
[[ -z ${cache_dir} ]] && cache_dir='/var/cache/manjaro-tools'
[[ -z ${chroots_dir} ]] && chroots_dir='/var/lib/manjaro-tools'
[[ -z ${sets_dir} ]] && sets_dir="${SYSCONFDIR}/sets"
###################
# buildtree
###################
[[ -z ${repo_tree[@]} ]] && repo_tree=('core' 'extra' 'community' 'multilib' 'openrc')
[[ -z ${host_tree} ]] && host_tree='https://github.com/manjaro'
[[ -z ${host_tree_abs} ]] && host_tree_abs='https://projects.archlinux.org/git/svntogit'
###################
# buildpkg
###################
chroots_pkg="${chroots_dir}/buildpkg"
sets_dir_pkg="${sets_dir}/pkg"
[[ -z ${buildset_pkg} ]] && buildset_pkg='default'
[[ -z ${build_mirror} ]] && build_mirror='http://mirror.netzspielplatz.de/manjaro/packages'
[[ -z ${blacklist_trigger[@]} ]] && blacklist_trigger=('eudev' 'upower-pm-utils' 'eudev-systemdcompat')
[[ -z ${blacklist[@]} ]] && blacklist=('libsystemd')
###################
# buildiso
###################
chroots_iso="${chroots_dir}/buildiso"
sets_dir_iso="${sets_dir}/iso"
[[ -z ${buildset_iso} ]] && buildset_iso='default'
##### iso settings #####
if [[ -z ${dist_release} ]];then
source /etc/lsb-release
dist_release=${DISTRIB_RELEASE}
fi
if [[ -z ${dist_codename} ]];then
source /etc/lsb-release
dist_codename="${DISTRIB_CODENAME}"
fi
[[ -z ${dist_branding} ]] && dist_branding="MJRO"
[[ -z ${dist_version} ]] && dist_version=$(date +%Y.%m)
[[ -z ${dist_name} ]] && dist_name="Manjaro"
[[ -z ${iso_name} ]] && iso_name="manjaro"
iso_label="${dist_branding}${dist_release//.}"
iso_label="${iso_label//_}" # relace all _
iso_label="${iso_label//-}" # relace all -
iso_label="${iso_label^^}" # all uppercase
iso_label="${iso_label::8}" # limit to 8 characters
[[ -z ${iso_publisher} ]] && iso_publisher='Manjaro Linux <http://www.manjaro.org>'
[[ -z ${iso_app_id} ]] && iso_app_id='Manjaro Linux Live/Rescue CD'
[[ -z ${iso_compression} ]] && iso_compression='xz'
[[ -z ${iso_checksum} ]] && iso_checksum='md5'
return 0
}
load_profile_config(){
[[ -f $1 ]] || return 1
profile_conf="$1"
[[ -r ${profile_conf} ]] && source ${profile_conf}
[[ -z ${initsys} ]] && initsys="systemd"
[[ -z ${displaymanager} ]] && displaymanager="none"
[[ -z ${default_desktop_executable} ]] && default_desktop_executable="none"
[[ -z ${default_desktop_file} ]] && default_desktop_file="none"
[[ -z ${kernel} ]] && kernel="linux318"
[[ -z ${efi_boot_loader} ]] && efi_boot_loader="grub"
[[ -z ${efi_part_size} ]] && efi_part_size="31M"
[[ -z ${hostname} ]] && hostname="manjaro"
[[ -z ${username} ]] && username="manjaro"
[[ -z ${plymouth_theme} ]] && plymouth_theme="manjaro-elegant"
[[ -z ${password} ]] && password="manjaro"
if [[ -z ${addgroups} ]];then
addgroups="video,audio,power,disk,storage,optical,network,lp,scanner,wheel"
fi
if [[ -z ${start_systemd[@]} ]];then
start_systemd=('bluetooth' 'cronie' 'ModemManager' 'NetworkManager' 'org.cups.cupsd' 'tlp' 'tlp-sleep')
fi
if [[ -z ${start_openrc[@]} ]];then
start_openrc=('acpid' 'bluetooth' 'consolekit' 'cronie' 'cupsd' 'dbus' 'syslog-ng' 'NetworkManager')
fi
if [[ -z ${start_systemd_live[@]} ]];then
start_systemd_live=('livecd' 'mhwd-live' 'pacman-init' 'pacman-boot')
fi
if [[ -z ${start_openrc_live[@]} ]];then
start_openrc_live=('livecd' 'mhwd-live' 'pacman-init' 'pacman-boot')
fi
return 0
}
prepare_dir(){
[[ ! -d $1 ]] && mkdir -p $1
}
clean_dir(){
if [[ -d $1 ]]; then
msg "Cleaning [$1] ..."
rm -r $1/*
fi
}
# $1: sets_dir
load_sets(){
local prof temp
for item in $(ls $1/*.set); do
temp=${item##*/}
prof=${prof:-}${prof:+|}${temp%.set}
done
echo $prof
}
# $1: buildset
# $2: sets_dir
eval_buildset(){
eval "case $1 in
$(load_sets $2)) is_buildset=true ;;
*) is_buildset=false ;;
esac"
}
load_user_info(){
OWNER=${SUDO_USER:-$USER}
if [[ -n $SUDO_USER ]]; then
eval "USER_HOME=~$SUDO_USER"
else
USER_HOME=$HOME
fi
USER_CONFIG="$USER_HOME/.config"
}
# $1: path
# $2: exit code
check_profile(){
local keyfiles=('profile.conf' 'mkinitcpio.conf' 'Packages' 'Packages-Livecd')
local keydirs=('overlay' 'overlay-livecd' 'isolinux')
local has_keyfiles=false has_keydirs=false
#msg "Checking profile [$1]"
for f in ${keyfiles[@]}; do
if [[ -f $1/$f ]];then
has_keyfiles=true
else
has_keyfiles=false
break
fi
done
for d in ${keydirs[@]}; do
if [[ -d $1/$d ]];then
has_keydirs=true
else
has_keydirs=false
break
fi
done
#msg2 "has_keyfiles: ${has_keyfiles}"
#msg2 "has_keydirs: ${has_keydirs}"
if ! ${has_keyfiles} && ! ${has_keydirs};then
# msg "Profile sanity check passed."
# else
eval $2
fi
}
# $1: file
# $2: exit code
check_sanity(){
if [[ ! -f $1 ]]; then
eval "$2"
fi
}
show_version(){
msg "manjaro-tools"
msg2 "version: ${version}"
}
show_config(){
if [[ -f ${USER_CONFIG}/manjaro-tools.conf ]]; then
msg2 "user_config: ${USER_CONFIG}/manjaro-tools.conf"
else
msg2 "manjaro_tools_conf: ${manjaro_tools_conf}"
fi
}