diff --git a/bin/interpreter.sh b/bin/interpreter.sh index 62deba1ff1..ef4a58905c 100755 --- a/bin/interpreter.sh +++ b/bin/interpreter.sh @@ -49,6 +49,12 @@ fi . "${bin}/common.sh" +ZEPPELIN_COMMANDLINE_MAIN=org.apache.zeppelin.utils.CommandLineUtils +if [ "$1" == "-version" ] || [ "$1" == "-v" ]; then + $ZEPPELIN_RUNNER $ZEPPELIN_COMMANDLINE_MAIN $1 + exit 0 +fi + ZEPPELIN_CLASSPATH+=":${ZEPPELIN_CONF_DIR}" # construct classpath diff --git a/bin/zeppelin-daemon.sh b/bin/zeppelin-daemon.sh index 56b3c9b493..5b3055d317 100755 --- a/bin/zeppelin-daemon.sh +++ b/bin/zeppelin-daemon.sh @@ -19,7 +19,7 @@ # description: Start and stop daemon script for. # -USAGE="Usage: zeppelin-daemon.sh [--config ] {start|stop|upstart|restart|reload|status}" +USAGE="Usage: zeppelin-daemon.sh [--config ] {start|stop|upstart|restart|reload|status|version(v)}" if [[ "$1" == "--config" ]]; then shift @@ -44,6 +44,12 @@ BIN=$(cd "${BIN}">/dev/null; pwd) . "${BIN}/common.sh" . "${BIN}/functions.sh" +ZEPPELIN_COMMANDLINE_MAIN=org.apache.zeppelin.utils.CommandLineUtils +if [ "$1" == "-version" ] || [ "$1" == "-v" ]; then + $ZEPPELIN_RUNNER $ZEPPELIN_COMMANDLINE_MAIN $1 + exit 0 +fi + HOSTNAME=$(hostname) ZEPPELIN_NAME="Zeppelin" ZEPPELIN_LOGFILE="${ZEPPELIN_LOG_DIR}/zeppelin-${ZEPPELIN_IDENT_STRING}-${HOSTNAME}.log" diff --git a/bin/zeppelin.sh b/bin/zeppelin.sh index 2fc530381e..cd76e470c2 100755 --- a/bin/zeppelin.sh +++ b/bin/zeppelin.sh @@ -39,6 +39,12 @@ bin=$(cd "${bin}">/dev/null; pwd) . "${bin}/common.sh" +ZEPPELIN_COMMANDLINE_MAIN=org.apache.zeppelin.utils.CommandLineUtils +if [ "$1" == "-version" ] || [ "$1" == "-v" ]; then + $ZEPPELIN_RUNNER $ZEPPELIN_COMMANDLINE_MAIN $1 + exit 0 +fi + HOSTNAME=$(hostname) ZEPPELIN_LOGFILE="${ZEPPELIN_LOG_DIR}/zeppelin-${ZEPPELIN_IDENT_STRING}-${HOSTNAME}.log" LOG="${ZEPPELIN_LOG_DIR}/zeppelin-cli-${ZEPPELIN_IDENT_STRING}-${HOSTNAME}.out" diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/ZeppelinRestApi.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/ZeppelinRestApi.java index 9a0b883e79..ca42e34e58 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/ZeppelinRestApi.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/ZeppelinRestApi.java @@ -17,6 +17,9 @@ package org.apache.zeppelin.rest; +import org.apache.zeppelin.server.JsonResponse; +import org.apache.zeppelin.util.Util; + import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.core.Response; @@ -41,4 +44,10 @@ public class ZeppelinRestApi { public Response getRoot() { return Response.ok().build(); } + + @GET + @Path("version") + public Response getVersion() { + return new JsonResponse<>(Response.Status.OK, "Zeppelin version", Util.getVersion()).build(); + } } diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/utils/CommandLineUtils.java b/zeppelin-server/src/main/java/org/apache/zeppelin/utils/CommandLineUtils.java new file mode 100644 index 0000000000..eb6c801258 --- /dev/null +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/utils/CommandLineUtils.java @@ -0,0 +1,26 @@ +package org.apache.zeppelin.utils; + +import org.apache.zeppelin.util.Util; + +import java.util.Locale; + +/** + * CommandLine Support Class + */ +public class CommandLineUtils { + public static void main(String[] args) { + if (args.length == 0) { + return; + } + + String usage = args[0].toLowerCase(Locale.US); + switch (usage) { + case "-version": + case "-v": + System.out.println(Util.getVersion()); + break; + + default: + } + } +} diff --git a/zeppelin-web/src/app/home/home.controller.js b/zeppelin-web/src/app/home/home.controller.js index 6f7f909e0b..e57a9837a5 100644 --- a/zeppelin-web/src/app/home/home.controller.js +++ b/zeppelin-web/src/app/home/home.controller.js @@ -13,7 +13,7 @@ */ 'use strict'; -angular.module('zeppelinWebApp').controller('HomeCtrl', function($scope, notebookListDataFactory, websocketMsgSrv, $rootScope, arrayOrderingSrv) { +angular.module('zeppelinWebApp').controller('HomeCtrl', function($scope, notebookListDataFactory, websocketMsgSrv, $rootScope, arrayOrderingSrv, $http, baseUrlSrv) { var vm = this; vm.notes = notebookListDataFactory; vm.websocketMsgSrv = websocketMsgSrv; @@ -23,9 +23,20 @@ angular.module('zeppelinWebApp').controller('HomeCtrl', function($scope, noteboo vm.staticHome = false; $scope.isReloading = false; + + var getZeppelinVersion = function() { + $http.get(baseUrlSrv.getRestApiBase() +'/version'). + success(function (data, status, headers, config) { + $scope.zeppelinVersion = data.body; + }). + error(function(data, status, headers, config) { + console.log('Error %o %o', status, data.message); + }); + }; var initHome = function() { websocketMsgSrv.getHomeNotebook(); + getZeppelinVersion(); }; initHome(); diff --git a/zeppelin-web/src/app/home/home.html b/zeppelin-web/src/app/home/home.html index 8818edca18..439dfa6c81 100644 --- a/zeppelin-web/src/app/home/home.html +++ b/zeppelin-web/src/app/home/home.html @@ -19,7 +19,7 @@ limitations under the License.

