You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafodion.apache.org by li...@apache.org on 2017/05/22 14:12:24 UTC

[1/2] incubator-trafodion git commit: TRAFODION-2462 jline not work will

Repository: incubator-trafodion
Updated Branches:
  refs/heads/master 3f1485fe6 -> d3c0bb9b1


TRAFODION-2462 jline not work will


Project: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/commit/5bba1331
Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/tree/5bba1331
Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/diff/5bba1331

Branch: refs/heads/master
Commit: 5bba13319d03021106c8844fd86ebc2381f95eda
Parents: bf3e8d0
Author: mashengchen <ma...@gmail.com>
Authored: Sun May 14 05:37:44 2017 +0000
Committer: mashengchen <ma...@gmail.com>
Committed: Sun May 14 05:37:44 2017 +0000

----------------------------------------------------------------------
 .../java/org/trafodion/ci/ConsoleReader.java    | 148 ++++++++++---------
 .../src/main/java/org/trafodion/ci/FCQuery.java |  12 +-
 .../java/org/trafodion/ci/ParseArguments.java   |  19 ++-
 .../java/org/trafodion/ci/QueryWrapper.java     |  22 ++-
 .../src/main/java/org/trafodion/ci/Session.java |   2 +-
 .../java/org/trafodion/ci/SessionInterface.java |   2 +-
 .../java/org/trafodion/ci/UserInterface.java    |   7 +-
 core/conn/trafci/utils/trafci.cmd-tmpl          |  14 +-
 core/conn/trafci/utils/trafci.sh-tmpl           |  42 +++---
 9 files changed, 158 insertions(+), 110 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/5bba1331/core/conn/trafci/src/main/java/org/trafodion/ci/ConsoleReader.java
----------------------------------------------------------------------
diff --git a/core/conn/trafci/src/main/java/org/trafodion/ci/ConsoleReader.java b/core/conn/trafci/src/main/java/org/trafodion/ci/ConsoleReader.java
index 26009a1..4e421c4 100644
--- a/core/conn/trafci/src/main/java/org/trafodion/ci/ConsoleReader.java
+++ b/core/conn/trafci/src/main/java/org/trafodion/ci/ConsoleReader.java
@@ -52,21 +52,30 @@ public class ConsoleReader
    private MaskingThread mt=null;
    WCIUtils wcs=null;
 
+    private boolean isJline = false;
     jline.console.ConsoleReader cr = null;
 
