From e6b492849128a34555bf5f4a09db69c57523dac0 Mon Sep 17 00:00:00 2001 From: Jean Sorgemoel Date: Sun, 22 Apr 2018 21:12:51 +0200 Subject: [PATCH] adding function to start server (container) on debian strech --- builder/debian/stretch/x86_64/build.sh | 2 +- .../common/servercontainer_configure_auto.sh | 2 +- .../common/servercontainer_configure_world.sh | 70 +-- .../common/servercontainer_init_mysql.sh | 5 +- server/debian/stretch/x86_64/Dockerfile | 29 + .../x86_64/Dockerfile.khanat.container | 33 ++ .../stretch/x86_64/Dockerfile.khanat.image | 33 ++ .../debian/stretch/x86_64/server-container.sh | 537 ++++++++++++++++++ server/debian/stretch/x86_64/server-image.sh | 441 ++++++++++++++ 9 files changed, 1108 insertions(+), 44 deletions(-) create mode 100644 server/debian/stretch/x86_64/Dockerfile create mode 100644 server/debian/stretch/x86_64/Dockerfile.khanat.container create mode 100644 server/debian/stretch/x86_64/Dockerfile.khanat.image create mode 100755 server/debian/stretch/x86_64/server-container.sh create mode 100755 server/debian/stretch/x86_64/server-image.sh diff --git a/builder/debian/stretch/x86_64/build.sh b/builder/debian/stretch/x86_64/build.sh index 38afe96..7d2498f 100755 --- a/builder/debian/stretch/x86_64/build.sh +++ b/builder/debian/stretch/x86_64/build.sh @@ -34,7 +34,7 @@ declare DOCKERBUILDOPT="" declare IMAGEDOCKER="builder_khanat_debian_stretch_x86_64" declare LOCALBUILDDIR="build/$IMAGEDOCKER" declare LOCALSRC="debian/stretch/x86_64" -declare DIRPACKAGE="output/khanat_debian_stretch_x86_64/package" +declare DIRPACKAGE="output/opennel_debian_stretch_x86_64/package" declare PACKAGEBIN="$DIRPACKAGE/ryzomcore_stretch_x86_64.tar.gz" declare PACKAGEREF="$DIRPACKAGE/khanat-ref-ressources.tar.gz" diff --git a/server/debian/common/servercontainer_configure_auto.sh b/server/debian/common/servercontainer_configure_auto.sh index 66e1294..c162fa7 100755 --- a/server/debian/common/servercontainer_configure_auto.sh +++ b/server/debian/common/servercontainer_configure_auto.sh @@ -20,7 +20,7 @@ /opt/ext/servercontainer_configure_mysql.sh || exit 2 sync /opt/ext/servercontainer_configure_apache.sh || exit 2 -/opt/ext/servercontainer_configure_world.sh || exit 2 +/opt/ext/servercontainer_configure_world.sh -d || exit 2 su -c '/opt/ext/servercontainer_configure_khanat.sh' gameserver || exit 2 su -c '/opt/ext/servercontainer_configure_patch.sh' gameserver || exit 2 su -c '/opt/ext/servercontainer_configure_launcher.sh' gameserver || exit 2 diff --git a/server/debian/common/servercontainer_configure_world.sh b/server/debian/common/servercontainer_configure_world.sh index 66ab5c9..2fdce5c 100755 --- a/server/debian/common/servercontainer_configure_world.sh +++ b/server/debian/common/servercontainer_configure_world.sh @@ -30,24 +30,6 @@ options: EOF } -function msg_debug() -{ - if [[ $DEBUG -ne 0 ]] - then - echo "$(date "+%Y/%m/%d %H:%M:%S") DEBUG - $*" - fi -} - -function msg_info() -{ - echo "$(date "+%Y/%m/%d %H:%M:%S") INFO - $*" -} - -function msg_error() -{ - echo "$(date "+%Y/%m/%d %H:%M:%S") ERROR - $*" >&2 -} - ##################### # MAIN ##################### @@ -79,15 +61,13 @@ done msg_debug "[$(basename $0):$LINENO] Load environment" if [[ ! -f /opt/khanat_config.sh ]] then - echo "ERROR [$(basename $0):$LINENO] missing /opt/khanat_config.sh" - exit 2 + msg_critical "[$(basename $0):$LINENO] missing /opt/khanat_config.sh" fi source /opt/khanat_config.sh if [[ ! -f /home/gameserver/.bashrc ]] then - msg_error "[$(basename $0):$LINENO] Missing /home/gameserver/.bashrc" - exit 2 + msg_critical "[$(basename $0):$LINENO] Missing /home/gameserver/.bashrc" fi source /home/gameserver/.bashrc @@ -111,7 +91,7 @@ echo "" sleep 1 msg_debug "start apache" -sudo service apache2 start || exit 2 +sudo service apache2 start || msg_critical "[$(basename $0):$LINENO] Impossible to start apache" #################################### @@ -119,15 +99,15 @@ sudo service apache2 start || exit 2 #################################### msg_debug "[$(basename $0):$LINENO] Create account" # Create account shard on MySQL -mysql -u root -e "CREATE USER 'shard'@'localhost' IDENTIFIED BY '';" || exit 2 -mysql -u root -e "GRANT ALL PRIVILEGES ON *.* TO 'shard'@'localhost' WITH GRANT OPTION;" || exit 2 +mysql -u root -e "CREATE USER IF NOT EXISTS 'shard'@'localhost' IDENTIFIED BY '';" || msg_critical "[$(basename $0):$LINENO] create use impossible" +mysql -u root -e "GRANT ALL PRIVILEGES ON *.* TO 'shard'@'localhost' WITH GRANT OPTION;" || msg_critical "[$(basename $0):$LINENO] update privileges impossible" #################################### # launch web configuration for khanat #################################### msg_debug "[$(basename $0):$LINENO] launch web configuration for khanat" -curl 'http://localhost:40916/setup/install.php' \ +httpcode=$(curl -L -w "%{http_code}" 'http://localhost:40916/setup/install.php' \ -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' \ -H 'Accept-Language: en-US' \ -H 'Connection: keep-alive' \ @@ -160,12 +140,17 @@ curl 'http://localhost:40916/setup/install.php' \ '&nelDomainName=Lirria'\ '&domainDatabase=ring_mini01'\ '&submit=Configure' \ - -o $KHANAT_HOME/log/configure/world_setup.html || exit 2 + -o $KHANAT_HOME/log/configure/world_setup.html || msg_critical "[$(basename $0):$LINENO] curl error (impossible to create world)") + +if [[ $httpcode != "200" ]] +then + msg_critical "[$(basename $0):$LINENO] impossible to create world (http return:$httpcode)" +fi chown_gameserver $KHANAT_HOME/log/configure/world_setup.html # Check account is create -grep "Domain role successfully installed" $KHANAT_HOME/log/configure/world_setup.html >/dev/null || exit 2 +grep "Domain role successfully installed" $KHANAT_HOME/log/configure/world_setup.html >/dev/null || msg_critical "[$(basename $0):$LINENO] Missing message 'Domain role successfully installed'" #################################### @@ -181,7 +166,7 @@ export addressip=${tmp//[[:blank:]]/} #################################### msg_debug "[$(basename $0):$LINENO] Configure Domain" mysql -u root -e "use nel; -INSERT INTO nel.domain (domain_id, domain_name, status, patch_version, backup_patch_url, patch_urls, login_address, session_manager_address, ring_db_name, web_host, web_host_php, description) VALUES ('12', 'Lirria', 'ds_open', '$KHANAT_CLIENT_VERSION', '$addressip:23001', '$addressip/patch', '$addressip:49998', '$addressip:49999', 'ring_mini01', '$addressip:30000', '$addressip:40916', NULL);" || exit 2 +INSERT INTO nel.domain (domain_id, domain_name, status, patch_version, backup_patch_url, patch_urls, login_address, session_manager_address, ring_db_name, web_host, web_host_php, description) VALUES ('12', 'Lirria', 'ds_open', '$KHANAT_CLIENT_VERSION', '$addressip:23001', '$addressip/patch', '$addressip:49998', '$addressip:49999', 'ring_mini01', '$addressip:30000', '$addressip:40916', NULL);" || msg_critical "[$(basename $0):$LINENO] MYSQL - Configure Domain" #################################### @@ -189,14 +174,14 @@ INSERT INTO nel.domain (domain_id, domain_name, status, patch_version, backup_pa #################################### msg_debug "[$(basename $0):$LINENO] Configure nel.shard" mysql -u root -e "use nel; -INSERT INTO nel.shard (ShardId, domain_id, WsAddr, NbPlayers, Name, Online, Version, FixedSessionId, State, MOTD) VALUES ('302', '12', '$addressip:', '0', 'Lirria shard', '0', '', '0', 'ds_open', '');" || exit 2 +INSERT INTO nel.shard (ShardId, domain_id, WsAddr, NbPlayers, Name, Online, Version, FixedSessionId, State, MOTD) VALUES ('302', '12', '$addressip:', '0', 'Lirria shard', '0', '', '0', 'ds_open', '');" || msg_critical "[$(basename $0):$LINENO] MYSQL - Configure nel.shard" #################################### # Configure nel_tool.neltool_domains #################################### msg_debug "[$(basename $0):$LINENO] Configure nel_tool.neltool_domains" mysql -u root -e "use nel; -INSERT INTO nel_tool.neltool_domains (domain_id, domain_name, domain_as_host, domain_as_port, domain_rrd_path, domain_las_admin_path, domain_las_local_path, domain_application, domain_sql_string, domain_hd_check, domain_mfs_web, domain_cs_sql_string) VALUES ('12', 'Lirria', '$addressip', '46700', '/home/gameserver/khanat/server/save_shard/rrd_graphs', '', '', 'ryzom_open', '', '0', NULL, NULL);" || exit 2 +INSERT INTO nel_tool.neltool_domains (domain_id, domain_name, domain_as_host, domain_as_port, domain_rrd_path, domain_las_admin_path, domain_las_local_path, domain_application, domain_sql_string, domain_hd_check, domain_mfs_web, domain_cs_sql_string) VALUES ('12', 'Lirria', '$addressip', '46700', '/home/gameserver/khanat/server/save_shard/rrd_graphs', '', '', 'ryzom_open', '', '0', NULL, NULL);" || msg_critical "[$(basename $0):$LINENO] MYSQL - Configure nel_tool.neltool_domains" #################################### @@ -204,7 +189,7 @@ INSERT INTO nel_tool.neltool_domains (domain_id, domain_name, domain_as_host, do #################################### msg_debug "[$(basename $0):$LINENO] Configure nel_tool.neltool_shards" mysql -u root -e "use nel; -INSERT INTO nel_tool.neltool_shards (shard_id, shard_name, shard_as_id, shard_domain_id, shard_lang, shard_restart) VALUES ('302', 'open', 'open', '12', 'fr', '0');" || exit 2 +INSERT INTO nel_tool.neltool_shards (shard_id, shard_name, shard_as_id, shard_domain_id, shard_lang, shard_restart) VALUES ('302', 'open', 'open', '12', 'fr', '0');" || msg_critical "[$(basename $0):$LINENO] MYSQL - Configure nel_tool.neltool_shards" #################################### @@ -212,7 +197,7 @@ INSERT INTO nel_tool.neltool_shards (shard_id, shard_name, shard_as_id, shard_do #################################### msg_debug "[$(basename $0):$LINENO] Configure nel_tool.neltool_user_domains" mysql -u root -e "use nel; -INSERT INTO nel_tool.neltool_user_domains (user_domain_id, user_domain_user_id, user_domain_domain_id) VALUES ('1', '1', '12');" || exit 2 +INSERT INTO nel_tool.neltool_user_domains (user_domain_id, user_domain_user_id, user_domain_domain_id) VALUES ('1', '1', '12');" || msg_critical "[$(basename $0):$LINENO] MYSQL - Configure nel_tool.neltool_user_domains" #################################### @@ -220,7 +205,7 @@ INSERT INTO nel_tool.neltool_user_domains (user_domain_id, user_domain_user_id, #################################### msg_debug "[$(basename $0):$LINENO] Configure nel_tool.neltool_user_shards" mysql -u root -e "use nel; -INSERT INTO nel_tool.neltool_user_shards (user_shard_id, user_shard_user_id, user_shard_shard_id, user_shard_domain_id) VALUES ('1', '1', '302', '12');" || exit 2 +INSERT INTO nel_tool.neltool_user_shards (user_shard_id, user_shard_user_id, user_shard_shard_id, user_shard_domain_id) VALUES ('1', '1', '302', '12');" || msg_critical "[$(basename $0):$LINENO] MYSQL - Configure nel_tool.neltool_user_shards" #################################### @@ -228,7 +213,7 @@ INSERT INTO nel_tool.neltool_user_shards (user_shard_id, user_shard_user_id, use #################################### msg_debug "[$(basename $0):$LINENO] Configure ring_mini01.sessions" mysql -u root -e "use ring_mini01; -INSERT INTO ring_mini01.sessions (session_id, session_type, title, owner, plan_date, start_date, description, orientation, level, rule_type, access_type, state, host_shard_id, subscription_slots, reserved_slots, free_slots, estimated_duration, final_duration, folder_id, lang, icone, anim_mode, race_filter, religion_filter, guild_filter, shard_filter, level_filter, subscription_closed, newcomer) VALUES ('302', 'st_mainland', '', '0', '2005-09-21 12:41:33.000000', '2005-08-31 00:00:00.000000', '', 'so_other', 'sl_a', 'rt_strict', 'at_private', 'ss_planned', '0', '0', '0', '0', 'et_short', '0', '0', '', '', 'am_dm', '', '', 'gf_only_my_guild', 'sf_shard00,sf_shard01,sf_shard02,sf_shard03,sf_shard04,sf_shard05,sf_shard06,sf_shard07,sf_shard08,sf_shard09,sf_shard10,sf_shard11,sf_shard12,sf_shard13,sf_shard14,sf_shard15,sf_shard16,sf_shard17,sf_shard18,sf_shard19,sf_shard20,sf_shard21,sf_shard22,sf_shard23,sf_shard24,sf_shard25,sf_shard26,sf_shard27,sf_shard28,sf_shard29,sf_shard30', 'lf_a,lf_b,lf_c,lf_d,lf_e,lf_f', '0', '0');" || exit 2 +INSERT INTO ring_mini01.sessions (session_id, session_type, title, owner, plan_date, start_date, description, orientation, level, rule_type, access_type, state, host_shard_id, subscription_slots, reserved_slots, free_slots, estimated_duration, final_duration, folder_id, lang, icone, anim_mode, race_filter, religion_filter, guild_filter, shard_filter, level_filter, subscription_closed, newcomer) VALUES ('302', 'st_mainland', '', '0', '2005-09-21 12:41:33.000000', '2005-08-31 00:00:00.000000', '', 'so_other', 'sl_a', 'rt_strict', 'at_private', 'ss_planned', '0', '0', '0', '0', 'et_short', '0', '0', '', '', 'am_dm', '', '', 'gf_only_my_guild', 'sf_shard00,sf_shard01,sf_shard02,sf_shard03,sf_shard04,sf_shard05,sf_shard06,sf_shard07,sf_shard08,sf_shard09,sf_shard10,sf_shard11,sf_shard12,sf_shard13,sf_shard14,sf_shard15,sf_shard16,sf_shard17,sf_shard18,sf_shard19,sf_shard20,sf_shard21,sf_shard22,sf_shard23,sf_shard24,sf_shard25,sf_shard26,sf_shard27,sf_shard28,sf_shard29,sf_shard30', 'lf_a,lf_b,lf_c,lf_d,lf_e,lf_f', '0', '0');" || msg_critical "[$(basename $0):$LINENO] MYSQL - Configure ring_mini01.sessions" #################################### @@ -237,7 +222,7 @@ INSERT INTO ring_mini01.sessions (session_id, session_type, title, owner, plan_d msg_debug "[$(basename $0):$LINENO] Create one user" declare accountuser="tester" declare passworduser="tester" -curl 'http://localhost:40916/ams/index.php' \ +httpcode=$(curl -L -w "%{http_code}" 'http://localhost:40916/ams/index.php' \ -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' \ -H 'Accept-Language: en-US' \ -H 'Connection: keep-alive' \ @@ -249,7 +234,12 @@ curl 'http://localhost:40916/ams/index.php' \ -H 'User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:6.0) Gecko/20100101 Firefox/6.0' \ -H 'Content-Type: application/x-www-form-urlencoded' \ --data 'Username='"$accountuser"'&Password='"$passworduser"'&ConfirmPass=tester&Email=tester%40khaganat.net&TaC=on&function=add_user' \ - -o $KHANAT_HOME/log/configure/world_account_tester.log || exit 2 + -o $KHANAT_HOME/log/configure/world_account_tester.log || msg_critical "[$(basename $0):$LINENO] curl - Create one user") + +if [[ $httpcode != "200" ]] +then + msg_critical "[$(basename $0):$LINENO] curl - Create one user" +fi #################################### @@ -258,7 +248,7 @@ curl 'http://localhost:40916/ams/index.php' \ msg_debug "[$(basename $0):$LINENO] Create nel.permission" mysql -u root -e "use nel; UPDATE nel.permission SET AccessPrivilege = 'OPEN,DEV,RESTRICTED'; -" || exit 2 +" || msg_critical "[$(basename $0):$LINENO] mysql - Create nel.permission" #################################### @@ -266,8 +256,8 @@ UPDATE nel.permission SET AccessPrivilege = 'OPEN,DEV,RESTRICTED'; #################################### msg_debug "[$(basename $0):$LINENO] Stop Database & apache" # start/restart service mysql & apache -sudo service apache2 stop || exit 2 -sudo service mysql stop || exit 2 +sudo service apache2 stop || msg_critical "[$(basename $0):$LINENO] apache2 stop" +sudo service mysql stop || msg_critical "[$(basename $0):$LINENO] mysql stop" # Change right for file mysql # TODO - remove creation of this file diff --git a/server/debian/common/servercontainer_init_mysql.sh b/server/debian/common/servercontainer_init_mysql.sh index 8a41296..05d65bf 100755 --- a/server/debian/common/servercontainer_init_mysql.sh +++ b/server/debian/common/servercontainer_init_mysql.sh @@ -99,12 +99,13 @@ else update_mysql_config '/etc/mysql/mariadb.conf.d/50-server.cnf' fi -mkdir -p /home/gameserver/database/ || exit 2 +mkdir -p /home/gameserver/database/ || exit 2 chown gameserver:$(id -g -n gameserver) /home/gameserver/database/ || exit 2 -mkdir -p /home/gameserver/log/mysql || exit 2 +mkdir -p /home/gameserver/log/mysql || exit 2 chown -R gameserver:$(id -g -n gameserver) /home/gameserver/log || exit 2 +mkdir -p /var/run/mysqld || exit 2 chown gameserver:$(id -g -n gameserver) /var/run/mysqld/ || exit 2 #################################### diff --git a/server/debian/stretch/x86_64/Dockerfile b/server/debian/stretch/x86_64/Dockerfile new file mode 100644 index 0000000..eefb582 --- /dev/null +++ b/server/debian/stretch/x86_64/Dockerfile @@ -0,0 +1,29 @@ +# Dockerfile - Build image to prepare khanat server +# +# Copyright (C) 2017 AleaJactaEst +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +FROM amd64/debian:9 +MAINTAINER AleaJactaEst + +ENV HOSTNAME basic_server + +RUN apt-get update ; \ + apt-get dist-upgrade -y ; \ + DEBIAN_FRONTEND=noninteractive apt-get install -y curl nano vim less bash-completion cron logrotate bsd-mailx openssh-server sudo net-tools lzma xdelta p7zip p7zip-full mysql-server apache2 php libapache2-mod-php php-mysql apache2-utils php-gd php-imagick rrdtool screen mcrypt php-mcrypt python3 phpmyadmin + + + diff --git a/server/debian/stretch/x86_64/Dockerfile.khanat.container b/server/debian/stretch/x86_64/Dockerfile.khanat.container new file mode 100644 index 0000000..7bbf50c --- /dev/null +++ b/server/debian/stretch/x86_64/Dockerfile.khanat.container @@ -0,0 +1,33 @@ +# Dockerfile - Build for server debian +# +# Copyright (C) 2017 AleaJactaEst +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +FROM opennel/server_generic_debian_stretch_x86_64 +MAINTAINER AleaJactaEst + +ENV HOSTNAME khanat_server + +COPY server/debian/common/servercontainer_function.sh /opt/ +COPY server/debian/common/servercontainer_init_* /opt/ + +COPY output/opennel_debian_stretch_x86_64/khanat_config.sh /opt/khanat_config.sh + +RUN /opt/servercontainer_init_create_account.sh +RUN /opt/servercontainer_init_mysql.sh +RUN /opt/servercontainer_init_apache.sh +RUN /opt/servercontainer_init_configure_envi.sh + diff --git a/server/debian/stretch/x86_64/Dockerfile.khanat.image b/server/debian/stretch/x86_64/Dockerfile.khanat.image new file mode 100644 index 0000000..b8d9152 --- /dev/null +++ b/server/debian/stretch/x86_64/Dockerfile.khanat.image @@ -0,0 +1,33 @@ +# Dockerfile - Build for server debian +# +# Copyright (C) 2017 AleaJactaEst +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +FROM opennel/server_generic_debian_stretch_x86_64 +MAINTAINER AleaJactaEst + +ENV HOSTNAME khanat_server + +COPY todelete.sh /opt/khanat_config.sh +COPY server/debian/common/ /opt/ + +COPY output/extra/ryzomcore.tar.gz /opt/ +COPY output/extra/ryzom-ressources.tar.gz /opt/ +COPY output/extra/khanat-ressources.tar.gz /opt/ +COPY output/extra/khanat-client-data.tar.gz /opt/ + +RUN /opt/serverimage_init_khanat.sh + diff --git a/server/debian/stretch/x86_64/server-container.sh b/server/debian/stretch/x86_64/server-container.sh new file mode 100755 index 0000000..b37b2a9 --- /dev/null +++ b/server/debian/stretch/x86_64/server-container.sh @@ -0,0 +1,537 @@ +#!/bin/bash +# +# Script to start khanat server (with docker) +# All data are include on host +# +# Copyright (C) 2017 AleaJactaEst +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + + +declare -i REMOVE=0 +declare -i IMAGE=1 +declare -i BASICSERVER=0 +declare -i KHANATSERVER=0 +declare -i CONFIGUREKHANATSERVER=0 +declare -i LAUNCHKHANAT=1 +declare -i UPDATEDATA=0 +declare -i DEBUG=0 +declare -i AUTODETEC=1 +declare -i STOPKHANAT=0 +declare -i CLEANCONTAINERKHANAT=0 +declare -i CONNECTSSHKHANAT=0 +declare -i KHANAT_CLIENT_VERSION=1 +declare -i SHOWIPKHANATSERVER=0 +declare METHODSTARTSERVER="--start-khanat-with-screen" +declare -i CLEANIMAGENONE=0 +declare DOCKERBUILDOPT="" + +declare IMAGEGENERICSERVER="opennel/server_generic_debian_stretch_x86_64" +declare IMAGEKHANATSERVER="opennel/servercontainer_debian_stretch_x86_64" +declare LOCALBUILDDIR="build/builder_khanat_debian_stretch_x86_64" +declare DIROUTPUT="output/opennel_debian_stretch_x86_64" +declare ROOTDATAKHANAT="$DIROUTPUT/gameserver" +declare DIRLOG="$ROOTDATAKHANAT/log" +declare DIRDATABASE="$ROOTDATAKHANAT/database" +declare ENVIFILE="$DIROUTPUT/khanat_config.sh" +declare DIRKHANAT="$ROOTDATAKHANAT/khanat" +declare KHANAT_RESSOURCES_DIR="" +declare KHANAT_CLIENT_DATA_DIR="" +declare OPENNEL_CODE_DIR="" +declare STEP_CONFIGURE_OK="$ROOTDATAKHANAT/khanat/step_configure.ok" +declare DIRCLIENT="Khanat_Linux64" +declare PACKAGECLIENT="smokey_linux64" + +usage() +{ +cat << EOF +usage:$0 [options] + script to build under docker + + Step: + 1) create image basic server + 2) create image khanat server + 3) configure khagant server + 4) launch khagant server + +options: + -h, --help : Show this help + -d, --debug : Show debug message + -r, --remove : Remove directory data khanat + -b, --force-basic : Force create/recreate image basic server + -k, --force-khanat : Force create/recreate image khanat server + -u, --update-data : generate a new patch (client & update server) + -g, --configure-khanat : Force configure khanat server + -n, --no-launch-khanat : Doesn't launch khanat server + -s, --stop-server : Stop server khanat + -c, --clean-container-khanat : Remove old server khanat (stopped) + -w, --clean-images-none : Remove images docker (with name 'none') + -i, --show-ip-khanat-server : show ip address for khanat server (launch under docker) + --option-docker-build=[STRING] : you can add option in "docker build" + --khanat-ressources-dir=[DIR] : localization khanat-ressources + --khanat-client-data-dir=[DIR] : localization khanat-client-data + --opennel-code-dir=[DIR] : localization opennel-code + --start-khanat-with-screen : start with screen + --start-khanat-with-khanat-log : start server khanat and show khanat log + --start-khanat-with-full-log : start server khanat and show full log + --start-khanat-with-watch-state : start server khanat and show state (loop) + --start-khanat-with-watch-state-nagios : start server khanat and show state [nagios format] (loop) + --start-khanat-with-bash-after : start server khanat and launch bash + --start-with-manager : start khanat with manager + --ssh : connect on khanat server (with ssh) [Exclusive action, can't execute other action] + --client-version=[INTEGER] : version client khanat (we need to communicate with our server) + +Example : + cd [root Khanat directory] + ./server.sh + ./server.sh -k + ./server.sh --ssh +EOF +} + +function msg_debug() +{ + if [[ $DEBUG -ne 0 ]] + then + echo "$(date "+%Y/%m/%d %H:%M:%S") DEBUG - $*" + fi +} + +function msg_info() +{ + echo "$(date "+%Y/%m/%d %H:%M:%S") INFO - $*" +} + +function msg_error() +{ + echo "$(date "+%Y/%m/%d %H:%M:%S") ERROR - $*" >&2 +} + +# +# MAIN +# + +#msg_info "START" + +calldir="$(dirname $0)" +basedir=$(cd $calldir; pwd) +rootdir="$(dirname $(dirname $(dirname $(dirname ${basedir}))))" +ressourcedir="$(dirname ${rootdir})/khanat-ressources" +dataclientdir="$(dirname ${rootdir})/khanat-client-data" + +while test $# -gt 0 +do + case "$1" in + -h|--help) + usage + exit 1 + ;; + -d|--debug) + DEBUG=1 + shift + ;; + --ssh) + CONNECTSSHKHANAT=1 + shift + ;; + -r|--remove) + REMOVE=1 + CONFIGUREKHANATSERVER=1 + shift + ;; + -c|--clean-container-khanat) + CLEANCONTAINERKHANAT=1 + shift + ;; + -s|--stop-server) + STOPKHANAT=1 + shift + ;; + -b|--force-basic) + BASICSERVER=1 + shift + ;; + -n|--no-launch-khanat) + LAUNCHKHANAT=0 + shift + ;; + -k|--force-khanat) + KHANATSERVER=1 + shift + ;; + -g|--configure-khanat) + CONFIGUREKHANATSERVER=1 + shift + ;; + -i|--show-ip-khanat-server) + SHOWIPKHANATSERVER=1 + shift + ;; + --start-khanat-with-screen) + METHODSTARTSERVER="--start-khanat-with-screen" + shift + ;; + --start-khanat-with-khanat-log) + METHODSTARTSERVER="--show-khanat-log" + shift + ;; + --start-khanat-with-full-log) + METHODSTARTSERVER="--show-all-log" + shift + ;; + --start-khanat-with-watch-state) + METHODSTARTSERVER="--show-status" + shift + ;; + --start-khanat-with-watch-state-nagios) + METHODSTARTSERVER="--show-status-nagios" + shift + ;; + --start-khanat-with-bash-after) + METHODSTARTSERVER="--bash-after-start" + shift + ;; + --start-with-manager) + METHODSTARTSERVER="--start-with-manager" + shift + ;; + --client-version*) + KHANAT_CLIENT_VERSION="${1#*=}" + shift + ;; + --khanat-ressources-dir=*) + KHANAT_RESSOURCES_DIR="${1#*=}" + shift + ;; + --khanat-client-data-dir=*) + KHANAT_CLIENT_DATA_DIR="${1#*=}" + shift + ;; + --opennel-code-dir=*) + OPENNEL_CODE_DIR="${1#*=}" + shift + ;; + -w|--clean-images-none) + CLEANIMAGENONE=1 + shift + ;; + -u|--update-data) + UPDATEDATA=1 + shift + ;; + --option-docker-build) + DOCKERBUILDOPT="$DOCKERBUILDOPT ${1#*=}" + shift + ;; + *) + msg_error "[$(basename $0):$LINENO] options '$1' not recognize" + usage + exit 1 + ;; + esac +done + +function chrashed() +{ + msg_error "[$(basename $0):$LINENO] BUILD FAILED (code:$?)" + exit 2 +} + +trap chrashed EXIT + +if [[ $SHOWIPKHANATSERVER -eq 0 ]] +then + msg_info "[$(basename $0):$LINENO] START" +fi + +msg_debug "[$(basename $0):$LINENO] prg: $0" + +docker -v 1>/dev/null +if [[ $? -ne 0 ]] +then + msg_error "[$(basename $0):$LINENO] docker not installed" + exit 2 +fi + +case "$(uname -m)" in + x86_64) + ;; + i686) + ;; + *) + msg_error "[$(basename $0):$LINENO] Unknown archi : $(uname -m)" + exit 2 + ;; +esac + +if [[ $REMOVE -ne 0 ]] +then + msg_info "[$(basename $0):$LINENO] REMOVE DATA KHANAT : $ROOTDATAKHANAT" + if [[ -n "$ROOTDATAKHANAT" ]] + then + rm -rf ${ROOTDATAKHANAT}/* || exit 2 + fi +fi + +msg_debug "[$(basename $0):$LINENO] Create directory on host ($ROOTDATAKHANAT)" +mkdir -p $ROOTDATAKHANAT || exit 2 +chmod g+s $ROOTDATAKHANAT + + +if [[ ($CONNECTSSHKHANAT -ne 0) || ($SHOWIPKHANATSERVER -ne 0) ]] +then + msg_debug "[$(basename $0):$LINENO] clean container" + listcontainer="$(docker ps -qf 'status=running' -f 'ancestor='"${IMAGEKHANATSERVER}"'')" + if [[ ${#listcontainer[@]} -eq 1 ]] + then + ipaddress=$(docker inspect --format="{{ .NetworkSettings.IPAddress }}" ${listcontainer[@]}) + fi +fi + +if [[ $SHOWIPKHANATSERVER -ne 0 ]] +then + trap '' EXIT + echo "$ipaddress" + exit 0 +fi + +if [[ $CONNECTSSHKHANAT -ne 0 ]] +then + ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no gameserver@$ipaddress + trap '' EXIT + msg_info "[$(basename $0):$LINENO] END SSH" + exit 0 +fi + +if [[ $AUTODETEC -ne 0 ]] +then + msg_debug "[$(basename $0):$LINENO] Autodetect state" + if [[ $(docker images -f "reference=$IMAGEGENERICSERVER" | wc -l) -lt 2 ]] + then + BASICSERVER=1 + fi + if [[ $(docker images -f "reference=$IMAGEKHANATSERVER" | wc -l) -lt 2 ]] + then + KHANATSERVER=1 + fi + if [[ -z "$KHANAT_RESSOURCES_DIR" ]] + then + KHANAT_RESSOURCES_DIR="$(dirname $rootdir)/khanat-ressources" + fi + if [[ -z "$KHANAT_CLIENT_DATA_DIR" ]] + then + KHANAT_CLIENT_DATA_DIR="$(dirname $rootdir)/khanat-client-data" + fi + if [[ -z "$OPENNEL_CODE_DIR" ]] + then + OPENNEL_CODE_DIR="$(dirname $rootdir)/khanat-opennel-code" + fi + if [[ ! (-f $rootdir/$STEP_CONFIGURE_OK) ]] + then + CONFIGUREKHANATSERVER=1 + fi +fi + +DIRBUILD="${rootdir}/${LOCALBUILDDIR}" + +msg_debug "[$(basename $0):$LINENO] calldir: $calldir" +msg_debug "[$(basename $0):$LINENO] basedir: $basedir" +msg_debug "[$(basename $0):$LINENO] rootdir: $rootdir" +msg_debug "[$(basename $0):$LINENO] ressourcedir: $ressourcedir" +msg_debug "[$(basename $0):$LINENO] generate basic image: $BASICSERVER" +msg_debug "[$(basename $0):$LINENO] localization khanat-ressources : ${KHANAT_RESSOURCES_DIR}" +msg_debug "[$(basename $0):$LINENO] localization khanat-client-data: ${KHANAT_CLIENT_DATA_DIR}" +msg_debug "[$(basename $0):$LINENO] localization opennel-code-client : ${OPENNEL_CODE_DIR}" +msg_debug "[$(basename $0):$LINENO] generate khanat image: $KHANATSERVER" +msg_debug "[$(basename $0):$LINENO] launch khanat: $LAUNCHKHANAT" +msg_debug "stop khanat: $STOPKHANAT" + +msg_info "[$(basename $0):$LINENO] check khanat-ressources" +if [[ ! -d ${KHANAT_RESSOURCES_DIR} ]] +then + msg_error "[$(basename $0):$LINENO] Missing directory khanat-ressources [${KHANAT_RESSOURCES_DIR}]" + cat << EOF +You need clone repo khanat-ressource. + +cd $(dirname ${KHANAT_RESSOURCES_DIR}) +git clone https://git.khaganat.net/khaganat/mmorpg_khanat/khanat-ressources.git + +EOF + exit 2 +fi + + +msg_info "[$(basename $0):$LINENO] check khanat-client-data" +if [[ ! -d ${KHANAT_CLIENT_DATA_DIR} ]] +then + msg_error "[$(basename $0):$LINENO] Missing directory khanat-client-data [${KHANAT_CLIENT_DATA_DIR}]" + cat << EOF +You need clone repo khanat-client-data. + +cd $(dirname ${KHANAT_CLIENT_DATA_DIR}) +git clone https://git.khaganat.net/khaganat/mmorpg_khanat/khanat-client-data.git + +EOF + exit 2 +fi + +if [[ ! -d ${OPENNEL_CODE_DIR} ]] +then + msg_error "[$(basename $0):$LINENO] Missing directory opennel-code [${OPENNEL_CODE_DIR}]" + cat << EOF +You need clone repo khanat-opennel-code. + +cd $(dirname ${KHANAT_RESSOURCES_DIR}) +git clone https://git.khaganat.net/khaganat/mmorpg_khanat/khanat-opennel-code.git + +EOF + exit 2 +fi +if [[ $STOPKHANAT -ne 0 ]] +then + msg_info "[$(basename $0):$LINENO] STOP SERVER KHANAT" + listcontainer="$(docker ps -qf 'status=running' -f 'ancestor='"${IMAGEKHANATSERVER}"'')" + msg_debug "[$(basename $0):$LINENO] CONTAINER KHANAT UP : ${listcontainer[@]}" + if [[ -n "$listcontainer" ]] + then + docker stop "$listcontainer" || exit 2 + fi +fi + +if [[ $CLEANCONTAINERKHANAT -ne 0 ]] +then + msg_info "[$(basename $0):$LINENO] CLEAN CONTAINER KHANAT" + listcontainer=( $(docker ps -qf 'status=exited' -f 'ancestor='"${IMAGEKHANATSERVER}"'') ) + msg_debug "[$(basename $0):$LINENO] CONTAINER KHANAT EXITED : ${listcontainer[@]}" + if [[ -n "${listcontainer[@]}" ]] + then + docker rm --force "${listcontainer[@]}" || exit 2 + fi +fi + +if [[ $CLEANIMAGENONE -ne 0 ]] +then + msg_info "[$(basename $0):$LINENO] CLEAN IMAGE DOCKER 'NONE'" + listimages=( $(docker images --filter "dangling=true" --format "{{.ID}}") ) + + msg_debug "[$(basename $0):$LINENO] IMAGES NONE : ${listimages[@]}" + if [[ -n "${listimages[@]}" ]] + then + docker rmi --force "${listimages[@]}" || exit 2 + fi +fi + +if [[ $BASICSERVER -ne 0 ]] +then + msg_info "[$(basename $0):$LINENO] GENERATE DOCKER IMAGE BASIC SERVER" + cd $rootdir; docker build . ${DOCKERBUILDOPT} -t ${IMAGEGENERICSERVER} \ + --file "${basedir}/Dockerfile" || exit 2 +fi + +if [[ $KHANATSERVER -ne 0 ]] +then + msg_info "[$(basename $0):$LINENO] GENERATE DOCKER IMAGE KHANAT SERVER" + cat << EOF > $rootdir/${ENVIFILE} +#!/bin/bash +# Temporary file, use only to send some information on build docker +export KHANAT_CLIENT_VERSION=$KHANAT_CLIENT_VERSION +export UIDGAMESERVER=$(id -u) +export GIDGAMESERVER=$(id -g) +export DIRCLIENT="$DIRCLIENT" +export PACKAGECLIENT="$PACKAGECLIENT" +EOF + cd $rootdir; docker build . ${DOCKERBUILDOPT} -t ${IMAGEKHANATSERVER} \ + --file "${basedir}/Dockerfile.khanat.container" || exit 2 +fi + +if [[ $CONFIGUREKHANATSERVER -ne 0 ]] +then + msg_info "[$(basename $0):$LINENO] CONFIGURE KHANAT SERVER" + mkdir -p $DIRLOG || exit 2 + mkdir -p $DIRDATABASE || exit 2 + msg_debug "[$(basename $0):$LINENO] command : cd $rootdir; docker run -it --hostname=khanat \ + -v /etc/localtime:/etc/localtime:ro \ + -v ${rootdir}/${LOCALBUILDDIR}/bin:/usr/local/bin:ro \ + -v ${OPENNEL_CODE_DIR}/code/web/:/home/gameserver/ext/khanatweb:ro \ + -v ${OPENNEL_CODE_DIR}/code/ryzom:/home/gameserver/ext/ryzom-ressources:ro \ + -v ${KHANAT_RESSOURCES_DIR}:/home/gameserver/ext/khanat-ressources:ro \ + -v ${KHANAT_CLIENT_DATA_DIR}:/home/gameserver/ext/khanat-client-data:ro \ + -v ${rootdir}/$DIRLOG:/home/gameserver/log:rw \ + -v ${rootdir}/$DIRDATABASE:/home/gameserver/database:rw \ + -v ${rootdir}/$DIRKHANAT:/home/gameserver/khanat:rw \ + -v ${rootdir}/server/debian/common/:/opt/ext:ro \ + ${IMAGEKHANATSERVER} /opt/ext/servercontainer_configure_auto.sh" + cd $rootdir; docker run -it --hostname=khanat \ + -v /etc/localtime:/etc/localtime:ro \ + -v ${rootdir}/${LOCALBUILDDIR}/bin:/usr/local/bin:ro \ + -v ${OPENNEL_CODE_DIR}/code/web/:/home/gameserver/ext/khanatweb:ro \ + -v ${OPENNEL_CODE_DIR}/code/ryzom:/home/gameserver/ext/ryzom-ressources:ro \ + -v ${KHANAT_RESSOURCES_DIR}:/home/gameserver/ext/khanat-ressources:ro \ + -v ${KHANAT_CLIENT_DATA_DIR}:/home/gameserver/ext/khanat-client-data:ro \ + -v ${rootdir}/$DIRLOG:/home/gameserver/log:rw \ + -v ${rootdir}/$DIRDATABASE:/home/gameserver/database:rw \ + -v ${rootdir}/$DIRKHANAT:/home/gameserver/khanat:rw \ + -v ${rootdir}/server/debian/common/:/opt/ext:ro \ + ${IMAGEKHANATSERVER} /opt/ext/servercontainer_configure_auto.sh || exit 2 +fi + +if [[ $UPDATEDATA -ne 0 ]] +then + msg_info "[$(basename $0):$LINENO] UPDATE KHANAT SERVER" + msg_debug "[$(basename $0):$LINENO] command: cd $rootdir; docker run -it --hostname=khanat \ + -v /etc/localtime:/etc/localtime:ro \ + -v ${rootdir}/${LOCALBUILDDIR}/bin:/usr/local/bin:ro \ + -v ${OPENNEL_CODE_DIR}/code/web/:/home/gameserver/ext/khanatweb:ro \ + -v ${OPENNEL_CODE_DIR}/code/ryzom:/home/gameserver/ext/ryzom-ressources:ro \ + -v ${KHANAT_RESSOURCES_DIR}:/home/gameserver/ext/khanat-ressources:ro \ + -v ${KHANAT_CLIENT_DATA_DIR}:/home/gameserver/ext/khanat-client-data:ro \ + -v ${rootdir}/$DIRLOG:/home/gameserver/log:rw \ + -v ${rootdir}/$DIRDATABASE:/home/gameserver/database:rw \ + -v ${rootdir}/$DIRKHANAT:/home/gameserver/khanat:rw \ + -v ${rootdir}/server/debian/common/:/opt/ext:ro \ + ${IMAGEKHANATSERVER} /opt/ext/servercontainer_update_auto.sh" + cd $rootdir; docker run -it --hostname=khanat \ + -v /etc/localtime:/etc/localtime:ro \ + -v ${rootdir}/${LOCALBUILDDIR}/bin:/usr/local/bin:ro \ + -v ${OPENNEL_CODE_DIR}/code/web/:/home/gameserver/ext/khanatweb:ro \ + -v ${OPENNEL_CODE_DIR}/code/ryzom:/home/gameserver/ext/ryzom-ressources:ro \ + -v ${KHANAT_RESSOURCES_DIR}:/home/gameserver/ext/khanat-ressources:ro \ + -v ${KHANAT_CLIENT_DATA_DIR}:/home/gameserver/ext/khanat-client-data:ro \ + -v ${rootdir}/$DIRLOG:/home/gameserver/log:rw \ + -v ${rootdir}/$DIRDATABASE:/home/gameserver/database:rw \ + -v ${rootdir}/$DIRKHANAT:/home/gameserver/khanat:rw \ + -v ${rootdir}/server/debian/common/:/opt/ext:ro \ + ${IMAGEKHANATSERVER} /opt/ext/servercontainer_update_auto.sh +fi + +if [[ $LAUNCHKHANAT -ne 0 ]] +then + msg_info "[$(basename $0):$LINENO] START KHANAT SERVER" + cd $rootdir; docker run -it --hostname=khanat \ + -u "$(id -u $USERNAME):$(id -g $USERNAME)" \ + -v /etc/localtime:/etc/localtime:ro \ + -v ${rootdir}/${LOCALBUILDDIR}/bin:/usr/local/bin:ro \ + -v ${OPENNEL_CODE_DIR}/code/web/:/home/gameserver/ext/khanatweb:ro \ + -v ${OPENNEL_CODE_DIR}/code/ryzom:/home/gameserver/ext/ryzom-ressources:ro \ + -v ${KHANAT_RESSOURCES_DIR}:/home/gameserver/ext/khanat-ressources:ro \ + -v ${KHANAT_CLIENT_DATA_DIR}:/home/gameserver/ext/khanat-client-data:ro \ + -v ${rootdir}/$DIRLOG:/home/gameserver/log:rw \ + -v ${rootdir}/$DIRDATABASE:/home/gameserver/database:rw \ + -v ${rootdir}/$DIRKHANAT:/home/gameserver/khanat:rw \ + -v ${rootdir}/server/debian/common/:/opt/ext:ro \ + ${IMAGEKHANATSERVER} /opt/ext/servercontainer_launch_auto.sh $METHODSTARTSERVER -d +fi + +trap '' EXIT +msg_info "[$(basename $0):$LINENO] END" diff --git a/server/debian/stretch/x86_64/server-image.sh b/server/debian/stretch/x86_64/server-image.sh new file mode 100755 index 0000000..6c6e6d6 --- /dev/null +++ b/server/debian/stretch/x86_64/server-image.sh @@ -0,0 +1,441 @@ +#!/bin/bash +# +# Script to start khanat server +# +# Copyright (C) 2017 AleaJactaEst +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +declare -i IMAGE=1 +declare -i BASICSERVER=0 +declare -i KHANATSERVER=0 +declare -i KHANATRESSOURCES=0 +declare -i KHANATDATACLIENT=0 +declare -i RYZOMRESSOURCES=0 +declare -i LAUNCHKHANAT=1 +declare -i DEBUG=0 +declare -i AUTODETEC=1 +declare -i STOPKHANAT=0 +declare -i CLEANCONTAINERKHANAT=0 +declare -i CONNECTSSHKHANAT=0 +declare -i KHANAT_CLIENT_VERSION=1 +declare -i SHOWIPKHANATSERVER=0 +declare -i METHODSTARTSERVER=1 +declare -i CLEANIMAGENONE=0 +declare DOCKERBUILDOPT="" + +declare IMAGEGENERICSERVER="opennel/server_generic_debian_stretch_x86_64" +declare IMAGEKHANATSERVER="opennel/serverimage_debian_stretch_x86_64" +declare LOCALBUILDDIR="build/opennel/builder_debian_stretch_x86_64" +declare DIRCLIENT="Khanat_Linux64" +declare PACKAGECLIENT="smokey_linux64" +declare DIROUTPUT="output/extra" + +usage() +{ +cat << EOF +usage:$0 [options] + script to build under docker + + Step: + 1) generate tar with khanat-ressources + 2) generate tar with ryzom-ressources + 3) create image basic server + 4) create image khanat server + 5) launch khanat server + +options: + -h, --help : Show this help + -d, --debug : Show debug message + -b, --force-basic : Force create/recreate image basic server + -t, --force-tar-ressources : Generate TAR.GZ for khanat-ressources (look directory ../khanat-ressources) + -q, --force-tar-client-data : Generate TAR.GZ for khanat-client-data (look directory ../khanat-client-data) + -z, --force-tar-ryzom-ressources : Generate TAR.GZ in data khanat-code + -k, --force-khanat : Force create/recreate image khanat server + -n, --no-launch-khanat : Doesn't launch khanat server + -s, --stop-server : Stop server khanat + -c, --clean-container-khanat : Remove old server khanat (stopped) + -w, --clean-images-none : Remove images docker (with name 'none') + -i, --show-ip-khanat-server : show ip address for khanat server (launch under docker) + --option-docker-build=[STRING] : you can add option in "docker build" + --opennel-code-dir=[DIR] : localization opennel-code + --start-khanat-with-screen : [default] start khanat with screen + --start-khanat-with-full-log : start server khanat and show full log + --start-khanat-with-watch-state : start server khanat and show state (loop) + --ssh : connect on khanat server (with ssh) [Exclusive action, can't execute other action] + --client-version=[INTEGER] : version client khanat (we need to communicate with our server) + +Example : + cd [root Khanat directory] + ./server.sh + ./server.sh -k + ./server.sh --ssh +EOF +} + +function msg_debug() +{ + if [[ $DEBUG -ne 0 ]] + then + echo "$(date "+%Y/%m/%d %H:%M:%S") DEBUG - $*" + fi +} + +function msg_info() +{ + echo "$(date "+%Y/%m/%d %H:%M:%S") INFO - $*" +} + +function msg_error() +{ + echo "$(date "+%Y/%m/%d %H:%M:%S") ERROR - $*" >&2 +} + +# +# MAIN +# + +#msg_info "START" + +calldir="$(dirname $0)" +basedir=$(cd $calldir; pwd) +rootdir="$(dirname $(dirname $(dirname $(dirname ${basedir}))))" +ressourcedir="$(dirname ${rootdir})/khanat-ressources" +dataclientdir="$(dirname ${rootdir})/khanat-client-data" + +while test $# -gt 0 +do + case "$1" in + -h|--help) + usage + exit 1 + ;; + -d|--debug) + DEBUG=1 + shift + ;; + --ssh) + CONNECTSSHKHANAT=1 + shift + ;; + -c|--clean-container-khanat) + CLEANCONTAINERKHANAT=1 + shift + ;; + -s|--stop-server) + STOPKHANAT=1 + shift + ;; + -b|--force-basic) + BASICSERVER=1 + shift + ;; + -n|--no-launch-khanat) + LAUNCHKHANAT=0 + shift + ;; + -t|--force-tar-ressources) + KHANATRESSOURCES=1 + shift + ;; + -q|--force-tar-client-data) + KHANATDATACLIENT=1 + shift + ;; + -z|--force-tar-ryzom-ressources) + RYZOMRESSOURCES=1 + shift + ;; + -k|--force-khanat) + KHANATSERVER=1 + shift + ;; + -i|--show-ip-khanat-server) + SHOWIPKHANATSERVER=1 + shift + ;; + --start-khanat-with-screen) + METHODSTARTSERVER=1 + shift + ;; + --start-khanat-with-full-log) + METHODSTARTSERVER=2 + shift + ;; + --start-khanat-with-watch-state) + METHODSTARTSERVER=3 + shift + ;; + --client-version*) + KHANAT_CLIENT_VERSION="${1#*=}" + shift + ;; + -w|--clean-images-none) + CLEANIMAGENONE=1 + shift + ;; + --option-docker-build) + DOCKERBUILDOPT="$DOCKERBUILDOPT ${1#*=}" + shift + ;; + --opennel-code-dir=*) + OPENNEL_CODE_DIR="${1#*=}" + shift + ;; + *) + msg_error "options '$1' not recognize" + usage + exit 1 + ;; + esac +done + +function chrashed() +{ + msg_error "BUILD FAILED (code:$?)" + exit 2 +} + +trap chrashed EXIT + +if [[ $SHOWIPKHANATSERVER -eq 0 ]] +then + msg_info "[$(basename $0):$LINENO] START" +fi + +msg_debug "[$(basename $0):$LINENO] prg: $0" + +extradir="${rootdir}/${DIROUTPUT}" +mkdir -p ${extradir} || exit 2 + + +docker -v 1>/dev/null +if [[ $? -ne 0 ]] +then + msg_error "[$(basename $0):$LINENO] docker not installed" + exit 2 +fi + +case "$(uname -m)" in + x86_64) + ;; + i686) + ;; + *) + msg_error "[$(basename $0):$LINENO] Unknown archi : $(uname -m)" + exit 2 + ;; +esac + +if [[ ($CONNECTSSHKHANAT -ne 0) || ($SHOWIPKHANATSERVER -ne 0) ]] +then + listcontainer="$(docker ps -qf 'status=running' -f 'ancestor='"${IMAGEKHANATSERVER}"'')" + if [[ ${#listcontainer[@]} -eq 1 ]] + then + ipaddress=$(docker inspect --format="{{ .NetworkSettings.IPAddress }}" ${listcontainer[@]}) + fi +fi + +if [[ $SHOWIPKHANATSERVER -ne 0 ]] +then + trap '' EXIT + echo "$ipaddress" + exit 0 +fi + +if [[ $CONNECTSSHKHANAT -ne 0 ]] +then + ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no gameserver@$ipaddress + trap '' EXIT + msg_info "[$(basename $0):$LINENO] END SSH" + exit 0 +fi + +if [[ $AUTODETEC -ne 0 ]] +then + if [[ $(docker images -f "reference=$IMAGEGENERICSERVER" | wc -l) -lt 2 ]] + then + BASICSERVER=1 + fi + if [[ ! -f ${extradir}/khanat-ressources.tar.gz ]] + then + KHANATRESSOURCES=1 + fi + if [[ ! -f ${extradir}/khanat-client-data.tar.gz ]] + then + KHANATDATACLIENT=1 + fi + if [[ ! -f ${extradir}/ryzom-ressources.tar.gz ]] + then + RYZOMRESSOURCES=1 + fi + if [[ $(docker images -f "reference=$IMAGEKHANATSERVER" | wc -l) -lt 2 ]] + then + KHANATSERVER=1 + fi + if [[ -z "$OPENNEL_CODE_DIR" ]] + then + OPENNEL_CODE_DIR="$(dirname $rootdir)/khanat-opennel-code" + fi + + if [[ -f ${extradir}/ryzomcore.tar.gz ]] + then + sumsrc=$(md5sum ${rootdir}/${LOCALBUILDDIR}/ryzomcore-0.12.0..tar.gz | awk '{print $1}') + sumdst=$(md5sum ${extradir}/ryzomcore.tar.gz | awk '{print $1}') + else + sumsrc=1 + sumdsr=2 + fi + msg_debug "[$(basename $0):$LINENO] ryzomcore checksum src:$sumsrc dst:$sumdst" + if [[ "$sumsrc" != "$sumdst" ]] + then + msg_debug "[$(basename $0):$LINENO] copy ryzomcore" + cp ${rootdir}/${LOCALBUILDDIR}/ryzomcore-0.12.0..tar.gz ${extradir}/ryzomcore.tar.gz || exit 2 + KHANATSERVER=1 + fi +fi + +DIRBUILD="${rootdir}/${LOCALBUILDDIR}" + +msg_debug "[$(basename $0):$LINENO] calldir: $calldir" +msg_debug "[$(basename $0):$LINENO] basedir: $basedir" +msg_debug "[$(basename $0):$LINENO] rootdir: $rootdir" +msg_debug "[$(basename $0):$LINENO] ressourcedir: $ressourcedir" +msg_debug "[$(basename $0):$LINENO] generate basic image: $BASICSERVER" +msg_debug "[$(basename $0):$LINENO] generate tar khanat ressources: $KHANATRESSOURCES" +msg_debug "[$(basename $0):$LINENO] generate tar khanat data client: $KHANATDATACLIENT" +msg_debug "[$(basename $0):$LINENO] generate tar ryzom ressources: $RYZOMRESSOURCES" +msg_debug "[$(basename $0):$LINENO] generate khanat image: $KHANATSERVER" +msg_debug "[$(basename $0):$LINENO] launch khanat: $LAUNCHKHANAT" +msg_debug "[$(basename $0):$LINENO] stop khanat: $STOPKHANAT" + +if [[ ! -d ${OPENNEL_CODE_DIR} ]] +then + msg_error "[$(basename $0):$LINENO] Missing directory opennel-code [${OPENNEL_CODE_DIR}]" + cat << EOF +You need clone repo khanat-opennel-code. + +cd $(dirname ${KHANAT_RESSOURCES_DIR}) +git clone https://git.khaganat.net/khaganat/mmorpg_khanat/khanat-opennel-code.git + +EOF + exit 2 +fi + +if [[ $KHANATRESSOURCES -ne 0 ]] +then + msg_info "[$(basename $0):$LINENO] CREATE TAR with KHANAT Ressources" + if [[ ! -d ${ressourcedir} ]] + then + msg_error "[$(basename $0):$LINENO] Missing khanat-ressources directory ($ressourcedir)" + exit 2 + fi + (cd $ressourcedir; tar --exclude='.git' -czf ${extradir}/khanat-ressources.tar.gz .) || exit 2 +fi + +if [[ $KHANATDATACLIENT -ne 0 ]] +then + msg_info "[$(basename $0):$LINENO] CREATE TAR with KHANAT DATA CLIENT" + if [[ ! -d ${dataclientdir} ]] + then + msg_error "[$(basename $0):$LINENO] Missing khanat-client-data directory ($dataclientdir)" + exit 2 + fi + (cd $dataclientdir; tar --exclude='.git' -czf ${extradir}/khanat-client-data.tar.gz .) || exit 2 +fi + +if [[ $RYZOMRESSOURCES -ne 0 ]] +then + msg_info "[$(basename $0):$LINENO] CREATE TAR with RYZOM Ressources" + if [[ ! -d ${ressourcedir} ]] + then + msg_error "[$(basename $0):$LINENO] Missing khanat-ressources directory ($ressourcedir)" + exit 2 + fi + cd ${OPENNEL_CODE_DIR}; tar czf ${extradir}/ryzom-ressources.tar.gz \ + code/ryzom/server/shard.screen.rc \ + code/ryzom/common/* \ + code/ryzom/client/* \ + code/ryzom/server/* \ + code/ryzom/tools/scripts/linux/* \ + code/web/* || exit 2 +fi + +if [[ $STOPKHANAT -ne 0 ]] +then + msg_info "[$(basename $0):$LINENO] STOP SERVER KHANAT" + listcontainer="$(docker ps -qf 'status=running' -f 'ancestor='"${IMAGEKHANATSERVER}"'')" + msg_debug "[$(basename $0):$LINENO] CONTAINER KHANAT UP : ${listcontainer[@]}" + if [[ -n "$listcontainer" ]] + then + docker stop "$listcontainer" || exit 2 + fi +fi + +if [[ $CLEANCONTAINERKHANAT -ne 0 ]] +then + msg_info "[$(basename $0):$LINENO] CLEAN CONTAINER KHANAT" + listcontainer=( $(docker ps -qf 'status=exited' -f 'ancestor='"${IMAGEKHANATSERVER}"'') ) + msg_debug "[$(basename $0):$LINENO] CONTAINER KHANAT EXITED : ${listcontainer[@]}" + if [[ -n "${listcontainer[@]}" ]] + then + docker rm --force "${listcontainer[@]}" || exit 2 + fi +fi + +if [[ $CLEANIMAGENONE -ne 0 ]] +then + msg_info "[$(basename $0):$LINENO] CLEAN IMAGE DOCKER 'NONE'" + listimages=( $(docker images --filter "dangling=true" --format "{{.ID}}") ) + + msg_debug "[$(basename $0):$LINENO] IMAGES NONE : ${listimages[@]}" + if [[ -n "${listimages[@]}" ]] + then + docker rmi --force "${listimages[@]}" || exit 2 + fi +fi + +if [[ $BASICSERVER -ne 0 ]] +then + msg_info "[$(basename $0):$LINENO] GENERATE DOCKER IMAGE BASIC SERVER" + cd $rootdir; docker build . ${DOCKERBUILDOPT} -t ${IMAGEGENERICSERVER} \ + --file "${basedir}/Dockerfile" || exit 2 +fi + +if [[ $KHANATSERVER -ne 0 ]] +then + msg_info "[$(basename $0):$LINENO] GENERATE DOCKER IMAGE KHANAT SERVER" + cat << EOF > $rootdir/todelete.sh +#!/bin/bash +# Temporary file, use only to send some information on build docker +export KHANAT_CLIENT_VERSION=$KHANAT_CLIENT_VERSION +export DIRCLIENT="$DIRCLIENT" +export PACKAGECLIENT="$PACKAGECLIENT" +EOF + cd $rootdir; docker build . ${DOCKERBUILDOPT} -t ${IMAGEKHANATSERVER} \ + --file "${basedir}/Dockerfile.khanat.image" || exit 2 + rm $rootdir/todelete.sh +fi + +if [[ $LAUNCHKHANAT -ne 0 ]] +then + msg_info "[$(basename $0):$LINENO] START KHANAT SERVER" + cd $rootdir; docker run -it --hostname=khanat \ + -v /etc/localtime:/etc/localtime:ro \ + ${IMAGEKHANATSERVER} /opt/serverimage_autostart.sh $METHODSTARTSERVER + clear +fi + +trap '' EXIT +msg_info "[$(basename $0):$LINENO] END"