package makhin.mykola.minor.utils.routerreset;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.SecureRandom;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
import org.apache.commons.httpclient.ConnectTimeoutException;
import org.apache.commons.httpclient.Credentials;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
import org.apache.commons.httpclient.URI;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpConnectionParams;
import org.apache.commons.httpclient.protocol.Protocol;
import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
/**
* @author Mykola Makhin
* @version 0.2
*/
private static final long serialVersionUID = -6196217426008036402L;
public static final int WAIT_TIME = 30000;
public static void main
(String[] args
) {
frame.
getContentPane().
add(new RouterResetUtil
(),
BorderLayout.
CENTER);
frame.pack();
frame.
setDefaultCloseOperation(JFrame.
DISPOSE_ON_CLOSE);
frame.setVisible(true);
}
public RouterResetUtil() {
initGui();
initNet();
}
t.printStackTrace();
public void run() {
JOptionPane.
showMessageDialog(RouterResetUtil.
this,
"Error "+t.
getClass().
getName()+" occured: "+t.
getMessage(),
"Error",
JOptionPane.
ERROR_MESSAGE);
}
});
}
protected void log
(String message
) {
System.
out.
println("["+dateFormat.
format(new Date())+"]: "+message
);
}
// ## GUI start
// TODO: move to separate GUI class
protected ButtonsHandler buttonsHandler = new ButtonsHandler();
protected static final String ACT_SAVE
= "ACT_SAVE";
protected static final String ACT_TEST
= "ACT_TEST";
public void initGui() {
// Init components
cbProtocol.addItem("HTTP");
cbProtocol.addItem("HTTPS");
btnSave.addActionListener(buttonsHandler);
btnSave.setActionCommand(ACT_SAVE);
btnTest.addActionListener(buttonsHandler);
btnTest.setActionCommand(ACT_TEST);
tfStatus.setEditable(false);
taLog.setEditable(false);
// Init config panel
pnlRouterParams.
add(new JLabel("Router host")); pnlRouterParams.
add(tfRouterHost
);
pnlRouterParams.
add(new JLabel("Protocol")); pnlRouterParams.
add(cbProtocol
);
pnlRouterParams.
add(new JLabel("Login")); pnlRouterParams.
add(tfRouterLogin
);
pnlRouterParams.
add(new JLabel("Password")); pnlRouterParams.
add(tfRouterPass
);
pnlRouterParams.add(btnTest); pnlRouterParams.add(btnSave);
// Init status/log panel
}
// ## Handler start
String actionCommand
= actEvent.
getActionCommand();
String routerHost
= tfRouterHost.
getText();
boolean useHttps = cbProtocol.getSelectedItem().toString().toLowerCase().equals("https");
String routerLogin
= tfRouterLogin.
getText();
if(ACT_SAVE.equals(actionCommand)) {
RouterResetUtil.this.configureNet(routerHost, useHttps, routerLogin, routerPass);
if(RouterResetUtil.this.testRouterLogin()) RouterResetUtil.this.doSaveParams();
else JOptionPane.
showMessageDialog(RouterResetUtil.
this,
"Connection error",
"Error",
JOptionPane.
ERROR_MESSAGE);
} else if(ACT_TEST.equals(actionCommand)) {
RouterResetUtil.this.configureNet(routerHost, useHttps, routerLogin, routerPass);
if(RouterResetUtil.
this.
testRouterLogin()) JOptionPane.
showMessageDialog(RouterResetUtil.
this,
"Router connection OK",
"Message",
JOptionPane.
INFORMATION_MESSAGE);
else JOptionPane.
showMessageDialog(RouterResetUtil.
this,
"Connection error",
"Error",
JOptionPane.
ERROR_MESSAGE);
}
}
}
protected void doSaveParams() {
this.removeAll();
this.invalidate();
this.revalidate();
if(monitorThread!=null) {
try {
monitorThread.interrupt();
doStartMonitor();
error(t);
}
} else {
doStartMonitor();
}
}
protected void doStartMonitor() {
monitorThread
= new Thread(new MonitorResetter
());
monitorThread.setDaemon(true);
monitorThread.start();
this.setStatus("Monitoring started");
this.logInfoMsg("Monitoring started");
}
// ## Handler end
protected void setStatus
(final String status
) {
public void run() {
tfStatus.
setText("["+dateFormat.
format(new Date())+"]: "+status
);
}
});
}
protected void logInfoMsg
(final String message
) {
public void run() {
taLog.
append("["+dateFormat.
format(new Date())+"]: "+message
+"\n");
}
});
}
// ## GUI end
// ## Netz start
protected void initSsl() {
try {
SSLContext context = SSLContext.getInstance("TLS");
context.
init(null,
new TrustManager
[] {new AllowAllTrustManager
()},
new SecureRandom());
/*
javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
context = SSLContext.getInstance("SSL");
context.init(null, new TrustManager[] {new AllowAllTrustManager()}, new SecureRandom());
javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
*/
Protocol myhttps = new Protocol("https", new ProtocolSocketFactory() {
SSLSocketFactory socketFactory;
public ProtocolSocketFactory setSocketFactory(SSLSocketFactory socketFactory) {
this.socketFactory = socketFactory;
return this;
}
return socketFactory.createSocket(host, port);
}
return socketFactory.createSocket(host, port, localAddress, localPort);
}
ConnectTimeoutException {
return socketFactory.createSocket(host, port, localAddress, localPort);
}
}.setSocketFactory(context.getSocketFactory()), 443);
Protocol.registerProtocol("https", myhttps);
t.printStackTrace();
}
}
protected HttpClient httpClient;
protected GetMethod getGoogle = new GetMethod("http://www.google.com");
protected GetMethod getRouterStartPage = new GetMethod();
protected PostMethod postRouterDHCPRenew = new PostMethod();
protected void initHttpClient() {
MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();
httpClient = new HttpClient(connectionManager);
httpClient.getParams().setConnectionManagerTimeout(12000L);
httpClient.getParams().setSoTimeout(12000);
postRouterDHCPRenew.addParameter("submit_type", "renew");
postRouterDHCPRenew.addParameter("submit_button", "Status_Router");
postRouterDHCPRenew.addParameter("change_action", "gozila_cgi");
postRouterDHCPRenew.addParameter("dhcp_renew", "DHCP Renew");
}
protected void initNet() {
initSsl();
initHttpClient();
}
protected void configureNet
(String routerHost,
boolean useHttps,
String login,
String pass
) {
Credentials credentials = new UsernamePasswordCredentials(login, pass);
httpClient.getState().clearCredentials();
httpClient.getState().setCredentials(new AuthScope(routerHost, AuthScope.ANY_PORT), credentials);
//httpClient.getState().setCredentials(AuthScope.ANY, credentials);
try {
getRouterStartPage.setURI(new URI((useHttps? "https://" : "http://") + routerHost+"/index.asp", true));
postRouterDHCPRenew.setURI(new URI((useHttps? "https://" : "http://") + routerHost+"/apply.cgi", true));
error(e);
}
}
protected boolean testRouterLogin() {
boolean result = false;
try {
log("Trying Router login");
int rspCode = httpClient.executeMethod(getRouterStartPage);
System.
out.
println(getRouterStartPage.
getURI());
if(rspCode>=200 && rspCode<300) {
result = true;
log("Router login seems successfull. Code: "+rspCode);
} else {
log("Router login seems not OK. Code: "+rspCode+".\nResponse:\n"+getRouterStartPage.getResponseBodyAsString());
}
error(t);
log("!! Error loggin in to Router - "+t.getClass().getName()+": "+t.getMessage());
} finally {
getRouterStartPage.releaseConnection();
}
return result;
}
protected boolean testInetConnection() {
boolean connected = false;
try {
log("Testing Inet connection");
int responseCode = httpClient.executeMethod(getGoogle);
byte[] responseBytes = getGoogle.getResponseBody();
String responseText
= new String(responseBytes, getGoogle.
getResponseCharSet());
if(responseCode<200 || responseCode>=300 || responseText.indexOf("<title>Google</title>")<0) {
if(responseCode<200 || responseCode>=300) {
log("Wrong response code from google.com");
} else {
log("Suspicious response text from google.com");
}
log("Response code: "+responseCode+"\nResponse text:"+responseText);
}
connected = true;
log("Inet connection OK");
connected = false; // Superficial. Well, whatever...
unknownHostException.printStackTrace();
log("Unknown host exception for www.google.com - obvious DNS failure");
log(unknownHostException.getClass().getName()+": "+unknownHostException.getMessage());
err.printStackTrace();
log("Error on testing Inet connection: "+err.getMessage());
log(err.getClass().getName()+": "+err.getMessage());
} finally {
getGoogle.releaseConnection();
}
return connected;
}
private boolean resetInternetConnection() {
boolean done = false;
try {
log("Resetting Inet connection");
if(!testRouterLogin()) log("Warning - router login error!");
int responseCode = httpClient.executeMethod(postRouterDHCPRenew);
byte[] responseBytes = postRouterDHCPRenew.getResponseBody();
String responseText
= new String(responseBytes, postRouterDHCPRenew.
getResponseCharSet());
if(responseCode<200 || responseCode>=300 || responseText.indexOf(">0.0.0.0<")>=0) {
if(responseCode<200 || responseCode>=300) {
log("Wrong response code from Router");
} else {
log("Zero IPs in response text from Router");
}
log("Router response code: "+responseCode+"\nRouter response text:"+responseText);
log("Resetting Inet connection unsuccessfull");
} else {
done = true;
log("Resetting Inet connection seems successfull");
}
err.printStackTrace();
log("Error on resetting Inet connection: "+err.getMessage());
log(err.getClass().getName()+": "+err.getMessage());
} finally {
postRouterDHCPRenew.releaseConnection();
}
return done;
}
// ## Netz end
protected enum TheCode { GREEN, YELLOW, RED};
protected class MonitorResetter
implements Runnable {
protected TheCode code = TheCode.GREEN;
public void run() {
while(true) {
if(!RouterResetUtil.this.testInetConnection()) {
log("!! Internet connection failure suspected");
setStatus("YELLOW: Connection failure suspected");
if(code.equals(TheCode.GREEN)) {
code = TheCode.YELLOW;
log("!! Code YELLOW");
} else if(code.equals(TheCode.YELLOW)) {
code = TheCode.RED;
log("!! Code RED");
log("!! Internet connection failure detected");
setStatus("RED: Connection failure detected!");
logInfoMsg("Connection failure detected");
}
if(code.equals(TheCode.RED)) {
log("!! Resetting Inet connection");
if(resetInternetConnection()) {
code = TheCode.YELLOW;
log("!! Connection reset\nCode YELLOW");
setStatus("YELLOW: Connection reset");
logInfoMsg("Connection reset attempt");
} else {
log("!! Failed to reset connection\nCode RED");
setStatus("RED: Failed to reset connection!!!");
logInfoMsg("Failed to reset connection!");
}
}
} else {
if(!code.equals(TheCode.GREEN)) {
if(code.equals(TheCode.RED)) {
code = TheCode.YELLOW;
log("!! Internet connection seems OK now by itself\nCode YELLOW");
setStatus("YELLOW: Connection seems OK by itself");
} else {
code = TheCode.GREEN;
log("!! Internet connection is OK\nCode GREEN");
setStatus("GREEN: Connection is now OK");
logInfoMsg("Connection is now OK");
}
} else {
log("Connection Ok");
setStatus("GREEN: Connection is OK");
}
}
try {
if(code.equals(TheCode.GREEN))
else
log("!! We've been interrupted");
log("InterruptedException");
break;
log("!! Thread insomnia");
log(e.getClass().getName()+": "+e.getMessage());
break;
}
}
}
}
public static class AllowAllTrustManager implements javax.net.ssl.TrustManager, javax.net.ssl.X509TrustManager {
return null;
}
public boolean isServerTrusted
(java.
security.
cert.
X509Certificate[] certs
) {
return true;
}
public boolean isClientTrusted
(java.
security.
cert.
X509Certificate[] certs
) {
return true;
}
return;
}
return;
}
}
}