mirror of
https://github.com/Ascend/ascend-docker-runtime.git
synced 2025-10-10 14:10:08 +08:00
Match-id-737d601f866e7f67e6759de16b6f5541d2d1ded4
This commit is contained in:
119
cli/src/main.c
119
cli/src/main.c
@@ -49,7 +49,8 @@ static bool DevicesCmdArgParser(struct CmdArgs *args, const char *arg)
|
||||
{
|
||||
errno_t err = strcpy_s(args->devices, BUF_SIZE, arg);
|
||||
if (err != EOK) {
|
||||
Logger("failed to get devices from cmd args.", 2);
|
||||
char msg[] = "failed to get devices from cmd args.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -61,12 +62,18 @@ static bool PidCmdArgParser(struct CmdArgs *args, const char *arg)
|
||||
errno = 0;
|
||||
args->pid = strtol(optarg, NULL, DECIMAL);
|
||||
if (errno != 0) {
|
||||
Logger(FormatMessage("failed to convert pid string from cmd args, pid string: %s.", arg), 2);
|
||||
int iLength = 0;
|
||||
char* str = FormatLogMessage("failed to convert pid string from cmd args, pid string: %s.", &iLength, arg);
|
||||
Logger(str, LEVEL_ERROR, iLength);
|
||||
free(str);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (args->pid <= 0) {
|
||||
Logger(FormatMessage("invalid pid %d.", args->pid), 2);
|
||||
int iLength = 0;
|
||||
char* str = FormatLogMessage("invalid pid %d.", &iLength, args->pid);
|
||||
Logger(str, LEVEL_ERROR, iLength);
|
||||
free(str);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -77,7 +84,8 @@ static bool RootfsCmdArgParser(struct CmdArgs *args, const char *arg)
|
||||
{
|
||||
errno_t err = strcpy_s(args->rootfs, BUF_SIZE, arg);
|
||||
if (err != EOK) {
|
||||
Logger("failed to get rootfs path from cmd args", 2);
|
||||
char msg[] = "failed to get rootfs path from cmd args";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -88,7 +96,8 @@ static bool OptionsCmdArgParser(struct CmdArgs *args, const char *arg)
|
||||
{
|
||||
errno_t err = strcpy_s(args->options, BUF_SIZE, arg);
|
||||
if (err != EOK) {
|
||||
Logger("failed to get options string from cmd args", 2);
|
||||
char msg[] = "failed to get options string from cmd args";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -98,14 +107,20 @@ static bool OptionsCmdArgParser(struct CmdArgs *args, const char *arg)
|
||||
static bool MountFileCmdArgParser(struct CmdArgs *args, const char *arg)
|
||||
{
|
||||
if (args->files.count == MAX_MOUNT_NR) {
|
||||
Logger(FormatMessage("too many files to mount, max number is %u", MAX_MOUNT_NR), 2);
|
||||
int iLength = 0;
|
||||
char* str = FormatLogMessage("too many files to mount, max number is %u", &iLength, MAX_MOUNT_NR);
|
||||
Logger(str, LEVEL_ERROR, iLength);
|
||||
free(str);
|
||||
return -1;
|
||||
}
|
||||
|
||||
char *dst = &args->files.list[args->files.count++][0];
|
||||
errno_t err = strcpy_s(dst, PATH_MAX, arg);
|
||||
if (err != EOK) {
|
||||
Logger(FormatMessage("failed to copy mount file path: %s", arg), 2);
|
||||
int iLength = 0;
|
||||
char* str = FormatLogMessage("failed to copy mount file path: %s", &iLength, arg);
|
||||
Logger(str, LEVEL_ERROR, iLength);
|
||||
free(str);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -115,14 +130,20 @@ static bool MountFileCmdArgParser(struct CmdArgs *args, const char *arg)
|
||||
static bool MountDirCmdArgParser(struct CmdArgs *args, const char *arg)
|
||||
{
|
||||
if (args->dirs.count == MAX_MOUNT_NR) {
|
||||
Logger(FormatMessage("too many directories to mount, max number is %u", MAX_MOUNT_NR), 2);
|
||||
int iLength = 0;
|
||||
char* str = FormatLogMessage("too many directories to mount, max number is %u", &iLength, MAX_MOUNT_NR);
|
||||
Logger(str, LEVEL_ERROR, iLength);
|
||||
free(str);
|
||||
return -1;
|
||||
}
|
||||
|
||||
char *dst = &args->dirs.list[args->dirs.count++][0];
|
||||
errno_t err = strcpy_s(dst, PATH_MAX, arg);
|
||||
if (err != EOK) {
|
||||
Logger(FormatMessage("error: failed to copy mount directory path: %s", arg), 2);
|
||||
int iLength = 0;
|
||||
char* str = FormatLogMessage("error: failed to copy mount directory path: %s", &iLength, arg);
|
||||
Logger(str, LEVEL_ERROR, iLength);
|
||||
free(str);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -153,12 +174,18 @@ static int ParseOneCmdArg(struct CmdArgs *args, char indicator, const char *valu
|
||||
}
|
||||
|
||||
if (i == NUM_OF_CMD_ARGS) {
|
||||
Logger(FormatMessage("unrecognized cmd arg: indicate char: %c, value: %s.", indicator, value), 2);
|
||||
int iLength = 0;
|
||||
char* str = FormatLogMessage("unrecognized cmd arg: indicate char: %c, value: %s.", &iLength, indicator, value);
|
||||
Logger(str, LEVEL_ERROR, iLength);
|
||||
free(str);
|
||||
return -1;
|
||||
}
|
||||
bool isOK = g_cmdArgParsers[i].parser(args, value);
|
||||
if (!isOK) {
|
||||
Logger(FormatMessage("failed while parsing cmd arg, indicate char: %c, value: %s.", indicator, value), 2);
|
||||
int iLength = 0;
|
||||
char* str = FormatLogMessage("failed while parsing cmd arg, indicate char: %c, value: %s.", &iLength, indicator, value);
|
||||
Logger(str, LEVEL_ERROR, iLength);
|
||||
free(str);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
@@ -179,14 +206,20 @@ static int ParseDeviceIDs(unsigned int *idList, size_t *idListSize, char *device
|
||||
token = strtok_s(devices, sep, &context);
|
||||
while (token != NULL) {
|
||||
if (idx >= *idListSize) {
|
||||
Logger(FormatMessage("too many devices(%u), support %u devices maximally", idx, *idListSize), 2);
|
||||
int iLength = 0;
|
||||
char* str = FormatLogMessage("too many devices(%u), support %u devices maximally", &iLength, idx, *idListSize);
|
||||
Logger(str, LEVEL_ERROR, iLength);
|
||||
free(str);
|
||||
return -1;
|
||||
}
|
||||
|
||||
errno = 0;
|
||||
idList[idx] = strtoul((const char *)token, NULL, DECIMAL);
|
||||
if (errno != 0) {
|
||||
Logger(FormatMessage("failed to convert device id (%s) from cmd args", token), 2);
|
||||
int iLength = 0;
|
||||
char* str = FormatLogMessage("failed to convert device id (%s) from cmd args", &iLength, token);
|
||||
Logger(str, LEVEL_ERROR, iLength);
|
||||
free(str);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -205,38 +238,48 @@ int DoPrepare(const struct CmdArgs *args, struct ParsedConfig *config)
|
||||
|
||||
err = strcpy_s(config->rootfs, BUF_SIZE, args->rootfs);
|
||||
if (err != EOK) {
|
||||
Logger("failed to copy rootfs path to parsed config.", 2);
|
||||
char msg[] = "failed to copy rootfs path to parsed config.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = ParseDeviceIDs(config->devices, &config->devicesNr, (char *)args->devices);
|
||||
if (ret < 0) {
|
||||
Logger("failed to parse device ids from cmdline argument", 2);
|
||||
char msg[] = "failed to parse device ids from cmdline argument";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = GetNsPath(args->pid, "mnt", config->containerNsPath, BUF_SIZE);
|
||||
if (ret < 0) {
|
||||
Logger(FormatMessage("failed to get container mnt ns path: pid(%d).", args->pid), 2);
|
||||
int iLength = 0;
|
||||
char* str = FormatLogMessage("failed to get container mnt ns path: pid(%d).", &iLength, args->pid);
|
||||
Logger(str, LEVEL_ERROR, iLength);
|
||||
free(str);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = GetCgroupPath(args->pid, config->cgroupPath, BUF_SIZE);
|
||||
if (ret < 0) {
|
||||
Logger("failed to get cgroup path.", 2);
|
||||
char msg[] = "failed to get cgroup path.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
return -1;
|
||||
}
|
||||
|
||||
char originNsPath[BUF_SIZE] = {0};
|
||||
ret = GetSelfNsPath("mnt", originNsPath, BUF_SIZE);
|
||||
if (ret < 0) {
|
||||
Logger("failed to get self ns path.", 2);
|
||||
char msg[] = "failed to get self ns path.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
return -1;
|
||||
}
|
||||
|
||||
config->originNsFd = open((const char *)originNsPath, O_RDONLY); // proc接口,非外部输入
|
||||
if (config->originNsFd < 0) {
|
||||
Logger(FormatMessage("failed to get self ns fd: %s.", originNsPath), 2);
|
||||
int iLength = 0;
|
||||
char* str = FormatLogMessage("failed to get self ns fd: %s.", &iLength, originNsPath);
|
||||
Logger(str, LEVEL_ERROR, iLength);
|
||||
free(str);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -255,28 +298,34 @@ int SetupContainer(struct CmdArgs *args)
|
||||
|
||||
ret = DoPrepare(args, &config);
|
||||
if (ret < 0) {
|
||||
Logger("failed to prepare nesessary config.", 2);
|
||||
char msg[] = "failed to prepare nesessary config.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
return -1;
|
||||
}
|
||||
|
||||
// enter container's mount namespace
|
||||
ret = EnterNsByPath((const char *)config.containerNsPath, CLONE_NEWNS);
|
||||
if (ret < 0) {
|
||||
Logger(FormatMessage("failed to set to container ns: %s.", config.containerNsPath), 2);
|
||||
int iLength = 0;
|
||||
char* str = FormatLogMessage("failed to set to container ns: %s.", &iLength, config.containerNsPath);
|
||||
Logger(str, LEVEL_ERROR, iLength);
|
||||
free(str);
|
||||
close(config.originNsFd);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = DoMounting(&config);
|
||||
if (ret < 0) {
|
||||
Logger("failed to do mounting.", 2);
|
||||
char msg[] = "failed to do mounting.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
close(config.originNsFd);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = SetupCgroup(&config);
|
||||
if (ret < 0) {
|
||||
Logger("failed to set up cgroup.", 2);
|
||||
char msg[] = "failed to set up cgroup.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
close(config.originNsFd);
|
||||
return -1;
|
||||
}
|
||||
@@ -284,7 +333,8 @@ int SetupContainer(struct CmdArgs *args)
|
||||
// back to original namespace
|
||||
ret = EnterNsByFd(config.originNsFd, CLONE_NEWNS);
|
||||
if (ret < 0) {
|
||||
Logger("failed to set ns back.", 2);
|
||||
char msg[] = "failed to set ns back.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
close(config.originNsFd);
|
||||
return -1;
|
||||
}
|
||||
@@ -300,28 +350,35 @@ int Process(int argc, char **argv)
|
||||
int optionIndex;
|
||||
struct CmdArgs args = {0};
|
||||
|
||||
Logger("runc start prestart-hook ...", 0);
|
||||
char startMsg[] = "runc start prestart-hook ...";
|
||||
Logger(startMsg, LEVEL_INFO, sizeof(startMsg)/sizeof(char));
|
||||
while ((c = getopt_long(argc, argv, "d:p:r:o:f:i", g_cmdOpts, &optionIndex)) != -1) {
|
||||
ret = ParseOneCmdArg(&args, (char)c, optarg);
|
||||
if (ret < 0) {
|
||||
Logger("failed to parse cmd args.", 2);
|
||||
char msg[] = "failed to parse cmd args.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
Logger("verify parameters valid and parse runtime options", 0);
|
||||
char parametersMsg[] = "verify parameters valid and parse runtime options";
|
||||
Logger(parametersMsg, LEVEL_INFO, sizeof(parametersMsg)/sizeof(char));
|
||||
if (!IsCmdArgsValid(&args)) {
|
||||
Logger("information not completed or valid.", 2);
|
||||
char msg[] = "information not completed or valid.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
return -1;
|
||||
}
|
||||
|
||||
ParseRuntimeOptions(args.options);
|
||||
Logger("setup container config", 0);
|
||||
char containerMsg[] = "setup container config";
|
||||
Logger(containerMsg, LEVEL_INFO, sizeof(containerMsg)/sizeof(char));
|
||||
ret = SetupContainer(&args);
|
||||
if (ret < 0) {
|
||||
Logger("failed to setup container.", 2);
|
||||
char msg[] = "failed to setup container.";
|
||||
Logger(msg, LEVEL_ERROR, sizeof(msg)/sizeof(char));
|
||||
return ret;
|
||||
}
|
||||
Logger("prestart-hook setup container successful.", 0);
|
||||
char successMsg[] = "prestart-hook setup container successful.";
|
||||
Logger(successMsg, LEVEL_INFO, sizeof(successMsg)/sizeof(char));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user