From 84dde5bcb8f7c60e60f366a96ae3c5495b074e4c Mon Sep 17 00:00:00 2001 From: John Yu Date: Mon, 5 Oct 2015 13:04:57 -0700 Subject: [PATCH] added execute-as-user feature. refer to documentation on usage details --- .../azkaban/executor/ExecutorManager.java | 4 +- .../azkaban/executor/JdbcExecutorLoader.java | 4 +- .../java/azkaban/jobExecutor/ProcessJob.java | 67 ++++++++++++------ .../utils/process/AzkabanProcess.java | 44 ++++++++++-- .../utils/process/AzkabanProcessBuilder.java | 24 ++++++- .../java/azkaban/project/ProjectManager.java | 2 +- .../azkaban/server/session/SessionCache.java | 2 +- .../azkaban/trigger/JdbcTriggerLoader.java | 4 +- .../java/azkaban/utils/TypedMapWrapper.java | 2 +- .../main/java/azkaban/utils/cache/Cache.java | 7 +- .../azkaban/executor/JavaJobRunnerMain.java | 2 +- .../azkaban/jobExecutor/PythonJobTest.java | 2 - .../java/azkaban/project/ProjectTest.java | 4 +- .../java/azkaban/utils/cache/CacheTest.java | 52 +++++++------- .../src/main/resources/execute-as-user.c | 58 ++++++--------- build.gradle | 32 ++------- gradle/wrapper/gradle-wrapper.jar | Bin 53638 -> 51348 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 6 +- 19 files changed, 187 insertions(+), 133 deletions(-) diff --git a/azkaban-common/src/main/java/azkaban/executor/ExecutorManager.java b/azkaban-common/src/main/java/azkaban/executor/ExecutorManager.java index 1a46230daf..3eb335bae6 100644 --- a/azkaban-common/src/main/java/azkaban/executor/ExecutorManager.java +++ b/azkaban-common/src/main/java/azkaban/executor/ExecutorManager.java @@ -101,7 +101,7 @@ public class ExecutorManager extends EventHandler implements private ExecutingManagerUpdaterThread executingManager; // 12 weeks private static final long DEFAULT_EXECUTION_LOGS_RETENTION_MS = 3 * 4 * 7 - * 24 * 60 * 60 * 1000L; + * 24 * 60 * 60 * 1000l; private long lastCleanerThreadCheckTime = -1; private long lastThreadCheckTime = -1; @@ -1982,4 +1982,4 @@ private void handleNoExecutorSelectedCase(ExecutionReference reference, queuedFlows.enqueue(exflow, reference); } } -} +} \ No newline at end of file diff --git a/azkaban-common/src/main/java/azkaban/executor/JdbcExecutorLoader.java b/azkaban-common/src/main/java/azkaban/executor/JdbcExecutorLoader.java index a588cca016..d6ffb4b492 100644 --- a/azkaban-common/src/main/java/azkaban/executor/JdbcExecutorLoader.java +++ b/azkaban-common/src/main/java/azkaban/executor/JdbcExecutorLoader.java @@ -104,7 +104,7 @@ private synchronized void uploadExecutableFlow(Connection connection, runner.query(connection, LastInsertID.LAST_INSERT_ID, new LastInsertID()); - if (id == -1L) { + if (id == -1l) { throw new ExecutorManagerException( "Execution id is not properly created."); } @@ -1061,7 +1061,7 @@ private static class LastInsertID implements ResultSetHandler { @Override public Long handle(ResultSet rs) throws SQLException { if (!rs.next()) { - return -1L; + return -1l; } long id = rs.getLong(1); return id; diff --git a/azkaban-common/src/main/java/azkaban/jobExecutor/ProcessJob.java b/azkaban-common/src/main/java/azkaban/jobExecutor/ProcessJob.java index 6881c98fc4..f71e483b3f 100644 --- a/azkaban-common/src/main/java/azkaban/jobExecutor/ProcessJob.java +++ b/azkaban-common/src/main/java/azkaban/jobExecutor/ProcessJob.java @@ -48,9 +48,11 @@ public class ProcessJob extends AbstractProcessJob { "memCheck.freeMemDecrAmt"; public static final String AZKABAN_MEMORY_CHECK = "azkaban.memory.check"; - + public static final String NATIVE_LIB_FOLDER = "azkaban.native.lib"; public static final String EXECUTE_AS_USER = "execute.as.user"; + public static final String EXECUTE_AS_USER_OVERRIDE = + "execute.as.user.override"; public static final String USER_TO_PROXY = "user.to.proxy"; public static final String KRB5CCNAME = "KRB5CCNAME"; @@ -86,7 +88,7 @@ public void run() throws Exception { memPair.getFirst(), memPair.getSecond(), getId())); } } - + List commands = null; try { commands = getCommandList(); @@ -102,29 +104,45 @@ public void run() throws Exception { info(commands.size() + " commands to execute."); File[] propFiles = initPropsFiles(); - + // change krb5ccname env var so that each job execution gets its own cache Map envVars = getEnvironmentVariables(); envVars.put(KRB5CCNAME, getKrb5ccname(jobProps)); - - // determine whether users should be running their jobs as proxyUser/submit user or - // if everybody will run as Azkaban - String executeAsUserBinary = null; - boolean isExecuteAsUser = sysProps.getBoolean(EXECUTE_AS_USER, false); - if(isExecuteAsUser){ - String nativeLibFolder = sysProps.getString(NATIVE_LIB_FOLDER); - executeAsUserBinary = String.format("%s/%s", nativeLibFolder, "execute-as-user"); + + // determine whether to run as Azkaban or run as effectiveUser + String executeAsUserBinary = null; + String effectiveUser = null; + boolean isExecuteAsUser = determineExecuteAsUser(sysProps, jobProps); + + if (isExecuteAsUser) { + String nativeLibFolder = sysProps.getString(NATIVE_LIB_FOLDER); + executeAsUserBinary = + String.format("%s/%s", nativeLibFolder, "execute-as-user"); + effectiveUser = getEffectiveUser(jobProps); + if ("root".equals(effectiveUser)) { + throw new RuntimeException( + "Not permitted to proxy as root through Azkaban"); + } } - + for (String command : commands) { - if(isExecuteAsUser){ - command = String.format("%s %s %s", executeAsUserBinary, getEffectiveUser(jobProps), command); - } - - info("Command: " + command); - AzkabanProcessBuilder builder = - new AzkabanProcessBuilder(partitionCommandLine(command)) - .setEnv(envVars).setWorkingDir(getCwd()).setLogger(getLog()); + AzkabanProcessBuilder builder = null; + if (isExecuteAsUser) { + command = + String.format("%s %s %s", executeAsUserBinary, effectiveUser, + command); + info("Command: " + command); + builder = + new AzkabanProcessBuilder(partitionCommandLine(command)) + .setEnv(envVars).setWorkingDir(getCwd()).setLogger(getLog()) + .setExecuteAsUser().setExecuteAsUserBinary(executeAsUserBinary) + .setEffectiveUser(effectiveUser); + } else { + info("Command: " + command); + builder = + new AzkabanProcessBuilder(partitionCommandLine(command)) + .setEnv(envVars).setWorkingDir(getCwd()).setLogger(getLog()); + } if (builder.getEnv().size() > 0) { info("Environment variables: " + builder.getEnv()); @@ -157,6 +175,15 @@ public void run() throws Exception { generateProperties(propFiles[1]); } + private boolean determineExecuteAsUser(Props sysProps, Props jobProps) { + boolean isExecuteAsUser = sysProps.getBoolean(EXECUTE_AS_USER, false); + // putting an override in case user needs to override. A temporary opening + if (jobProps.containsKey(EXECUTE_AS_USER_OVERRIDE)) + isExecuteAsUser = jobProps.getBoolean(EXECUTE_AS_USER_OVERRIDE, false); + + return isExecuteAsUser; + } + /** *
    * This method extracts the kerberos ticket cache file name from the jobprops.