-   ConsoleReader()
-   {
-      newLine=System.getProperty("line.separator");
-      defaultEncoding=System.getProperty("file.encoding");
-    
-      CTRLCHandler = new MySignalHandlerClass();
-      try {
-      INTSignal=new Signal("INT");
-      } catch (Exception e) {}
-   }
+    ConsoleReader() {
+        this(false);
+    }
+
+    public ConsoleReader(boolean isJline) {
+        this.isJline = isJline;
+        newLine = System.getProperty("line.separator");
+        defaultEncoding = System.getProperty("file.encoding");
+
+        CTRLCHandler = new MySignalHandlerClass();
+        try {
+            INTSignal = new Signal("INT");
+        } catch (Exception e) {
+        }
+    }
 
    public void setPrompt(String ps, boolean time, boolean ampmFmt)
    {
+      if (isJline) {
+          this.cr.setPrompt(ps);
+      }
       this.prompt = ps;
       this.time = time;
       this.ampmFmt = ampmFmt;
@@ -110,9 +119,11 @@ public class ConsoleReader
    public void initialize() throws IOException
    {
       this.in=System.in;
-        cr = new jline.console.ConsoleReader();
-        cr.setPrompt(this.prompt);
-        cr.setHandleUserInterrupt(true);
+      if (isJline) {
+          cr = new jline.console.ConsoleReader();
+          cr.setPrompt(this.prompt);
+          cr.setHandleUserInterrupt(true);
+      }
    }
 
    public String getLine() throws IOException, UserInterruption
@@ -123,69 +134,61 @@ public class ConsoleReader
 
    public String readLine() throws UnsupportedEncodingException, UserInterruption, IOException
    {
-/*      StringBuffer lineBuffer=null;
-      lineBuffer=new StringBuffer();
-	  int i=-1;
-            
-      try {
-         if (CTRLCHandler != null)
-         {
-            Signal.handle(INTSignal, CTRLCHandler);
-         }
-      } catch (Exception e) {}
-
-      while (true)
-      {
-         queryInterrupted = false;
-         this.in.mark(1);
-         try{
-         if ((i = this.in.read()) != -1)
-         {
-            if (queryInterrupted)
-            {
-               in.reset();
-               throw new UserInterruption();
+        if (!isJline) {
+            StringBuffer lineBuffer = null;
+            lineBuffer = new StringBuffer();
+            int i = -1;
+
+            try {
+                if (CTRLCHandler != null) {
+                    Signal.handle(INTSignal, CTRLCHandler);
+                }
+            } catch (Exception e) {
             }
 
-            lineBuffer.append((char)i);
-            line = lineBuffer.toString();
-            
-            if (!defaultEncoding.equalsIgnoreCase("Cp1047")) 
-            {
-               byte[] ba=line.getBytes("ISO-8859-1"); // added for nls character support
-               line=new String(ba,defaultEncoding);
+            while (true) {
+                queryInterrupted = false;
+                this.in.mark(1);
+                try {
+                    if ((i = this.in.read()) != -1) {
+                        if (queryInterrupted) {
+                            in.reset();
+                            throw new UserInterruption();
+                        }
+
+                        lineBuffer.append((char) i);
+                        line = lineBuffer.toString();
+
+                        if (!defaultEncoding.equalsIgnoreCase("Cp1047")) {
+                            byte[] ba = line.getBytes("ISO-8859-1"); // added for nls character support
+                            line = new String(ba, defaultEncoding);
+                        }
+
+                        if (line != null && line.endsWith(newLine)) {
+                            return line.substring(0, line.length() - newLine.length());
+                        }
+                    }
+                } catch (ArrayIndexOutOfBoundsException e) {
+                    System.out.println(SessionError.OUT_OF_BOUNDS);
+
+                    if (doTrace) {
+                        e.printStackTrace();
+                    }
+                }
+
+                if (queryInterrupted) {
+                    in.reset();
+                    throw new UserInterruption();
+                }
             }
-            
-            if (line != null && line.endsWith(newLine))
-            {
-               return line.substring(0,line.length() - newLine.length());
+        } else {
+            String readLine = null;
+            try {
+                readLine = cr.readLine();
+            } catch (UserInterruptException e) {
             }
-         }
-         }catch (ArrayIndexOutOfBoundsException e)
-         	{        	 
-        	 	 System.out.println(SessionError.OUT_OF_BOUNDS);
-        	 	 
-        	 if(doTrace)
-        	 {
-        		 e.printStackTrace();
-        	 }
-         	}
-                 
-         if (queryInterrupted)
-         {
-            in.reset();
-            throw new UserInterruption();
-
-         }
-      }
-*/
-        String readLine = null;
-        try {
-            readLine = cr.readLine();
-        } catch (UserInterruptException e) {
-            // TODO Auto-generated catch block
+            return readLine;
         }
-        return readLine;
    }
 
    public boolean next() throws IOException, UserInterruption
@@ -227,5 +230,8 @@ public class ConsoleReader
       return (num <= 0 ? true:false);
    }
 
+    public boolean isJline() {
+        return isJline;
+    }
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/5bba1331/core/conn/trafci/src/main/java/org/trafodion/ci/FCQuery.java
----------------------------------------------------------------------
diff --git a/core/conn/trafci/src/main/java/org/trafodion/ci/FCQuery.java b/core/conn/trafci/src/main/java/org/trafodion/ci/FCQuery.java
index f67d5a7..10ca6de 100644
--- a/core/conn/trafci/src/main/java/org/trafodion/ci/FCQuery.java
+++ b/core/conn/trafci/src/main/java/org/trafodion/ci/FCQuery.java
@@ -78,7 +78,11 @@ public class FCQuery
          } 
          if (sessObj.isLogCmdText()) {
                writer.writeln(sessObj.getSessionPrompt() + multiLineQry[lineNo]); // print the line to be edited
-               writer.write(fcPrompt); //print the fc prompt 
+               if (reader.getConsoleReader().isJline()) {
+                   reader.getConsoleReader().setPrompt(fcPrompt, false, false);
+               } else {
+                   writer.write(fcPrompt); // print the fc prompt
+               }
          }
          //read the fc command
          fcCommand= reader.getLine().toCharArray();
