[PATCH 2/2] Fix synchronous waiting for command prompt in Linux & connection lost when restarting


Ioana Grigoropol <ioanax.grigoropol@...>
 

- when waiting for an command to finish running, we wait to receive a command prompt using the syntax user@host....endChar. This pattern is not always encountered on local or remote connection from linux to linux. Instead echo some terminator value after each command and wait for recieve the value.

- when working on a Linux machine and creating a project using the Local connection, after a restart, the RSE registry fails to find the project's connection using its URI because there is no host set. Manually set the current connection to Localhost

Signed-off-by: Ioana Grigoropol <ioanax.grigoropol@...>
---
.../src/org/yocto/bc/bitbake/BBSession.java | 2 +
.../src/org/yocto/bc/bitbake/ShellSession.java | 24 ++----
.../yocto/bc/remote/utils/ProcessStreamBuffer.java | 14 ++--
.../org/yocto/bc/remote/utils/RemoteHelper.java | 14 ++--
.../remote/utils/YoctoHostShellProcessAdapter.java | 28 +------
.../src/org/yocto/bc/ui/Activator.java | 79 ++++++--------------
.../src/org/yocto/bc/ui/model/ProjectInfo.java | 4 +
.../bc/ui/wizards/NewBitBakeFileRecipeWizard.java | 7 +-
.../ui/wizards/NewBitBakeFileRecipeWizardPage.java | 15 ++--
9 files changed, 60 insertions(+), 127 deletions(-)

diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/bitbake/BBSession.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/bitbake/BBSession.java
index c5354a4..3aa4efe 100644
--- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/bitbake/BBSession.java
+++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/bitbake/BBSession.java
@@ -439,6 +439,8 @@ public class BBSession implements IBBSessionListener, IModelElement, Map {
}

