diff --git a/Mage.Updater/pom.xml b/Mage.Updater/pom.xml new file mode 100644 index 0000000000..d19343091f --- /dev/null +++ b/Mage.Updater/pom.xml @@ -0,0 +1,31 @@ + + + + mage-root + org.mage + 0.8.5 + + 4.0.0 + + org.mage + mage-updater + Mage Updater + + + + + org.apache.maven.plugins + maven-jar-plugin + + + + com.magefree.update.Main + + + + + + + \ No newline at end of file diff --git a/Mage.Updater/src/main/java/com/magefree/update/ChechsumHelper.java b/Mage.Updater/src/main/java/com/magefree/update/ChechsumHelper.java new file mode 100644 index 0000000000..f208807ee0 --- /dev/null +++ b/Mage.Updater/src/main/java/com/magefree/update/ChechsumHelper.java @@ -0,0 +1,37 @@ +package com.magefree.update; + +import java.io.FileInputStream; +import java.io.InputStream; +import java.security.MessageDigest; + +public class ChechsumHelper { + public static byte[] createChecksum(String filename) throws + Exception + { + InputStream fis = new FileInputStream(filename); + + byte[] buffer = new byte[1024]; + MessageDigest complete = MessageDigest.getInstance("SHA1"); + int numRead; + do { + numRead = fis.read(buffer); + if (numRead > 0) { + complete.update(buffer, 0, numRead); + } + } while (numRead != -1); + fis.close(); + return complete.digest(); + } + + // see this How-to for a faster way to convert + // a byte array to a HEX string + public static String getSHA1Checksum(String filename) throws Exception { + byte[] b = createChecksum(filename); + String result = ""; + for (int i=0; i < b.length; i++) { + result += + Integer.toString( ( b[i] & 0xff ) + 0x100, 16).substring( 1 ); + } + return result; + } +} diff --git a/Mage.Updater/src/main/java/com/magefree/update/Main.java b/Mage.Updater/src/main/java/com/magefree/update/Main.java new file mode 100644 index 0000000000..24d4523859 --- /dev/null +++ b/Mage.Updater/src/main/java/com/magefree/update/Main.java @@ -0,0 +1,147 @@ +package com.magefree.update; + +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLConnection; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Scanner; + +public class Main { + private final static String URL_PREFIX = "http://download.magefree.com/update/"; + + public static void main(String[] args) throws Exception { + Main m = new Main(); + HashMap local = m.readLocalData(); + HashMap remote = m.downloadAndParseUpdateData(); + List downloadList = m.findUpdated(local, remote); + downloadList.addAll(m.findNew(local, remote)); + m.downloadAndUpdate(downloadList); + m.removeFiles(m.findRemoved(local, remote)); + } + + public HashMap readLocalData() throws Exception { + HashMap result = new HashMap(); + for (File f : findJars()) { + result.put(f.getPath().replaceAll("\\\\", "/"), ChechsumHelper.getSHA1Checksum(f.getPath())); + } + return result; + } + + public List findJars() throws Exception { + ArrayList result = new ArrayList(); + result.addAll(findJarsInDir("mage-client/lib")); + result.addAll(findJarsInDir("mage-client/plugins")); + result.addAll(findJarsInDir("mage-server/lib")); + result.addAll(findJarsInDir("mage-server/plugins")); + return result; + } + + public List findJarsInDir(String dir) { + ArrayList result = new ArrayList(); + File directory = new File(dir); + if (directory.exists() && directory.isDirectory()) { + for (File jar : directory.listFiles(new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + return name.endsWith(".jar"); + } + })) { + result.add(jar); + } + } + return result; + } + + public HashMap downloadAndParseUpdateData() throws Exception { + HashMap result = new HashMap(); + URL url = new URL(URL_PREFIX + "update-data.txt"); + URLConnection urlConnection = url.openConnection(); + urlConnection.connect(); + Scanner scanner = new Scanner(urlConnection.getInputStream()); + while (scanner.hasNextLine()) { + String[] lines = scanner.nextLine().split(" "); + if (lines.length == 2) { + result.put(lines[1], lines[0]); + System.out.println("jar " + lines[1] + ", checksum " + lines[0]); + } + } + return result; + } + + public List findUpdated(HashMap local, HashMap remote) { + ArrayList result = new ArrayList(); + for (String remoteFile : remote.keySet()) { + if (local.containsKey(remoteFile)) { + if (!local.get(remoteFile).equals(remote.get(remoteFile))) { + System.out.println("jar need to be updated - " + remoteFile); + result.add(remoteFile); + } + } + } + return result; + } + + public List findNew(HashMap local, HashMap remote) { + ArrayList result = new ArrayList(); + for (String remoteFile : remote.keySet()) { + if (!local.containsKey(remoteFile)) { + System.out.println("new jar found - " + remoteFile); + result.add(remoteFile); + } + } + return result; + } + + public List findRemoved(HashMap local, HashMap remote) { + ArrayList result = new ArrayList(); + for (String localFile : local.keySet()) { + if (!remote.containsKey(localFile)) { + System.out.println("deleted jar found - " + localFile); + result.add(localFile); + } + } + return result; + } + + public void downloadAndUpdate(List downloadList) throws IOException { + for (String filename : downloadList) { + URL url = new URL(URL_PREFIX + filename); + HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); + urlConnection.connect(); + if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) { + System.out.println("downloading " + filename); + try { + InputStream in = urlConnection.getInputStream(); + File f = new File(filename); + if (!f.exists()) + f.getParentFile().mkdirs(); + FileOutputStream out = new FileOutputStream(filename); + byte[] buf = new byte[4 * 1024]; + int bytesRead; + while ((bytesRead = in.read(buf)) != -1) { + out.write(buf, 0, bytesRead); + } + } catch (IOException e) { + System.out.println("i/o exception - " + e.getMessage()); + } + + } else { + System.out.println(filename + " error status : " + urlConnection.getResponseMessage()); + } + } + } + + public void removeFiles(List files) { + for (String filename : files) { + File f = new File(filename); + if (f.exists()) { + f.delete(); + } else { + System.out.println("ERROR. File was found but currently not found"); + } + } + } +} diff --git a/pom.xml b/pom.xml index 84a1404045..79ff3d9a3d 100644 --- a/pom.xml +++ b/pom.xml @@ -32,7 +32,7 @@ Mage.Server.Plugins Mage.Server.Console Mage.Tests - mage.updater.client + Mage.Updater