Android Open Source - wolPi Wol Pi






From Project

Back to project page wolPi.

License

The source code is released under:

Apache License

If you think the Android project wolPi listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package de.matthesrieke.wolpi;
//from   w w w  .  ja v  a 2 s  .  c o  m
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;

import de.matthesrieke.wolpi.Interactor.Located;
import de.matthesrieke.wolpi.settings.SSHConnection;
import de.matthesrieke.wolpi.settings.WolSettings;

/**
 * Wake-On-Lan through Raspberry Pi (or other Debian-based
 * Linux systems).
 * 
 * @author matthes rieke
 *
 */
public class WolPi {
  
  private static final Logger logger = LoggerFactory.getLogger(WolPi.class);

  private SSHConnection connection;
  private Interactor interactor;
  private JSch jsch;

  private Session session;

  public WolPi(SSHConnection conn, Interactor in) {
    this.connection = conn;
    this.interactor = in;
  }

  private boolean checkWakeOnLanAvailable() throws JSchException, IOException {
    CommandResult result = executeCommand("dpkg -s wakeonlan");
    
    if (result.getExitStatus() == 0) {
      //TODO do logging?
      return true;
    }
    
    return false;
  }

  private void closeConnection() {
    interactor.onOutput("Closing connection to host '{}'.", connection.getHost());
    
    session.disconnect();    
  }

  private void establishConnection() throws JSchException {
    interactor.onOutput("Connecting to '{}' with configuration: {}", connection.getHost(),
        connection);
    
    jsch = new JSch();  
    session = jsch.getSession(connection.getUser(), connection.getHost(),
        connection.getPort());
    session.setUserInfo(new UserInfoImpl(connection.getPassword()));
    session.connect();
  }

  private CommandResult executeCommand(String command) throws JSchException, IOException {
    interactor.onOutput("Executing shell command '{}'...", command);
    
    Channel channel = session.openChannel("exec");
    ((ChannelExec) channel).setCommand(command);

    channel.setInputStream(null);

    ByteArrayOutputStream err = new ByteArrayOutputStream();
    ((ChannelExec) channel).setErrStream(err);

    InputStream in = channel.getInputStream();

    channel.connect();

    StringBuilder sb = new StringBuilder();
    byte[] tmp = new byte[1024];
    while (true) {
      while (in.available() > 0) {
        int i = in.read(tmp, 0, 1024);
        if (i < 0)
          break;
        sb.append(new String(tmp, 0, i));
      }
      
      if (channel.isClosed())
        break;
      
      try {
        Thread.sleep(500);
      } catch (Exception ee) {
        logger.warn(ee.getMessage(), ee);
      }
    }
    
    channel.disconnect();
    
    interactor.onOutput("Execution of command '{}' terminated with exit status {}.",
        command, channel.getExitStatus());
    
    return new CommandResult(sb.toString().trim(), err.toString().trim(), channel.getExitStatus());
  }


  /**
   * Execute a remote WOL call. informs the {@link #interactor}
   * with status updates.
   * 
   * @param wolSettings the wol-specific settings
   */
  public void executeWakeOnLan(final WolSettings wolSettings) {
    new Thread(new Runnable() {
      @Override
      public void run() {
        interactor.onOutput("#### start wol call ####", Located.LOCAL);
        
        try {
          establishConnection();
        } catch (JSchException e) {
          interactor.onError("Error connecting to RPi: {}.", e);
          return;
        }
        
        try {
          if (!checkWakeOnLanAvailable()) {
            if (interactor.requestConfirmation("Module 'wakeonlan' not found on the remote machine. " +
                "Install 'wakeonlan' via apt-get?")) {
              installWakeOnLan();
            }
            else {
              interactor.onOutput("Aborting.");
              return;
            }
          }
        } catch (JSchException e) {
          interactor.onError("Exception: {}.", e);
          return;
        } catch (IOException e) {
          interactor.onError("Exception: {}.", e);
          return;
        } catch (WolPiException e) {
          interactor.onError("Exception: {}.", e);
          return;
        }
        
        
        String command = "wakeonlan -i " + wolSettings.getBroadcastIp() + " " + wolSettings.getMacAddress();
        
//        command = "date";
        
        CommandResult result;
        try {
          result = executeCommand(command);

          interactor.onOutput("{}@{}:~$ {}", Located.REMOTE, connection.getUser(),
              connection.getHost(), command);
          if (result.getExitStatus() == 0) {
            interactor.onOutput(result.getStdout(), Located.REMOTE);
          }
          else {
            interactor.onOutput(result.getStderr(), Located.REMOTE);
          }
        } catch (JSchException e) {
          interactor.onError("Exception: {}.", e);
          return;
        } catch (IOException e) {
          interactor.onError("Exception: {}.", e);
          return;
        }
        
        closeConnection();
      }
    }).start();
  }

  private void installWakeOnLan() throws JSchException, IOException, WolPiException {
    CommandResult result = executeCommand("sudo apt-get --yes --force-yes install wakeonlan");
    
    if (result.getExitStatus() == 0) {
      //TODO do logging?
    }
    else {
      throw new WolPiException("Installation of 'wakeonlan' failed: "+ result);
    }
  }

}




Java Source Code List

de.matthesrieke.wolpi.CommandResult.java
de.matthesrieke.wolpi.Interactor.java
de.matthesrieke.wolpi.SysoutInteractor.java
de.matthesrieke.wolpi.UserInfoImpl.java
de.matthesrieke.wolpi.WolPiException.java
de.matthesrieke.wolpi.WolPi.java
de.matthesrieke.wolpi.dao.SQLiteSettingsProvider.java
de.matthesrieke.wolpi.settings.HostConfiguration.java
de.matthesrieke.wolpi.settings.SSHConnection.java
de.matthesrieke.wolpi.settings.SettingsProvider.java
de.matthesrieke.wolpi.settings.WolSettings.java
de.matthesrieke.wolpi.ui.ConfirmationDialog.java
de.matthesrieke.wolpi.ui.HostListActivity.java
de.matthesrieke.wolpi.ui.HostManagementActivity.java
de.matthesrieke.wolpi.ui.MainActivity.java
de.matthesrieke.wolpi.ui.TextViewInteractor.java
de.matthesrieke.wolpi.util.AndroidServiceLoader.java