増田内科様のカスタマイズを見ると,PVT Server をサーバ機で走らせるようにされている。自分でも同じことをしたいと思ったのだが,当方のサーバは X をインストールしていない Debian Etch なので,OpenDolphin のクライアントはそのままでは走らない。しかたがないので,console で OpenDolphin の PVT Server 部分だけを起動できるように StandAlonePVTServer を作成した。サーバマシン起動時に起動スクリプトで立ち上げることにして,JBoss サーバが立ち上がるまで 10 秒ごとにログインをリトライするようにした。
server/StandAlonePVTServer.java
package open.dolphin.server;
import java.util.Iterator;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.prefs.Preferences;
import open.dolphin.client.ClientContext;
import open.dolphin.client.ClientContextStub;
import open.dolphin.delegater.UserDelegater;
import open.dolphin.infomodel.UserModel;
import open.dolphin.plugin.PluginLoader;
import open.dolphin.project.DolphinPrincipal;
import open.dolphin.project.Project;
import open.dolphin.project.ProjectStub;
import org.apache.log4j.Logger;
/**
* Console verion of PVT Server
* @author pns
*/
public class StandAlonePVTServer {
private static final String DEFAULT_FACILITY_OID = "1.3.6.1.4.1.9414.10.1";
private final String NODE_NAME = "/open/dolphin/project";
private PVTServer pvtServer;
private Logger pvtLogger;
private ScheduledFuture timerHandler;
private StandAlonePVTServer(String hostIp, String userId, String password) {
// ClientContext を生成する
ClientContextStub stub = new ClientContextStub();
ClientContext.setClientContextStub(stub);
pvtLogger = ClientContext.getLogger("pvt");
pvtLogger.info("Host Address: " + hostIp);
pvtLogger.info("User ID: " + userId);
// set dolphin server address
Preferences prefs = Preferences.userRoot().node(NODE_NAME);
prefs.put(Project.HOST_ADDRESS, hostIp);
// pref に設定した host address を Project に書き込み
Project.setProjectStub(new ProjectStub());
// facility ID と user ID をセット
DolphinPrincipal principal = new DolphinPrincipal();
principal.setFacilityId(DEFAULT_FACILITY_OID);
principal.setUserId(userId);
// 10秒ごとにログインをトライする
Login l = new Login(principal, password);
ScheduledExecutorService schedule = Executors.newSingleThreadScheduledExecutor();
timerHandler = schedule.scheduleWithFixedDelay(l, 0, 10, TimeUnit.SECONDS);
}
protected class Login implements Runnable {
private UserDelegater userDlg;
private UserModel userModel;
private DolphinPrincipal principal;
private String password;
public Login(DolphinPrincipal principal, String password) {
userDlg = new UserDelegater();
this.principal = principal;
this.password = password;
}
public void run() {
userModel = null;
try {
userModel = userDlg.login(principal, password);
} catch (Exception ex) {
System.out.println(ex);
}
if (userModel != null) {
startPVTServer();
timerHandler.cancel(true);
pvtLogger.info("Login process completed");
} else {
pvtLogger.info("Login failed. Retry in 10 sec.");
}
}
}
private void startPVTServer() {
// plugin loader
PluginLoader loader = PluginLoader.load(PVTServer.class, ClientContext.getPluginClassLoader());
Iterator iter = loader.iterator();
if (iter.hasNext()) {
pvtServer = iter.next();
pvtServer.setContext(null);
pvtServer.start();
}
// ^C でサーバを止めるための設定
Runtime.getRuntime().addShutdownHook(new Thread(){
@Override
public void run() {
pvtLogger.info("Shutdown process starts.");
pvtServer.stop();
}
});
}
public static void main(String[] args) {
String usage = "Usage: java -cp OpenDolphin-1.3.0.X.jar open.dolphin.server.StandAlonePVTServer -Uxxxx -Pxxxx -Sxxx.xxx.xxx.xxx";
String userId = "";
String userPassword = "";
String serverAddress = "";
for (String arg : args){
if ("-U".equals(arg.substring(0, 2))){
userId = arg.substring(2, arg.length());
}
if ("-P".equals(arg.substring(0, 2))){
userPassword = arg.substring(2, arg.length());
}
if ("-S".equals(arg.substring(0,2))){
serverAddress = arg.substring(2, arg.length());
}
}
if (!userId.equals("") && !userPassword.equals("") && !serverAddress.equals("")) {
new StandAlonePVTServer(serverAddress, userId, userPassword);
} else {
System.out.println(usage);
System.exit(1);
}
}
}
起動スクリプト pvtserver.sh
#!/bin/bash
OPENDOLPHIN="OpenDolphin-1.3.0.2.jar"
PVTSERVER="open.dolphin.server.StandAlonePVTServer"
PVTSERVER_HOME="/home/dolphin/opendolphin-client"
PVTSERVER_USER="dolphin"
JBOSS_HOST="192.168.1.100"
JAVA="/usr/bin/java"
USER="admin"
PASS="admin"
SUBIT="su - $PVTSERVER_USER -c "
# log
PVTSERVER_CONSOLE=$PVTSERVER_HOME/log/console.log
if [ -n "$PVTSERVER_CONSOLE" -a ! -d "$PVTSERVER_CONSOLE" ]; then
# ensure the file exists
touch $PVTSERVER_CONSOLE
if [ ! -z "$SUBIT" ]; then
chown $PVTSERVER_USER $PVTSERVER_CONSOLE
fi
fi
if [ -n "$PVTSERVER_CONSOLE" -a ! -f "$PVTSERVER_CONSOLE" ]; then
echo "WARNING: location for saving console log invalid: $PVTSERVER_CONSOLE"
echo "WARNING: ignoring it and using /dev/null"
PVTSERVER_CONSOLE="/dev/null"
fi
# define what will be done with the console log
PVTSERVER_CONSOLE=${PVTSERVER_CONSOLE:-"/dev/null"}
PVTSERVERSH="$JAVA -cp $OPENDOLPHIN $PVTSERVER -U$USER -P$PASS -S$JBOSS_HOST"
PVTSERVER_CMD_START="cd $PVTSERVER_HOME/; $PVTSERVERSH"
if [ ! -d "$PVTSERVER_HOME" ]; then
echo PVTSERVER_HOME does not exist as a valid directory : $PVTSERVER_HOME
exit 1
fi
# echo PVTSERVER_CMD_START = $PVTSERVER_CMD_START
function procrunning() {
procid=0
PVTSERVERSCRIPT=$(echo $PVTSERVERSH | awk '{print $1}')
for procid in `/bin/pidof -x "$PVTSERVERSCRIPT"`; do
ps -fp $procid | grep "${PVTSERVERSH% *}" > /dev/null && pid=$procid
done
}
stop() {
pid=0
procrunning
if [ $pid = '0' ]; then
echo -n -e "\n * No PVTServer is currently running\n"
exit 1
fi
RETVAL=1
# If process is still running
for id in `ps --pid $pid | awk '{print $1}' | grep -v "^PID$"`; do
if [ -z "$SUBIT" ]; then
kill $id
else
$SUBIT "kill $id"
fi
done
sleep=0
while [ $sleep -lt 5 -a $RETVAL -eq 1 ]; do
echo -n -e "\n * waiting for processes to stop";
sleep 1
sleep=`expr $sleep + 10`
pid=0
procrunning
if [ $pid == '0' ]; then
RETVAL=0
fi
done
# Still not dead... kill it
count=0
pid=0
procrunning
if [ $RETVAL != 0 ] ; then
echo -e "\n * Timeout: Shutdown command was sent, but process is still running with PID $pid"
exit 1
fi
echo
exit 0
}
case "$1" in
start)
echo " * Starting PVTServer, check $PVTSERVER_CONSOLE"
cd $PVTSERVER_HOME/
if [ -z "$SUBIT" ]; then
eval $PVTSERVER_CMD_START >${PVTSERVER_CONSOLE} 2>&1 &
else
$SUBIT "$PVTSERVER_CMD_START >${PVTSERVER_CONSOLE} 2>&1 &"
fi
;;
stop)
stop
;;
restart)
$0 stop
$0 start
;;
*)
echo "usage: $0 (start|stop|restart|help)"
esac