install_without_dependencies.sh 6.73 KB
Newer Older
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
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
#!/usr/bin/env bash

# Grasscutter install script for linux - Simpler version
# This installer doesn't ask you to install dependencies, you have to install them manually
# Made by TurtleIdiot and modified by syktyvkar (and then again modified by Blue)

# Stops the installer if any command has a non-zero exit status
set -e

# Checks for root
if [ $EUID != 0 ]; then
    echo "Please run the installer as root (sudo)!"
    exit
fi

is_command() {
    # Checks if given command is available
    local check_command="$1"
    command -v "${check_command}" > /dev/null 2>&1
}

# IP validation
valid_ip() {
    local ip=$1
    local stat=1

    if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
        OIFS=$IFS
        IFS="."
        ip=($ip)
        IFS=$OIFS
        [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
            && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
        stat=$?
    fi
    return $stat
}
echo "#################################"
echo ""
echo "This script will take for granted that you have all dependencies installed (mongodb, openjdk-17-jre/jre17-openjdk, wget, openssl, unzip, git, curl, base-devel), in fact, this script is recommended to update your current server installation, and it should run from the same folder as grasscutter.jar"
echo "#################################"
echo ""
echo "If you are using version > 2.8 of the client, make sure to use the patched metadata if you don't use Cultivation."
echo "Search for METADATA here: https://discord.gg/grasscutter."
echo ""
echo "#################################"

echo ""
echo "Grasscutter will be installed to script's running directory"
echo "Do you wish to proceed and install Grasscutter?"
select yn in "Yes" "No" ; do
    case $yn in
        Yes ) break;;
        No )
			echo "Aborting..."
			exit;;
    esac
done

if [ -d "./resources" ]
then
    echo "It's recommended to remove resources folder"
    echo "Remove resources folder?"
    select yn in "Yes" "No" ; do
        case $yn in
            Yes ) 
                rm -rf resources
                break;;
            No )
                echo "Aborting..."
                exit;;
        esac
    done
echo "You may need to remove data folder and config.json to apply some updates"
echo "#################################"
fi



# Allows choice between stable and dev branch
echo "Please select the branch you wish to install"
echo -e "!!NOTE!!: stable is the recommended branch.\nDo *NOT* use development unless you have a reason to and know what you're doing"
select branch in "stable" "development" ; do
    case $branch in
        stable )
            break;;
        development )
            break;;
    esac
done

echo -e "Using $branch branch for installing server \n"

# Prompt IP address for config.json and for generating new keystore.p12 file
echo "Please enter the IP address that will be used to connect to the server"
echo "This can be a local or a public IP address"
echo "This IP address will be used to generate SSL certificates, so it is important it is correct!"

while : ; do
    read -p "Enter server IP: " SERVER_IP
    if valid_ip $SERVER_IP; then
        break;
    else
        echo "Invalid IP address. Try again."
    fi
done

echo "Beginning Grasscutter installation..."


# Download resources
echo "Downloading Grasscutter BinOutputs..."
git clone --single-branch https://github.com/Koko-boya/Grasscutter_Resources.git Grasscutter-bins
mv ./Grasscutter-bins/Resources ./resources
rm -rf Grasscutter-bins # takes ~350M of drive space after moving BinOutputs... :sob:

# Download and build jar
echo "Downloading Grasscutter source code..."
git clone --single-branch -b $branch https://github.com/Grasscutters/Grasscutter.git Grasscutter-src #change this to download a fork

echo "Building grasscutter.jar..."
cd Grasscutter-src
chmod +x ./gradlew #just in case
./gradlew --no-daemon jar
mv $(find -name "grasscutter*.jar" -type f) ../grasscutter.jar
echo "Building grasscutter.jar done!"
cd ..

# Generate handbook/config
echo "Grasscutter will be started to generate its data files"
echo "Please enter language for GM handbook when prompted"
echo "Grasscutter will stop once GM handbook is generated"
java -jar grasscutter.jar -handbook

# Replaces "127.0.0.1" with given IP
echo "Replacing IP address in server config..."
sed -i "s/127.0.0.1/$SERVER_IP/g" config.json

# Generates new keystore.p12 with the server's IP address
# This is done to prevent a "Connection Timed Out" error from appearing
#	   after clicking to enter the door in the main menu/title screen
# This issue only exists when connecting to a server *other* than localhost
#	   since the default keystore.p12 has only been made for localhost

mkdir certs
cd certs
echo "Generating CA key and certificate pair..."
openssl req -x509 -nodes -days 25202 -newkey rsa:2048 -subj "/C=GB/ST=Essex/L=London/O=Grasscutters/OU=Grasscutters/CN=$SERVER_IP" -keyout CAkey.key -out CAcert.crt

echo "Generating SSL key and certificate pair..."
openssl genpkey -out ssl.key -algorithm rsa

# Creates a conf file in order to generate a csr
cat > csr.conf <<EOF
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn

[ dn ]
C = GB
ST = Essex
L = London
O = Grasscutters
OU = Grasscutters
CN = $SERVER_IP

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ]
IP.1 = $SERVER_IP
EOF

# Creates csr using key and conf
openssl req -new -key ssl.key -out ssl.csr -config csr.conf

# Creates conf to finalise creation of certificate
cat > cert.conf <<EOF

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, keyAgreement, dataEncipherment
subjectAltName = @alt_names

[alt_names]
IP.1 = $SERVER_IP

EOF

# Creates SSL cert
openssl x509 -req -in ssl.csr -CA CAcert.crt -CAkey CAkey.key -CAcreateserial -out ssl.crt -days 25202 -sha256 -extfile cert.conf

echo "Generating keystore.p12 from key and certificate..."
openssl pkcs12 -export -out keystore.p12 -inkey ssl.key -in ssl.crt -certfile CAcert.crt -passout pass:123456

cd ../
mv ./certs/keystore.p12 ./keystore.p12
echo "Done!"

# Running scripts as sudo makes all Grasscutter files to be owned by root
# which may cause problems editing .jsons...
if [ $SUDO_USER ]; then
	echo "Changing Grasscutter files owner to current user..."
	chown -R $SUDO_USER:$SUDO_USER ./*
fi

echo "Asking Noelle to clean up..."
rm -rf ./certs ./Grasscutter-src

echo "All done!"
echo "-=-=-=-=-=--- !! IMPORTANT !! ---=-=-=-=-=-"
echo "Please make sure that ports 80, 443, 8888 and 22102 are OPEN (both tcp and udp)"
echo "In order to run the server, run the following command:"
echo "    sudo java -jar grasscutter.jar"
echo "You must run it using sudo as port 443 is a privileged port"
echo "To play, use the IP you provided earlier ($SERVER_IP) via GrassClipper or Fiddler"

exit