From c2df049383395c06a12dd92fd1e87cc392791719 Mon Sep 17 00:00:00 2001 From: Loki Date: Mon, 20 Feb 2012 12:33:24 +0400 Subject: [PATCH] console updater for mage.client. almost ready to work --- mage.updater.client/pom.xml | 15 ++ .../com/magefree/update/ChechsumHelper.java | 37 +++++ .../main/java/com/magefree/update/Main.java | 146 ++++++++++++++++++ 3 files changed, 198 insertions(+) create mode 100644 mage.updater.client/pom.xml create mode 100644 mage.updater.client/src/main/java/com/magefree/update/ChechsumHelper.java create mode 100644 mage.updater.client/src/main/java/com/magefree/update/Main.java diff --git a/mage.updater.client/pom.xml b/mage.updater.client/pom.xml new file mode 100644 index 00000000000..bbcafdb99ad --- /dev/null +++ b/mage.updater.client/pom.xml @@ -0,0 +1,15 @@ + + + + mage-root + org.mage + 0.8.3 + + 4.0.0 + + mage-updater-client + + + \ No newline at end of file diff --git a/mage.updater.client/src/main/java/com/magefree/update/ChechsumHelper.java b/mage.updater.client/src/main/java/com/magefree/update/ChechsumHelper.java new file mode 100644 index 00000000000..f208807ee0c --- /dev/null +++ b/mage.updater.client/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.client/src/main/java/com/magefree/update/Main.java b/mage.updater.client/src/main/java/com/magefree/update/Main.java new file mode 100644 index 00000000000..aa7779c9153 --- /dev/null +++ b/mage.updater.client/src/main/java/com/magefree/update/Main.java @@ -0,0 +1,146 @@ +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://magefree.com:81/test1/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(); + File dir = new File("lib"); + if (dir.exists() && dir.isDirectory()) { + for (File jar : dir.listFiles(new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + return name.endsWith(".jar"); + } + })) { + result.add(jar); + } + } + dir = new File("plugins"); + if (dir.exists() && dir.isDirectory()) { + for (File jar : dir.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(); + 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"); + } + } + } +}