package net.limework.networking; import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.Session; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.scheduler.BukkitRunnable; import java.io.File; public class AppleTunneler extends JavaPlugin { private Session sshSession; private final JSch jsch = new JSch(); private synchronized void createNewConnection() throws JSchException { if (sshSession != null) { sshSession.disconnect(); } java.util.Properties config = new java.util.Properties(); config.put("StrictHostKeyChecking", "no"); sshSession = jsch.getSession(getUsername(), getHost(), getPort()); sshSession.setConfig(config); sshSession.connect(2000); loadRemoteToLocalPortForwarding(); } private void connectionFailedLog(JSchException exception) { getLogger().severe("=========================="); getLogger().severe("failed to start a connection"); exception.printStackTrace(); getLogger().severe("=========================="); } private void loadIds() throws JSchException { File file = new File(getDataFolder(), "Identities"); if (file.mkdir()) { getLogger().info("created Identities folder."); } File[] files = file.listFiles(); if (files == null) { return; } if (files.length == 0) { getLogger().warning("no Identities files found, please put them in " + file.getPath()); throw new RuntimeException("no Identities files found"); } for (File id : files) { jsch.addIdentity(id.getPath()); } } private void loadRemoteToLocalPortForwarding() throws JSchException { for (String line : getConfig().getStringList("ports")) { String[] array = line.split(":"); sshSession.setPortForwardingL(Integer.parseInt(array[0]), array[1], Integer.parseInt(array[2])); } } @Override public void onEnable() { this.saveDefaultConfig(); try { loadIds(); } catch (JSchException e) { throw new RuntimeException(e); } try { createNewConnection(); } catch (JSchException e) { connectionFailedLog(e); } new BukkitRunnable() { private boolean isConnecting = false; @Override public void run() { if (isConnecting) { return; } if (!sshSession.isConnected()) { isConnecting = true; try { createNewConnection(); } catch (JSchException e) { connectionFailedLog(e); } isConnecting = false; } } }.runTaskTimerAsynchronously(this, 0, 20); } private int getPort() { return this.getConfig().getInt("port"); } private String getUsername() { return this.getConfig().getString("username"); } private String getHost() { return this.getConfig().getString("host"); } }