summaryrefslogtreecommitdiffstats
path: root/server/bin/setserveraddr
blob: cca279b869c82cd9e0a8811091aea1a613288a75 (plain)
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