diff --git a/azkaban-common/src/main/java/azkaban/jobExecutor/utils/process/AzkabanProcess.java b/azkaban-common/src/main/java/azkaban/jobExecutor/utils/process/AzkabanProcess.java
index 1035be04cc..cbe6ec34a2 100644
--- a/azkaban-common/src/main/java/azkaban/jobExecutor/utils/process/AzkabanProcess.java
+++ b/azkaban-common/src/main/java/azkaban/jobExecutor/utils/process/AzkabanProcess.java
@@ -50,6 +50,10 @@ public class AzkabanProcess {
   private volatile int processId;
   private volatile Process process;
 
+  private boolean isExecuteAsUser = false;
+  private String executeAsUserBinary = null;
+  private String effectiveUser = null;
+
   public AzkabanProcess(final List cmd, final Map env,
       final String workingDir, final Logger logger) {
     this.cmd = cmd;
@@ -61,6 +65,15 @@ public AzkabanProcess(final List cmd, final Map env,
     this.logger = logger;
   }
 
+  public AzkabanProcess(List cmd, Map env,
+      String workingDir, Logger logger, String executeAsUserBinary,
+      String effectiveUser) {
+    this(cmd, env, workingDir, logger);
+    this.isExecuteAsUser = true;
+    this.executeAsUserBinary = executeAsUserBinary;
+    this.effectiveUser = effectiveUser;
+  }
+
   /**
    * Execute this process, blocking until it has completed.
    */
@@ -101,16 +114,15 @@ public void run() throws IOException {
       }
 
       completeLatch.countDown();
-      
+
       // try to wait for everything to get logged out before exiting
       outputGobbler.awaitCompletion(5000);
       errorGobbler.awaitCompletion(5000);
-      
+
       if (exitCode != 0) {
         throw new ProcessFailureException(exitCode, errorGobbler.getRecentLog());
       }
 
-
     } finally {
       IOUtils.closeQuietly(process.getInputStream());
       IOUtils.closeQuietly(process.getOutputStream());
@@ -158,7 +170,14 @@ public boolean softKill(final long time, final TimeUnit unit)
     checkStarted();
     if (processId != 0 && isStarted()) {
       try {
-        Runtime.getRuntime().exec("kill " + processId);
+        if (isExecuteAsUser) {
+          String cmd =
+              String.format("%s %s kill %d", executeAsUserBinary,
+                  effectiveUser, processId);
+          Runtime.getRuntime().exec(cmd);
+        } else {
+          Runtime.getRuntime().exec("kill " + processId);
+        }
         return completeLatch.await(time, unit);
       } catch (IOException e) {
         logger.error("Kill attempt failed.", e);
@@ -176,7 +195,14 @@ public void hardKill() {
     if (isRunning()) {
       if (processId != 0) {
         try {
-          Runtime.getRuntime().exec("kill -9 " + processId);
+          if (isExecuteAsUser) {
+            String cmd =
+                String.format("%s %s kill -9 %d", executeAsUserBinary,
+                    effectiveUser, processId);
+            Runtime.getRuntime().exec(cmd);
+          } else {
+            Runtime.getRuntime().exec("kill -9 " + processId);
+          }
         } catch (IOException e) {
           logger.error("Kill attempt failed.", e);
         }
@@ -237,4 +263,12 @@ public String toString() {
     return "Process(cmd = " + Joiner.on(" ").join(cmd) + ", env = " + env
         + ", cwd = " + workingDir + ")";
   }
+
+  public boolean isExecuteAsUser() {
+    return isExecuteAsUser;
+  }
+
+  public String getEffectiveUser() {
+    return effectiveUser;
+  }
 }
diff --git a/azkaban-common/src/main/java/azkaban/jobExecutor/utils/process/AzkabanProcessBuilder.java b/azkaban-common/src/main/java/azkaban/jobExecutor/utils/process/AzkabanProcessBuilder.java
index 8832195681..070c4074d7 100644
--- a/azkaban-common/src/main/java/azkaban/jobExecutor/utils/process/AzkabanProcessBuilder.java
+++ b/azkaban-common/src/main/java/azkaban/jobExecutor/utils/process/AzkabanProcessBuilder.java
@@ -35,6 +35,9 @@ public class AzkabanProcessBuilder {
   private Map env = new HashMap();
   private String workingDir = System.getProperty("user.dir");
   private Logger logger = Logger.getLogger(AzkabanProcess.class);
+  private boolean isExecuteAsUser = false;
+  private String executeAsUserBinary = null;
+  private String effectiveUser = null;
 
   private int stdErrSnippetSize = 30;
   private int stdOutSnippetSize = 30;
@@ -100,7 +103,11 @@ public AzkabanProcessBuilder setLogger(Logger logger) {
   }
 
   public AzkabanProcess build() {
-    return new AzkabanProcess(cmd, env, workingDir, logger);
+    if (isExecuteAsUser)
+      return new AzkabanProcess(cmd, env, workingDir, logger,
+          executeAsUserBinary, effectiveUser);
+    else
+      return new AzkabanProcess(cmd, env, workingDir, logger);
   }
 
   public List getCommand() {
@@ -116,4 +123,19 @@ public String toString() {
     return "ProcessBuilder(cmd = " + Joiner.on(" ").join(cmd) + ", env = "
         + env + ", cwd = " + workingDir + ")";
   }
+
+  public AzkabanProcessBuilder setExecuteAsUser() {
+    this.isExecuteAsUser = true;
+    return this;
+  }
+
+  public AzkabanProcessBuilder setExecuteAsUserBinary(String executeAsUserBinary) {
+    this.executeAsUserBinary = executeAsUserBinary;
+    return this;
+  }
+
+  public AzkabanProcessBuilder setEffectiveUser(String effectiveUser) {
+    this.effectiveUser = effectiveUser;
+    return this;
+  }
 }
diff --git a/azkaban-common/src/main/java/azkaban/project/ProjectManager.java b/azkaban-common/src/main/java/azkaban/project/ProjectManager.java
index 1e5e52264b..0f09b9c158 100644
--- a/azkaban-common/src/main/java/azkaban/project/ProjectManager.java
+++ b/azkaban-common/src/main/java/azkaban/project/ProjectManager.java
@@ -269,7 +269,7 @@ public Project createProject(String projectName, String description,
           "Project names must start with a letter, followed by any number of letters, digits, '-' or '_'.");
     }
 
-    if (projectsByName.containsKey(projectName)) {
+    if (projectsByName.contains(projectName)) {
       throw new ProjectManagerException("Project already exists.");
     }
 
diff --git a/azkaban-common/src/main/java/azkaban/server/session/SessionCache.java b/azkaban-common/src/main/java/azkaban/server/session/SessionCache.java
index 123767884f..fc4d64f426 100644
--- a/azkaban-common/src/main/java/azkaban/server/session/SessionCache.java
+++ b/azkaban-common/src/main/java/azkaban/server/session/SessionCache.java
@@ -58,7 +58,7 @@ public SessionCache(Props props) {
    * @return
    */
   public Session getSession(String sessionId) {
-    Session elem = cache.get(Session.class, sessionId);
+    Session elem = cache. get(sessionId);
 
     return elem;
   }
diff --git a/azkaban-common/src/main/java/azkaban/trigger/JdbcTriggerLoader.java b/azkaban-common/src/main/java/azkaban/trigger/JdbcTriggerLoader.java
index 007d872cf9..99b32f981b 100644
--- a/azkaban-common/src/main/java/azkaban/trigger/JdbcTriggerLoader.java
+++ b/azkaban-common/src/main/java/azkaban/trigger/JdbcTriggerLoader.java
@@ -178,7 +178,7 @@ private synchronized void addTrigger(Connection connection, Trigger t,
           runner.query(connection, LastInsertID.LAST_INSERT_ID,
               new LastInsertID());
 
-      if (id == -1L) {
+      if (id == -1l) {
         logger.error("trigger id is not properly created.");
         throw new TriggerLoaderException("trigger id is not properly created.");
       }
@@ -257,7 +257,7 @@ private static class LastInsertID implements ResultSetHandler {
     @Override
     public Long handle(ResultSet rs) throws SQLException {
       if (!rs.next()) {
-        return -1L;
+        return -1l;
       }
 
       long id = rs.getLong(1);
diff --git a/azkaban-common/src/main/java/azkaban/utils/TypedMapWrapper.java b/azkaban-common/src/main/java/azkaban/utils/TypedMapWrapper.java
index 62208f3243..7118e8c62d 100644
--- a/azkaban-common/src/main/java/azkaban/utils/TypedMapWrapper.java
+++ b/azkaban-common/src/main/java/azkaban/utils/TypedMapWrapper.java
@@ -71,7 +71,7 @@ public Integer getInt(K key, Integer defaultVal) {
   }
 
   public Long getLong(K key) {
-    return getLong(key, -1L);
+    return getLong(key, -1l);
   }
 
   public Long getLong(K key, Long defaultVal) {
diff --git a/azkaban-common/src/main/java/azkaban/utils/cache/Cache.java b/azkaban-common/src/main/java/azkaban/utils/cache/Cache.java
index 231d419962..a2ddc60109 100644
--- a/azkaban-common/src/main/java/azkaban/utils/cache/Cache.java
+++ b/azkaban-common/src/main/java/azkaban/utils/cache/Cache.java
@@ -38,16 +38,17 @@ public enum EjectionPolicy {
     LRU, FIFO
   }
 
-  /* package */ Cache(CacheManager manager) {
+  /* package */Cache(CacheManager manager) {
     this.manager = manager;
   }
 
-  public  T get(Class clazz, Object key) {
+  @SuppressWarnings("unchecked")
+  public  T get(Object key) {
     Element element = elementMap.get(key);
     if (element == null) {
       return null;
     }
-    return clazz.cast(element.getElement());
+    return (T) element.getElement();
   }
 
   public  void put(Object key, T item) {
diff --git a/azkaban-common/src/test/java/azkaban/executor/JavaJobRunnerMain.java b/azkaban-common/src/test/java/azkaban/executor/JavaJobRunnerMain.java
index cf46637e72..67d0284bd2 100644
--- a/azkaban-common/src/test/java/azkaban/executor/JavaJobRunnerMain.java
+++ b/azkaban-common/src/test/java/azkaban/executor/JavaJobRunnerMain.java
@@ -196,7 +196,7 @@ private void outputGeneratedProperties(Props outputProperties) {
       }
       writer.write("}".getBytes());
     } catch (Exception e) {
-      throw new RuntimeException("Unable to store output properties to: "
+      new RuntimeException("Unable to store output properties to: "
           + outputFileStr);
     } finally {
       try {
diff --git a/azkaban-common/src/test/java/azkaban/jobExecutor/PythonJobTest.java b/azkaban-common/src/test/java/azkaban/jobExecutor/PythonJobTest.java
index 7320c156bc..ee767de039 100644
--- a/azkaban-common/src/test/java/azkaban/jobExecutor/PythonJobTest.java
+++ b/azkaban-common/src/test/java/azkaban/jobExecutor/PythonJobTest.java
@@ -24,7 +24,6 @@
 import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.BeforeClass;
-import org.junit.Ignore;
 import org.junit.Test;
 
 import azkaban.utils.Props;
@@ -83,7 +82,6 @@ public static void cleanup() {
     Utils.removeFile(scriptFile);
   }
 
-  @Ignore("Test appears to hang.")
   @Test
   public void testPythonJob() {
 
diff --git a/azkaban-common/src/test/java/azkaban/project/ProjectTest.java b/azkaban-common/src/test/java/azkaban/project/ProjectTest.java
index 63c19f0e06..da36d46b30 100644
--- a/azkaban-common/src/test/java/azkaban/project/ProjectTest.java
+++ b/azkaban-common/src/test/java/azkaban/project/ProjectTest.java
@@ -28,8 +28,8 @@ public class ProjectTest {
   @Test
   public void testToAndFromObject() throws Exception {
     Project project = new Project(1, "tesTing");
-    project.setCreateTimestamp(1L);
-    project.setLastModifiedTimestamp(2L);
+    project.setCreateTimestamp(1l);
+    project.setLastModifiedTimestamp(2l);
     project.setDescription("I am a test");
     project.setUserPermission("user1", new Permission(new Type[] { Type.ADMIN,
         Type.EXECUTE }));
diff --git a/azkaban-common/src/test/java/azkaban/utils/cache/CacheTest.java b/azkaban-common/src/test/java/azkaban/utils/cache/CacheTest.java
index 55dd5d9d14..125f1b38a9 100644
--- a/azkaban-common/src/test/java/azkaban/utils/cache/CacheTest.java
+++ b/azkaban-common/src/test/java/azkaban/utils/cache/CacheTest.java
@@ -34,19 +34,19 @@ public void testLRU() {
     cache.insertElement("key3", "val3");
     cache.insertElement("key4", "val4");
 
-    Assert.assertEquals(cache.get(String.class, "key2"), "val2");
-    Assert.assertEquals(cache.get(String.class, "key3"), "val3");
-    Assert.assertEquals(cache.get(String.class, "key4"), "val4");
-    Assert.assertEquals(cache.get(String.class, "key1"), "val1");
+    Assert.assertEquals(cache.get("key2"), "val2");
+    Assert.assertEquals(cache.get("key3"), "val3");
+    Assert.assertEquals(cache.get("key4"), "val4");
+    Assert.assertEquals(cache.get("key1"), "val1");
     Assert.assertEquals(4, cache.getSize());
 
     cache.insertElement("key5", "val5");
     Assert.assertEquals(4, cache.getSize());
-    Assert.assertEquals(cache.get(String.class, "key3"), "val3");
-    Assert.assertEquals(cache.get(String.class, "key4"), "val4");
-    Assert.assertEquals(cache.get(String.class, "key1"), "val1");
-    Assert.assertEquals(cache.get(String.class, "key5"), "val5");
-    Assert.assertNull(cache.get(String.class, "key2"));
+    Assert.assertEquals(cache.get("key3"), "val3");
+    Assert.assertEquals(cache.get("key4"), "val4");
+    Assert.assertEquals(cache.get("key1"), "val1");
+    Assert.assertEquals(cache.get("key5"), "val5");
+    Assert.assertNull(cache.get("key2"));
   }
 
   @Test
@@ -67,19 +67,19 @@ public void testFIFO() {
     cache.insertElement("key3", "val3");
     cache.insertElement("key4", "val4");
 
-    Assert.assertEquals(cache.get(String.class, "key2"), "val2");
-    Assert.assertEquals(cache.get(String.class, "key3"), "val3");
-    Assert.assertEquals(cache.get(String.class, "key4"), "val4");
-    Assert.assertEquals(cache.get(String.class, "key1"), "val1");
+    Assert.assertEquals(cache.get("key2"), "val2");
+    Assert.assertEquals(cache.get("key3"), "val3");
+    Assert.assertEquals(cache.get("key4"), "val4");
+    Assert.assertEquals(cache.get("key1"), "val1");
     Assert.assertEquals(4, cache.getSize());
 
     cache.insertElement("key5", "val5");
     Assert.assertEquals(4, cache.getSize());
-    Assert.assertEquals(cache.get(String.class, "key3"), "val3");
-    Assert.assertEquals(cache.get(String.class, "key4"), "val4");
-    Assert.assertEquals(cache.get(String.class, "key2"), "val2");
-    Assert.assertEquals(cache.get(String.class, "key5"), "val5");
-    Assert.assertNull(cache.get(String.class, "key1"));
+    Assert.assertEquals(cache.get("key3"), "val3");
+    Assert.assertEquals(cache.get("key4"), "val4");
+    Assert.assertEquals(cache.get("key2"), "val2");
+    Assert.assertEquals(cache.get("key5"), "val5");
+    Assert.assertNull(cache.get("key1"));
   }
 
   @Test
@@ -99,7 +99,7 @@ public void testTimeToLiveExpiry() {
       } catch (InterruptedException e) {
       }
     }
-    Assert.assertEquals(cache.get(String.class, "key1"), "val1");
+    Assert.assertEquals(cache.get("key1"), "val1");
     cache.insertElement("key2", "val2");
     synchronized (this) {
       try {
@@ -107,8 +107,8 @@ public void testTimeToLiveExpiry() {
       } catch (InterruptedException e) {
       }
     }
-    Assert.assertNull(cache.get(String.class, "key1"));
-    Assert.assertEquals("val2", cache.get(String.class, "key2"));
+    Assert.assertNull(cache.get("key1"));
+    Assert.assertEquals("val2", cache.get("key2"));
 
     synchronized (this) {
       try {
@@ -117,7 +117,7 @@ public void testTimeToLiveExpiry() {
       }
     }
 
-    Assert.assertNull(cache.get(String.class, "key2"));
+    Assert.assertNull(cache.get("key2"));
   }
 
   @Test
@@ -137,7 +137,7 @@ public void testIdleExpireExpiry() {
       } catch (InterruptedException e) {
       }
     }
-    Assert.assertEquals(cache.get(String.class, "key1"), "val1");
+    Assert.assertEquals(cache.get("key1"), "val1");
     cache.insertElement("key2", "val2");
     synchronized (this) {
       try {
@@ -145,8 +145,8 @@ public void testIdleExpireExpiry() {
       } catch (InterruptedException e) {
       }
     }
-    Assert.assertEquals("val1", cache.get(String.class, "key1"));
-    Assert.assertNull(cache.get(String.class, "key3"));
+    Assert.assertEquals("val1", cache.get("key1"));
+    Assert.assertNull(cache.get("key3"));
     synchronized (this) {
       try {
         wait(1000);
@@ -154,6 +154,6 @@ public void testIdleExpireExpiry() {
       }
     }
 
-    Assert.assertNull(cache.get(String.class, "key2"));
+    Assert.assertNull(cache.get("key2"));
   }
 }
diff --git a/azkaban-execserver/src/main/resources/execute-as-user.c b/azkaban-execserver/src/main/resources/execute-as-user.c
index e87bd85c82..0a8cbe3b89 100644
--- a/azkaban-execserver/src/main/resources/execute-as-user.c
+++ b/azkaban-execserver/src/main/resources/execute-as-user.c
@@ -33,7 +33,9 @@
 
 FILE *LOGFILE = NULL;
 FILE *ERRORFILE = NULL;
-int SETUID_OPER_FAILED=10;
+int SETUID_OPER_FAILED = 10;
+int USER_NOT_FOUND = 20;
+int INVALID_INPUT = 30;
 
 /*
  *  Change the real and effective user and group from super user to the specified user
@@ -73,55 +75,41 @@ int change_user(uid_t user, gid_t group) {
 }
 
 int main(int argc, char **argv){
-    if (argc < 3) {
-        fprintf(ERRORFILE, "Requires at least 3 variables: ./execute-as-user uid command [args]");
-    }
 
+// set up the logging stream
     if(!LOGFILE)
         LOGFILE=stdout;
     if(!ERRORFILE)
         ERRORFILE=stderr;
 
-    char *uid = argv[1];
-
-    // for loop to calculate the length to malloc
-    int i;
-    int total_len = 0;
-    for(i=2;ipw_uid, userInfo->pw_gid);
-    int retval = change_user(userInfo->pw_uid, userInfo->pw_gid);
-    fprintf(LOGFILE, "change user function return value: %d\n", retval);
+    // try to change user
+    fprintf(LOGFILE, "Changing user: user: %s, uid: %d, gid: %d\n", uid, user_info->pw_uid, user_info->pw_gid);
+    int retval = change_user(user_info->pw_uid, user_info->pw_gid);
     if( retval != 0){
         fprintf(LOGFILE, "Error changing user to %s\n", uid);
         return SETUID_OPER_FAILED;
     }
 
-    // create the command
-    char *cur = cmd;
-    int len;
-    for(i=2;i
 subprojects {
   apply plugin: 'java'
   apply plugin: 'eclipse'
-  apply plugin: 'net.ltgt.errorprone'
-
-  configurations.errorprone {
-    resolutionStrategy.force 'com.google.errorprone:error_prone_core:2.0.5'
-  }
 
   /**
    * Gets the version name from the latest Git tag
@@ -87,9 +78,6 @@ project(':azkaban-common') {
     all {
       transitive = false
     }
-    errorprone {
-      transitive = true
-    }
   }
 
   dependencies {
@@ -126,11 +114,11 @@ project(':azkaban-common') {
     testCompile('junit:junit:4.11')
     testCompile('org.hamcrest:hamcrest-all:1.3')
   }
-
+  
   tasks.withType(JavaCompile) {
     options.encoding = "UTF-8"
   }
-
+  
 }
 
 project(':azkaban-migration') {
@@ -138,9 +126,6 @@ project(':azkaban-migration') {
     all {
       transitive = false
     }
-    errorprone {
-      transitive = true
-    }
   }
 
   dependencies {
@@ -189,9 +174,6 @@ project(':azkaban-webserver') {
     generateRestli {
       transitive = true
     }
-    errorprone {
-      transitive = true
-    }
   }
 
   dependencies {
@@ -315,9 +297,6 @@ project(':azkaban-execserver') {
     all {
       transitive = false
     }
-    errorprone {
-      transitive = true
-    }
   }
 
   dependencies {
@@ -333,6 +312,7 @@ project(':azkaban-execserver') {
     compile('org.mortbay.jetty:jetty-util:6.1.26')
     compile('org.codehaus.jackson:jackson-core-asl:1.9.5')
     compile('org.codehaus.jackson:jackson-mapper-asl:1.9.5')
+    
 
     testCompile('junit:junit:4.11')
     testCompile('org.hamcrest:hamcrest-all:1.3')
@@ -498,11 +478,11 @@ project(':azkaban-test') {
     }
   }
 
-  distZip.dependsOn animalDistZip, embeddedDistZip, embedded2DistZip,
+  distZip.dependsOn build, animalDistZip, embeddedDistZip, embedded2DistZip,
       embedded3DistZip, embeddedBadDistZip, execpropstestDistZip,
       exectest1DistZip, exectest2DistZip, logtestDistZip
 
-  distTar.dependsOn animalDistTar, embeddedDistTar, embedded2DistTar,
+  distTar.dependsOn build, animalDistTar, embeddedDistTar, embedded2DistTar,
       embedded3DistTar, embeddedBadDistTar, execpropstestDistTar,
       exectest1DistTar, exectest2DistTar, logtestDistTar
 }
@@ -590,5 +570,5 @@ distZip.dependsOn migrationDistZip, webserverDistZip, execserverDistZip, soloser
  * Gradle wrapper task.
  */
 task wrapper(type: Wrapper) {
-  gradleVersion = '2.7'
+  gradleVersion = '1.12'
 }
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index e8c6bf7bb47dff6b81c2cf7a349eb7e912c9fbe2..0087cd3b18659b5577cf6ad3ef61f8eb9416ebba 100644
GIT binary patch
delta 29330
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 qpB^N5UYP&4fBo8dB*7ojzrd>/dev/null`