protected void parse(String content, Map outMap) throws Exception {
+ if (content == null)
+ return;
BufferedReader reader = new BufferedReader(new StringReader(content));
String line;
boolean inLine = false;
diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/bitbake/ShellSession.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/bitbake/ShellSession.java
index f143bed..c127c25 100644
--- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/bitbake/ShellSession.java
+++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/bitbake/ShellSession.java
@@ -81,24 +81,13 @@ public class ShellSession {
this.projectInfo = pInfo;
this.root = root;
this.initCmd = initCmd;
-// if (out == null) {
-// this.out = new NullWriter();
-// } else {
-// this.out = out;
-// }
-// if (shellType == SHELL_TYPE_SH) {
-// shellPath = "/bin/sh";
-// }
-// shellPath = "/bin/bash";
-
initializeShell(new NullProgressMonitor());
}

private void initializeShell(IProgressMonitor monitor) throws IOException {
try {
- IHost connection = RemoteHelper.getRemoteConnectionByName(projectInfo.getConnection().getName());
- RemoteHelper.runCommandRemote(connection, new YoctoCommand("source " + initCmd, root.getAbsolutePath(), ""));
- RemoteHelper.runCommandRemote(connection, new YoctoCommand(exportCmd, root.getAbsolutePath(), ""));
+ RemoteHelper.runCommandRemote(projectInfo.getConnection(), new YoctoCommand("source " + initCmd, root.getAbsolutePath(), ""));
+ RemoteHelper.runCommandRemote(projectInfo.getConnection(), new YoctoCommand(exportCmd, root.getAbsolutePath(), ""));
} catch (Exception e) {
e.printStackTrace();
}
@@ -113,9 +102,12 @@ public class ShellSession {
public String execute(String command, boolean hasErrors) throws IOException {

try {
- IHost connection = RemoteHelper.getRemoteConnectionByName(projectInfo.getConnection().getName());
- hasErrors = RemoteHelper.runCommandRemote(connection, new YoctoCommand(command, root.getAbsolutePath() + "/build/", ""));
- return RemoteHelper.getProcessBuffer(connection).getMergedOutputLines();
+ if (projectInfo.getConnection() != null) {
+ IHost connection = RemoteHelper.getRemoteConnectionByName(projectInfo.getConnection().getName());
+ hasErrors = RemoteHelper.runCommandRemote(connection, new YoctoCommand(command, root.getAbsolutePath() + "/build/", ""));
+ return RemoteHelper.getProcessBuffer(connection).getMergedOutputLines();
+ }
+ return null;
} catch (Exception e) {
e.printStackTrace();
}
diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/ProcessStreamBuffer.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/ProcessStreamBuffer.java
index 438a5b4..2c6d122 100644
--- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/ProcessStreamBuffer.java
+++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/ProcessStreamBuffer.java
@@ -2,6 +2,7 @@ package org.yocto.bc.remote.utils;

import java.util.ArrayList;
import java.util.List;
+import java.util.regex.Pattern;

public class ProcessStreamBuffer {
private static final String WHITESPACES = "\\s+";
@@ -54,17 +55,16 @@ public class ProcessStreamBuffer {
return null;
}

- public String getOutputLineContaining(String str) {
- int index = 0;
+ public String getOutputLineContaining(String arg, String pattern) {
for (int i = outputLines.size() - 1; i >= 0; i--){
String line = outputLines.get(i);
- if (line.contains(str)) {
- index = i + 1;
- break;
+ if (line.contains(arg)) {
+ String[] tokens = line.split("\\s+");
+ if (Pattern.matches(pattern, tokens[0])) {
+ return tokens[0];
+ }
}
}
- if (index >= 0 && index < outputLines.size())
- return outputLines.get(index);
return null;
}
}
diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/RemoteHelper.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/RemoteHelper.java
index f375de1..c230fd6 100644
--- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/RemoteHelper.java
+++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/RemoteHelper.java
@@ -45,6 +45,7 @@ import org.yocto.bc.ui.Activator;
import org.yocto.bc.ui.wizards.install.Messages;

public class RemoteHelper {
+ public static final String TERMINATOR = "234o987dsfkcqiuwey18837032843259d";
public static final int TOTALWORKLOAD = 100;
private static Map<IHost, RemoteMachine> machines;

@@ -95,9 +96,11 @@ public class RemoteHelper {
return null;

String host = uri.getHost();
- if (host == null)
- return null;
-
+ if (host == null) {
+ // this is a local connection
+ ISystemRegistry sr = RSECorePlugin.getTheSystemRegistry();
+ return sr.getLocalHost();
+ }
ISystemRegistry sr = RSECorePlugin.getTheSystemRegistry();
IHost[] connections = sr.getHosts();

@@ -259,8 +262,9 @@ public class RemoteHelper {
public void run() {
try {
YoctoHostShellProcessAdapter adapter = getHostShellProcessAdapter(connection);
- adapter.setLastCommand(remoteCommand);
- getHostShell(connection).writeToShell(remoteCommand);
+ String fullRemoteCommand = remoteCommand + "; echo " + TERMINATOR + ";";
+ adapter.setLastCommand(fullRemoteCommand);
+ getHostShell(connection).writeToShell(fullRemoteCommand);
while (!adapter.isFinished())
Thread.sleep(2);
// return hostShellProcessAdapter.hasErrors();
diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/YoctoHostShellProcessAdapter.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/YoctoHostShellProcessAdapter.java
index 2dba0a6..bb137b1 100644
--- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/YoctoHostShellProcessAdapter.java
+++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/YoctoHostShellProcessAdapter.java
@@ -17,10 +17,6 @@ import org.eclipse.rse.services.shells.IHostShellOutputReader;
import org.eclipse.swt.widgets.Display;

public class YoctoHostShellProcessAdapter extends HostShellProcessAdapter {
- private String commandPrompt = null;
- private static final String ROOT = "root";
- private static final String PROMPT_USER_CH = "$";
- private static final String PROMPT_ROOT_CH = "#";
private ProcessStreamBuffer processStreamBuffer;
private CommandResponseHandler commandResponseHandler;
private boolean isFinished;
@@ -30,7 +26,6 @@ public class YoctoHostShellProcessAdapter extends HostShellProcessAdapter {

private String command;
private Map<String, IProgressMonitor> commandMonitors;
- private String endChar = null;

private Semaphore sem;

@@ -57,9 +52,7 @@ public class YoctoHostShellProcessAdapter extends HostShellProcessAdapter {
isFinished = false;
sem.acquire();
this.command = lastCommand.trim();
- System.out.println("last command " + lastCommand + getOwnMonitor());
this.commandMonitors.put(command, getOwnMonitor());
-
} catch (InterruptedException e) {
e.printStackTrace();
}
@@ -145,7 +138,6 @@ public class YoctoHostShellProcessAdapter extends HostShellProcessAdapter {
if (value.isEmpty()) {
continue;
}
- setCommandPrompt(value);
System.out.println(value);
this.processStreamBuffer.addErrorLine(value);
this.commandResponseHandler.response(value, false);
@@ -156,11 +148,7 @@ public class YoctoHostShellProcessAdapter extends HostShellProcessAdapter {
if (value.isEmpty()) {
continue;
}
- setCommandPrompt(value);
-
- if (commandPrompt != null && endChar != null && command != null && processStreamBuffer != null &&
- value.startsWith(commandPrompt) && value.endsWith(endChar) &&
- !value.endsWith(command) && processStreamBuffer.getLastOutputLineContaining(command) != null /*&& waitForOutput*/) {
+ if (value.endsWith(RemoteHelper.TERMINATOR)) {
sem.release();
isFinished = true;
}
@@ -173,20 +161,6 @@ public class YoctoHostShellProcessAdapter extends HostShellProcessAdapter {
}

}
- private void setCommandPrompt(String value) {
- if (commandPrompt == null) {
- if (value.startsWith(ROOT) && value.indexOf(PROMPT_ROOT_CH) != -1) {
- int end = value.indexOf(PROMPT_ROOT_CH);
- commandPrompt = value.substring(0, end);
- endChar = PROMPT_ROOT_CH;
- } else if (value.indexOf(PROMPT_USER_CH) != -1) {
- int end = value.indexOf(PROMPT_USER_CH);
- commandPrompt = value.substring(0, end);
- endChar = PROMPT_USER_CH;
- }
-
- }
- }
public boolean isFinished() {
return isFinished;
}
diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/Activator.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/Activator.java
index 64ca6a7..48c59d5 100644
--- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/Activator.java
+++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/Activator.java
@@ -24,10 +24,8 @@ import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.rse.core.model.IHost;
import org.eclipse.rse.services.files.IHostFile;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.osgi.framework.BundleContext;
@@ -68,7 +66,7 @@ public class Activator extends AbstractUIPlugin {

return recipe;
}
-
+
/**
* Get or create a BitBake session passing in ProjectInfo
* @param pinfo
@@ -80,40 +78,36 @@ public class Activator extends AbstractUIPlugin {
if (bbSessionMap == null) {
bbSessionMap = new Hashtable<URI, BBSession>();
}
-
- BBSession bbs = (BBSession) bbSessionMap.get(projectRoot);
-
+
+ BBSession bbs = bbSessionMap.get(projectRoot);
+
if (bbs == null) {
bbs = new BBSession(getShellSession(projectInfo, out, monitor), projectRoot);
bbSessionMap.put(projectRoot, bbs);
}
-
+
return bbs;
}
-
+
/**
* Get or create a BitBake session passing in ProjectInfo
* @param pinfo
* @return
- * @throws Exception
+ * @throws Exception
*/
public static BBSession getBBSession(ProjectInfo projectInfo, IProgressMonitor monitor) throws Exception {
URI projectRoot = projectInfo.getURI();
if (bbSessionMap == null) {
bbSessionMap = new Hashtable<URI, BBSession>();
}
-
- BBSession bbs = (BBSession) bbSessionMap.get(projectRoot);
-
+
+ BBSession bbs = bbSessionMap.get(projectRoot);
+
if (bbs == null) {
bbs = new BBSession(getShellSession(projectInfo, null, monitor), projectRoot);
bbSessionMap.put(projectRoot, bbs);
- } else {
- if (projectInfo.getConnection() == null) {
- throw new Exception("The remote connection is null!");
- }
}
-
+
return bbs;
}

@@ -141,9 +135,7 @@ public class Activator extends AbstractUIPlugin {
if (projInfoMap == null) {
projInfoMap = new Hashtable<URI, ProjectInfo>();
}
-
- ProjectInfo pi = (ProjectInfo) projInfoMap.get(location);
-
+ ProjectInfo pi = projInfoMap.get(location);
if (pi == null) {
pi = new ProjectInfo();
pi.setLocation(location);
@@ -152,13 +144,10 @@ public class Activator extends AbstractUIPlugin {
} catch (IOException e) {
throw new InvocationTargetException(e);
}
- if (pi.getConnection() == null) {
- IHost connection = RemoteHelper.getRemoteConnectionForURI(location, new NullProgressMonitor());
- pi.setConnection(connection);
- }
+
projInfoMap.put(location, pi);
}
-
+
return pi;
}

@@ -175,7 +164,7 @@ public class Activator extends AbstractUIPlugin {
if(bbSessionMap != null) {
iter= bbSessionMap.values().iterator();
while(iter.hasNext()) {
- BBSession p = (BBSession)iter.next();
+ BBSession p = iter.next();
p.changeNotified(added, removed, changed);
}
}
@@ -184,56 +173,31 @@ public class Activator extends AbstractUIPlugin {
/**
* @param absolutePath
* @return a cached shell session for a given project root.
- * @throws IOException
+ * @throws IOException
*/
private static ShellSession getShellSession(ProjectInfo projInfo, Writer out, IProgressMonitor monitor) throws IOException {
URI absolutePath = projInfo.getURI();
if (shellMap == null) {
shellMap = new Hashtable<String, ShellSession>();
}
-
- ShellSession ss = (ShellSession) shellMap.get(absolutePath);
-
+
+ ShellSession ss = shellMap.get(absolutePath);
+
if (ss == null) {
-// if (conn == null)
-// RemoteHelper.getRemoteConnectionByName();
IHostFile remoteHostFile = RemoteHelper.getRemoteHostFile(projInfo.getConnection(), absolutePath.getPath(), monitor);
ss = new ShellSession(projInfo, ShellSession.SHELL_TYPE_BASH, remoteHostFile, ProjectInfoHelper.getInitScriptPath(absolutePath), out);
}
-
+
return ss;
}

-// private static String loadInit(String absolutePath) throws CoreException {
-// IProject [] prjs = ResourcesPlugin.getWorkspace().getRoot().getProjects();
-// IProject foundPrj = null;
-//
-// for (int i = 0; i < prjs.length; ++i) {
-// IProject p = prjs[i];
-//
-// System.out
-// .println(p.getDescription().getLocationURI().getPath());
-//
-// if (p.getDescription().getLocationURI().getPath().equals(absolutePath)) {
-// foundPrj = p;
-// break;
-// }
-// }
-//
-// if (foundPrj == null) {
-// throw new RuntimeException("Unable to find project associated with path! " + absolutePath);
-// }
-//
-// return foundPrj.getPersistentProperty(CreateBBCProjectOperation.BBC_PROJECT_INIT);
-// }
-
public static void putProjInfo(URI location, ProjectInfo pinfo) {
if (projInfoMap == null) {
projInfoMap = new Hashtable<URI, ProjectInfo>();
}
projInfoMap.put(location, pinfo);
}
-
+
/**
* The constructor
*/
@@ -273,6 +237,7 @@ public class Activator extends AbstractUIPlugin {
bbSessionMap.remove(path);
}

+ @Override
protected void initializeImageRegistry(ImageRegistry reg) {
reg.put(IMAGE_VARIABLE, Activator.getImageDescriptor("icons/variable.gif"));
reg.put(IMAGE_FUNCTION, Activator.getImageDescriptor("icons/function.gif"));
diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/model/ProjectInfo.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/model/ProjectInfo.java
index 5fc4ba2..4530bb3 100644
--- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/model/ProjectInfo.java
+++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/model/ProjectInfo.java
@@ -13,6 +13,7 @@ package org.yocto.bc.ui.model;
import java.net.URI;

import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.ptp.remote.core.IRemoteConnection;
import org.eclipse.ptp.remote.core.IRemoteServices;
import org.eclipse.rse.core.model.IHost;
@@ -58,6 +59,9 @@ public class ProjectInfo implements IModelElement {
}

public IHost getConnection() {
+ if (connection == null) {
+ connection = RemoteHelper.getRemoteConnectionForURI(location, new NullProgressMonitor());
+ }
return connection;
}

diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/NewBitBakeFileRecipeWizard.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/NewBitBakeFileRecipeWizard.java
index 57cad18..8457996 100644
--- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/NewBitBakeFileRecipeWizard.java
+++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/NewBitBakeFileRecipeWizard.java
@@ -118,10 +118,7 @@ public class NewBitBakeFileRecipeWizard extends Wizard implements INewWizard {
IProject p = ((IResource)element).getProject();
try {
ProjectInfo projInfo = Activator.getProjInfo(p.getLocationURI());
- if (projInfo.getConnection() == null)
- this.connection = RemoteHelper.getRemoteConnectionForURI(p.getLocationURI(), new NullProgressMonitor());
- else
- this.connection = projInfo.getConnection();
+ this.connection = projInfo.getConnection();
} catch (CoreException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
@@ -205,7 +202,7 @@ public class NewBitBakeFileRecipeWizard extends Wizard implements INewWizard {
public void run(IProgressMonitor monitor) throws InvocationTargetException {
try {
doFinish(element, monitor);
- RemoteHelper.runCommandRemote(connection, new YoctoCommand("rm -rf temp", element.getMetaDir() + "/temp", ""));
+ RemoteHelper.runCommandRemote(connection, new YoctoCommand("rm -rf " + element.getMetaDir() + "/temp", "", ""));
} catch (Exception e) {
throw new InvocationTargetException(e);
} finally {
diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/NewBitBakeFileRecipeWizardPage.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/NewBitBakeFileRecipeWizardPage.java
index e9dc1f3..a52c2fe 100644
--- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/NewBitBakeFileRecipeWizardPage.java
+++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/ui/wizards/NewBitBakeFileRecipeWizardPage.java
@@ -397,22 +397,17 @@ public class NewBitBakeFileRecipeWizardPage extends WizardPage {
updateSrcUri(mirrorTable, srcURI);
populateInheritance(extractDir, monitor);

- String md5Val = retrieveSum(md5YCmd);
+ String md5Val = retrieveSum(srcFileNameExt, md5Pattern);
md5sumText.setText(Pattern.matches(md5Pattern, md5Val) ? md5Val : "");
- String sha256Val = retrieveSum(sha256YCmd);
+ String sha256Val = retrieveSum(srcFileNameExt, sha256Pattern);
sha256sumText.setText(Pattern.matches(sha256Pattern, sha256Val) ? sha256Val : "");
- String checkSumVal = retrieveSum(licenseChecksumCmd);
+ String checkSumVal = retrieveSum(COPYING_FILE, md5Pattern);
checksumText.setText(RemoteHelper.createNewURI(extractDir, COPYING_FILE).toString() + ";md5=" + (Pattern.matches(md5Pattern, checkSumVal) ? checkSumVal : ""));
}

- private String retrieveSum(YoctoCommand cmd) {
+ private String retrieveSum(String arg, String pattern) {
ProcessStreamBuffer buffer = RemoteHelper.getProcessBuffer(this.connection);
- String line = buffer.getOutputLineContaining(cmd.getCommand());
- if (line != null) {
- String[] tokens = line.split(WHITESPACES);
- return tokens[0];
- }
- return "";
+ return buffer.getOutputLineContaining(arg, pattern);
}

private URI extractPackage(URI srcURI) {
--
1.7.9.5

Join yocto@lists.yoctoproject.org to automatically receive all group messages.