307 lines
8.5 KiB
Bash
307 lines
8.5 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"
|
|
}
|
|
|
|
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 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
|