@@ -129,7 +133,11 @@ public class FCQuery
                   }
                   if (sessObj.isLogCmdText()) {
                        writer.writeln(sessObj.getSessionPrompt() + qryText );
-                       writer.write(fcPrompt);
+                       if (reader.getConsoleReader().isJline()) {
+                           reader.getConsoleReader().setPrompt(fcPrompt, false, false);
+                       } else {
+                           writer.write(fcPrompt);
+                       }
                   }
                   fcCommand= reader.getLine().toCharArray();
 

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/5bba1331/core/conn/trafci/src/main/java/org/trafodion/ci/ParseArguments.java
----------------------------------------------------------------------
diff --git a/core/conn/trafci/src/main/java/org/trafodion/ci/ParseArguments.java b/core/conn/trafci/src/main/java/org/trafodion/ci/ParseArguments.java
index 57944a0..eb2d0cc 100644
--- a/core/conn/trafci/src/main/java/org/trafodion/ci/ParseArguments.java
+++ b/core/conn/trafci/src/main/java/org/trafodion/ci/ParseArguments.java
@@ -168,7 +168,6 @@ public class ParseArguments
          printUsage();
          throw new InvalidNumberOfArguments();
       }
-
       
       argsList=null;
       
@@ -178,7 +177,6 @@ public class ParseArguments
       {
          String option=args[i++].trim();
          String value=args[i].trim();
-
          if (option.equalsIgnoreCase("-u")|| option.equalsIgnoreCase("-user"))
          {
             userName=value;
@@ -211,6 +209,9 @@ public class ParseArguments
             }
 
          }
