![JAR search and dependency download from the Maven repository](/logo.png)
net.jxta.impl.shell.bin.rshd.RemoteShellSession Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jxse-shell Show documentation
Show all versions of jxse-shell Show documentation
The JXTA Shell is a sample application that demonstrates key concepts
of JXTA JXSE. The JXTA Shell enables users to interact with the JXTA
platform through a command-line interpreter. Much like the UNIX® shell,
the JXTA Shell is useful for accessing and managing core platform objects
(peers, groups, pipes), debugging communications problems, checking the
status of peers and/or peer groups, and communicating with other JXTA
services and applications. As in UNIX®, the JXTA shell allows users to
"pipe" shell commands together connecting commands "on-the-fly." Pipes
in Project JXTA are useful for collecting information at one peer and
perhaps processing the command at another.
The newest version!
/*
* Copyright (c) 2002 Sun Microsystems, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Sun Microsystems, Inc. for Project JXTA."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Sun", "Sun Microsystems, Inc.", "JXTA" and "Project JXTA" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact Project JXTA at http://www.jxta.org.
*
* 5. Products derived from this software may not be called "JXTA",
* nor may "JXTA" appear in their name, without prior written
* permission of Sun.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL SUN MICROSYSTEMS OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of Project JXTA. For more
* information on Project JXTA, please see
* .
*
* This license is based on the BSD license adopted by the Apache Foundation.
*
* $Id: RemoteShellSession.java,v 1.4 2007/02/09 23:12:42 hamada Exp $
*/
package net.jxta.impl.shell.bin.rshd;
import net.jxta.endpoint.EndpointAddress;
import net.jxta.impl.shell.*;
import net.jxta.pipe.InputPipe;
import net.jxta.pipe.OutputPipe;
import java.io.IOException;
import java.util.TimerTask;
import net.jxta.peergroup.PeerGroup;
/**
* Remote JXTA Shell Deamon
*/
class RemoteShellSession extends ShellApp implements Runnable {
static final String INITIAL_APP = "login";
static final String LOGIN_INITIAL_APP = "Shell";
private rshd server = null;
private ShellConsole cons = null;
private InputPipe inputPipe = null;
private OutputPipe outputPipe = null;
private String remoteAddress = null;
private String localAddress = null;
private long lastActivity;
private TimerTask timerTask = null;
private String[] appArgs = null;
public RemoteShellSession(rshd server, EndpointAddress addr, String remoteAddr) throws IOException {
this.server = server;
try {
this.remoteAddress =
addr.getProtocolName()
+ "://" + addr.getProtocolAddress() + "/"
+ rshd.NAME + "/" +
remoteAddr;
} catch (Exception ez1) {
throw new IOException();
}
long currentTime = System.currentTimeMillis();
this.localAddress = Long.toHexString(currentTime);
lastActivity = currentTime;
}
/**
* {@inheritDoc}
*/
public int startApp(String[] appArgs) {
this.appArgs = appArgs;
try {
cons = new EndpointRemoteShellConsole(this, this,
localAddress,
remoteAddress,
server.endpoint);
} catch (IOException failed) {
return ShellApp.appMiscError;
}
ShellEnv env = new ShellEnv();
setEnv(env);
env.add("console", new ShellObject("console", cons));
env.add("stdgroup", new ShellObject("Default Group", getGroup()));
// Create the default InputPipe
inputPipe = new ShellInputPipe(getGroup(), cons);
outputPipe = new ShellOutputPipe(getGroup(), cons);
setInputPipe(inputPipe);
setOutputPipe(outputPipe);
setInputConsPipe(inputPipe);
setOutputConsPipe(outputPipe);
env.add("stdin", new ShellObject("stdin", inputPipe));
env.add("stdout", new ShellObject("stdout", outputPipe));
env.add("consin", new ShellObject("consin", inputPipe));
env.add("consout", new ShellObject("consout", outputPipe));
timerTask = new TimerTask() {
@Override
public void run() {
long currentTime = System.currentTimeMillis();
if ((currentTime - lastActivity) > rshd.INACTIVITY_TIMEOUT) {
consprintln(" ");
consoleMessage("Inactivity timeout, your session has automatically shutdown.");
stopApp();
}
}
};
try {
server.timer.schedule(timerTask, rshd.INACTIVITY_TIMEOUT, rshd.INACTIVITY_TIMEOUT);
} catch (Exception ez1) {
printStackTrace("Cannot set inactivity timer: ", ez1);
}
Thread t = new Thread(getGroup().getHomeThreadGroup(), this, "Remote Shell Session");
t.setDaemon(true); // FIXME 20040421 jice Questionable
t.start();
// As far as the invoker is concerned, we're finished here.
return ShellApp.appSpawned;
}
/**
* {@inheritDoc}
*
* Spawn a sperate thread and let the rshd server's thread go. It is still the incoming
* message thread !
*/
public void run() {
try {
String[] intialArgs = new String[appArgs.length + 3];
intialArgs[0] = "-s";
intialArgs[1] = LOGIN_INITIAL_APP;
intialArgs[2] = "--";
System.arraycopy(appArgs, 0, intialArgs, 3, appArgs.length);
exec(null, INITIAL_APP, intialArgs, getEnv());
// exec is always in the foreground. When it returns, the app is finished. Tear down.
// The app does not know it is top-level because if we told it that, it would also
// try and create its own window and would actually use the remote peer's one
// if can't make one. We do not have a middle-ground concept.
// So, it is us that do all the tear-down.
} finally {
stopApp();
}
}
/**
* {@inheritDoc}
*/
@Override
public synchronized void stopApp() {
super.stopApp();
println(" ");
println("Remote shell session terminated.");
println("type ~. to exit rsh");
println(" ");
// Give a couple of seconds to help ensure that the message will be sent.
try {
Thread.sleep(2000);
} catch (InterruptedException ie) {
}
getInputPipe().close();
getOutputPipe().close();
if (timerTask != null) {
timerTask.cancel();
}
if (cons != null) {
cons.destroy();
}
}
synchronized void updateActivity() {
lastActivity = System.currentTimeMillis();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy