Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
d2d51961
T
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1187
Star
22018
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
d2d51961
编写于
4月 21, 2022
作者:
S
Shengliang Guan
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
refactor(tools): refact shell codes
上级
2d94f8a8
变更
12
展开全部
隐藏空白更改
内联
并排
Showing
12 changed file
with
1265 addition
and
1721 deletion
+1265
-1721
include/os/osSystem.h
include/os/osSystem.h
+7
-7
include/util/tdef.h
include/util/tdef.h
+0
-2
source/os/src/osSystem.c
source/os/src/osSystem.c
+3
-3
tools/shell/inc/shellCommand.h
tools/shell/inc/shellCommand.h
+0
-54
tools/shell/inc/shellInt.h
tools/shell/inc/shellInt.h
+49
-33
tools/shell/src/backup/shellDarwin.c
tools/shell/src/backup/shellDarwin.c
+0
-498
tools/shell/src/shellArguments.c
tools/shell/src/shellArguments.c
+348
-0
tools/shell/src/shellCommand.c
tools/shell/src/shellCommand.c
+415
-74
tools/shell/src/shellEngine.c
tools/shell/src/shellEngine.c
+277
-378
tools/shell/src/shellMain.c
tools/shell/src/shellMain.c
+28
-658
tools/shell/src/shellNettest.c
tools/shell/src/shellNettest.c
+22
-14
tools/shell/src/shellUtil.c
tools/shell/src/shellUtil.c
+116
-0
未找到文件。
include/os/osSystem.h
浏览文件 @
d2d51961
...
...
@@ -31,19 +31,19 @@ extern "C" {
typedef
struct
TdCmd
*
TdCmdPtr
;
TdCmdPtr
taosOpenCmd
(
const
char
*
cmd
);
int64_t
taosGetLineCmd
(
TdCmdPtr
pCmd
,
char
**
__restrict
ptrBuf
);
int32_t
taosEOFCmd
(
TdCmdPtr
pCmd
);
int64_t
taosCloseCmd
(
TdCmdPtr
*
ppCmd
);
TdCmdPtr
taosOpenCmd
(
const
char
*
cmd
);
int64_t
taosGetLineCmd
(
TdCmdPtr
pCmd
,
char
**
__restrict
ptrBuf
);
int32_t
taosEOFCmd
(
TdCmdPtr
pCmd
);
int64_t
taosCloseCmd
(
TdCmdPtr
*
ppCmd
);
void
*
taosLoadDll
(
const
char
*
filename
);
void
*
taosLoadSym
(
void
*
handle
,
char
*
name
);
void
taosCloseDll
(
void
*
handle
);
int32_t
taosSetConsoleEcho
(
bool
on
);
void
s
etTerminalMode
();
int32_t
g
etOldTerminalMode
();
void
r
esetTerminalMode
();
void
taosS
etTerminalMode
();
int32_t
taosG
etOldTerminalMode
();
void
taosR
esetTerminalMode
();
#ifdef __cplusplus
}
...
...
include/util/tdef.h
浏览文件 @
d2d51961
...
...
@@ -76,8 +76,6 @@ extern const int32_t TYPE_BYTES[15];
#define TSDB_DEFAULT_PASS "taosdata"
#endif
#define SHELL_MAX_PASSWORD_LEN 20
#define TSDB_TRUE 1
#define TSDB_FALSE 0
#define TSDB_OK 0
...
...
source/os/src/osSystem.c
浏览文件 @
d2d51961
...
...
@@ -119,7 +119,7 @@ int taosSetConsoleEcho(bool on) {
#endif
}
void
s
etTerminalMode
()
{
void
taosS
etTerminalMode
()
{
#if defined(WINDOWS)
#else
...
...
@@ -152,7 +152,7 @@ void setTerminalMode() {
#endif
}
int32_t
g
etOldTerminalMode
()
{
int32_t
taosG
etOldTerminalMode
()
{
#if defined(WINDOWS)
#else
...
...
@@ -170,7 +170,7 @@ int32_t getOldTerminalMode() {
#endif
}
void
r
esetTerminalMode
()
{
void
taosR
esetTerminalMode
()
{
#if defined(WINDOWS)
#else
...
...
tools/shell/inc/shellCommand.h
已删除
100644 → 0
浏览文件 @
2d94f8a8
/*
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
*
* This program is free software: you can use, redistribute, and/or modify
* it under the terms of the GNU Affero General Public License, version 3
* or later ("AGPL"), as published by the Free Software Foundation.
*
* 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.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _TD_SHELL_COMMAND_H_
#define _TD_SHELL_COMMAND_H_
#include "shellInt.h"
#define LEFT 1
#define RIGHT 2
#define UP 3
#define DOWN 4
typedef
struct
{
char
*
buffer
;
char
*
command
;
unsigned
commandSize
;
unsigned
bufferSize
;
unsigned
cursorOffset
;
unsigned
screenOffset
;
unsigned
endOffset
;
}
Command
;
extern
void
backspaceChar
(
Command
*
cmd
);
extern
void
clearLineBefore
(
Command
*
cmd
);
extern
void
clearLineAfter
(
Command
*
cmd
);
extern
void
deleteChar
(
Command
*
cmd
);
extern
void
moveCursorLeft
(
Command
*
cmd
);
extern
void
moveCursorRight
(
Command
*
cmd
);
extern
void
positionCursorHome
(
Command
*
cmd
);
extern
void
positionCursorEnd
(
Command
*
cmd
);
extern
void
showOnScreen
(
Command
*
cmd
);
extern
void
updateBuffer
(
Command
*
cmd
);
extern
int
isReadyGo
(
Command
*
cmd
);
extern
void
resetCommand
(
Command
*
cmd
,
const
char
s
[]);
int
countPrefixOnes
(
unsigned
char
c
);
void
clearScreen
(
int
ecmd_pos
,
int
cursor_pos
);
void
printChar
(
char
c
,
int
times
);
void
positionCursor
(
int
step
,
int
direction
);
#endif
/*_TD_SHELL_COMMAND_H_*/
tools/shell/inc/shellInt.h
浏览文件 @
d2d51961
...
...
@@ -19,34 +19,37 @@
#include "os.h"
#include "taos.h"
#include "taosdef.h"
#include "taoserror.h"
#include "tconfig.h"
#include "tglobal.h"
#include "ttypes.h"
#include "tutil.h"
#include <regex.h>
#include <wordexp.h>
#define MAX_HISTORY_SIZE 1000
#define MAX_COMMAND_SIZE 1048586
#define HISTORY_FILE ".taos_history"
#define DEFAULT_RES_SHOW_NUM 100
#define SHELL_MAX_HISTORY_SIZE 1000
#define SHELL_MAX_COMMAND_SIZE 1048586
#define SHELL_HISTORY_FILE ".taos_history"
#define SHELL_DEFAULT_RES_SHOW_NUM 100
#define SHELL_DEFAULT_MAX_BINARY_DISPLAY_WIDTH 30
typedef
struct
{
char
*
hist
[
MAX_HISTORY_SIZE
];
char
*
hist
[
SHELL_MAX_HISTORY_SIZE
];
char
file
[
TSDB_FILENAME_LEN
];
int32_t
hstart
;
int32_t
hend
;
}
SShellHistory
;
typedef
struct
{
const
char
*
host
;
const
char
*
password
;
const
char
*
user
;
const
char
*
auth
;
const
char
*
database
;
const
char
*
file
;
const
char
*
cfgdir
;
const
char
*
commands
;
const
char
*
netrole
;
char
password
[
TSDB_USET_PASSWORD_LEN
];
bool
is_gen_auth
;
bool
is_raw_time
;
bool
is_client
;
bool
is_server
;
bool
is_version
;
bool
is_dump_config
;
bool
is_check
;
...
...
@@ -55,38 +58,51 @@ typedef struct {
uint16_t
port
;
int32_t
pktLen
;
int32_t
pktNum
;
int32_t
displayWidth
;
int32_t
abort
;
}
SShellArgs
;
typedef
struct
{
SShellArgs
args
;
SShellHistory
history
;
TAOS
*
conn
;
int64_t
result
;
const
char
*
clientVersion
;
const
char
*
promptHeader
;
const
char
*
promptContinue
;
const
char
*
osname
;
int32_t
promptSize
;
char
programVersion
[
32
];
}
SShellOsDetails
;
typedef
struct
{
SShellArgs
args
;
SShellHistory
history
;
SShellOsDetails
info
;
TAOS
*
conn
;
TdThread
pid
;
tsem_t
cancelSem
;
int64_t
result
;
}
SShellObj
;
// shellArguments.c
int32_t
shellParseArgs
(
int32_t
argc
,
char
*
argv
[]);
int32_t
shellInit
();
void
shellCleanup
(
void
*
arg
);
void
shellExit
();
void
*
shellThreadLoop
(
void
*
arg
);
void
shellPrintError
(
TAOS_RES
*
tres
,
int64_t
st
);
int32_t
shellRegexMatch
(
const
char
*
s
,
const
char
*
reg
,
int32_t
cflags
);
void
shellGetGrantInfo
();
void
shellReadHistory
();
void
shellWriteHistory
();
void
shellHistoryPath
(
char
*
history
);
// shellCommand.c
int32_t
shellReadCommand
(
char
*
command
);
// shellEngine.c
int32_t
shellExecute
();
// shellUtil.c
int32_t
shellCheckIntSize
();
void
shellPrintVersion
();
void
shellGenerateAuth
();
void
shellDumpConfig
();
void
shellCheckServerStatus
();
bool
shellRegexMatch
(
const
char
*
s
,
const
char
*
reg
,
int32_t
cflags
);
int32_t
shellReadCommand
(
char
command
[]);
int32_t
shellRunCommand
(
char
*
command
);
void
shellRunCommandImp
(
char
command
[]);
void
shellSourceFile
(
TAOS
*
con
,
char
*
fptr
);
int32_t
shellDumpResult
(
TAOS_RES
*
con
,
char
*
fname
,
int32_t
*
error_no
,
bool
printMode
);
// shellNettest.c
void
shellTestNetWork
();
extern
char
PROMPT_HEADER
[];
extern
char
CONTINUE_PROMPT
[];
extern
int32_t
prompt_size
;
// shellMain.c
extern
SShellObj
shell
;
extern
void
taos_init
();
#endif
/*_TD_SHELL_INT_H_*/
tools/shell/src/backup/shellDarwin.c
已删除
100644 → 0
浏览文件 @
2d94f8a8
/*
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
*
* This program is free software: you can use, redistribute, and/or modify
* it under the terms of the GNU Affero General Public License, version 3
* or later ("AGPL"), as published by the Free Software Foundation.
*
* 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.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#define __USE_XOPEN
#include "os.h"
#include "shellInt.h"
#include "shellCommand.h"
#include "tbase64.h"
#include "tscLog.h"
#define OPT_ABORT 1
/* �Cabort */
int
indicator
=
1
;
struct
termios
oldtio
;
void
insertChar
(
Command
*
cmd
,
char
*
c
,
int
size
);
void
printHelp
()
{
char
indent
[
10
]
=
" "
;
printf
(
"taos shell is used to test the TDengine database
\n
"
);
printf
(
"%s%s
\n
"
,
indent
,
"-h"
);
printf
(
"%s%s%s
\n
"
,
indent
,
indent
,
"TDengine server IP address to connect. The default host is localhost."
);
printf
(
"%s%s
\n
"
,
indent
,
"-p"
);
printf
(
"%s%s%s
\n
"
,
indent
,
indent
,
"The password to use when connecting to the server."
);
printf
(
"%s%s
\n
"
,
indent
,
"-P"
);
printf
(
"%s%s%s
\n
"
,
indent
,
indent
,
"The TCP/IP port number to use for the connection"
);
printf
(
"%s%s
\n
"
,
indent
,
"-u"
);
printf
(
"%s%s%s
\n
"
,
indent
,
indent
,
"The user name to use when connecting to the server."
);
printf
(
"%s%s
\n
"
,
indent
,
"-c"
);
printf
(
"%s%s%s
\n
"
,
indent
,
indent
,
"Configuration directory."
);
printf
(
"%s%s
\n
"
,
indent
,
"-s"
);
printf
(
"%s%s%s
\n
"
,
indent
,
indent
,
"Commands to run without enter the shell."
);
printf
(
"%s%s
\n
"
,
indent
,
"-r"
);
printf
(
"%s%s%s
\n
"
,
indent
,
indent
,
"Output time as unsigned long.."
);
printf
(
"%s%s
\n
"
,
indent
,
"-f"
);
printf
(
"%s%s%s
\n
"
,
indent
,
indent
,
"Script to run without enter the shell."
);
printf
(
"%s%s
\n
"
,
indent
,
"-d"
);
printf
(
"%s%s%s
\n
"
,
indent
,
indent
,
"Database to use when connecting to the server."
);
printf
(
"%s%s
\n
"
,
indent
,
"-t"
);
printf
(
"%s%s%s
\n
"
,
indent
,
indent
,
"Time zone of the shell, default is local."
);
printf
(
"%s%s
\n
"
,
indent
,
"-D"
);
printf
(
"%s%s%s
\n
"
,
indent
,
indent
,
"Use multi-thread to import all SQL files in the directory separately."
);
printf
(
"%s%s
\n
"
,
indent
,
"-T"
);
printf
(
"%s%s%s
\n
"
,
indent
,
indent
,
"Number of threads when using multi-thread to import data."
);
exit
(
EXIT_SUCCESS
);
}
char
DARWINCLIENT_VERSION
[]
=
"Welcome to the TDengine shell from %s, Client Version:%s
\n
"
"Copyright (c) 2020 by TAOS Data, Inc. All rights reserved.
\n\n
"
;
char
g_password
[
SHELL_MAX_PASSWORD_LEN
];
void
shellParseArgs
(
int
argc
,
char
*
argv
[],
SShellArgs
*
arguments
)
{
wordexp_t
full_path
;
for
(
int
i
=
1
;
i
<
argc
;
i
++
)
{
// for host
if
(
strcmp
(
argv
[
i
],
"-h"
)
==
0
)
{
if
(
i
<
argc
-
1
)
{
arguments
->
host
=
argv
[
++
i
];
}
else
{
fprintf
(
stderr
,
"option -h requires an argument
\n
"
);
exit
(
EXIT_FAILURE
);
}
}
// for password
else
if
((
strncmp
(
argv
[
i
],
"-p"
,
2
)
==
0
)
||
(
strncmp
(
argv
[
i
],
"--password"
,
10
)
==
0
))
{
strcpy
(
tsOsName
,
"Darwin"
);
printf
(
DARWINCLIENT_VERSION
,
tsOsName
,
taos_get_client_info
());
if
((
strlen
(
argv
[
i
])
==
2
)
||
(
strncmp
(
argv
[
i
],
"--password"
,
10
)
==
0
))
{
printf
(
"Enter password: "
);
taosSetConsoleEcho
(
false
);
if
(
scanf
(
"%s"
,
g_password
)
>
1
)
{
fprintf
(
stderr
,
"password read error
\n
"
);
}
taosSetConsoleEcho
(
true
);
getchar
();
}
else
{
tstrncpy
(
g_password
,
(
char
*
)(
argv
[
i
]
+
2
),
SHELL_MAX_PASSWORD_LEN
);
}
arguments
->
password
=
g_password
;
arguments
->
is_use_passwd
=
true
;
strcpy
(
argv
[
i
],
""
);
argc
-=
1
;
}
// for management port
else
if
(
strcmp
(
argv
[
i
],
"-P"
)
==
0
)
{
if
(
i
<
argc
-
1
)
{
arguments
->
port
=
atoi
(
argv
[
++
i
]);
}
else
{
fprintf
(
stderr
,
"option -P requires an argument
\n
"
);
exit
(
EXIT_FAILURE
);
}
}
// for user
else
if
(
strcmp
(
argv
[
i
],
"-u"
)
==
0
)
{
if
(
i
<
argc
-
1
)
{
arguments
->
user
=
argv
[
++
i
];
}
else
{
fprintf
(
stderr
,
"option -u requires an argument
\n
"
);
exit
(
EXIT_FAILURE
);
}
}
else
if
(
strcmp
(
argv
[
i
],
"-c"
)
==
0
)
{
if
(
i
<
argc
-
1
)
{
if
(
strlen
(
argv
[
++
i
])
>=
TSDB_FILENAME_LEN
)
{
fprintf
(
stderr
,
"config file path: %s overflow max len %d
\n
"
,
argv
[
i
],
TSDB_FILENAME_LEN
-
1
);
exit
(
EXIT_FAILURE
);
}
strcpy
(
configDir
,
argv
[
i
]);
}
else
{
fprintf
(
stderr
,
"Option -c requires an argument
\n
"
);
exit
(
EXIT_FAILURE
);
}
}
else
if
(
strcmp
(
argv
[
i
],
"-s"
)
==
0
)
{
if
(
i
<
argc
-
1
)
{
arguments
->
commands
=
argv
[
++
i
];
}
else
{
fprintf
(
stderr
,
"option -s requires an argument
\n
"
);
exit
(
EXIT_FAILURE
);
}
}
else
if
(
strcmp
(
argv
[
i
],
"-r"
)
==
0
)
{
arguments
->
is_raw_time
=
true
;
}
// For temperory batch commands to run TODO
else
if
(
strcmp
(
argv
[
i
],
"-f"
)
==
0
)
{
if
(
i
<
argc
-
1
)
{
strcpy
(
arguments
->
file
,
argv
[
++
i
]);
}
else
{
fprintf
(
stderr
,
"option -f requires an argument
\n
"
);
exit
(
EXIT_FAILURE
);
}
}
// for default database
else
if
(
strcmp
(
argv
[
i
],
"-d"
)
==
0
)
{
if
(
i
<
argc
-
1
)
{
arguments
->
database
=
argv
[
++
i
];
}
else
{
fprintf
(
stderr
,
"option -d requires an argument
\n
"
);
exit
(
EXIT_FAILURE
);
}
}
// For time zone
else
if
(
strcmp
(
argv
[
i
],
"-t"
)
==
0
)
{
if
(
i
<
argc
-
1
)
{
arguments
->
timezone
=
argv
[
++
i
];
}
else
{
fprintf
(
stderr
,
"option -t requires an argument
\n
"
);
exit
(
EXIT_FAILURE
);
}
}
// For import directory
else
if
(
strcmp
(
argv
[
i
],
"-D"
)
==
0
)
{
if
(
i
<
argc
-
1
)
{
if
(
wordexp
(
argv
[
++
i
],
&
full_path
,
0
)
!=
0
)
{
fprintf
(
stderr
,
"Invalid path %s
\n
"
,
argv
[
i
]);
exit
(
EXIT_FAILURE
);
}
strcpy
(
arguments
->
dir
,
full_path
.
we_wordv
[
0
]);
wordfree
(
&
full_path
);
}
else
{
fprintf
(
stderr
,
"option -D requires an argument
\n
"
);
exit
(
EXIT_FAILURE
);
}
}
// For time zone
else
if
(
strcmp
(
argv
[
i
],
"-T"
)
==
0
)
{
if
(
i
<
argc
-
1
)
{
arguments
->
threadNum
=
atoi
(
argv
[
++
i
]);
}
else
{
fprintf
(
stderr
,
"option -T requires an argument
\n
"
);
exit
(
EXIT_FAILURE
);
}
}
// For temperory command TODO
else
if
(
strcmp
(
argv
[
i
],
"--help"
)
==
0
)
{
printHelp
();
exit
(
EXIT_FAILURE
);
}
else
{
fprintf
(
stderr
,
"wrong options
\n
"
);
printHelp
();
exit
(
EXIT_FAILURE
);
}
}
}
int32_t
shellReadCommand
(
TAOS
*
con
,
char
*
command
)
{
unsigned
hist_counter
=
history
.
hend
;
char
utf8_array
[
10
]
=
"
\0
"
;
Command
cmd
;
memset
(
&
cmd
,
0
,
sizeof
(
cmd
));
cmd
.
buffer
=
(
char
*
)
taosMemoryCalloc
(
1
,
MAX_COMMAND_SIZE
);
cmd
.
command
=
(
char
*
)
taosMemoryCalloc
(
1
,
MAX_COMMAND_SIZE
);
showOnScreen
(
&
cmd
);
// Read input.
char
c
;
while
(
1
)
{
c
=
getchar
();
if
(
c
<
0
)
{
// For UTF-8
int
count
=
countPrefixOnes
(
c
);
utf8_array
[
0
]
=
c
;
for
(
int
k
=
1
;
k
<
count
;
k
++
)
{
c
=
getchar
();
utf8_array
[
k
]
=
c
;
}
insertChar
(
&
cmd
,
utf8_array
,
count
);
}
else
if
(
c
<
'\033'
)
{
// Ctrl keys. TODO: Implement ctrl combinations
switch
(
c
)
{
case
1
:
// ctrl A
positionCursorHome
(
&
cmd
);
break
;
case
3
:
printf
(
"
\n
"
);
resetCommand
(
&
cmd
,
""
);
kill
(
0
,
SIGINT
);
break
;
case
4
:
// EOF or Ctrl+D
printf
(
"
\n
"
);
taos_close
(
con
);
// write the history
shellWriteHistory
();
shellExit
();
break
;
case
5
:
// ctrl E
positionCursorEnd
(
&
cmd
);
break
;
case
8
:
backspaceChar
(
&
cmd
);
break
;
case
'\n'
:
case
'\r'
:
printf
(
"
\n
"
);
if
(
isReadyGo
(
&
cmd
))
{
sprintf
(
command
,
"%s%s"
,
cmd
.
buffer
,
cmd
.
command
);
taosMemoryFreeClear
(
cmd
.
buffer
);
taosMemoryFreeClear
(
cmd
.
command
);
return
0
;
}
else
{
updateBuffer
(
&
cmd
);
}
break
;
case
11
:
// Ctrl + K;
clearLineAfter
(
&
cmd
);
break
;
case
12
:
// Ctrl + L;
system
(
"clear"
);
showOnScreen
(
&
cmd
);
break
;
case
21
:
// Ctrl + U
clearLineBefore
(
&
cmd
);
break
;
}
}
else
if
(
c
==
'\033'
)
{
c
=
getchar
();
switch
(
c
)
{
case
'['
:
c
=
getchar
();
switch
(
c
)
{
case
'A'
:
// Up arrow
if
(
hist_counter
!=
history
.
hstart
)
{
hist_counter
=
(
hist_counter
+
MAX_HISTORY_SIZE
-
1
)
%
MAX_HISTORY_SIZE
;
resetCommand
(
&
cmd
,
(
history
.
hist
[
hist_counter
]
==
NULL
)
?
""
:
history
.
hist
[
hist_counter
]);
}
break
;
case
'B'
:
// Down arrow
if
(
hist_counter
!=
history
.
hend
)
{
int
next_hist
=
(
hist_counter
+
1
)
%
MAX_HISTORY_SIZE
;
if
(
next_hist
!=
history
.
hend
)
{
resetCommand
(
&
cmd
,
(
history
.
hist
[
next_hist
]
==
NULL
)
?
""
:
history
.
hist
[
next_hist
]);
}
else
{
resetCommand
(
&
cmd
,
""
);
}
hist_counter
=
next_hist
;
}
break
;
case
'C'
:
// Right arrow
moveCursorRight
(
&
cmd
);
break
;
case
'D'
:
// Left arrow
moveCursorLeft
(
&
cmd
);
break
;
case
'1'
:
if
((
c
=
getchar
())
==
'~'
)
{
// Home key
positionCursorHome
(
&
cmd
);
}
break
;
case
'2'
:
if
((
c
=
getchar
())
==
'~'
)
{
// Insert key
}
break
;
case
'3'
:
if
((
c
=
getchar
())
==
'~'
)
{
// Delete key
deleteChar
(
&
cmd
);
}
break
;
case
'4'
:
if
((
c
=
getchar
())
==
'~'
)
{
// End key
positionCursorEnd
(
&
cmd
);
}
break
;
case
'5'
:
if
((
c
=
getchar
())
==
'~'
)
{
// Page up key
}
break
;
case
'6'
:
if
((
c
=
getchar
())
==
'~'
)
{
// Page down key
}
break
;
case
72
:
// Home key
positionCursorHome
(
&
cmd
);
break
;
case
70
:
// End key
positionCursorEnd
(
&
cmd
);
break
;
}
break
;
}
}
else
if
(
c
==
0x7f
)
{
// press delete key
backspaceChar
(
&
cmd
);
}
else
{
insertChar
(
&
cmd
,
&
c
,
1
);
}
}
return
0
;
}
void
*
shellThreadLoop
(
void
*
arg
)
{
if
(
indicator
)
{
getOldTerminalMode
();
indicator
=
0
;
}
TAOS
*
con
=
(
TAOS
*
)
arg
;
setThreadName
(
"shellThreadLoop"
);
taosThreadCleanupPush
(
shellCleanup
,
NULL
);
char
*
command
=
taosMemoryMalloc
(
MAX_COMMAND_SIZE
);
if
(
command
==
NULL
){
tscError
(
"failed to malloc command"
);
return
NULL
;
}
int32_t
err
=
0
;
do
{
// Read command from shell.
memset
(
command
,
0
,
MAX_COMMAND_SIZE
);
setTerminalMode
();
err
=
shellReadCommand
(
con
,
command
);
if
(
err
)
{
break
;
}
resetTerminalMode
();
}
while
(
shellRunCommand
(
con
,
command
)
==
0
);
taosMemoryFreeClear
(
command
);
shellExit
();
taosThreadCleanupPop
(
1
);
return
NULL
;
}
void
shellHistoryPath
(
char
*
history
)
{
sprintf
(
history
,
"%s/%s"
,
getpwuid
(
getuid
())
->
pw_dir
,
HISTORY_FILE
);
}
void
clearScreen
(
int
ecmd_pos
,
int
cursor_pos
)
{
struct
winsize
w
;
if
(
ioctl
(
0
,
TIOCGWINSZ
,
&
w
)
<
0
||
w
.
ws_col
==
0
||
w
.
ws_row
==
0
)
{
//fprintf(stderr, "No stream device, and use default value(col 120, row 30)\n");
w
.
ws_col
=
120
;
w
.
ws_row
=
30
;
}
int
cursor_x
=
cursor_pos
/
w
.
ws_col
;
int
cursor_y
=
cursor_pos
%
w
.
ws_col
;
int
command_x
=
ecmd_pos
/
w
.
ws_col
;
positionCursor
(
cursor_y
,
LEFT
);
positionCursor
(
command_x
-
cursor_x
,
DOWN
);
fprintf
(
stdout
,
"
\033
[2K"
);
for
(
int
i
=
0
;
i
<
command_x
;
i
++
)
{
positionCursor
(
1
,
UP
);
fprintf
(
stdout
,
"
\033
[2K"
);
}
fflush
(
stdout
);
}
void
showOnScreen
(
Command
*
cmd
)
{
struct
winsize
w
;
if
(
ioctl
(
0
,
TIOCGWINSZ
,
&
w
)
<
0
||
w
.
ws_col
==
0
||
w
.
ws_row
==
0
)
{
//fprintf(stderr, "No stream device\n");
w
.
ws_col
=
120
;
w
.
ws_row
=
30
;
}
TdWchar
wc
;
int
size
=
0
;
// Print out the command.
char
*
total_string
=
taosMemoryMalloc
(
MAX_COMMAND_SIZE
);
memset
(
total_string
,
'\0'
,
MAX_COMMAND_SIZE
);
if
(
strcmp
(
cmd
->
buffer
,
""
)
==
0
)
{
sprintf
(
total_string
,
"%s%s"
,
PROMPT_HEADER
,
cmd
->
command
);
}
else
{
sprintf
(
total_string
,
"%s%s"
,
CONTINUE_PROMPT
,
cmd
->
command
);
}
int
remain_column
=
w
.
ws_col
;
/* size = cmd->commandSize + prompt_size; */
for
(
char
*
str
=
total_string
;
size
<
cmd
->
commandSize
+
prompt_size
;)
{
int
ret
=
taosMbToWchar
(
&
wc
,
str
,
MB_CUR_MAX
);
if
(
ret
<
0
)
break
;
size
+=
ret
;
/* assert(size >= 0); */
int
width
=
taosWcharWidth
(
wc
);
if
(
remain_column
>
width
)
{
printf
(
"%lc"
,
wc
);
remain_column
-=
width
;
}
else
{
if
(
remain_column
==
width
)
{
printf
(
"%lc
\n\r
"
,
wc
);
remain_column
=
w
.
ws_col
;
}
else
{
printf
(
"
\n\r
%lc"
,
wc
);
remain_column
=
w
.
ws_col
-
width
;
}
}
str
=
total_string
+
size
;
}
taosMemoryFree
(
total_string
);
/* for (int i = 0; i < size; i++){ */
/* char c = total_string[i]; */
/* if (k % w.ws_col == 0) { */
/* printf("%c\n\r", c); */
/* } */
/* else { */
/* printf("%c", c); */
/* } */
/* k += 1; */
/* } */
// Position the cursor
int
cursor_pos
=
cmd
->
screenOffset
+
prompt_size
;
int
ecmd_pos
=
cmd
->
endOffset
+
prompt_size
;
int
cursor_x
=
cursor_pos
/
w
.
ws_col
;
int
cursor_y
=
cursor_pos
%
w
.
ws_col
;
// int cursor_y = cursor % w.ws_col;
int
command_x
=
ecmd_pos
/
w
.
ws_col
;
int
command_y
=
ecmd_pos
%
w
.
ws_col
;
// int command_y = (command.size() + prompt_size) % w.ws_col;
positionCursor
(
command_y
,
LEFT
);
positionCursor
(
command_x
,
UP
);
positionCursor
(
cursor_x
,
DOWN
);
positionCursor
(
cursor_y
,
RIGHT
);
fflush
(
stdout
);
}
void
shellCleanup
(
void
*
arg
)
{
resetTerminalMode
();
}
void
shellExit
()
{
resetTerminalMode
();
exit
(
EXIT_SUCCESS
);
}
tools/shell/src/
backup/shellWindow
s.c
→
tools/shell/src/
shellArgument
s.c
浏览文件 @
d2d51961
/*******************************************************************
* Copyright (c) 2017 by TAOS Technologies, Inc.
* All rights reserved.
*
* This file is proprietary and confidential to TAOS Technologies.
* No part of this file may be reproduced, stored, transmitted,
* disclosed or used in any form or by any means other than as
* expressly provided by the written permission from Jianhui Tao
*
* ****************************************************************/
/*
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
*
* This program is free software: you can use, redistribute, and/or modify
* it under the terms of the GNU Affero General Public License, version 3
* or later ("AGPL"), as published by the Free Software Foundation.
*
* 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.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <assert.h>
#include <regex.h>
#include <stdio.h>
#include "../../../../include/client/taos.h"
#include "os.h"
#include "shellInt.h"
#include "shellCommand.h"
extern
char
configDir
[];
char
WINCLIENT_VERSION
[]
=
"Welcome to the TDengine shell from %s, Client Version:%s
\n
"
"Copyright (c) 2020 by TAOS Data, Inc. All rights reserved.
\n\n
"
;
void
printVersion
()
{
printf
(
"version: %s
\n
"
,
version
);
}
void
printHelp
()
{
#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32) || defined(_TD_DARWIN_64)
void
shellPrintHelp
()
{
char
indent
[
10
]
=
" "
;
printf
(
"taos shell is used to test the TDengine database
\n
"
);
printf
(
"%s%s
\n
"
,
indent
,
"-h"
);
printf
(
"%s%s%s
\n
"
,
indent
,
indent
,
"TDengine server FQDN to connect. The default host is localhost."
);
printf
(
"%s%s
\n
"
,
indent
,
"-p"
);
printf
(
"%s%s%s
\n
"
,
indent
,
indent
,
"The password to use when connecting to the server."
);
printf
(
"%s%s
\n
"
,
indent
,
"-P"
);
printf
(
"%s%s%s
\n
"
,
indent
,
indent
,
"The TCP/IP port number to use for the connection"
);
printf
(
"%s%s
\n
"
,
indent
,
"-u"
);
printf
(
"%s%s%s
\n
"
,
indent
,
indent
,
"The user name to use when connecting to the server."
);
printf
(
"%s%s
\n
"
,
indent
,
"-A"
);
printf
(
"%s%s
\n
"
,
indent
,
"-p"
);
printf
(
"%s%s%s
\n
"
,
indent
,
indent
,
"The password to use when connecting to the server."
);
printf
(
"%s%s
\n
"
,
indent
,
"-a"
);
printf
(
"%s%s%s
\n
"
,
indent
,
indent
,
"The user auth to use when connecting to the server."
);
printf
(
"%s%s
\n
"
,
indent
,
"-A"
);
printf
(
"%s%s%s
\n
"
,
indent
,
indent
,
"Generate auth string from password."
);
printf
(
"%s%s
\n
"
,
indent
,
"-c"
);
printf
(
"%s%s%s
\n
"
,
indent
,
indent
,
"Configuration directory."
);
printf
(
"%s%s
\n
"
,
indent
,
"-C"
);
...
...
@@ -52,27 +43,24 @@ void printHelp() {
printf
(
"%s%s%s
\n
"
,
indent
,
indent
,
"Script to run without enter the shell."
);
printf
(
"%s%s
\n
"
,
indent
,
"-d"
);
printf
(
"%s%s%s
\n
"
,
indent
,
indent
,
"Database to use when connecting to the server."
);
printf
(
"%s%s
\n
"
,
indent
,
"-k"
);
printf
(
"%s%s%s
\n
"
,
indent
,
indent
,
"Check the service status."
);
printf
(
"%s%s
\n
"
,
indent
,
"-t"
);
printf
(
"%s%s%s
\n
"
,
indent
,
indent
,
"Time zone of the shell, default is local."
);
printf
(
"%s%s%s
\n
"
,
indent
,
indent
,
"Check the details of the service status."
);
printf
(
"%s%s
\n
"
,
indent
,
"-w"
);
printf
(
"%s%s%s
\n
"
,
indent
,
indent
,
"Set the default binary display width."
);
printf
(
"%s%s
\n
"
,
indent
,
"-n"
);
printf
(
"%s%s%s
\n
"
,
indent
,
indent
,
"Net role when network connectivity test,
default is startup, options: client|server|rpc|startup|sync|speed|fqdn
."
);
printf
(
"%s%s%s
\n
"
,
indent
,
indent
,
"Net role when network connectivity test,
options: client|server
."
);
printf
(
"%s%s
\n
"
,
indent
,
"-l"
);
printf
(
"%s%s%s
\n
"
,
indent
,
indent
,
"Packet length used for net test, default is 1000 bytes."
);
printf
(
"%s%s
\n
"
,
indent
,
"-N"
);
printf
(
"%s%s%s
\n
"
,
indent
,
indent
,
"Packet numbers used for net test, default is 100."
);
printf
(
"%s%s
\n
"
,
indent
,
"-S"
);
printf
(
"%s%s%s
\n
"
,
indent
,
indent
,
"Packet type used for net test, default is TCP."
);
printf
(
"%s%s
\n
"
,
indent
,
"-V"
);
printf
(
"%s%s%s
\n
"
,
indent
,
indent
,
"Print program version."
);
exit
(
EXIT_SUCCESS
);
}
char
g_password
[
SHELL_MAX_PASSWORD_LEN
];
void
shellParseArgs
(
int
argc
,
char
*
argv
[],
SShellArgs
*
arguments
)
{
void
shellParseArgsInWindows
(
int
argc
,
char
*
argv
[])
{
for
(
int
i
=
1
;
i
<
argc
;
i
++
)
{
// for host
if
(
strcmp
(
argv
[
i
],
"-h"
)
==
0
)
{
if
(
i
<
argc
-
1
)
{
arguments
->
host
=
argv
[
++
i
];
...
...
@@ -80,67 +68,40 @@ void shellParseArgs(int argc, char *argv[], SShellArgs *arguments) {
fprintf
(
stderr
,
"option -h requires an argument
\n
"
);
exit
(
EXIT_FAILURE
);
}
}
// for password
else
if
((
strncmp
(
argv
[
i
],
"-p"
,
2
)
==
0
)
||
(
strncmp
(
argv
[
i
],
"--password"
,
10
)
==
0
))
{
arguments
->
is_use_passwd
=
true
;
strcpy
(
tsOsName
,
"Windows"
);
printf
(
WINCLIENT_VERSION
,
tsOsName
,
taos_get_client_info
());
if
((
strlen
(
argv
[
i
])
==
2
)
||
(
strncmp
(
argv
[
i
],
"--password"
,
10
)
==
0
))
{
printf
(
"Enter password: "
);
taosSetConsoleEcho
(
false
);
if
(
scanf
(
"%s"
,
g_password
)
>
1
)
{
fprintf
(
stderr
,
"password read error!
\n
"
);
}
taosSetConsoleEcho
(
true
);
getchar
();
}
else
{
tstrncpy
(
g_password
,
(
char
*
)(
argv
[
i
]
+
2
),
SHELL_MAX_PASSWORD_LEN
);
}
arguments
->
password
=
g_password
;
strcpy
(
argv
[
i
],
""
);
argc
-=
1
;
}
// for management port
else
if
(
strcmp
(
argv
[
i
],
"-P"
)
==
0
)
{
}
else
if
(
strcmp
(
argv
[
i
],
"-P"
)
==
0
)
{
if
(
i
<
argc
-
1
)
{
arguments
->
port
=
atoi
(
argv
[
++
i
]);
}
else
{
fprintf
(
stderr
,
"option -P requires an argument
\n
"
);
exit
(
EXIT_FAILURE
);
}
}
// for user
else
if
(
strcmp
(
argv
[
i
],
"-u"
)
==
0
)
{
}
else
if
(
strcmp
(
argv
[
i
],
"-u"
)
==
0
)
{
if
(
i
<
argc
-
1
)
{
arguments
->
user
=
argv
[
++
i
];
}
else
{
fprintf
(
stderr
,
"option -u requires an argument
\n
"
);
exit
(
EXIT_FAILURE
);
}
}
else
if
(
strcmp
(
argv
[
i
],
"-A"
)
==
0
)
{
}
else
if
((
strncmp
(
argv
[
i
],
"-p"
,
2
)
==
0
)
||
(
strncmp
(
argv
[
i
],
"--password"
,
10
)
==
0
))
{
continue
;
}
else
if
(
strcmp
(
argv
[
i
],
"-a"
)
==
0
)
{
if
(
i
<
argc
-
1
)
{
arguments
->
auth
=
argv
[
++
i
];
}
else
{
fprintf
(
stderr
,
"option -
A
requires an argument
\n
"
);
fprintf
(
stderr
,
"option -
a
requires an argument
\n
"
);
exit
(
EXIT_FAILURE
);
}
}
else
if
(
strcmp
(
argv
[
i
],
"-A"
)
==
0
)
{
arguments
->
is_gen_auth
=
true
;
}
else
if
(
strcmp
(
argv
[
i
],
"-c"
)
==
0
)
{
if
(
i
<
argc
-
1
)
{
char
*
tmp
=
argv
[
++
i
];
if
(
strlen
(
tmp
)
>=
TSDB_FILENAME_LEN
)
{
fprintf
(
stderr
,
"config file path: %s overflow max len %d
\n
"
,
tmp
,
TSDB_FILENAME_LEN
-
1
);
exit
(
EXIT_FAILURE
);
}
strcpy
(
configDir
,
tmp
);
arguments
->
cfgdir
=
argv
[
++
i
];
}
else
{
fprintf
(
stderr
,
"Option -c requires an argument
\n
"
);
exit
(
EXIT_FAILURE
);
}
}
else
if
(
strcmp
(
argv
[
i
],
"-C"
)
==
0
)
{
arguments
->
dump_config
=
true
;
arguments
->
is_
dump_config
=
true
;
}
else
if
(
strcmp
(
argv
[
i
],
"-s"
)
==
0
)
{
if
(
i
<
argc
-
1
)
{
arguments
->
commands
=
argv
[
++
i
];
...
...
@@ -150,176 +111,238 @@ void shellParseArgs(int argc, char *argv[], SShellArgs *arguments) {
}
}
else
if
(
strcmp
(
argv
[
i
],
"-r"
)
==
0
)
{
arguments
->
is_raw_time
=
true
;
}
// For temperory batch commands to run TODO
else
if
(
strcmp
(
argv
[
i
],
"-f"
)
==
0
)
{
}
else
if
(
strcmp
(
argv
[
i
],
"-f"
)
==
0
)
{
if
(
i
<
argc
-
1
)
{
strcpy
(
arguments
->
file
,
argv
[
++
i
]);
}
else
{
fprintf
(
stderr
,
"option -f requires an argument
\n
"
);
exit
(
EXIT_FAILURE
);
}
}
// for default database
else
if
(
strcmp
(
argv
[
i
],
"-d"
)
==
0
)
{
}
else
if
(
strcmp
(
argv
[
i
],
"-d"
)
==
0
)
{
if
(
i
<
argc
-
1
)
{
arguments
->
database
=
argv
[
++
i
];
}
else
{
fprintf
(
stderr
,
"option -d requires an argument
\n
"
);
exit
(
EXIT_FAILURE
);
}
}
// For time zone
else
if
(
strcmp
(
argv
[
i
],
"-t"
)
==
0
)
{
}
else
if
(
strcmp
(
argv
[
i
],
"-k"
)
==
0
)
{
arguments
->
is_check
=
true
;
}
else
if
(
strcmp
(
argv
[
i
],
"-t"
)
==
0
)
{
arguments
->
is_startup
=
true
;
}
else
if
(
strcmp
(
argv
[
i
],
"-w"
)
==
0
)
{
if
(
i
<
argc
-
1
)
{
arguments
->
timezone
=
argv
[
++
i
];
arguments
->
displayWidth
=
argv
[
++
i
];
}
else
{
fprintf
(
stderr
,
"option -
t
requires an argument
\n
"
);
fprintf
(
stderr
,
"option -
w
requires an argument
\n
"
);
exit
(
EXIT_FAILURE
);
}
}
else
if
(
strcmp
(
argv
[
i
],
"-n"
)
==
0
)
{
}
else
if
(
strcmp
(
argv
[
i
],
"-n"
)
==
0
)
{
if
(
i
<
argc
-
1
)
{
arguments
->
netTestRole
=
argv
[
++
i
];
}
else
{
fprintf
(
stderr
,
"option -n requires an argument
\n
"
);
exit
(
EXIT_FAILURE
);
}
}
else
if
(
strcmp
(
argv
[
i
],
"-l"
)
==
0
)
{
}
else
if
(
strcmp
(
argv
[
i
],
"-l"
)
==
0
)
{
if
(
i
<
argc
-
1
)
{
arguments
->
pktLen
=
atoi
(
argv
[
++
i
]);
}
else
{
fprintf
(
stderr
,
"option -l requires an argument
\n
"
);
exit
(
EXIT_FAILURE
);
}
}
else
if
(
strcmp
(
argv
[
i
],
"-N"
)
==
0
)
{
}
else
if
(
strcmp
(
argv
[
i
],
"-N"
)
==
0
)
{
if
(
i
<
argc
-
1
)
{
arguments
->
pktNum
=
atoi
(
argv
[
++
i
]);
}
else
{
fprintf
(
stderr
,
"option -N requires an argument
\n
"
);
exit
(
EXIT_FAILURE
);
}
}
else
if
(
strcmp
(
argv
[
i
],
"-S"
)
==
0
)
{
}
else
if
(
strcmp
(
argv
[
i
],
"-S"
)
==
0
)
{
if
(
i
<
argc
-
1
)
{
arguments
->
pktType
=
argv
[
++
i
];
}
else
{
fprintf
(
stderr
,
"option -S requires an argument
\n
"
);
exit
(
EXIT_FAILURE
);
}
}
else
if
(
strcmp
(
argv
[
i
],
"-V"
)
==
0
)
{
printVersion
();
exit
(
EXIT_SUCCESS
);
}
// For temperory command TODO
else
if
(
strcmp
(
argv
[
i
],
"--help"
)
==
0
)
{
printHelp
();
exit
(
EXIT_SUCCESS
);
}
else
if
(
strcmp
(
argv
[
i
],
"-V"
)
==
0
)
{
arguments
->
is_version
=
true
;
}
else
if
(
strcmp
(
argv
[
i
],
"--help"
)
==
0
)
{
arguments
->
is_help
=
true
;
}
else
{
fprintf
(
stderr
,
"wrong options
\n
"
);
printHelp
();
exit
(
EXIT_FAILURE
);
arguments
->
is_help
=
true
;
}
}
}
void
shellPrintContinuePrompt
()
{
printf
(
"%s"
,
CONTINUE_PROMPT
);
}
#else
void
shellPrintPrompt
()
{
printf
(
"%s"
,
PROMPT_HEADER
);
}
#include <argp.h>
#include <termio.h>
const
char
*
argp_program_version
=
version
;
const
char
*
argp_program_bug_address
=
"<support@taosdata.com>"
;
void
updateBuffer
(
Command
*
cmd
)
{
if
(
shellRegexMatch
(
cmd
->
buffer
,
"(
\\
s+$)|(^$)"
,
REG_EXTENDED
))
strcat
(
cmd
->
command
,
" "
);
strcat
(
cmd
->
buffer
,
cmd
->
command
);
static
struct
argp_option
shellOptions
[]
=
{
{
"host"
,
'h'
,
"HOST"
,
0
,
"TDengine server FQDN to connect. The default host is localhost."
},
{
"port"
,
'P'
,
"PORT"
,
0
,
"The TCP/IP port number to use for the connection."
},
{
"user"
,
'u'
,
"USER"
,
0
,
"The user name to use when connecting to the server."
},
{
"password"
,
'p'
,
"PASSWORD"
,
0
,
"The password to use when connecting to the server."
},
{
"auth"
,
'a'
,
"AUTH"
,
0
,
"The auth string to use when connecting to the server."
},
{
"generate-auth"
,
'A'
,
0
,
0
,
"Generate auth string from password."
},
{
"config-dir"
,
'c'
,
"CONFIG_DIR"
,
0
,
"Configuration directory."
},
{
"dump-config"
,
'C'
,
0
,
0
,
"Dump configuration."
},
{
"commands"
,
's'
,
"COMMANDS"
,
0
,
"Commands to run without enter the shell."
},
{
"raw-time"
,
'r'
,
0
,
0
,
"Output time as uint64_t."
},
{
"file"
,
'f'
,
"FILE"
,
0
,
"Script to run without enter the shell."
},
{
"database"
,
'd'
,
"DATABASE"
,
0
,
"Database to use when connecting to the server."
},
{
"check"
,
'k'
,
0
,
0
,
"Check the service status."
},
{
"startup"
,
't'
,
0
,
0
,
"Check the details of the service status."
},
{
"display-width"
,
'w'
,
0
,
0
,
"Set the default binary display width."
},
{
"netrole"
,
'n'
,
"NETROLE"
,
0
,
"Net role when network connectivity test, options: client|server."
},
{
"pktlen"
,
'l'
,
"PKTLEN"
,
0
,
"Packet length used for net test, default is 1000 bytes."
},
{
"pktnum"
,
'N'
,
"PKTNUM"
,
0
,
"Packet numbers used for net test, default is 100."
},
{
"version"
,
'V'
,
0
,
0
,
"Print client version number."
},
{
0
},
};
memset
(
cmd
->
command
,
0
,
MAX_COMMAND_SIZE
);
cmd
->
cursorOffset
=
0
;
}
int
isReadyGo
(
Command
*
cmd
)
{
char
*
total
=
taosMemoryMalloc
(
MAX_COMMAND_SIZE
);
memset
(
total
,
0
,
MAX_COMMAND_SIZE
);
sprintf
(
total
,
"%s%s"
,
cmd
->
buffer
,
cmd
->
command
);
static
error_t
shellParseOpt
(
int32_t
key
,
char
*
arg
,
struct
argp_state
*
state
)
{
SShellArgs
*
arguments
=
&
shell
.
args
;
wordexp_t
full_path
=
{
0
};
char
*
reg_str
=
"(^.*;
\\
s*$)|(^
\\
s*$)|(^
\\
s*exit
\\
s*$)|(^
\\
s*q
\\
s*$)|(^
\\
s*quit
\\
s*$)|(^"
"
\\
s*clear
\\
s*$)"
;
if
(
shellRegexMatch
(
total
,
reg_str
,
REG_EXTENDED
|
REG_ICASE
))
{
taosMemoryFree
(
total
);
return
1
;
switch
(
key
)
{
case
'h'
:
arguments
->
host
=
arg
;
break
;
case
'P'
:
arguments
->
port
=
atoi
(
arg
);
break
;
case
'u'
:
arguments
->
user
=
arg
;
break
;
case
'p'
:
break
;
case
'a'
:
arguments
->
auth
=
arg
;
break
;
case
'A'
:
arguments
->
is_gen_auth
=
true
;
break
;
case
'c'
:
arguments
->
cfgdir
=
arg
;
break
;
case
'C'
:
arguments
->
is_dump_config
=
true
;
break
;
case
's'
:
arguments
->
commands
=
arg
;
break
;
case
'r'
:
arguments
->
is_raw_time
=
true
;
break
;
case
'f'
:
arguments
->
file
=
arg
;
break
;
case
'd'
:
arguments
->
database
=
arg
;
break
;
case
'k'
:
arguments
->
is_check
=
true
;
break
;
case
't'
:
arguments
->
is_startup
=
true
;
break
;
case
'w'
:
arguments
->
displayWidth
=
atoi
(
arg
);
break
;
case
'n'
:
arguments
->
netrole
=
arg
;
break
;
case
'l'
:
arguments
->
pktLen
=
atoi
(
arg
);
break
;
case
'N'
:
arguments
->
pktNum
=
atoi
(
arg
);
break
;
case
'V'
:
arguments
->
is_version
=
true
;
break
;
case
1
:
arguments
->
abort
=
1
;
break
;
default:
return
ARGP_ERR_UNKNOWN
;
}
taosMemoryFree
(
total
);
return
0
;
}
void
insertChar
(
Command
*
cmd
,
char
c
)
{
// TODO: Check if the length enough.
if
(
cmd
->
cursorOffset
>=
MAX_COMMAND_SIZE
)
{
fprintf
(
stdout
,
"sql is larger than %d bytes"
,
MAX_COMMAND_SIZE
);
return
;
}
static
struct
argp
shellArgp
=
{
shellOptions
,
shellParseOpt
,
""
,
""
};
cmd
->
command
[
cmd
->
cursorOffset
++
]
=
c
;
static
void
shellParseArgsInLinux
(
int
argc
,
char
*
argv
[])
{
argp_program_version
=
shell
.
info
.
programVersion
;
argp_parse
(
&
shellArgp
,
argc
,
argv
,
0
,
0
,
NULL
);
}
int32_t
shellReadCommand
(
TAOS
*
con
,
char
command
[])
{
Command
cmd
;
memset
(
&
cmd
,
0
,
sizeof
(
cmd
));
cmd
.
buffer
=
(
char
*
)
taosMemoryCalloc
(
1
,
MAX_COMMAND_SIZE
);
cmd
.
command
=
(
char
*
)
taosMemoryCalloc
(
1
,
MAX_COMMAND_SIZE
);
#endif
// Read input.
char
c
;
while
(
1
)
{
c
=
getchar
();
switch
(
c
)
{
case
'\n'
:
case
'\r'
:
if
(
isReadyGo
(
&
cmd
))
{
sprintf
(
command
,
"%s%s"
,
cmd
.
buffer
,
cmd
.
command
);
taosMemoryFree
(
cmd
.
buffer
);
cmd
.
buffer
=
NULL
;
taosMemoryFree
(
cmd
.
command
);
cmd
.
command
=
NULL
;
return
0
;
}
else
{
shellPrintContinuePrompt
();
updateBuffer
(
&
cmd
);
static
void
shellInitArgs
(
int
argc
,
char
*
argv
[])
{
for
(
int
i
=
1
;
i
<
argc
;
i
++
)
{
if
((
strncmp
(
argv
[
i
],
"-p"
,
2
)
==
0
)
||
(
strncmp
(
argv
[
i
],
"--password"
,
10
)
==
0
))
{
printf
(
shell
.
info
.
clientVersion
,
tsOsName
,
taos_get_client_info
());
if
((
strlen
(
argv
[
i
])
==
2
)
||
(
strncmp
(
argv
[
i
],
"--password"
,
10
)
==
0
))
{
printf
(
"Enter password: "
);
taosSetConsoleEcho
(
false
);
if
(
scanf
(
"%20s"
,
shell
.
args
.
password
)
>
1
)
{
fprintf
(
stderr
,
"password reading error
\n
"
);
}
break
;
default:
insertChar
(
&
cmd
,
c
);
taosSetConsoleEcho
(
true
);
if
(
EOF
==
getchar
())
{
fprintf
(
stderr
,
"getchar() return EOF
\n
"
);
}
}
else
{
tstrncpy
(
shell
.
args
.
password
,
(
char
*
)(
argv
[
i
]
+
2
),
sizeof
(
shell
.
args
.
password
));
strcpy
(
argv
[
i
],
"-p"
);
}
}
}
if
(
strlen
(
shell
.
args
.
password
)
==
0
)
{
tstrncpy
(
shell
.
args
.
password
,
TSDB_DEFAULT_PASS
,
sizeof
(
shell
.
args
.
password
));
}
return
0
;
shell
.
args
.
pktLen
=
1024
;
shell
.
args
.
pktNum
=
100
;
shell
.
args
.
displayWidth
=
SHELL_DEFAULT_MAX_BINARY_DISPLAY_WIDTH
;
shell
.
args
.
user
=
TSDB_DEFAULT_USER
;
}
void
*
shellThreadLoop
(
void
*
arg
)
{
TAOS
*
con
=
(
TAOS
*
)
arg
;
char
*
command
=
taosMemoryMalloc
(
MAX_COMMAND_SIZE
);
if
(
command
==
NULL
)
return
NULL
;
static
int32_t
shellCheckArgs
()
{
return
0
;
}
int32_t
err
=
0
;
int32_t
shellParseArgs
(
int32_t
argc
,
char
*
argv
[])
{
shellInitArgs
(
argc
,
argv
);
shell
.
info
.
clientVersion
=
"Welcome to the TDengine shell from %s, Client Version:%s
\n
"
"Copyright (c) 2020 by TAOS Data, Inc. All rights reserved.
\n\n
"
;
shell
.
info
.
promptHeader
=
"taos> "
;
shell
.
info
.
promptContinue
=
" -> "
;
shell
.
info
.
promptSize
=
6
;
snprintf
(
shell
.
info
.
programVersion
,
sizeof
(
shell
.
info
.
programVersion
),
"version: %s
\n
"
,
version
);
do
{
memset
(
command
,
0
,
MAX_COMMAND_SIZE
);
shellPrintPrompt
();
#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
shell
.
info
.
osname
=
"Windows"
;
snprintf
(
shell
.
history
.
file
,
TSDB_FILENAME_LEN
,
"C:/TDengine/%s"
,
SHELL_HISTORY_FILE
);
shellParseArgsInLinuxAndDarwin
();
#elif defined(_TD_DARWIN_64)
shell
.
info
.
osname
=
"Darwin"
;
snprintf
(
shell
.
history
.
file
,
TSDB_FILENAME_LEN
,
"%s/%s"
,
getpwuid
(
getuid
())
->
pw_dir
,
SHELL_HISTORY_FILE
);
shellParseArgsInLinuxAndDarwin
();
#else
shell
.
info
.
osname
=
"Linux"
;
snprintf
(
shell
.
history
.
file
,
TSDB_FILENAME_LEN
,
"%s/%s"
,
getenv
(
"HOME"
),
SHELL_HISTORY_FILE
);
shellParseArgsInLinux
(
argc
,
argv
);
#endif
// Read command from shell.
err
=
shellReadCommand
(
con
,
command
);
if
(
err
)
{
break
;
}
}
while
(
shellRunCommand
(
con
,
command
)
==
0
);
if
(
shell
.
args
.
abort
)
{
return
-
1
;
}
return
NULL
;
return
shellCheckArgs
()
;
}
void
shellHistoryPath
(
char
*
history
)
{
sprintf
(
history
,
"C:/TDengine/%s"
,
HISTORY_FILE
);
}
void
shellExit
()
{
exit
(
EXIT_SUCCESS
);
}
tools/shell/src/shellCommand.c
浏览文件 @
d2d51961
此差异已折叠。
点击以展开。
tools/shell/src/shellEngine.c
浏览文件 @
d2d51961
此差异已折叠。
点击以展开。
tools/shell/src/shellMain.c
浏览文件 @
d2d51961
此差异已折叠。
点击以展开。
tools/shell/src/shell
T
est.c
→
tools/shell/src/shell
Nett
est.c
浏览文件 @
d2d51961
...
...
@@ -13,27 +13,32 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#define _DEFAULT_SOURCE
#define _GNU_SOURCE
#include "shellInt.h"
void
shellTestNetWork
()
{}
#if 0
#define ALLOW_FORBID_FUNC
#include "os.h"
#include "rpcHead.h"
#include "syncMsg.h"
#include "taosdef.h"
#include "tmsg.h"
#include "taoserror.h"
#include "t
log
.h"
#include "t
checksum
.h"
#include "tglobal.h"
#include "tlog.h"
#include "tmsg.h"
#include "trpc.h"
#include "rpcHead.h"
#include "tchecksum.h"
#include "syncMsg.h"
#include "osSocket.h"
#define MAX_PKG_LEN (64 * 1000)
#define MAX_PKG_LEN
(64 * 1000)
#define MAX_SPEED_PKG_LEN (1024 * 1024 * 1024)
#define MIN_SPEED_PKG_LEN 1024
#define MAX_SPEED_PKG_NUM 10000
#define MIN_SPEED_PKG_NUM 1
#define BUFFER_SIZE (MAX_PKG_LEN + 1024)
#define BUFFER_SIZE
(MAX_PKG_LEN + 1024)
extern int tsRpcMaxUdpSize;
...
...
@@ -321,9 +326,8 @@ static int32_t taosNetCheckUdpPort(STestInfo *info) {
iDataNum = recvfrom(clientSocket, buffer, BUFFER_SIZE, 0, (struct sockaddr *)&serverAddr, &sin_size);
if (iDataNum < 0 || iDataNum != info->pktLen) {
uError
(
"UDP: received ack:%d bytes(expect:%d) from port:%d since %s"
,
iDataNum
,
info
->
pktLen
,
info
->
port
,
strerror
(
errno
));
taosCloseSocket
(
&
pSocket
);
return
-
1
;
uError("UDP: received ack:%d bytes(expect:%d) from port:%d since %s", iDataNum, info->pktLen, info->port,
strerror(errno)); taosCloseSocket(&pSocket); return -1;
}
taosCloseSocket(&pSocket);
...
...
@@ -408,7 +412,7 @@ static void taosNetTestServer(char *host, int32_t startPort, int32_t pkgLen) {
static void taosNetCheckSpeed(char *host, int32_t port, int32_t pkgLen,
int32_t pkgNum, char *pkgType) {
#if 0
// record config
int32_t compressTmp = tsCompressMsgSize;
int32_t maxUdpSize = tsRpcMaxUdpSize;
...
...
@@ -468,11 +472,13 @@ static void taosNetCheckSpeed(char *host, int32_t port, int32_t pkgLen,
uint64_t endTime = taosGetTimestampUs();
uint64_t el = endTime - startTime;
printf("progress:%5d/%d\tstatus:%d\tcost:%8.2lf ms\tspeed:%8.2lf MB/s\n", i, pkgNum, code, el/1000.0, pkgLen/(el/1000000.0)/1024.0/1024.0);
printf("progress:%5d/%d\tstatus:%d\tcost:%8.2lf ms\tspeed:%8.2lf MB/s\n", i, pkgNum, code, el/1000.0,
pkgLen/(el/1000000.0)/1024.0/1024.0);
}
int64_t endT = taosGetTimestampUs();
uint64_t elT = endT - startT;
printf("\ntotal succ:%5d/%d\tcost:%8.2lf ms\tspeed:%8.2lf MB/s\n", totalSucc, pkgNum, elT/1000.0, pkgLen/(elT/1000000.0)/1024.0/1024.0*totalSucc);
printf("\ntotal succ:%5d/%d\tcost:%8.2lf ms\tspeed:%8.2lf MB/s\n", totalSucc, pkgNum, elT/1000.0,
pkgLen/(elT/1000000.0)/1024.0/1024.0*totalSucc);
rpcClose(pRpcConn);
...
...
@@ -512,3 +518,5 @@ void taosNetTest(char *role, char *host, int32_t port, int32_t pkgLen, int32_t p
tsLogEmbedded = 0;
}
#endif
\ No newline at end of file
tools/shell/src/shellUtil.c
0 → 100644
浏览文件 @
d2d51961
/*
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
*
* This program is free software: you can use, redistribute, and/or modify
* it under the terms of the GNU Affero General Public License, version 3
* or later ("AGPL"), as published by the Free Software Foundation.
*
* 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.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#define _BSD_SOURCE
#define _GNU_SOURCE
#define _XOPEN_SOURCE
#define _DEFAULT_SOURCE
#include "shellInt.h"
bool
shellRegexMatch
(
const
char
*
s
,
const
char
*
reg
,
int32_t
cflags
)
{
regex_t
regex
;
char
msgbuf
[
100
]
=
{
0
};
/* Compile regular expression */
if
(
regcomp
(
&
regex
,
reg
,
cflags
)
!=
0
)
{
fprintf
(
stderr
,
"Fail to compile regex"
);
return
false
;
}
/* Execute regular expression */
int32_t
reti
=
regexec
(
&
regex
,
s
,
0
,
NULL
,
0
);
if
(
!
reti
)
{
regfree
(
&
regex
);
return
true
;
}
else
if
(
reti
==
REG_NOMATCH
)
{
regfree
(
&
regex
);
return
false
;
}
else
{
regerror
(
reti
,
&
regex
,
msgbuf
,
sizeof
(
msgbuf
));
fprintf
(
stderr
,
"Regex match failed: %s
\n
"
,
msgbuf
);
regfree
(
&
regex
);
return
false
;
}
return
false
;
}
int32_t
shellCheckIntSize
()
{
if
(
sizeof
(
int8_t
)
!=
1
)
{
printf
(
"taos int8 size is %d(!= 1)"
,
(
int
)
sizeof
(
int8_t
));
return
-
1
;
}
if
(
sizeof
(
int16_t
)
!=
2
)
{
printf
(
"taos int16 size is %d(!= 2)"
,
(
int
)
sizeof
(
int16_t
));
return
-
1
;
}
if
(
sizeof
(
int32_t
)
!=
4
)
{
printf
(
"taos int32 size is %d(!= 4)"
,
(
int
)
sizeof
(
int32_t
));
return
-
1
;
}
if
(
sizeof
(
int64_t
)
!=
8
)
{
printf
(
"taos int64 size is %d(!= 8)"
,
(
int
)
sizeof
(
int64_t
));
return
-
1
;
}
return
0
;
}
void
shellPrintVersion
()
{
printf
(
"version: %s
\n
"
,
version
);
}
void
shellGenerateAuth
()
{}
void
shellDumpConfig
()
{
SConfig
*
pCfg
=
taosGetCfg
();
if
(
pCfg
==
NULL
)
{
printf
(
"TDengine read global config failed!
\n
"
);
}
else
{
cfgDumpCfg
(
pCfg
,
1
,
1
);
}
}
void
shellCheckServerStatus
()
{
TSDB_SERVER_STATUS
code
;
do
{
char
details
[
1024
]
=
{
0
};
code
=
taos_check_server_status
(
shell
.
args
.
host
,
shell
.
args
.
port
,
details
,
1024
);
switch
(
code
)
{
case
TSDB_SRV_STATUS_UNAVAILABLE
:
printf
(
"0: unavailable
\n
"
);
break
;
case
TSDB_SRV_STATUS_NETWORK_OK
:
printf
(
"1: network ok
\n
"
);
break
;
case
TSDB_SRV_STATUS_SERVICE_OK
:
printf
(
"2: service ok
\n
"
);
break
;
case
TSDB_SRV_STATUS_SERVICE_DEGRADED
:
printf
(
"3: service degraded
\n
"
);
break
;
case
TSDB_SRV_STATUS_EXTING
:
printf
(
"4: exiting
\n
"
);
break
;
}
if
(
strlen
(
details
)
!=
0
)
{
printf
(
"%s
\n\n
"
,
details
);
}
if
(
code
==
TSDB_SRV_STATUS_NETWORK_OK
&&
shell
.
args
.
is_startup
)
{
taosMsleep
(
1000
);
}
else
{
break
;
}
}
while
(
1
);
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录