1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/jungle-libcli

Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

libcli

библиотека для упаковки командной строки

Примеры

https://happyoj.com/telnet Нажмите connect, затем введите имя пользователя test и пароль Root@123 ! Введите описание изображения

Что такое libcli

libcli — это библиотека для упаковки командной строки, которая может использоваться для управления командной строкой в встраиваемых операционных системах, подобно технологии управления командной строкой в коммутаторах Cisco и H3C.

Какие функции поддерживает libcli

  1. Поддерживает автозавершение команд, автодополнение, помощь по командам, целочисленные параметры, символьные параметры и т. д.
  2. Поддерживает многопользовательскую командную строку vty через протокол telnet.
  3. Поддерживает возможности представлений.
  4. Поддерживает возможности сборки и запуска.
# Пример использования
system>
system>sy
system>system-view
system]dis
system]display  ?
 device                   Device
 user-name                User Name
system]display  device  ?
 slot                     Slot
 <cr>
system]display  device  slot  2
Выполните команду display device slot 2.
system]dis
system]display  ?
 device                   Device
 user-name                User Name
system]display  user-name  ?
 STRING<1-32>             User Name, length range from 1 to 32.
system]display  user-name  jungle  ?
 <cr>
system]display  user-name  jungle
Выполните команду display user-name jungle.
system]dia
system-diagnose]?
 display                  Display
 quit                     Quit from current view
system-diagnose]q
system]q
system>
 system]display  current-configuration
#version 0.0.1
sysname system
#
return
#
``` system]sys
system]sysname Cisco
Cisco]dis cu
Cisco]dis current-configuration
#version 0.0.1
sysname Cisco
#
return
#
Cisco]

Инструкции по использованию

Компиляция

cmake . .
cmake --build . .

Компиляция демонстрационного примера

cmake -D BUILD_DEMO=1 . .
cmake --build . .

Использование библиотеки libcli

  1. Для использования библиотеки libcli необходимо включить заголовочный файл icli.h и при компиляции подключить библиотеку libcli.a, как показано в примере "main.cpp".
link_directories("${CMAKE_CURRENT_SOURCE_DIR}/lib")  # путь к libcli.a
add_executable(cli_tester demo/main.cpp)
target_link_libraries(cli_tester cli)  # подключение библиотеки libcli
  1. Или использование cmake для подключения выпущенной версии
include(FetchContent)
set(LIB_CLI_NAME libcli)
set(LIB_CLI_GIT_TAG v0.0.3)
set(LIB_CLI_GIT_URL https://gitee.com/jungle/${LIB_CLI_NAME}.git)
FetchContent_Declare(
	${LIB_CLI_NAME}
	GIT_REPOSITORY ${LIB_CLI_GIT_URL}
	GIT_TAG ${LIB_CLI_GIT_TAG}
)
FetchContent_MakeAvailable(${LIB_CLI_NAME})
add_executable(cli_tester demo/main.cpp)
target_link_libraries(cli_tester cli)  # Связываем библиотеку libcli
```### Инициализация и запуск библиотеки libcli
1. Сначала вызывается `cmd_init()` для инициализации библиотеки CLI. <br>
2. Затем запускается основной поток библиотеки `cmd_main_entry()`. <br>```cpp
int main()
{
  /* Инициализация */
  cmd_init(0);
  /* Регистрация командной строки */
  reg_cmd();
  reg_cmd2();
  /* Регистрация обратного вызова обработки командной строки */
  (void)cmd_regcallback(MID_TEST, cmd_callback);
  /* Создание основного потока */
  _beginthreadex(NULL, 0, cmd_main_entry, NULL, NULL, NULL);
  for (;;)
  {
  	Sleep(1);
  }
  return 0;
}
  1. Далее используется библиотека libcli для регистрации командной строки, которая выполняется в четыре этапа, каждый из которых необходим.
    Пример:
#define MID_TEST 1
enum CMO_TBLID_EM {
	CMO_TBL_SHOW = 0,
	CMO_TBL_CFG,
};
enum CMO_SHOW_ID_EM {
	CMO_SHOW_SHOW_DEVICE = CMD_ELEMID_DEF(MID_TEST, CMO_TBL_SHOW, 0),
	CMO_SHOW_SHOW_SLOTID,
	CMO_SHOW_SHOW_NAME,
};
ULONG reg_cmd()
{
	CMD_VECTOR_S * vec = NULL;
	/* Четыре этапа регистрации командной строки 1: Запрос вектора команд */
	CMD_VECTOR_NEW(vec);
	/* Четыре этапа регистрации командной строки 2: Определение командного символа */
	/* 1 display */
	cmd_regelement_new(CMD_ELEMID_NULL, CMD_ELEM_TYPE_KEY, "display", "Display", vec);
	/* 2 device */
	cmd_regelement_new(CMO_SHOW_SHOW_DEVICE, CMD_ELEM_TYPE_KEY, "device", "Device", vec);
	/* 3 slot */
	cmd_regelement_new(CMD_ELEMID_NULL, CMD_ELEM_TYPE_KEY, "slot", "Slot", vec);
	/* 4 slot-id */
	cmd_regelement_new(CMO_SHOW_SHOW_SLOTID, CMD_ELEM_TYPE_INTEGER, "INTEGER<0-8>", "Slot ID", vec);
	/* 5 user-name */
	cmd_regelement_new(CMD_ELEMID_NULL, CMD_ELEM_TYPE_KEY, "user-name", "User Name", vec);
	/* 6 user-name-value */
	cmd_regelement_new(CMO_SHOW_SHOW_NAME, CMD_ELEM_TYPE_STRING, "STRING<1-32>", "User Name, length range from 1 to 32.", vec);
	/* Четыре этапа регистрации командной строки 3: Регистрация командной строки */
	cmd_install_command(MID_TEST, VIEW_GLOBAL, " 1 2 ", vec); /* display device */
	cmd_install_command(MID_TEST, VIEW_GLOBAL, " 1 2 3 4 ", vec); /* display device slot <slot-id> */
	cmd_install_command(MID_TEST, VIEW_GLOBAL, " 1 5 6 ", vec); /* display user-name <user-name-value> */
```### Командная строка: освобождение вектора командной строки 4```c
CMD_VECTOR_FREE(vec);
return 0;