- Welcome to Zeppelin! + Welcome to Zeppelin! ({{zeppelinVersion}})

Zeppelin is web-based notebook that enables interactive data analytics.
You can make beautiful data-driven, interactive, collaborative document with SQL, code and even more!
diff --git a/zeppelin-zengine/pom.xml b/zeppelin-zengine/pom.xml index f1792675b7..e68caf2e1b 100644 --- a/zeppelin-zengine/pom.xml +++ b/zeppelin-zengine/pom.xml @@ -222,4 +222,13 @@ + + + + + src/main/resources + true + + + diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/util/Util.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/util/Util.java index fc19d0fe27..be22d96bfa 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/util/Util.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/util/Util.java @@ -17,14 +17,33 @@ package org.apache.zeppelin.util; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; +import java.util.Properties; /** * TODO(moon) : add description. */ public class Util { + private static final String PROJECT_PROPERTIES_VERSION_KEY = "version"; + + static Logger logger = LoggerFactory.getLogger(Util.class); + private static Properties projectProperties; + + static { + projectProperties = new Properties(); + try { + projectProperties.load(Util.class.getResourceAsStream("/project.properties")); + } catch (IOException e) { + logger.error("Fail to read project.properties"); + } + } public static String[] split(String str, char split) { return split(str, new String[] {String.valueOf(split)}, false); @@ -181,4 +200,13 @@ public class Util { return false; } } + + /** + * Get Zeppelin version + * + * @return Current Zeppelin version + */ + public static String getVersion() { + return StringUtils.defaultIfEmpty(projectProperties.getProperty(PROJECT_PROPERTIES_VERSION_KEY), StringUtils.EMPTY); + } } diff --git a/zeppelin-zengine/src/main/resources/project.properties b/zeppelin-zengine/src/main/resources/project.properties new file mode 100644 index 0000000000..a2273e2388 --- /dev/null +++ b/zeppelin-zengine/src/main/resources/project.properties @@ -0,0 +1,2 @@ +version=${project.version} +artifactId=${project.artifactId} \ No newline at end of file diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/util/UtilTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/util/UtilTest.java index e96c824b94..713166d797 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/util/UtilTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/util/UtilTest.java @@ -97,4 +97,10 @@ public class UtilTest extends TestCase { assertEquals("array > tags", t[0]); assertEquals("aa", t[2]); } + + public void testGetVersion(){ + String version = Util.getVersion(); + assertNotNull(version); + System.out.println(version); + } }