SHA256
1
0
forked from pool/gdm
gdm/SuSEconfig.gdm

319 lines
8.7 KiB
Bash

#!/bin/bash
#
# Copyright (c) 2004-2006 SuSE
# Author: Stanislav Brabec <sbrabec@suse.cz>
type -p awk &> /dev/null || {
echo "${0##*/}: No awk in PATH ... skipping"
exit 0
}
type -p cmp &> /dev/null || {
echo "${0##*/}: No cmp in PATH ... skipping"
exit 0
}
# Read old values. We will need one for correct updating of
if test -f $r/etc/gdm/gdm_sysconfig.conf ; then
. $r/etc/gdm/gdm_sysconfig.conf
fi
export OLD_DISPLAYMANAGER_AUTOLOGIN="$DISPLAYMANAGER_AUTOLOGIN"
r=$ROOT
# Set default values. (This overwrites all variables from gdm_sysconfig.conf.)
DISPLAYMANAGER_REMOTE_ACCESS="no"
DISPLAYMANAGER_ROOT_LOGIN_REMOTE="no"
DISPLAYMANAGER_STARTS_XSERVER="yes"
DISPLAYMANAGER_XSERVER_TCP_PORT_6000_OPEN="no"
DISPLAYMANAGER_AUTOLOGIN=""
DISPLAYMANAGER_PASSWORD_LESS_LOGIN="no"
DISPLAYMANAGER_AD_INTEGRATION="no"
DISPLAYMANAGER_SHUTDOWN=""
test -f $r/etc/sysconfig/displaymanager || {
echo "${0##*/}: No $r/etc/sysconfig/displaymanager found."
exit 1
}
. $r/etc/sysconfig/displaymanager
test -f $r/etc/sysconfig/security || {
echo "${0##*/}: No $r/etc/sysconfig/security found."
exit 1
}
. $r/etc/sysconfig/security
test -f $r/lib/YaST/SuSEconfig.functions || {
echo "${0##*/}: ERROR - can not find $r"'/lib/YaST/SuSEconfig.functions!!'
echo "${0##*/}: This should not happen. Exit..."
exit 1
}
. $r/lib/YaST/SuSEconfig.functions
GDM_IS_RUNNING=false
if test -z "$r" ; then
if test "$DISPLAYMANAGER" = gdm ; then
if /etc/init.d/xdm status >/dev/null ; then
GDM_IS_RUNNING=false
fi
fi
fi
# Write new set of monitore variables.
echo -en "# custom.conf was last time updated with following sysconfig:\\nDISPLAYMANAGER_REMOTE_ACCESS=\"$DISPLAYMANAGER_REMOTE_ACCESS\"\\nDISPLAYMANAGER_ROOT_LOGIN_REMOTE=\"$DISPLAYMANAGER_ROOT_LOGIN_REMOTE\"\\nDISPLAYMANAGER_STARTS_XSERVER=\"$DISPLAYMANAGER_STARTS_XSERVER\"\\nDISPLAYMANAGER_XSERVER_TCP_PORT_6000_OPEN=\"$DISPLAYMANAGER_XSERVER_TCP_PORT_6000_OPEN\"\\nDISPLAYMANAGER_AUTOLOGIN=\"$DISPLAYMANAGER_AUTOLOGIN\"\\nDISPLAYMANAGER_PASSWORD_LESS_LOGIN=\"$DISPLAYMANAGER_PASSWORD_LESS_LOGIN\"\\nDISPLAYMANAGER_AD_INTEGRATION=\"$DISPLAYMANAGER_AD_INTEGRATION\"\\nDISPLAYMANAGER_SHUTDOWN=\"$DISPLAYMANAGER_SHUTDOWN\"\\nPERMISSION_SECURITY=\"$PERMISSION_SECURITY\"\\n" >$r/etc/gdm/gdm_sysconfig.conf.new
# Are there any changes in monitored variables?
if cmp -s 2>/dev/null $r/etc/gdm/gdm_sysconfig.conf $r/etc/gdm/gdm_sysconfig.conf.new ; then
rm $r/etc/gdm/gdm_sysconfig.conf.new
exit
fi
function sysconfig_yesno_to_gdm {
eval local suseval=\$$1
case "$suseval" in
yes )
export $2=true
;;
* )
export $2=false
;;
esac
export comment_$2="displaymanager:$1"
}
function sysconfig_yesno_to_gdm_reversed {
eval local suseval=\$$1
case "$suseval" in
yes )
export $2=false
;;
* )
export $2=true
;;
esac
export comment_$2="displaymanager:~$1"
}
sysconfig_yesno_to_gdm DISPLAYMANAGER_REMOTE_ACCESS xdmcp_Enable
sysconfig_yesno_to_gdm DISPLAYMANAGER_ROOT_LOGIN_REMOTE security_AllowRemoteRoot
export comment_servers_0="displaymanager:DISPLAYMANAGER_STARTS_XSERVER"
case "$DISPLAYMANAGER_STARTS_XSERVER" in
"yes" )
export servers_0=@SKIP@
;;
* )
export servers_0=inactive
;;
esac
sysconfig_yesno_to_gdm_reversed DISPLAYMANAGER_XSERVER_TCP_PORT_6000_OPEN security_DisallowTCP
sysconfig_yesno_to_gdm DISPLAYMANAGER_AD_INTEGRATION greeter_ShowDomain
export comment_daemon_AutomaticLoginEnable="displaymanager:DISPLAYMANAGER_AUTOLOGIN"
export comment_daemon_AutomaticLogin="displaymanager:DISPLAYMANAGER_AUTOLOGIN"
case "$DISPLAYMANAGER_AUTOLOGIN" in
"" )
export daemon_AutomaticLoginEnable=false
export daemon_AutomaticLogin=@SKIP@
;;
* )
export daemon_AutomaticLoginEnable=true
export daemon_AutomaticLogin="$DISPLAYMANAGER_AUTOLOGIN"
;;
esac
export comment_greeter_AllowShutdown="displaymanager:DISPLAYMANAGER_SHUTDOWN"
export comment_greeter_SecureShutdown="displaymanager:DISPLAYMANAGER_SHUTDOWN"
case "$DISPLAYMANAGER_SHUTDOWN" in
root )
export greeter_AllowShutdown=true
export greeter_SecureShutdown=true
;;
# Remote users can never shutdown in GDM.
none )
export greeter_AllowShutdown=false
export greeter_SecureShutdown=true
;;
all )
export greeter_AllowShutdown=true
export greeter_SecureShutdown=false
;;
auto | * )
export comment_greeter_AllowShutdown="displaymanager:DISPLAYMANAGER_SHUTDOWN, security:PERMISSION_SECURITY"
export comment_greeter_SecureShutdown="displaymanager:DISPLAYMANAGER_SHUTDOWN, security:PERMISSION_SECURITY"
export comment_security_AllowRemoteRoot="displaymanager:DISPLAYMANAGER_ROOT_LOGIN_REMOTE,DISPLAYMANAGER_SHUTDOWN, security:PERMISSION_SECURITY"
case "$PERMISSION_SECURITY" in
paranoid )
export greeter_AllowShutdown=true
export greeter_SecureShutdown=true
export security_AllowRemoteRoot=false
;;
"easy local" )
export greeter_AllowShutdown=true
export greeter_SecureShutdown=false
;;
* )
export greeter_AllowShutdown=true
export greeter_SecureShutdown=true
;;
esac
;;
esac
unset unset ${!last_of_*} ${!custom_conf_*}
# Parse configuration file and record all items to environment values.
eval "$(
awk <$r/etc/gdm/custom.conf '
BEGIN {
section="BEGIN";
section_last_line=0;
after_empty_line=0;
}
# Do not set last_of_ initial comments of a new section.
/^#/ {
if (after_empty_line == 0)
section_last_line=NR;
else
next;
}
/^\[.*\]/ {
print "export last_of_"section"="section_last_line;
section=$0;
gsub ("[][]", "", section);
section_last_line=NR;
after_empty_line=0;
next;
}
/^[a-zA-Z0-9_]*=/ {
item=$0;
gsub ("=.*", "", item);
value=$0;
gsub ("^[a-zA-Z0-9_]*=", "", value);
gsub ("'\''", "'\''\\'\'''\''", value);
section_last_line=NR;
after_empty_line=0;
print "export custom_conf_"section"_"item"_seen=true";
# print "export custom_conf_"section"_"item"='\''"value"'\''";
next;
}
# Do not set last_of_ for empty lines - we want to add missing stuff before the final empty line.
/^$/ {
after_empty_line=1;
next;
}
/.*/ {
section_last_line=NR;
after_empty_line=0;
}
END {
print "export last_of_"section"="section_last_line;
}
'
)"
# And now set what is required.
awk <$r/etc/gdm/custom.conf >$r/etc/gdm/custom.conf.new '
# Prepare array from variable.
function gdm_prepare_var(var) {
gdm_conf_var[var]=ENVIRON[var];
}
# Update configuration from gdm_conf_var array.
function update_item(section, item) {
if (gdm_conf_var[section"_"item] != "@SKIP@") {
print "# SuSEconfig: "ENVIRON["comment_"section"_"item];
print item"="gdm_conf_var[section"_"item];
if (ENVIRON["GDM_IS_RUNNING"] == "true")
# FIXME: If gdm is running and no session is active, command is executed too early.
system("$r/usr/bin/gdmflexiserver --command=\"UPDATE_CONFIG "section"/"item"\"")
return "DONE";
} else
return "KEEP_ORIG";
}
function process_unseen() {
# Print all items not seen in the section.
if (ENVIRON["last_of_"section] == NR)
for (item in gdm_conf_var) {
item_section = item;
gsub ("_.*", "", item_section);
gsub ("[^_]*_", "", item);
if (item_section == section && ENVIRON["custom_conf_"section"_"item"_seen"] != "true")
update_item(section, item);
}
}
BEGIN {
section="BEGIN";
gdm_prepare_var("daemon_AutomaticLoginEnable");
gdm_prepare_var("daemon_AutomaticLogin");
gdm_prepare_var("security_AllowRemoteRoot");
gdm_prepare_var("security_DisallowTCP");
gdm_prepare_var("xdmcp_Enable");
gdm_prepare_var("greeter_AllowShutdown");
gdm_prepare_var("greeter_SecureShutdown");
gdm_prepare_var("greeter_ShowDomain");
gdm_prepare_var("servers_0");
}
# Remove invalid entry created by SuSEconfig.gdm in SuSE Linux 10.2.
/^enable=/ {
if (section == "xdmcp") {
# Remove old gdm_sysconfig.conf to force update of custom.conf.
system("rm -f $r/etc/gdm/gdm_sysconfig.conf");
process_unseen();
next;
}
}
/^# SuSEconfig:/ {
process_unseen();
next;
}
/^\[.*\]/ {
section=$0;
gsub ("[][]", "", section);
print;
process_unseen();
next;
}
/^[a-zA-Z0-9_]*=/ {
item=$0;
gsub ("=.*", "", item);
value=$0;
gsub ("^[a-zA-Z0-9_]*=", "", value);
# Update value of item.
if (section"_"item in gdm_conf_var) {
if (update_item(section, item) == "KEEP_ORIG")
# This is actually used only for daemon_AutomaticLogin and servers_0:
if (item == "servers_0") {
if (value != "inactive")
print;
} else {
if (value != ENVIRON["OLD_DISPLAYMANAGER_AUTOLOGIN"])
print;
}
} else
print;
process_unseen();
next;
}
/.*/ {
print;
process_unseen();
next;
}
'
mv $r/etc/gdm/custom.conf.new $r/etc/gdm/custom.conf
mv $r/etc/gdm/gdm_sysconfig.conf.new $r/etc/gdm/gdm_sysconfig.conf