Здесь следует отметить, что при регистрации команды командной строки с помощью cmd_install_command, третий параметр представляет собой выражение, состоящее из чисел, которые представляют элементы команд, определенные ранее с помощью cmd_regelement_new, и составляют полную команду.

Регистрация обратного вызова обработки командной строки

ULONG show_callback(VOID *pRcvMsg)
{
	ULONG iLoop = 0;
	ULONG iElemNum = 0;
	ULONG iElemID = 0;
	VOID *pElem = NULL;
	ULONG vtyId = 0;
	ULONG SlotId = 0xFFFFFFFF;
	ULONG isDevice = 0;
	ULONG isUsername = 0;
	CHAR szName[32] = {0};

	vtyId = cmd_get_vty_id(pRcvMsg);
	iElemNum = cmd_get_elem_num(pRcvMsg);

	for (iLoop = 0; iLoop < iElemNum; iLoop++)
	{
		pElem = cmd_get_elem_by_index(pRcvMsg, iLoop);
		iElemID = cmd_get_elemid(pElem);

		switch (iElemID)
		{
			case CMO_SHOW_SHOW_DEVICE:
				isDevice = 1;
				break;
			case CMO_SHOW_SHOW_SLOTID:
				SlotId = cmd_get_ulong_param(pElem);
				break;
			case CMO_SHOW_SHOW_NAME:
				isUsername = 1;
				cmd_copy_string_param(pElem, szName);
				break;
			default:
				break;
		}
	}

	if (SlotId != 0xFFFFFFFF)
	{
		vty_printf(vtyId, "Выполняется команда отображения устройства слота %u.\r\n", SlotId);
		return 0;
	}

	if (isDevice)
	{
		vty_printf(vtyId, "Выполняется команда отображения устройства.\r\n");
		return 0;
	}

	if (isUsername)
	{
		vty_printf(vtyId, "Выполняется команда отображения имени пользователя %s.\r\n", szName);
		return 0;
	}

	return 0;
}

ULONG cmd_callback(VOID *pRcvMsg)
{
	ULONG iRet = 0;
	ULONG iTBLID = 0;

	/* Получение tblid командной строки для обработки команд различных подмодулей */
	iTBLID = cmd_get_first_elem_tblid(pRcvMsg);

	switch (iTBLID)
	{
		case CMO_TBL_SHOW:
			iRet = show_callback(pRcvMsg);
			break;
		case CMO_TBL_CFG:
			iRet = cfg_callback(pRcvMsg);
			break;
		default:
			break;
	}
}
``````markdown
return iRet;
}

(void)cmd_regcallback(MID_TEST, cmd_callback);

Примечание

Шаги обработки командной строки в функции show_callback являются фиксированными.

Проекты, использующие libcli

  1. https://gitee.com/jungle/online-judge Этот проект использует libcli для реализации многопользовательской командной строки посредством протокола Telnet.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Libcli — это интерфейс командной строки, консоль, которая помогает пользователям отправлять команды программе. Может использоваться в качестве интерфейса для настройки и управления конфигурацией командных строк во встраиваемых устройствах. Поддерживает функции командной строки, автодополнения, помощи по командной строке, форматирования парамет... Развернуть Свернуть
GPL-2.0
Отмена

Обновления (4)

все

Участники

все

Язык

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/jungle-libcli.git
git@api.gitlife.ru:oschina-mirror/jungle-libcli.git
oschina-mirror
jungle-libcli
jungle-libcli
master