Mercurial Hosting > luan
annotate src/goodjava/lucene/backup/BackupServer.java @ 2026:9c10e37c56f6
minor
| author | Franklin Schmidt <fschmidt@gmail.com> | 
|---|---|
| date | Wed, 29 Oct 2025 21:38:14 -0600 | 
| parents | 969291201e12 | 
| children | 
| rev | line source | 
|---|---|
| 1499 | 1 package goodjava.lucene.backup; | 
| 2 | |
| 3 import java.io.File; | |
| 4 import java.io.IOException; | |
| 5 import java.util.Map; | |
| 
1690
 
973d3039c421
backup server checks client domain
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1675 
diff
changeset
 | 
6 import java.net.InetAddress; | 
| 1499 | 7 import java.net.Socket; | 
| 8 import java.net.ServerSocket; | |
| 
1690
 
973d3039c421
backup server checks client domain
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1675 
diff
changeset
 | 
9 import java.net.UnknownHostException; | 
| 1499 | 10 import java.util.concurrent.Executors; | 
| 1502 | 11 import java.util.concurrent.ExecutorService; | 
| 1509 | 12 import javax.net.ssl.SSLSocket; | 
| 1499 | 13 import javax.net.ssl.SSLServerSocket; | 
| 14 import goodjava.util.SoftCacheMap; | |
| 1501 | 15 import goodjava.io.IoUtils; | 
| 1499 | 16 import goodjava.rpc.RpcServer; | 
| 17 import goodjava.rpc.RpcCall; | |
| 1509 | 18 import goodjava.rpc.RpcClient; | 
| 19 import goodjava.rpc.RpcResult; | |
| 1512 | 20 import goodjava.rpc.Rpc; | 
| 1509 | 21 import goodjava.rpc.RpcException; | 
| 1499 | 22 import goodjava.logging.Logger; | 
| 23 import goodjava.logging.LoggerFactory; | |
| 24 | |
| 25 | |
| 1672 | 26 public final class BackupServer { | 
| 1499 | 27 private static final Logger logger = LoggerFactory.getLogger(BackupServer.class); | 
| 28 | |
| 1675 | 29 public static int port = 9102; | 
| 1499 | 30 public static String[] cipherSuites = new String[] { | 
| 31 "TLS_DH_anon_WITH_AES_128_GCM_SHA256", | |
| 32 "TLS_DH_anon_WITH_AES_128_CBC_SHA256", | |
| 33 "TLS_ECDH_anon_WITH_AES_128_CBC_SHA", | |
| 34 "TLS_DH_anon_WITH_AES_128_CBC_SHA", | |
| 35 "TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA", | |
| 36 "SSL_DH_anon_WITH_3DES_EDE_CBC_SHA", | |
| 37 "TLS_ECDH_anon_WITH_RC4_128_SHA", | |
| 38 "SSL_DH_anon_WITH_RC4_128_MD5", | |
| 39 "SSL_DH_anon_WITH_DES_CBC_SHA", | |
| 40 "SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA", | |
| 41 "SSL_DH_anon_EXPORT_WITH_RC4_40_MD5", | |
| 42 }; | |
| 43 | |
| 44 private final File backupDir; | |
| 1502 | 45 private static final ExecutorService threadPool = Executors.newCachedThreadPool(); | 
| 1499 | 46 private static final Map<String,Backup> backups = new SoftCacheMap<String,Backup>(); | 
| 47 | |
| 1501 | 48 public BackupServer(File backupDir) throws IOException { | 
| 1499 | 49 this.backupDir = backupDir; | 
| 1501 | 50 IoUtils.mkdirs(backupDir); | 
| 1499 | 51 } | 
| 52 | |
| 53 public synchronized void start() throws IOException { | |
| 54 final ServerSocket ss; | |
| 55 if( cipherSuites == null ) { | |
| 56 ss = new ServerSocket(port); | |
| 57 } else { | |
| 
1506
 
d80395468b4e
ssl security in code
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1502 
diff
changeset
 | 
58 ss = IoUtils.getSSLServerSocketFactory().createServerSocket(port); | 
| 1499 | 59 ((SSLServerSocket)ss).setEnabledCipherSuites(cipherSuites); | 
| 60 } | |
| 61 threadPool.execute(new Runnable(){public void run() { | |
| 62 try { | |
| 63 while(!threadPool.isShutdown()) { | |
| 64 final Socket socket = ss.accept(); | |
| 65 threadPool.execute(new Runnable(){public void run() { | |
| 66 handle(socket); | |
| 67 }}); | |
| 68 } | |
| 69 } catch(IOException e) { | |
| 70 logger.error("",e); | |
| 71 } | |
| 72 }}); | |
| 73 logger.info("started server on port "+port); | |
| 74 } | |
| 75 | |
| 
1690
 
973d3039c421
backup server checks client domain
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1675 
diff
changeset
 | 
76 private static String getName(RpcServer rpc,Object[] args) { | 
| 
 
973d3039c421
backup server checks client domain
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1675 
diff
changeset
 | 
77 String domain = (String)args[0]; | 
| 
 
973d3039c421
backup server checks client domain
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1675 
diff
changeset
 | 
78 InetAddress addr; | 
| 
 
973d3039c421
backup server checks client domain
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1675 
diff
changeset
 | 
79 try { | 
| 
 
973d3039c421
backup server checks client domain
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1675 
diff
changeset
 | 
80 addr = InetAddress.getByName(domain); | 
| 
 
973d3039c421
backup server checks client domain
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1675 
diff
changeset
 | 
81 } catch(UnknownHostException e) { | 
| 
 
973d3039c421
backup server checks client domain
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1675 
diff
changeset
 | 
82 rpc.write( new RpcException("domain lookup failed") ); | 
| 
 
973d3039c421
backup server checks client domain
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1675 
diff
changeset
 | 
83 rpc.close(); | 
| 
 
973d3039c421
backup server checks client domain
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1675 
diff
changeset
 | 
84 return null; | 
| 
 
973d3039c421
backup server checks client domain
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1675 
diff
changeset
 | 
85 } | 
| 
 
973d3039c421
backup server checks client domain
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1675 
diff
changeset
 | 
86 if( !rpc.socket.getInetAddress().equals(addr) ) { | 
| 
 
973d3039c421
backup server checks client domain
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1675 
diff
changeset
 | 
87 rpc.write( new RpcException("domain doesn't match client") ); | 
| 
 
973d3039c421
backup server checks client domain
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1675 
diff
changeset
 | 
88 rpc.close(); | 
| 
 
973d3039c421
backup server checks client domain
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1675 
diff
changeset
 | 
89 return null; | 
| 
 
973d3039c421
backup server checks client domain
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1675 
diff
changeset
 | 
90 } | 
| 
 
973d3039c421
backup server checks client domain
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1675 
diff
changeset
 | 
91 String name = (String)args[1]; | 
| 
 
973d3039c421
backup server checks client domain
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1675 
diff
changeset
 | 
92 return name==null ? domain : domain + "~" + name; | 
| 
 
973d3039c421
backup server checks client domain
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1675 
diff
changeset
 | 
93 } | 
| 
 
973d3039c421
backup server checks client domain
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1675 
diff
changeset
 | 
94 | 
| 
1697
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
95 private Backup getBackup(String name) { | 
| 
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
96 synchronized(backups) { | 
| 
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
97 Backup backup = backups.get(name); | 
| 
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
98 if( backup == null ) { | 
| 
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
99 backup = new Backup( new File(backupDir,name) ); | 
| 
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
100 backups.put(name,backup); | 
| 
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
101 } | 
| 
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
102 return backup; | 
| 
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
103 } | 
| 
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
104 } | 
| 
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
105 | 
| 1499 | 106 private void handle(Socket socket) { | 
| 107 RpcServer rpc = new RpcServer(socket); | |
| 1674 | 108 Backup backup = null; | 
| 109 while( !rpc.isClosed() ) { | |
| 1499 | 110 RpcCall call = rpc.read(); | 
| 1674 | 111 if( call == null ) | 
| 112 break; | |
| 113 if( call.cmd.equals("exists") ) { | |
| 
1690
 
973d3039c421
backup server checks client domain
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1675 
diff
changeset
 | 
114 String name = getName(rpc,call.args); | 
| 
 
973d3039c421
backup server checks client domain
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1675 
diff
changeset
 | 
115 if( name==null ) return; | 
| 1674 | 116 rpc.write( new RpcResult(new Object[]{new File(backupDir,name).exists()}) ); | 
| 117 } else if( call.cmd.equals("login") ) { | |
| 
1690
 
973d3039c421
backup server checks client domain
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1675 
diff
changeset
 | 
118 String name = getName(rpc,call.args); | 
| 
 
973d3039c421
backup server checks client domain
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1675 
diff
changeset
 | 
119 if( name==null ) return; | 
| 
1697
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
120 backup = getBackup(name); | 
| 1674 | 121 rpc.write(Rpc.OK); | 
| 122 } else if( backup != null ) { | |
| 123 backup.handle(rpc,call); | |
| 
1697
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
124 } else if( call.cmd.equals("copy") ) { | 
| 1698 | 125 try { | 
| 126 if( !IoUtils.getInetAddresses().contains(rpc.socket.getInetAddress()) ) { | |
| 127 rpc.write( new RpcException("only localhost allowed") ); | |
| 128 rpc.close(); | |
| 129 return; | |
| 130 } | |
| 131 } catch(IOException e) { | |
| 132 throw new RuntimeException(e); | |
| 133 } | |
| 
1697
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
134 String dirName = (String)call.args[0]; | 
| 
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
135 copy(new File(dirName)); | 
| 
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
136 rpc.write(Rpc.OK); | 
| 1674 | 137 } else { | 
| 1512 | 138 rpc.write( new RpcException("login expected") ); | 
| 139 rpc.close(); | |
| 140 return; | |
| 141 } | |
| 1499 | 142 } | 
| 143 } | |
| 144 | |
| 
1697
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
145 private void copy(File dir) { | 
| 
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
146 try { | 
| 
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
147 IoUtils.deleteRecursively(dir); | 
| 
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
148 IoUtils.mkdirs(dir); | 
| 
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
149 for( File f : backupDir.listFiles() ) { | 
| 
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
150 if( f.isDirectory() && new File(f,"index.json").exists() ) { | 
| 
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
151 String name = f.getName(); | 
| 
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
152 Backup backup = getBackup(name); | 
| 
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
153 backup.copyTo( new File(dir,name) ); | 
| 
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
154 } | 
| 
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
155 } | 
| 
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
156 } catch(IOException e) { | 
| 
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
157 throw new RuntimeException(e); | 
| 
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
158 } | 
| 
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
159 } | 
| 
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
160 | 
| 1509 | 161 | 
| 162 // for client | |
| 163 | |
| 2022 | 164 static Socket clientSocket(String backupDomain) throws IOException { | 
| 1509 | 165 Socket socket; | 
| 166 if( BackupServer.cipherSuites == null ) { | |
| 167 socket = new Socket(backupDomain,BackupServer.port); | |
| 168 } else { | |
| 169 socket = IoUtils.getSSLSocketFactory().createSocket(backupDomain,BackupServer.port); | |
| 170 ((SSLSocket)socket).setEnabledCipherSuites(BackupServer.cipherSuites); | |
| 171 } | |
| 2022 | 172 return socket; | 
| 173 } | |
| 174 | |
| 175 public static RpcClient rpcClient(String backupDomain) throws IOException { | |
| 176 Socket socket = clientSocket(backupDomain); | |
| 1509 | 177 return new RpcClient(socket); | 
| 178 } | |
| 179 | |
| 
1697
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
180 public static void copyBackupTo(String dirName) throws IOException, RpcException { | 
| 
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
181 RpcClient rpc = BackupServer.rpcClient("localhost"); | 
| 
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
182 rpc.write( new RpcCall("copy",dirName) ); | 
| 
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
183 RpcResult result = rpc.read(); | 
| 
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
184 rpc.close(); | 
| 
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
185 } | 
| 
 
aff2309ae510
add copy_backups.luan
 
Franklin Schmidt <fschmidt@gmail.com> 
parents: 
1690 
diff
changeset
 | 
186 | 
| 1499 | 187 } | 
