package org.limewire.http.mongrel;
import java.io.File;
import java.io.FileNotFoundException;
import javax.script.ScriptException;
import org.limewire.core.settings.ConnectionSettings;
import org.limewire.io.NetworkUtils;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
import com.limegroup.gnutella.NetworkManager;
import com.limegroup.gnutella.UPnPManager;
import org.limewire.scripting.RubyEvaluator;
@Singleton
public
class MongrelManagerImpl implements MongrelManager {
private RubyEvaluator rubyEvaluator;
private final Provider<UPnPManager> upnpManager;
private NetworkManager networkManager;
private int _port = 4422;
private String status = "stopped";
@Inject
public MongrelManagerImpl(final RubyEvaluator rubyEvaluator, Provider<UPnPManager> upnpManager,
NetworkManager networkManager) {
this.rubyEvaluator = rubyEvaluator;
this.upnpManager = upnpManager;
this.networkManager = networkManager;
}
@Override
public String getServiceName() {
return org.limewire.i18n.I18nMarker.marktr("Mongrel Manager");
}
@Override
public void start() {
if(!this.isServerRunning()) {
System.out.println("Starting mongrel...");
setStatus("starting");
// Try to port forward incoming traffic to our server via UPnP
mapPort();
loadMongrel();
setStatus("started");
}
}
public void loadMongrel() {
System.out.println("Release the hounds!");
try {
String usablePath = null;
String[] loadPaths = {
"../../../../../script/start_rails",
"rails/script/start_rails"
};
// Look through the paths to find one
for(String path : loadPaths) {
File file = new File(path);
if(file.exists()) {
usablePath = path;
}
};
if(usablePath != null) {
rubyEvaluator.eval(usablePath);
} else {
throw new FileNotFoundException();
}
} catch(FileNotFoundException exception) {
System.out.println("couldn't find mongrel start script.");
} catch(ScriptException exception) {
exception.getCause().printStackTrace();
}
}
public void mapPort() {
boolean natted = upnpManager.get().isNATPresent();
boolean validPort = NetworkUtils.isValidPort(_port);
boolean forcedIP = ConnectionSettings.FORCE_IP_ADDRESS.getValue() &&
!ConnectionSettings.UPNP_IN_USE.getValue();
if(natted && validPort && !forcedIP) {
byte[] externalAddress = networkManager.getExternalAddress();
System.out.println(_port);
System.out.println(externalAddress);
int usedPort = upnpManager.get().mapPort(_port, externalAddress);
System.out.println(usedPort);
}
}
public void stop() {
if(this.isServerRunning()) {
this.setStatus("stopping");
}
}
public void restart() {
if(this.isServerRunning()) {
this.stop();
}
this.start();
}
public Boolean isServerRunning() {
return this.getStatus() == "started" || this.getStatus() == "starting";
}
public synchronized String getStatus() {
return this.status;
}
public synchronized void setStatus(String status) {
System.out.println("setting status to " + status);
this.status = status;
}
@Override
public boolean isAsyncStop() {
return true;
}
}