+         else if (option.equalsIgnoreCase("-j")|| option.equalsIgnoreCase("-jline")) {
+             continue;
+         }
          else if (isLaunchConnect && (option.equalsIgnoreCase("-q")|| option.equalsIgnoreCase("-sql")))
          {
             queryStr=value;
@@ -338,8 +339,12 @@ public class ParseArguments
       if (!this.isLaunchConnect) 
          breakConnectPrompt = "Command Interrupted - Please hit <Enter> ... "+SessionDefaults.lineSeperator;
 
-      crObj.setPrompt(breakConnectPrompt,false,false);
-      cwObj.print(prompt);
+      if (crObj.isJline()) {
+          crObj.setPrompt(prompt,false,false);
+      }else {
+          crObj.setPrompt(breakConnectPrompt,false,false);
+          cwObj.print(prompt);
+      }
 
       //set retry count to 0 if user hits a Ctrl+C while entering login parameters
       try
@@ -428,7 +433,11 @@ public class ParseArguments
       if (!this.isLaunchConnect) 
          breakConnectPrompt = "Command Interrupted - Please hit <Enter> ... "+SessionDefaults.lineSeperator;
 
-      crObj.setPrompt(breakConnectPrompt,false,false);
+      if (! crObj.isJline()) {
+          crObj.setPrompt(breakConnectPrompt,false,false);
+      } else {
+          crObj.setPrompt("",false,false);
+      }
 
 
       try

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/5bba1331/core/conn/trafci/src/main/java/org/trafodion/ci/QueryWrapper.java
----------------------------------------------------------------------
diff --git a/core/conn/trafci/src/main/java/org/trafodion/ci/QueryWrapper.java b/core/conn/trafci/src/main/java/org/trafodion/ci/QueryWrapper.java
index 2adc7e5..57e78fd 100644
--- a/core/conn/trafci/src/main/java/org/trafodion/ci/QueryWrapper.java
+++ b/core/conn/trafci/src/main/java/org/trafodion/ci/QueryWrapper.java
@@ -184,17 +184,23 @@ public abstract class QueryWrapper
       {
          if ((matchTrigStmt)&& (utils.rtrim(queryStr).equals(crTrigTerminator)))
             break;
-         else if ((!matchTrigStmt) && (queryStr.trim().toUpperCase().endsWith(sessObj.getSessionSQLTerminator())))
-			{this.sessObj.getConsoleReader().cr.setPrompt("SQL>");
-            break;
-			}
+         else if ((!matchTrigStmt) && (queryStr.trim().toUpperCase().endsWith(sessObj.getSessionSQLTerminator()))) {
+             if (this.sessObj.getConsoleReader().isJline()) {
+                 this.sessObj.getConsoleReader().cr.setPrompt("SQL>");
+             }
+             break;
+         }
          if (( (writer.getWriterMode() == SessionDefaults.CONSOLE_WRITE_MODE ||
             writer.getWriterMode() == SessionDefaults.CONSOLE_SPOOL_WRITE_MODE))  )
          {
-            if((reader.getReadMode() == SessionDefaults.OBEY_READ_MODE  && !sessObj.isQuietEnabled()) || !(reader.getReadMode() == SessionDefaults.OBEY_READ_MODE) )            
-                {//writer.getConsoleWriter().print(sessObj.getSessionCprompt());
-				this.sessObj.getConsoleReader().cr.setPrompt("+>");
-				}
+            if((reader.getReadMode() == SessionDefaults.OBEY_READ_MODE  && !sessObj.isQuietEnabled()) || !(reader.getReadMode() == SessionDefaults.OBEY_READ_MODE) )
+            {
+                if (this.sessObj.getConsoleReader().isJline()) {
+                    this.sessObj.getConsoleReader().cr.setPrompt("+>");
+                } else {
+                    writer.getConsoleWriter().print(sessObj.getSessionCprompt());
+                }
+            }
          }
          try
          {

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/5bba1331/core/conn/trafci/src/main/java/org/trafodion/ci/Session.java
----------------------------------------------------------------------
diff --git a/core/conn/trafci/src/main/java/org/trafodion/ci/Session.java b/core/conn/trafci/src/main/java/org/trafodion/ci/Session.java
index 62d26f5..3e31e5a 100644
--- a/core/conn/trafci/src/main/java/org/trafodion/ci/Session.java
+++ b/core/conn/trafci/src/main/java/org/trafodion/ci/Session.java
@@ -558,7 +558,7 @@ static {
       switch (this.mode)
       {
          case SessionDefaults.SQL_MODE:
-            //prompt =  sessionSQLPrompt;
+            prompt =  sessionSQLPrompt;
             break;
          default:
             prompt =  sessionSQLPrompt;

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/5bba1331/core/conn/trafci/src/main/java/org/trafodion/ci/SessionInterface.java
----------------------------------------------------------------------
diff --git a/core/conn/trafci/src/main/java/org/trafodion/ci/SessionInterface.java b/core/conn/trafci/src/main/java/org/trafodion/ci/SessionInterface.java
index 49db0b0..0243eb1 100644
--- a/core/conn/trafci/src/main/java/org/trafodion/ci/SessionInterface.java
+++ b/core/conn/trafci/src/main/java/org/trafodion/ci/SessionInterface.java
@@ -415,7 +415,7 @@ public class SessionInterface implements SessionDefaults
                if (!OS_EOF)
                {
             	   if(!sessObj.isSessionStartup()) {
-	                  if  (!userPressedCtrlC && sessObj.isLogCmdText() && sessObj.isLogCmdEcho() )
+	                  if  (!userPressedCtrlC && sessObj.isLogCmdText() && sessObj.isLogCmdEcho() && !reader.getConsoleReader().isJline() )
 	                  {
 	                     writer.write(sessObj.getSessionPrompt());
 	                  }

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/5bba1331/core/conn/trafci/src/main/java/org/trafodion/ci/UserInterface.java
----------------------------------------------------------------------
diff --git a/core/conn/trafci/src/main/java/org/trafodion/ci/UserInterface.java b/core/conn/trafci/src/main/java/org/trafodion/ci/UserInterface.java
index 0638b79..e1345f4 100644
--- a/core/conn/trafci/src/main/java/org/trafodion/ci/UserInterface.java
+++ b/core/conn/trafci/src/main/java/org/trafodion/ci/UserInterface.java
@@ -54,8 +54,8 @@ public class UserInterface {
 		int exitCode = 0;
 		boolean doTrace = Boolean.getBoolean(SessionDefaults.PROP_TRACE);
 		String mySQRoot = System.getenv("TRAF_HOME");
-		
-
+		//to decide using jline
+		boolean isJline = "yes".equalsIgnoreCase(System.getProperty("jline")) ? true : false;
 
 		/* handle AWT exceptions */
 		try {
@@ -78,7 +78,7 @@ public class UserInterface {
 				e1.printStackTrace();
 			System.exit(SessionDefaults.abruptExit);
 		}
-		crObj = new ConsoleReader();
+		crObj = new ConsoleReader(isJline);
 
 		try {
 			crObj.initialize();
@@ -92,6 +92,7 @@ public class UserInterface {
 
 		banner();
         
+		System.out.println("using jline: "+ isJline);
 		// parse the arguments
 		ParseArguments paObj = new ParseArguments(crObj, cwObj);
 

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/5bba1331/core/conn/trafci/utils/trafci.cmd-tmpl
----------------------------------------------------------------------
diff --git a/core/conn/trafci/utils/trafci.cmd-tmpl b/core/conn/trafci/utils/trafci.cmd-tmpl
index 167fb54..1be77af 100644
--- a/core/conn/trafci/utils/trafci.cmd-tmpl
+++ b/core/conn/trafci/utils/trafci.cmd-tmpl
@@ -33,6 +33,18 @@ set count=0
 :set_args_loop
 
 set /a count+=1
+
+set m=0
+set n=0
+if '%1'=='-j' set /a m=1
+if '%1'=='-jline' set /a n=1
+set /a x=m "|" n
+if %x% EQU 1 (
+  set extention_opts=-Djline=%2%
+  shift /1
+  shift /1
+)
+
 set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
 shift /1
 if %count%==16 goto after_set_args_loop
@@ -44,7 +56,7 @@ set binlocation=%~dp0
 set driver=%binlocation:~0,2%
 %driver%
 cd %binlocation%
-java -classpath %TRAFCI_CLASSPATH% org.trafodion.ci.UserInterface %CMD_LINE_ARGS%
+java %extention_opts% -classpath %TRAFCI_CLASSPATH% org.trafodion.ci.UserInterface %CMD_LINE_ARGS%
 
 if not %ERRORLEVEL% EQU -9999 goto end_loop
 echo.

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/5bba1331/core/conn/trafci/utils/trafci.sh-tmpl
----------------------------------------------------------------------
diff --git a/core/conn/trafci/utils/trafci.sh-tmpl b/core/conn/trafci/utils/trafci.sh-tmpl
index 53ee1f2..cb03e0e 100644
--- a/core/conn/trafci/utils/trafci.sh-tmpl
+++ b/core/conn/trafci/utils/trafci.sh-tmpl
@@ -132,24 +132,22 @@ while [ $# -gt 0 ]; do  # {{
          USER_ARG=$1
          shift;
          USER_OPTION="$1"
+      elif [ "ci$OPT_VALUE" = "ci-p"  -o "ci$OPT_VALUE" = "ci-password" ]; then # {{{{{{{
+         PASSWORD_ARG=$1
+         shift;
+         PASSWORD_OPTION="$1"
+      elif [ "ci$OPT_VALUE" = "ci-r"  -o "ci$OPT_VALUE" = "ci-role" ]; then # {{{{{{{{
+         ROLE_ARG=$1
+         shift;
+         ROLE_VALUE=$1
+         UIMAINCLASS_PARAMS="$UIMAINCLASS_PARAMS $ROLE_ARG \"$ROLE_VALUE\""
+      elif [ "ci$OPT_VALUE" = "ci-j"  -o "ci$OPT_VALUE" = "ci-jline" ]; then
+         JLINE_ARG=$1
+         shift;
+         JLINE_VALUE=$1
       else
-         if [ "ci$OPT_VALUE" = "ci-p"  -o "ci$OPT_VALUE" = "ci-password" ]; then # {{{{{{{
-           PASSWORD_ARG=$1
-           shift;
-           PASSWORD_OPTION="$1"
-         else
-           if [ "ci$OPT_VALUE" = "ci-r"  -o "ci$OPT_VALUE" = "ci-role" ]; then # {{{{{{{{
-             ROLE_ARG=$1
-             shift;
-             ROLE_VALUE=$1
-             UIMAINCLASS_PARAMS="$UIMAINCLASS_PARAMS $ROLE_ARG \"$ROLE_VALUE\""
-           else
-             UIMAINCLASS_PARAMS="$UIMAINCLASS_PARAMS $1"
+         UIMAINCLASS_PARAMS="$UIMAINCLASS_PARAMS $1"
             
-           fi # End of check for Role }}}}}}}}          
-         
-         fi # End of check for password }}}}}}}
-         
       fi # End of check for user }}}}}}
 
    fi  #  }}} End of  IF the option is -q or -sql.
@@ -176,12 +174,20 @@ if [ ! -z "$PASSWORD_ARG" ]; then
    jusercred_opts="$jusercred_opts $PASSWORD_ARG \"$PASSWORD_OPTION\""
 fi
 
+extention_opts=""
+if [ ! -z "$JLINE_ARG" ]; then
+   extention_opts="-Djline=$JLINE_VALUE"
+else
+   extention_opts="-Djline=no"
+fi
+
 #echo "***DEBUG*** jusercred_opts = $jusercred_opts"
+#echo "***DEBUG*** extention_opts = $extention_opts"
 #echo ""
 #echo "***DEBUG*** running command = java $jcmd_opts $jusercred_opts $QUERY_OPTION \"$QUERY_ARG\"  "
 
 if [ ! -z "$QUERY_OPTION"  ]; then
-        eval java $jcmd_opts $jusercred_opts $QUERY_OPTION \'"$QUERY_ARG"\'
+        eval java $extention_opts $jcmd_opts $jusercred_opts $QUERY_OPTION \'"$QUERY_ARG"\'
 else
-        eval java $jcmd_opts $jusercred_opts
+        eval java $extention_opts $jcmd_opts $jusercred_opts
 fi


[2/2] incubator-trafodion git commit: Merge Fix for TRAFODION-2462 jline not work well

Posted by li...@apache.org.
Merge Fix for TRAFODION-2462 jline not work well


Project: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/commit/d3c0bb9b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/tree/d3c0bb9b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/diff/d3c0bb9b

Branch: refs/heads/master
Commit: d3c0bb9b1f07f24668bae265cb97ca16dc86757c
Parents: 3f1485f 5bba133
Author: Liu Ming <ov...@sina.com>
Authored: Mon May 22 14:11:53 2017 +0000
Committer: Liu Ming <ov...@sina.com>
Committed: Mon May 22 14:11:53 2017 +0000

----------------------------------------------------------------------
 .../java/org/trafodion/ci/ConsoleReader.java    | 148 ++++++++++---------
 .../src/main/java/org/trafodion/ci/FCQuery.java |  12 +-
 .../java/org/trafodion/ci/ParseArguments.java   |  19 ++-
 .../java/org/trafodion/ci/QueryWrapper.java     |  22 ++-
 .../src/main/java/org/trafodion/ci/Session.java |   2 +-
 .../java/org/trafodion/ci/SessionInterface.java |   2 +-
 .../java/org/trafodion/ci/UserInterface.java    |   7 +-
 core/conn/trafci/utils/trafci.cmd-tmpl          |  14 +-
 core/conn/trafci/utils/trafci.sh-tmpl           |  42 +++---
 9 files changed, 158 insertions(+), 110 deletions(-)
----------------------------------------------------------------------