diff --git a/application/build.gradle b/application/build.gradle index 25ad51d129..1d8a526fd1 100644 --- a/application/build.gradle +++ b/application/build.gradle @@ -57,6 +57,21 @@ ospackage { into "bin" } + // Copy the install files + from("target/bin/install/install.sh") { + fileMode 0775 + into "bin/install" + } + + from("target/bin/install/upgrade.sh") { + fileMode 0775 + into "bin/install" + } + + from("target/bin/install/logback.xml") { + into "bin/install" + } + // Copy the config files from("target/conf") { exclude "${pkgName}.conf" diff --git a/application/pom.xml b/application/pom.xml index 7465109feb..4241b66634 100644 --- a/application/pom.xml +++ b/application/pom.xml @@ -375,6 +375,29 @@ + + copy-install + process-resources + + copy-resources + + + ${project.build.directory}/bin/install + + + src/main/scripts/install + + **/*.sh + **/*.xml + + true + + + + src/main/filters/unix.properties + + + copy-windows-control process-resources @@ -395,7 +418,7 @@ - copy-data-cql + copy-data process-resources copy-resources @@ -403,10 +426,14 @@ ${project.build.directory}/data + + src/main/data + ../dao/src/main/resources **/*.cql + **/*.sql false diff --git a/application/src/main/data/upgrade/1.3.0/schema_update.cql b/application/src/main/data/upgrade/1.3.0/schema_update.cql index 4e595772a2..40706142e5 100644 --- a/application/src/main/data/upgrade/1.3.0/schema_update.cql +++ b/application/src/main/data/upgrade/1.3.0/schema_update.cql @@ -1,3 +1,19 @@ +-- +-- Copyright © 2016-2017 The Thingsboard Authors +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + DROP MATERIALIZED VIEW IF EXISTS thingsboard.device_by_tenant_and_name; DROP MATERIALIZED VIEW IF EXISTS thingsboard.device_by_tenant_and_search_text; DROP MATERIALIZED VIEW IF EXISTS thingsboard.device_by_tenant_by_type_and_search_text; diff --git a/application/src/main/java/org/thingsboard/server/install/ThingsboardInstallService.java b/application/src/main/java/org/thingsboard/server/install/ThingsboardInstallService.java index 52d59985fa..61b3e8a8e3 100644 --- a/application/src/main/java/org/thingsboard/server/install/ThingsboardInstallService.java +++ b/application/src/main/java/org/thingsboard/server/install/ThingsboardInstallService.java @@ -39,7 +39,7 @@ public class ThingsboardInstallService { @Value("${install.upgrade:false}") private Boolean isUpgrade; - @Value("${install.upgrade.form_version:1.2.3}") + @Value("${install.upgrade.from_version:1.2.3}") private String upgradeFromVersion; @Value("${install.data_dir}") diff --git a/application/src/main/java/org/thingsboard/server/service/install/CassandraDatabaseSchemaService.java b/application/src/main/java/org/thingsboard/server/service/install/CassandraDatabaseSchemaService.java index ea18b9280d..eaef0e4d15 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/CassandraDatabaseSchemaService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/CassandraDatabaseSchemaService.java @@ -35,6 +35,7 @@ import java.util.List; @Slf4j public class CassandraDatabaseSchemaService implements DatabaseSchemaService { + private static final String CASSANDRA_DIR = "cassandra"; private static final String SCHEMA_CQL = "schema.cql"; @Value("${install.data_dir}") @@ -47,7 +48,7 @@ public class CassandraDatabaseSchemaService implements DatabaseSchemaService { public void createDatabaseSchema() throws Exception { log.info("Installing Cassandra DataBase schema..."); - Path schemaFile = Paths.get(this.dataDir, SCHEMA_CQL); + Path schemaFile = Paths.get(this.dataDir, CASSANDRA_DIR, SCHEMA_CQL); loadCql(schemaFile); } diff --git a/application/src/main/java/org/thingsboard/server/service/install/SqlDatabaseSchemaService.java b/application/src/main/java/org/thingsboard/server/service/install/SqlDatabaseSchemaService.java index fc92de81ea..9d22776996 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/SqlDatabaseSchemaService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/SqlDatabaseSchemaService.java @@ -22,20 +22,44 @@ import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Service; import org.thingsboard.server.dao.util.SqlDao; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.sql.Connection; +import java.sql.DriverManager; + @Service @Profile("install") @Slf4j @SqlDao public class SqlDatabaseSchemaService implements DatabaseSchemaService { + private static final String SQL_DIR = "sql"; + private static final String SCHEMA_SQL = "schema.sql"; + @Value("${install.data_dir}") private String dataDir; + @Value("${spring.datasource.url}") + private String dbUrl; + + @Value("${spring.datasource.username}") + private String dbUserName; + + @Value("${spring.datasource.password}") + private String dbPassword; + @Override public void createDatabaseSchema() throws Exception { log.info("Installing SQL DataBase schema..."); - //TODO: + + Path schemaFile = Paths.get(this.dataDir, SQL_DIR, SCHEMA_SQL); + try (Connection conn = DriverManager.getConnection(dbUrl, dbUserName, dbPassword)) { + String sql = new String(Files.readAllBytes(schemaFile), Charset.forName("UTF-8")); + conn.createStatement().execute(sql); + } } diff --git a/application/src/main/scripts/install/install.sh b/application/src/main/scripts/install/install.sh new file mode 100755 index 0000000000..be96363742 --- /dev/null +++ b/application/src/main/scripts/install/install.sh @@ -0,0 +1,63 @@ +#!/bin/bash +# +# Copyright © 2016-2017 The Thingsboard Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +while [[ $# -gt 0 ]] +do +key="$1" + +case $key in + --loadDemo) + LOAD_DEMO=true + shift # past argument + ;; + *) + # unknown option + ;; +esac +shift # past argument or value +done + +if [ "$LOAD_DEMO" == "true" ]; then + loadDemo=true +else + loadDemo=false +fi + +CONF_FOLDER=${pkg.installFolder}/conf +configfile=${pkg.name}.conf +jarfile=${pkg.installFolder}/bin/${pkg.name}.jar +installDir=${pkg.installFolder}/data + +source "${CONF_FOLDER}/${configfile}" + +run_user=${pkg.name} + +su -s /bin/sh -c "java -cp ${jarfile} $JAVA_OPTS -Dloader.main=org.thingsboard.server.ThingsboardInstallApplication \ + -Dinstall.data_dir=${installDir} \ + -Dinstall.load_demo=${loadDemo} \ + -Dspring.jpa.hibernate.ddl-auto=none \ + -Dinstall.upgrade=false \ + -Dlogging.config=${pkg.installFolder}/bin/install/logback.xml \ + org.springframework.boot.loader.PropertiesLauncher" "$run_user" + +if [ $? -ne 0 ]; then + echo "ThingsBoard installation failed!" +else + echo "ThingsBoard installed successfully!" +fi + +exit $? diff --git a/application/src/main/scripts/install/logback.xml b/application/src/main/scripts/install/logback.xml new file mode 100644 index 0000000000..aadd92fcc3 --- /dev/null +++ b/application/src/main/scripts/install/logback.xml @@ -0,0 +1,58 @@ + + + + + + + ${pkg.logFolder}/install.log + + ${pkg.logFolder}/install.%d{yyyy-MM-dd}.%i.log + 100MB + 30 + 3GB + + + %d{ISO8601} [%thread] %-5level %logger{36} - %msg%n + + + + + + %msg%n + + + + + + + + + + + + + + + + + + + diff --git a/application/src/main/scripts/install/upgrade.sh b/application/src/main/scripts/install/upgrade.sh new file mode 100755 index 0000000000..b40c3bb497 --- /dev/null +++ b/application/src/main/scripts/install/upgrade.sh @@ -0,0 +1,62 @@ +#!/bin/bash +# +# Copyright © 2016-2017 The Thingsboard Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +for i in "$@" +do +case $i in + --fromVersion=*) + FROM_VERSION="${i#*=}" + shift + ;; + *) + # unknown option + ;; +esac +done + +if [[ -z "${FROM_VERSION// }" ]]; then + echo "--fromVersion parameter is invalid or unspecified!" + echo "Usage: upgrade.sh --fromVersion={VERSION}" + exit 1 +else + fromVersion="${FROM_VERSION// }" +fi + +CONF_FOLDER=${pkg.installFolder}/conf +configfile=${pkg.name}.conf +jarfile=${pkg.installFolder}/bin/${pkg.name}.jar +installDir=${pkg.installFolder}/data + +source "${CONF_FOLDER}/${configfile}" + +run_user=${pkg.name} + +su -s /bin/sh -c "java -cp ${jarfile} $JAVA_OPTS -Dloader.main=org.thingsboard.server.ThingsboardInstallApplication \ + -Dinstall.data_dir=${installDir} \ + -Dspring.jpa.hibernate.ddl-auto=none \ + -Dinstall.upgrade=true \ + -Dinstall.upgrade.from_version=${fromVersion} \ + -Dlogging.config=${pkg.installFolder}/bin/install/logback.xml \ + org.springframework.boot.loader.PropertiesLauncher" "$run_user" + +if [ $? -ne 0 ]; then + echo "ThingsBoard upgrade failed!" +else + echo "ThingsBoard upgraded successfully!" +fi + +exit $?