source: server/bin/setserveraddr @ 63b3fbf

Last change on this file since 63b3fbf was 084fdc1, checked in by OpenGnSys Support Team <soporte-og@…>, 5 years ago

#988 Fix setserveraddr json handling

setserveraddr script modified ogserver.json values with "sed". This
caused unwanted changes in database.ip.

This commit replaces "sed" with "jq" for modifying ogserver.json,
ensuring only rest.ip and wol.interface values change.

  • Property mode set to 100755
File size: 5.4 KB
Line 
1#!/bin/bash
2
3#/**
4#@file    setserveraddr
5#@brief   Assign default IP address to OpenGnsys services.
6#@usage   setserveraddr { IPAddress | NetIface }
7#@param   IPAddress  IP address assigned to a network interface
8#@param   NetIface   network interface name defined by the operating system
9#@version Initial version.
10#@author  Ramón M. Gómez - ETSII Univ. Sevilla
11#@date    2011-01-25
12#@version 1.0.5 - Regenerate configuration files.
13#@author  Ramón M. Gómez - ETSII Univ. Sevilla
14#@date    2014-06-06
15#@version 1.1.1 - Updating menu URLs and PXE files.
16#@author  Ramón M. Gómez - ETSII Univ. Sevilla
17#@date    2018-11-15
18#*/ ##
19
20
21# Variables.
22OPENGNSYS=${OPENGNSYS:-"/opt/opengnsys"}
23PXEDIRS="$OPENGNSYS/tftpboot/menu.lst $OPENGNSYS/tftpboot/grub"
24DEFAULTFILE=/etc/default/opengnsys
25
26# Functions.
27source $OPENGNSYS/lib/ogfunctions.sh || exit 1
28
29# Show help or version number.
30[ "$*" == "help" ] && help
31[ "$*" == "version" ] && version
32# Checking parameters.
33[ "$USER" != "root" ] && raiseError access "Need to be root"
34[ $# -ne 1 ] && raiseError usage
35[ -r $DEFAULTFILE ] || raiseError access "Cannot read default configuration file"
36for f in $OPENGNSYS/{etc/ogserver.json,etc/ogAdmRepo.cfg,www/controlacceso.php,client/ogClient/cfg/ogclient.json}; do
37        [ -w $f ] || raiseError access "Cannot write to file: $f"
38done
39
40# Detecting network interfaces.
41DEVICES=$(ip -o link show up | awk -F: '$2!~/lo/ {print $2}')
42for DEV in $DEVICES; do
43        # If the network interface is found, get its IP address.
44        IP=$(ip -o addr show dev "$DEV" | awk '$3~/inet$/ {sub (/\/.*/, ""); print ($4)}')
45        if [ "$DEV" == "$1" ] || [ "$IP" == "$1" ]; then
46                SERVERIP="$IP"
47                SERVERDEV="$DEV"
48        fi
49done
50
51# Checking if IP address has been detected.
52if [ -n "$SERVERIP" ]; then
53        # Showing warning to inform that initiated clients may hang.
54        read -rp "WARNING: initiated clients can hang. Continue? (y/n): " ANSWER
55        [ "${ANSWER,,}" != "y" ] && raiseError cancel "Do nothing"
56        # Temporary files.
57        tmpfile=$(mktemp /tmp/og.XXXXX)
58        trap "rm -f $tmpfile" 1 2 3 6 9 15
59
60        # Checking whether the DHCP settings need to be changed.
61        CHANGE=0
62        for f in /etc/{dhcp,hcp3}/dhcpd.conf; do
63                if [ -f $f ]; then
64                        # Changing DHCP "next-server" parameter.
65                        file="${f/./-$SERVERDEV.}"
66                        sed -e "s/next-server.*/next-server $SERVERIP;/" \
67                            -e "s/option routers ;/option routers ${SERVERIP%.*}.1;/" $file >$tmpfile
68                        # Copying and linking file if there are changes.
69                        if [ ! $f -ef $file ] || ! diff -q $tmpfile $file &>/dev/null; then
70                                mv $tmpfile $file
71                                chmod 644 $file
72                                ln -f $file $f
73                                CHANGE=1
74                        fi
75                fi
76        done
77        # Restarting DHCP service if its configuration has changed.
78        if [ $CHANGE == 1 ]; then
79                for s in isc-dhcp-server dhcp3-server dhcpd; do
80                        restart $s &>/dev/null && break
81                done
82        else
83                echo "DHCP configuration has not changed."
84        fi
85
86        # Saving old IP address.
87        source_json_config $OPENGNSYS/etc/ogserver.json
88        OLDSERVERIP=$ServidorAdm
89        # Checking if configuration files need to be modified.
90        CHANGE=0
91        for f in $OPENGNSYS/{etc/ogAdmRepo.cfg,www/controlacceso.php}; do
92                # Updating configuration variables (if URL does not contain "localhost").
93                sed -e "s,\(ServidorAdm\|IPlocal\)=.*,\1=$SERVERIP," \
94                    -e "s,^INTERFACE=.*,INTERFACE=$SERVERDEV," \
95                    -e "s,UrlMenu=https?://\([^/]*\)/\(.*\),UrlMenu=https://$SERVERIP/\2," \
96                    -e '/localhost/!s,https\?://[^/]*/\(.*\),https://'$SERVERIP'/\1,' $f >$tmpfile
97                file="${f/./-$SERVERDEV.}"
98                # Copying updated file, if needed.
99                if [ ! $f -ef $file ] || ! diff -q $tmpfile $file &>/dev/null; then
100                        cp $tmpfile $file
101                        ln -f $file $f
102                        CHANGE=1
103                fi
104        done
105
106        f="$OPENGNSYS"/etc/ogserver.json
107        file="${f/./-$SERVERDEV.}"
108        step_one=$(mktemp)
109        jq --arg ip "$SERVERIP" '.rest.ip = $ip' "$file" > "$step_one"
110        step_two=$(mktemp)
111        jq --arg iface "$SERVERDEV" '.wol.interface = $iface' "$step_one" > "$step_two"
112        if [ ! "$f" -ef "$file" ] || ! diff -q "$step_two" "$file" &>/dev/null; then
113                cp "$step_two" "$file"
114                ln -f "$file" "$f"
115                CHANGE=1
116        fi
117
118        # Processing when something has changed.
119        if [ $CHANGE == 1 ]; then
120                # Config ogClient.
121                IP_PATTERN="[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}"
122                sed -i -e "s/$IP_PATTERN/$SERVERIP/g" \
123                          "$OPENGNSYS"/client/ogClient/cfg/ogclient.json
124                # Restart OpenGnsys services.
125                echo "Restarting services..."
126                restart opengnsys >/dev/null
127                source $DEFAULTFILE
128                # If OpenGnsys Server is active, updating the database.
129                if [ "$RUN_OGADMSERVER" == "yes" ]; then
130                        # Updating IP addresses and menu URLs.
131                        dbexec "
132UPDATE entornos
133   SET ipserveradm='$SERVERIP'
134 WHERE identorno=1;
135UPDATE repositorios
136   SET ip='$SERVERIP'
137 WHERE ip='$OLDSERVERIP';
138UPDATE menus
139   SET htmlmenupub = REPLACE(htmlmenupub, '$OLDSERVERIP', '$SERVERIP'),
140       htmlmenupri = REPLACE(htmlmenupri, '$OLDSERVERIP', '$SERVERIP');"
141                        # Updating all PXE files.
142                        find $PXEDIRS -name "01-*" -exec sed -i -e "s/$OLDSERVERIP/$SERVERIP/g" {} \;
143                fi
144
145                # Showing manual task to do after execution.
146                cat << EOT
147Default server interface set to: $SERVERDEV ($SERVERIP)
148
149Manual tasks:
150- Check DHCP configuration file and restart service, if needed.
151- Check PXE files.
152- Log-in as Web Console user:
153  - Check menu URLs.
154- Note: Run "settoken" script to update authentication tokens.
155EOT
156        else
157                # Showing message if nothing changes.
158                echo "Default interface has not changed: $1"
159        fi
160else
161        # Error if network interface is not found.
162        raiseError notfound "Network device"
163fi
164
165# Removing temporary files.
166rm -f $tmpfile
167
Note: See TracBrowser for help on using the repository browser.