| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| #include <pwd.h> |
| #include <stdio.h> |
| #include <sys/types.h> |
| |
| //command definitions |
| enum command { |
| INITIALIZE_JOB = 0, |
| LAUNCH_TASK_JVM = 1, |
| SIGNAL_TASK = 2, |
| DELETE_AS_USER = 3, |
| }; |
| |
| enum errorcodes { |
| INVALID_ARGUMENT_NUMBER = 1, |
| INVALID_USER_NAME, //2 |
| INVALID_COMMAND_PROVIDED, //3 |
| SUPER_USER_NOT_ALLOWED_TO_RUN_TASKS, //4 |
| INVALID_TT_ROOT, //5 |
| SETUID_OPER_FAILED, //6 |
| UNABLE_TO_EXECUTE_TASK_SCRIPT, //7 |
| UNABLE_TO_KILL_TASK, //8 |
| INVALID_TASK_PID, //9 |
| ERROR_RESOLVING_FILE_PATH, //10 |
| RELATIVE_PATH_COMPONENTS_IN_FILE_PATH, //11 |
| UNABLE_TO_STAT_FILE, //12 |
| FILE_NOT_OWNED_BY_TASKTRACKER, //13 |
| PREPARE_ATTEMPT_DIRECTORIES_FAILED, //14 |
| INITIALIZE_JOB_FAILED, //15 |
| PREPARE_TASK_LOGS_FAILED, //16 |
| INVALID_TT_LOG_DIR, //17 |
| OUT_OF_MEMORY, //18 |
| INITIALIZE_DISTCACHEFILE_FAILED, //19 |
| INITIALIZE_USER_FAILED, //20 |
| UNABLE_TO_BUILD_PATH, //21 |
| INVALID_TASKCONTROLLER_PERMISSIONS, //22 |
| PREPARE_JOB_LOGS_FAILED, //23 |
| INVALID_CONFIG_FILE, // 24 |
| }; |
| |
| #define TT_GROUP_KEY "mapreduce.tasktracker.group" |
| #define USER_DIR_PATTERN "%s/usercache/%s" |
| #define TT_JOB_DIR_PATTERN USER_DIR_PATTERN "/appcache/%s" |
| #define ATTEMPT_DIR_PATTERN TT_JOB_DIR_PATTERN "/%s" |
| #define TASK_SCRIPT "task.sh" |
| #define TT_LOCAL_TASK_DIR_PATTERN TT_JOB_DIR_PATTERN "/%s" |
| #define TT_SYS_DIR_KEY "mapreduce.cluster.local.dir" |
| #define TT_LOG_DIR_KEY "hadoop.log.dir" |
| #define CREDENTIALS_FILENAME "container_tokens" |
| #define MIN_USERID_KEY "min.user.id" |
| #define BANNED_USERS_KEY "banned.users" |
| |
| extern struct passwd *user_detail; |
| |
| // the log file for error messages |
| extern FILE *LOGFILE; |
| |
| // get the executable's filename |
| char* get_executable(); |
| |
| int check_taskcontroller_permissions(char *executable_file); |
| |
| /** |
| * delete a given log directory as a user |
| */ |
| int delete_log_directory(const char *log_dir); |
| |
| // initialize the job directory |
| int initialize_job(const char *user, const char *jobid, |
| const char *credentials, char* const* args); |
| |
| // run the task as the user |
| int run_task_as_user(const char * user, const char *jobid, const char *taskid, |
| const char *work_dir, const char *script_name, |
| const char *cred_file); |
| |
| // send a signal as the user |
| int signal_user_task(const char *user, int pid, int sig); |
| |
| // delete a directory (or file) recursively as the user. The directory |
| // could optionally be relative to the baseDir set of directories (if the same |
| // directory appears on multiple disk volumes, the disk volumes should be passed |
| // as the baseDirs). If baseDirs is not specified, then dir_to_be_deleted is |
| // assumed as the absolute path |
| int delete_as_user(const char *user, |
| const char *dir_to_be_deleted, |
| char* const* baseDirs); |
| |
| // set the task tracker's uid and gid |
| void set_tasktracker_uid(uid_t user, gid_t group); |
| |
| /** |
| * Is the user a real user account? |
| * Checks: |
| * 1. Not root |
| * 2. UID is above the minimum configured. |
| * 3. Not in banned user list |
| * Returns NULL on failure |
| */ |
| struct passwd* check_user(const char *user); |
| |
| // set the user |
| int set_user(const char *user); |
| |
| // methods to get the directories |
| |
| char *get_user_directory(const char *tt_root, const char *user); |
| |
| char *get_job_directory(const char * tt_root, const char *user, |
| const char *jobid); |
| |
| char *get_attempt_work_directory(const char *tt_root, const char *user, |
| const char *job_dir, const char *attempt_id); |
| |
| char *get_task_launcher_file(const char* work_dir); |
| |
| char *get_task_credentials_file(const char* work_dir); |
| |
| /** |
| * Get the job log directory under log_root |
| */ |
| char* get_job_log_directory(const char* log_root, const char* jobid); |
| |
| char *get_task_log_dir(const char *log_dir, const char *job_id, |
| const char *attempt_id); |
| |
| /** |
| * Ensure that the given path and all of the parent directories are created |
| * with the desired permissions. |
| */ |
| int mkdirs(const char* path, mode_t perm); |
| |
| /** |
| * Function to initialize the user directories of a user. |
| */ |
| int initialize_user(const char *user); |
| |
| /** |
| * Create a top level directory for the user. |
| * It assumes that the parent directory is *not* writable by the user. |
| * It creates directories with 02700 permissions owned by the user |
| * and with the group set to the task tracker group. |
| * return non-0 on failure |
| */ |
| int create_directory_for_user(const char* path); |
| |
| int change_user(uid_t user, gid_t group); |