+
+ release
+ false
+
+ dir
+ tar.gz
+
+
+
+
+ conf/**
+
+
+
+
+ bin/*
+
+ 0755
+
+
+
+
+
+
+ target/
+ nacosctl.jar
+
+
+
\ No newline at end of file
diff --git a/distrobution/bin/nacosctl.sh b/distrobution/bin/nacosctl.sh
new file mode 100755
index 0000000..f150c7f
--- /dev/null
+++ b/distrobution/bin/nacosctl.sh
@@ -0,0 +1,79 @@
+#!/bin/bash
+
+cygwin=false
+darwin=false
+os400=false
+case "`uname`" in
+CYGWIN*) cygwin=true;;
+Darwin*) darwin=true;;
+OS400*) os400=true;;
+esac
+error_exit ()
+{
+ echo "ERROR: $1 !!"
+ exit 1
+}
+[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
+[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
+[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/opt/taobao/java
+[ ! -e "$JAVA_HOME/bin/java" ] && unset JAVA_HOME
+
+if [ -z "$JAVA_HOME" ]; then
+ if $darwin; then
+
+ if [ -x '/usr/libexec/java_home' ] ; then
+ export JAVA_HOME=`/usr/libexec/java_home`
+
+ elif [ -d "/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home" ]; then
+ export JAVA_HOME="/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home"
+ fi
+ else
+ JAVA_PATH=`dirname $(readlink -f $(which javac))`
+ if [ "x$JAVA_PATH" != "x" ]; then
+ export JAVA_HOME=`dirname $JAVA_PATH 2>/dev/null`
+ fi
+ fi
+ if [ -z "$JAVA_HOME" ]; then
+ error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)! jdk8 or later is better!"
+ fi
+fi
+
+export SERVER="nacosctl"
+
+export JAVA_HOME
+export JAVA="$JAVA_HOME/bin/java"
+export BASE_DIR=`cd $(dirname $0)/..; pwd`
+
+#===========================================================================================
+# JVM Configuration
+#===========================================================================================
+
+JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"
+
+JAVA_MAJOR_VERSION=$($JAVA -version 2>&1 | sed -E -n 's/.* version "([0-9]*).*$/\1/p')
+if [[ "$JAVA_MAJOR_VERSION" -ge "9" ]] ; then
+ JAVA_OPT_EXT_FIX=""
+else
+ JAVA_OPT_EXT_FIX="-Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${JAVA_HOME}/lib/ext"
+fi
+
+JAVA_OPT="${JAVA_OPT} -jar ${BASE_DIR}/target/${SERVER}.jar"
+JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"
+JAVA_OPT="${JAVA_OPT} --logging.config=${BASE_DIR}/conf/logback.xml"
+
+if [ ! -d "${BASE_DIR}/logs" ]; then
+ mkdir ${BASE_DIR}/logs
+fi
+
+echo "$JAVA $JAVA_OPT_EXT_FIX ${JAVA_OPT} $@"
+
+# check the start.out log output file
+if [ ! -f "${BASE_DIR}/logs/start.out" ]; then
+ touch "${BASE_DIR}/logs/start.out"
+fi
+
+if [[ "$JAVA_OPT_EXT_FIX" == "" ]]; then
+ "$JAVA" ${JAVA_OPT} "$@"
+else
+ "$JAVA" "$JAVA_OPT_EXT_FIX" ${JAVA_OPT} "$@"
+fi
diff --git a/distrobution/conf/conf.properties b/distrobution/conf/conf.properties
new file mode 100644
index 0000000..0b43126
--- /dev/null
+++ b/distrobution/conf/conf.properties
@@ -0,0 +1,7 @@
+#username = nacos
+#password = nacos
+#confirmEnabled = true
+#accessKey = ?
+#secrectKey = ?
+#host=localhost
+#port=8848
\ No newline at end of file
diff --git a/distrobution/pom.xml b/distrobution/pom.xml
new file mode 100644
index 0000000..e003414
--- /dev/null
+++ b/distrobution/pom.xml
@@ -0,0 +1,46 @@
+
+
+
+
+ nacosctl
+ com.alibaba.nacos
+ ${revision}
+
+ 4.0.0
+
+ distrobution
+
+
+
+ com.alibaba.nacos
+ nacos-ctl-bootstrap
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+
+
+ assembly/release.xml
+
+ posix
+
+
+
+ assembly
+ package
+
+ single
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/interaction/pom.xml b/interaction/pom.xml
new file mode 100644
index 0000000..06df7f8
--- /dev/null
+++ b/interaction/pom.xml
@@ -0,0 +1,26 @@
+
+
+
+ nacosctl
+ com.alibaba.nacos
+ ${revision}
+
+ 4.0.0
+
+ nacos-ctl-interaction
+
+
+
+ com.alibaba.nacos
+ nacos-ctl-core
+
+
+
+ jline
+ jline
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/com/alibaba/nacos/cli/input/InputGetter.java b/interaction/src/main/java/com/alibaba/nacos/ctl/intraction/input/InputGetter.java
similarity index 88%
rename from src/main/java/com/alibaba/nacos/cli/input/InputGetter.java
rename to interaction/src/main/java/com/alibaba/nacos/ctl/intraction/input/InputGetter.java
index fa3c291..64129e9 100644
--- a/src/main/java/com/alibaba/nacos/cli/input/InputGetter.java
+++ b/interaction/src/main/java/com/alibaba/nacos/ctl/intraction/input/InputGetter.java
@@ -1,92 +1,92 @@
-package com.alibaba.nacos.cli.input;
-
-import com.alibaba.nacos.cli.config.GlobalConfig;
-import com.alibaba.nacos.cli.core.exception.HandlerException;
-import com.alibaba.nacos.cli.input.completer.NacosCtlCompleter;
-import jline.console.ConsoleReader;
-
-import java.io.IOException;
-
-/**
- * JLine实现的输入行
- *
- * 有可能会出现创建出错的情况,那样的话只能用默认的Scanner来
- *
- *
整个的补全逻辑都在completer包下,自己写了一整套补全逻辑
- *
- * @author lehr
- */
-public class InputGetter {
-
- private static InputGetter instance = new InputGetter();
-
- public static InputGetter getInstance() {
- return instance;
- }
-
- private ConsoleReader console;
-
- private GlobalConfig config = GlobalConfig.getInstance();
-
- public static void init() throws HandlerException {
- try {
- instance.console = new ConsoleReader();
- instance.console.addCompleter(new NacosCtlCompleter());
- } catch (IOException e) {
- throw new HandlerException("Failed to load JLine", e);
- }
- }
-
- /**
- * 对于删除等请求,需要让用户再确认下
- *
- * @return
- */
- public static boolean cancelConfirm() {
-
- if (!GlobalConfig.getInstance().isConfirmEnabled()) {
- return false;
- }
-
- try {
- String s = instance.console.readLine("confirm operation? (y/n) ").trim();
- boolean cancel = !("yes".equals(s) || "y".equals(s));
- if (cancel) {
- System.out.println("operation canceled!");
- }
- return cancel;
- } catch (IOException e) {
- return true;
- }
- }
-
- public String nextLine() {
-
- try {
- return console.readLine(getPrompt());
- } catch (IOException e) {
- return "";
- }
- }
-
-
- public void clear() {
- try {
- console.clearScreen();
- } catch (IOException e) {
- System.out.println("fail to clear screen");
- }
- }
-
- /**
- * 给客户端提供prompt文字(每次刷新一次信息)
- *
- * @return
- */
- public String getPrompt() {
- StringBuffer sb = new StringBuffer();
- sb.append("[NacosCtl:").append(config.getHostAddress()).append("(").append(config.getNamespaceName())
- .append(")]>");
- return sb.toString();
- }
-}
+package com.alibaba.nacos.ctl.intraction.input;
+
+import com.alibaba.nacos.ctl.core.config.GlobalConfig;
+import com.alibaba.nacos.ctl.core.exception.HandlerException;
+import com.alibaba.nacos.ctl.intraction.input.completer.NacosCtlCompleter;
+import jline.console.ConsoleReader;
+
+import java.io.IOException;
+
+/**
+ * JLine实现的输入行
+ *
+ *
有可能会出现创建出错的情况,那样的话只能用默认的Scanner来
+ *
+ *
整个的补全逻辑都在completer包下,自己写了一整套补全逻辑
+ *
+ * @author lehr
+ */
+public class InputGetter {
+
+ private static InputGetter instance = new InputGetter();
+
+ public static InputGetter getInstance() {
+ return instance;
+ }
+
+ private ConsoleReader console;
+
+ private GlobalConfig config = GlobalConfig.getInstance();
+
+ public static void init() throws HandlerException {
+ try {
+ instance.console = new ConsoleReader();
+ instance.console.addCompleter(new NacosCtlCompleter());
+ } catch (IOException e) {
+ throw new HandlerException("Failed to load JLine", e);
+ }
+ }
+
+ /**
+ * 对于删除等请求,需要让用户再确认下
+ *
+ * @return
+ */
+ public static boolean cancelConfirm() {
+
+ if (!GlobalConfig.getInstance().isConfirmEnabled()) {
+ return false;
+ }
+
+ try {
+ String s = instance.console.readLine("confirm operation? (y/n) ").trim();
+ boolean cancel = !("yes".equals(s) || "y".equals(s));
+ if (cancel) {
+ System.out.println("operation canceled!");
+ }
+ return cancel;
+ } catch (IOException e) {
+ return true;
+ }
+ }
+
+ public String nextLine() {
+
+ try {
+ return console.readLine(getPrompt());
+ } catch (IOException e) {
+ return "";
+ }
+ }
+
+
+ public void clear() {
+ try {
+ console.clearScreen();
+ } catch (IOException e) {
+ System.out.println("fail to clear screen");
+ }
+ }
+
+ /**
+ * 给客户端提供prompt文字(每次刷新一次信息)
+ *
+ * @return
+ */
+ public String getPrompt() {
+ StringBuffer sb = new StringBuffer();
+ sb.append("[NacosCtl:").append(config.getHostAddress()).append("(").append(config.getNamespaceName())
+ .append(")]>");
+ return sb.toString();
+ }
+}
diff --git a/src/main/java/com/alibaba/nacos/cli/input/completer/CompleterFactory.java b/interaction/src/main/java/com/alibaba/nacos/ctl/intraction/input/completer/CompleterFactory.java
similarity index 98%
rename from src/main/java/com/alibaba/nacos/cli/input/completer/CompleterFactory.java
rename to interaction/src/main/java/com/alibaba/nacos/ctl/intraction/input/completer/CompleterFactory.java
index 3193802..46e28c6 100644
--- a/src/main/java/com/alibaba/nacos/cli/input/completer/CompleterFactory.java
+++ b/interaction/src/main/java/com/alibaba/nacos/ctl/intraction/input/completer/CompleterFactory.java
@@ -1,4 +1,4 @@
-package com.alibaba.nacos.cli.input.completer;
+package com.alibaba.nacos.ctl.intraction.input.completer;
import jline.console.completer.ArgumentCompleter;
import jline.console.completer.Completer;
diff --git a/src/main/java/com/alibaba/nacos/cli/input/completer/NacosCtlCompleter.java b/interaction/src/main/java/com/alibaba/nacos/ctl/intraction/input/completer/NacosCtlCompleter.java
similarity index 92%
rename from src/main/java/com/alibaba/nacos/cli/input/completer/NacosCtlCompleter.java
rename to interaction/src/main/java/com/alibaba/nacos/ctl/intraction/input/completer/NacosCtlCompleter.java
index 569f968..dae1687 100644
--- a/src/main/java/com/alibaba/nacos/cli/input/completer/NacosCtlCompleter.java
+++ b/interaction/src/main/java/com/alibaba/nacos/ctl/intraction/input/completer/NacosCtlCompleter.java
@@ -1,74 +1,74 @@
-package com.alibaba.nacos.cli.input.completer;
-
-import com.alibaba.nacos.cli.core.exception.HandlerException;
-import jline.console.completer.Completer;
-import jline.internal.Preconditions;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * NacosCtl全局指令自动补全器
- *
- *
整个程序的各种子指令的补全逻辑都在这里拼接
- *
- * @author lehr
- */
-public class NacosCtlCompleter implements Completer {
-
- private List completers;
-
- public NacosCtlCompleter() throws HandlerException {
- try {
- completers = CompleterFactory.loadAll();
- } catch (Exception e) {
- throw new HandlerException("failed to load completer groups", e);
- }
- }
-
- @Override
- public int complete(String buffer, int cursor, List candidates) {
- Preconditions.checkNotNull(candidates);
- List completions = new ArrayList(this.completers.size());
- int max = -1;
- Iterator var6 = this.completers.iterator();
-
- while (var6.hasNext()) {
- Completer completer = (Completer) var6.next();
- Completion completion = new Completion(candidates);
- completion.complete(completer, buffer, cursor);
- max = Math.max(max, completion.cursor);
- completions.add(completion);
- }
-
- var6 = completions.iterator();
-
- while (var6.hasNext()) {
- Completion completion = (Completion) var6.next();
- if (completion.cursor == max) {
- candidates.addAll(completion.candidates);
- }
- }
-
- return max;
- }
-
- private class Completion {
-
- public final List candidates;
-
- public int cursor;
-
- public Completion(List candidates) {
- Preconditions.checkNotNull(candidates);
- this.candidates = new LinkedList(candidates);
- }
-
- public void complete(Completer completer, String buffer, int cursor) {
- Preconditions.checkNotNull(completer);
- this.cursor = completer.complete(buffer, cursor, this.candidates);
- }
- }
-}
+package com.alibaba.nacos.ctl.intraction.input.completer;
+
+import com.alibaba.nacos.ctl.core.exception.HandlerException;
+import jline.console.completer.Completer;
+import jline.internal.Preconditions;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * NacosCtl全局指令自动补全器
+ *
+ * 整个程序的各种子指令的补全逻辑都在这里拼接
+ *
+ * @author lehr
+ */
+public class NacosCtlCompleter implements Completer {
+
+ private List completers;
+
+ public NacosCtlCompleter() throws HandlerException {
+ try {
+ completers = CompleterFactory.loadAll();
+ } catch (Exception e) {
+ throw new HandlerException("failed to load completer groups", e);
+ }
+ }
+
+ @Override
+ public int complete(String buffer, int cursor, List candidates) {
+ Preconditions.checkNotNull(candidates);
+ List completions = new ArrayList(this.completers.size());
+ int max = -1;
+ Iterator var6 = this.completers.iterator();
+
+ while (var6.hasNext()) {
+ Completer completer = (Completer) var6.next();
+ Completion completion = new Completion(candidates);
+ completion.complete(completer, buffer, cursor);
+ max = Math.max(max, completion.cursor);
+ completions.add(completion);
+ }
+
+ var6 = completions.iterator();
+
+ while (var6.hasNext()) {
+ Completion completion = (Completion) var6.next();
+ if (completion.cursor == max) {
+ candidates.addAll(completion.candidates);
+ }
+ }
+
+ return max;
+ }
+
+ private class Completion {
+
+ public final List candidates;
+
+ public int cursor;
+
+ public Completion(List candidates) {
+ Preconditions.checkNotNull(candidates);
+ this.candidates = new LinkedList(candidates);
+ }
+
+ public void complete(Completer completer, String buffer, int cursor) {
+ Preconditions.checkNotNull(completer);
+ this.cursor = completer.complete(buffer, cursor, this.candidates);
+ }
+ }
+}
diff --git a/src/main/java/com/alibaba/nacos/cli/input/completer/NacosSwitchSetCompleter.java b/interaction/src/main/java/com/alibaba/nacos/ctl/intraction/input/completer/NacosSwitchSetCompleter.java
similarity index 86%
rename from src/main/java/com/alibaba/nacos/cli/input/completer/NacosSwitchSetCompleter.java
rename to interaction/src/main/java/com/alibaba/nacos/ctl/intraction/input/completer/NacosSwitchSetCompleter.java
index 206eef8..ff5e3c7 100644
--- a/src/main/java/com/alibaba/nacos/cli/input/completer/NacosSwitchSetCompleter.java
+++ b/interaction/src/main/java/com/alibaba/nacos/ctl/intraction/input/completer/NacosSwitchSetCompleter.java
@@ -1,50 +1,50 @@
-package com.alibaba.nacos.cli.input.completer;
-
-import com.alibaba.nacos.cli.core.LogicHandler;
-import com.alibaba.nacos.cli.core.exception.HandlerException;
-import jline.console.completer.Completer;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.SortedSet;
-import java.util.TreeSet;
-
-/**
- * Use命令自动补全可用的namespace
- */
-class NacosSwitchSetCompleter implements Completer {
-
- private SortedSet strings = new TreeSet();
-
-
- @Override
- public int complete(final String buffer, final int cursor, final List candidates) {
-
- // 找服务器刷新可访问的数据类型
- if (strings.isEmpty()) {
- Map switches = null;
- try {
- switches = LogicHandler.getSwitches();
- } catch (HandlerException e) {
- switches = Collections.emptyMap();
- }
- strings.addAll(switches.keySet());
- strings.add("all");
- }
-
- // 如果目前没有输入,则列出所有选项
- if (buffer == null) {
- candidates.addAll(strings);
- } else {
- // 进行前缀匹配,把match的加入进去
- for (String match : strings.tailSet(buffer)) {
- if (!match.startsWith(buffer)) {
- break;
- }
- candidates.add(match);
- }
- }
- return candidates.isEmpty() ? -1 : 0;
- }
-}
+package com.alibaba.nacos.ctl.intraction.input.completer;
+
+import com.alibaba.nacos.ctl.core.LogicHandler;
+import com.alibaba.nacos.ctl.core.exception.HandlerException;
+import jline.console.completer.Completer;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+/**
+ * Use命令自动补全可用的namespace
+ */
+class NacosSwitchSetCompleter implements Completer {
+
+ private SortedSet strings = new TreeSet