1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
|
#!/bin/bash
#/**
# setserveraddr {str_ipaddress | str_netiface}
#@file setserveraddr
#@brief Command the modifies configuration files to assign the default network interface.
#@param str_ipaddress IP address assigned to a network interface
#@param str_netiface network interface name defined by the operating system.
#@version Initial version.
#@author Ramón M. Gómez - ETSII Univ. Sevilla
#@date 2011-01-25
#@version 1.0.5 - Regenerate configuration files.
#@author Ramón M. Gómez - ETSII Univ. Sevilla
#@date 2014-06-06
#@version 1.1.1 - Updating menu URLs, PXE files, and repository API key.
#@author Ramón M. Gómez - ETSII Univ. Sevilla
#@date 2018-11-15
#*/ ##
# Variables.
PROG="$(basename "$0")"
OPENGNSYS=/opt/opengnsys
PXEDIR=$OPENGNSYS/tftpboot/menu.lst
DEFAULTFILE=/etc/default/opengnsys
# Checking parameters.
if [ $# -ne 1 ]; then
echo "$PROG: Incorrect operand. Format: $PROG ipaddress|netiface" >&2
exit 1
fi
if [ "$USER" != "root" ]; then
echo "$PROG: Need to be root." >&2
exit 1
fi
# Showing warning to inform that initiated clients may hang.
read -rp "WARNING: initiated clients can hang. Continue? (y/n): " ANSWER
if [ "${ANSWER,,}" != "y" ]; then
echo "Operation canceled."
exit 0
fi
# Detecting network interfaces.
DEVICES=$(ip -o link show up | awk -F: '$2!~/lo/ {print $2}')
for DEV in $DEVICES; do
# If the network interface is found, get its IP address.
IP=$(ip -o addr show dev "$DEV" | awk '$3~/inet$/ {sub (/\/.*/, ""); print ($4)}')
if [ "$DEV" == "$1" ] || [ "$IP" == "$1" ]; then
SERVERIP="$IP"
SERVERDEV="$DEV"
fi
done
# Checking if IP address has been detected.
if [ -n "$SERVERIP" ]; then
# Temporary files.
tmpfile=$(mktemp /tmp/og.XXXXX)
MYCNF=$(mktemp /tmp/.my.cnf.XXXXX)
trap "rm -f $tmpfile $MYCNF" 1 2 3 6 9 15
# Checking whether the DHCP settings need to be changed.
CHANGE=0
for f in /etc/{dhcp,hcp3}/dhcpd.conf; do
if [ -f $f ]; then
# Changing DHCP "next-server" parameter.
file="${f/./-$SERVERDEV.}"
sed -e "s/next-server.*/next-server $SERVERIP;/" \
-e "s/option routers ;/option routers ${SERVERIP%.*}.1;/" $file >$tmpfile
# Copying and linking file if there are changes.
if [ ! $f -ef $file ] || ! diff -q $tmpfile $file &>/dev/null; then
mv $tmpfile $file
chmod 644 $file
ln -f $file $f
CHANGE=1
fi
fi
done
# Restarting DHCP service if its configuration has changed.
if [ $CHANGE == 1 ]; then
for f in /etc/init.d/{isc-dhcp-server,dhcp3-server,dhcpd}; do
[ -x $f ] && $f restart
done
else
echo "DHCP configuration has not changed."
fi
# Saving old IP address.
source $OPENGNSYS/etc/ogAdmRepo.cfg
OLDSERVERIP=$IPlocal
# Checking if configuration files need to be modified.
CHANGE=0
for f in $OPENGNSYS/{etc/{ogAdmServer,ogAdmRepo,ogAdmAgent}.cfg,www/controlacceso.php,client/etc/ogAdmClient.cfg}; do
# Error if configuration file cannot be found.
if [ ! -f $f ]; then
echo "$PROG: File $file does not exist." >&2
exit 2
fi
# Updating configuration variables (if URLs does not contain "localhost").
sed -e "s,ServidorAdm=.*,ServidorAdm=$SERVERIP," \
-e "s,IPlocal=.*,IPlocal=$SERVERIP," \
-e "s,UrlMenu=https?://\([^/]*\)/\(.*\),UrlMenu=https://$SERVERIP/\2," \
-e '/localhost/!s,https\?://[^/]*/\(.*\),https://'$SERVERIP'/\1,' $f >$tmpfile
file="${f/./-$SERVERDEV.}"
# Copying updated file, if needed.
if [ ! $f -ef $file ] || ! diff -q $tmpfile $file &>/dev/null; then
cp $tmpfile $file
ln -f $file $f
CHANGE=1
fi
done
# Processing when something has changed.
if [ $CHANGE == 1 ]; then
# Restart OpenGnsys services.
/etc/init.d/opengnsys restart
# If Repository is active, generating a new API token.
source $DEFAULTFILE
if [ "$RUN_OGADMREPO" == "yes" ]; then
REPOKEY=$(php -r 'echo md5(uniqid(rand(), true));')
sed -i -e "s/ApiToken=.*/ApiToken=$REPOKEY/" $OPENGNSYS/etc/ogAdmRepo.cfg
sed -i -e "s/APITOKEN=.*/APITOKEN=$REPOKEY/" $OPENGNSYS/etc/ogAdmServer.cfg
fi
# If OpenGnsys Server is active, updating the database.
if [ "$RUN_OGADMSERVER" == "yes" ]; then
source $OPENGNSYS/etc/ogAdmServer.cfg
# Creating credentials file.
cat << EOT > $MYCNF
[client]
user=$USUARIO
password=$PASSWORD
EOT
# Updating OpenGnsys Server IP address.
mysql --defaults-extra-file=$MYCNF -D "$CATALOG" -e \
"UPDATE entornos
SET ipserveradm='$SERVERIP'
WHERE identorno=1"
# If OpenGnsys Repository is active, updating IP address and API token.
if [ "$RUN_OGADMREPO" == "yes" ]; then
mysql --defaults-extra-file=$MYCNF -D "$CATALOG" -e \
"UPDATE repositorios
SET ip='$SERVERIP', apikey='$REPOKEY'
WHERE ip='$OLDSERVERIP'"
unset REPOKEY
fi
# Updating all menu URLs.
mysql --defaults-extra-file=$MYCNF -D "$CATALOG" -e \
"UPDATE menus
SET htmlmenupub = REPLACE(htmlmenupub, '$OLDSERVERIP', '$SERVERIP'),
htmlmenupri = REPLACE(htmlmenupri, '$OLDSERVERIP', '$SERVERIP');"
# Updating all PXE files.
find $PXEDIR -name "01-*" -exec sed -i -e "s/$OLDSERVERIP/$SERVERIP/g" {} \;
fi
# Showing manual task to do after execution.
cat << EOT
Default server interface set to: $SERVERDEV ($SERVERIP)
Manual tasks:
- Check DHCP configuration file and restart service, if needed.
- Check PXE files.
- Log-in as Web Console user:
- Check menu URLs.
${REPOKEY:+" - Update repository API token"}
EOT
else
# Showing message if nothing changes.
echo "Default interface has not changed: $1"
fi
else
# Error if network interface is not found.
echo "$PROG: Network device not found. Format: $PROG ipaddress|netiface" >&2
exit 1
fi
# Removing temporary files.
rm -f $tmpfile $MYCNF
|