1、DnsUtil中加入500毫秒延迟,以便增加拿到地址的成功率。
authorsnickersun <snickersun@qq.com>
Sun, 1 Mar 2020 16:33:50 +0000 (00:33 +0800)
committersnickersun <snickersun@qq.com>
Sun, 1 Mar 2020 16:33:50 +0000 (00:33 +0800)
2、把ftp协议上传log为http协议上传日志,解决电信卡无法上传日志的问题(ftp协议端口网路中似乎受限,移动卡都可以,就是电信卡不行)。
3、编译版本365

app/app.iml
app/src/main/java/com/enqualcomm/support/Config.java
app/src/main/java/com/enqualcomm/support/ICSmsManager.java
app/src/main/java/com/enqualcomm/support/utils/DnsUtil.java
app/src/main/java/com/enqualcomm/support/utils/ICHttpUtil.java [new file with mode: 0644]
app/src/main/java/com/enqualcomm/support/utils/Util.java
app/version_code.properties
dNSCache/src/main/java/com/sina/util/dnscache/net/ApacheHttpClientNetworkRequests.java

index 1a534bf..51cd3ff 100644 (file)
     <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test:runner:0.5@aar" level="project" />\r
     <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test:exposed-instrumentation-api-publish:0.5@aar" level="project" />\r
     <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test.espresso:espresso-idling-resource:2.2.2@aar" level="project" />\r
+    <orderEntry type="library" name="Gradle: __local_aars__:D.\Snicker\icsupport\app\libs\android-logging-log4j-1.0.3.jar:unspecified@jar" level="project" />\r
     <orderEntry type="library" name="Gradle: __local_aars__:D.\Snicker\icsupport\app\libs\ftp4j-1.7.2.jar:unspecified@jar" level="project" />\r
     <orderEntry type="library" name="Gradle: __local_aars__:D.\Snicker\icsupport\app\libs\LauncherCtrl.jar:unspecified@jar" level="project" />\r
+    <orderEntry type="library" name="Gradle: __local_aars__:D.\Snicker\icsupport\app\libs\log4j-1.2.17.jar:unspecified@jar" level="project" />\r
     <orderEntry type="library" name="Gradle: __local_aars__:D.\Snicker\icsupport\app\libs\okio-2.4.3.jar:unspecified@jar" level="project" />\r
     <orderEntry type="library" name="Gradle: com.android.support:support-annotations:25.1.0@jar" level="project" />\r
     <orderEntry type="library" name="Gradle: io.reactivex:rxjava:1.1.0@jar" level="project" />\r
index fa27715..d31186b 100644 (file)
@@ -285,6 +285,7 @@ public class Config {
     return json;\r
   }\r
 \r
+  public final  static boolean upload_logs_via_ftp=false;\r
   final static String KeyProtocolServerIP="ProtocolServerIP";\r
   final static String KeyProtocolServerHOST="ProtocolServerHOST";\r
   final static String KeyProtocolServerPort="ProtoclServerPort";;\r
index 2244f4b..9ac8e12 100644 (file)
@@ -19,6 +19,7 @@ import com.enqualcomm.support.bean.Runtime;
 import com.enqualcomm.support.service.Deliver;\r
 import com.enqualcomm.support.utils.APNUtil;\r
 import com.enqualcomm.support.utils.DeviceInfoUtil;\r
+import com.enqualcomm.support.utils.ICHttpUtil;\r
 import com.enqualcomm.support.utils.ICLogger;\r
 import com.enqualcomm.support.utils.ServiceUtil;\r
 import com.enqualcomm.support.utils.TimeUtil;\r
@@ -36,6 +37,7 @@ import chestnut.utils.PhoneUtils;
 import rx.Observable;\r
 import rx.functions.Action1;\r
 \r
+import static com.enqualcomm.support.Config.upload_logs_via_ftp;\r
 import static com.enqualcomm.support.Constants.DIALOG_ACTION;\r
 import static com.enqualcomm.support.utils.DeviceInfoUtil.getDeviceVersion;\r
 \r
@@ -370,6 +372,7 @@ public class ICSmsManager {
                                 Observable.timer(500L, TimeUnit.MILLISECONDS).subscribe(new Action1<Long>() {\r
                                     public void call(Long param1Long) {\r
                                         sendSMS(phonenumber, "start Upload allLogfile [crashlog APILog log GPS LocationAlarm Battery] to " + Config.getFtpServer(mContext));\r
+                                        String logtime=TimeUtil.getSystemTime3();\r
                                         for (String file : filelist) {\r
 \r
                                             if (Util.LogfileExist(runtime, file)) {\r
@@ -377,19 +380,30 @@ public class ICSmsManager {
                                                 String filepath = Util.getLogfilePath(runtime, file);\r
                                                 URL serverurl = null;\r
                                                 try {\r
-                                                    serverurl = new URL(Util.getServerLogfilePath(Config.getFtpServer(mContext), time, file));\r
+                                                    serverurl = new URL(Util.getServerLogfilePath(Config.getFtpServer(mContext), time, file,runtime));\r
                                                 } catch (MalformedURLException e) {\r
                                                     e.printStackTrace();\r
                                                 }\r
-                                                if (ftpUtils.upload(serverurl, Config.getFtpUser(mContext), Config.getFtpPWD(mContext), new File(filepath))) {\r
-                                                    sb.append(" ").append(file);\r
-                                                    ICLogger.i("Upload file "+file+" success! ");\r
+                                                if (upload_logs_via_ftp){\r
+                                                    if (ftpUtils.upload(serverurl, Config.getFtpUser(mContext), Config.getFtpPWD(mContext), new File(filepath))) {\r
+                                                        sb.append(" ").append(file);\r
+                                                        ICLogger.i("Upload file "+file+" success! ");\r
+                                                    }else{\r
+                                                        ICLogger.i("Upload file "+file+" failed! ");\r
+\r
+                                                    }\r
                                                 }else{\r
-                                                    ICLogger.i("Upload file "+file+" failed! ");\r
+                                                    if (ICHttpUtil.uploadFile(filepath,runtime,logtime)) {\r
+                                                        sb.append(" ").append(file);\r
+                                                        ICLogger.i("Upload file "+file+" success! ");\r
+                                                    }else{\r
+                                                        ICLogger.i("Upload file "+file+" failed! ");\r
 \r
+                                                    }\r
                                                 }\r
 \r
 \r
+\r
                                             }\r
                                         }\r
                                         if (sb.length()>0) {\r
@@ -406,17 +420,27 @@ public class ICSmsManager {
                                         String filepath = Util.getLogfilePath(runtime, logfile);\r
                                         URL serverurl = null;\r
                                         try {\r
-                                            serverurl = new URL(Util.getServerLogfilePath(Config.getFtpServer(mContext), TimeUtil.getSystemTime3(), logfile));\r
+                                            serverurl = new URL(Util.getServerLogfilePath(Config.getFtpServer(mContext), TimeUtil.getSystemTime3(), logfile,runtime));\r
                                         } catch (MalformedURLException e) {\r
                                             e.printStackTrace();\r
                                         }\r
                                         if (Util.LogfileExist(runtime, logfile)) {\r
 \r
                                             sendSMS(phonenumber, "start Upload " + logfile + " to " + Config.getFtpServer(mContext) +" ...");\r
-                                            if( ftpUtils.upload(serverurl, Config.getFtpUser(mContext), Config.getFtpPWD(mContext), new File(filepath))) {\r
-                                                sendSMS(phonenumber, "Upload " + logfile + " to " + Config.getFtpServer(mContext) +" success!");\r
+                                            String logtime=TimeUtil.getSystemTime3();\r
+\r
+                                            if (upload_logs_via_ftp) {\r
+                                                if (ftpUtils.upload(serverurl, Config.getFtpUser(mContext), Config.getFtpPWD(mContext), new File(filepath))) {\r
+                                                    sendSMS(phonenumber, "Upload " + logfile + " to " + Config.getFtpServer(mContext) + " success!");\r
+                                                } else {\r
+                                                    sendSMS(phonenumber, "Upload " + logfile + " to " + Config.getFtpServer(mContext) + " failed!");\r
+                                                }\r
                                             }else{\r
-                                                sendSMS(phonenumber, "Upload " + logfile + " to " + Config.getFtpServer(mContext) +" failed!");\r
+                                                if (ICHttpUtil.uploadFile(filepath,runtime,logtime)) {\r
+                                                    sendSMS(phonenumber, "Upload " + logfile + " to " + Config.getFtpServer(mContext) + " success!");\r
+                                                } else {\r
+                                                    sendSMS(phonenumber, "Upload " + logfile + " to " + Config.getFtpServer(mContext) + " failed!");\r
+                                                }\r
                                             }\r
                                         } else {\r
                                             sendSMS(phonenumber, logfile + " not exist !");\r
index bd01b61..20e6db9 100644 (file)
@@ -185,6 +185,11 @@ public class DnsUtil  {
         };\r
         runTask(temp, call);\r
         String ip;\r
+        try {\r
+            Thread.sleep(500L);\r
+        } catch (InterruptedException e) {\r
+            e.printStackTrace();\r
+        }\r
 //        ICLogger.i(temp.toString());\r
         if (temp.domainIp!=null){\r
             if (temp.hostIp!=null){\r
diff --git a/app/src/main/java/com/enqualcomm/support/utils/ICHttpUtil.java b/app/src/main/java/com/enqualcomm/support/utils/ICHttpUtil.java
new file mode 100644 (file)
index 0000000..303d361
--- /dev/null
@@ -0,0 +1,115 @@
+package com.enqualcomm.support.utils;\r
+\r
+import android.content.Context;\r
+import android.util.Log;\r
+\r
+import com.enqualcomm.support.Config;\r
+import com.sina.util.dnscache.net.ApacheHttpClientNetworkRequests;\r
+import com.enqualcomm.support.bean.Runtime;\r
+\r
+import java.io.DataInputStream;\r
+import java.io.DataOutputStream;\r
+import java.io.File;\r
+import java.io.FileInputStream;\r
+import java.io.FileOutputStream;\r
+import java.io.OutputStream;\r
+import java.net.HttpURLConnection;\r
+import java.net.URL;\r
+import java.util.zip.CRC32;\r
+import java.util.zip.CheckedOutputStream;\r
+import java.util.zip.ZipOutputStream;\r
+\r
+import static android.content.ContentValues.TAG;\r
+\r
+public class ICHttpUtil {\r
+    public static boolean uploadFile(String filenames, Runtime runtime,String logtime)  {\r
+\r
+        try {\r
+            if (Util.zipFile(new File(filenames), runtime.getCacheDir().getAbsolutePath(),\r
+                    new ZipOutputStream(new CheckedOutputStream(new FileOutputStream(filenames+".zip"),new CRC32()))\r
+            , filenames)) {\r
+                filenames += ".zip";\r
+            }\r
+        }catch (Exception e){\r
+            e.printStackTrace();\r
+        }\r
+        String server= Config.getFotaServerIP(runtime.getContextProxy().context);\r
+        int port= Config.getFotaServerPort(runtime.getContextProxy().context);\r
+        String product=DeviceInfoUtil.getModule();\r
+        String pkgver=DeviceInfoUtil.getSWVersionDisplayName();\r
+        String imei=runtime.IMEI();\r
+        String actionUrl = "http://"+server+":"+port + "/UploadFile.jsp?product=" + product + "&pkgver="+ pkgver + "&imei="+ imei+"&logtime="+logtime;\r
+        return upLoadFile(actionUrl, new File(filenames));\r
+\r
+    }\r
+    public static boolean upLoadFile(String url, File file) {\r
+        boolean result = false;\r
+        try {\r
+            if (null == url || null == file || !file.exists() || file.length() < 1) {\r
+                return false;\r
+            }\r
+            /**\r
+             * 第一部分\r
+             */\r
+            URL urlObj = new URL(url);\r
+            HttpURLConnection con = (HttpURLConnection) urlObj.openConnection();\r
+\r
+            /**\r
+             * 设置关键值\r
+             */\r
+            con.setRequestMethod("POST"); // 以Post方式提交表单,默认get方式\r
+            con.setDoInput(true);\r
+            con.setDoOutput(true);\r
+            con.setUseCaches(false); // post方式不能使用缓存\r
+\r
+            // 设置请求头信息\r
+            con.setRequestProperty("Connection", "Keep-Alive");\r
+            con.setRequestProperty("Charset", "UTF-8");\r
+\r
+            // 设置边界\r
+            String BOUNDARY = "----------" + System.currentTimeMillis();\r
+            con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);\r
+\r
+            // 请求正文信息\r
+\r
+            // 第一部分:\r
+            StringBuilder sb = new StringBuilder();\r
+            sb.append("--"); // ////////必须多两道线\r
+            sb.append(BOUNDARY);\r
+            sb.append("\r\n");\r
+            sb.append("Content-Disposition: form-data;name=\"file\";filename=\"" + file.getName() + "\"\r\n");\r
+            sb.append("Content-Type:application/octet-stream\r\n\r\n");\r
+\r
+            byte[] head = sb.toString().getBytes("utf-8");\r
+\r
+            // 获得输出流\r
+            OutputStream out = new DataOutputStream(con.getOutputStream());\r
+            out.write(head);\r
+\r
+            // 文件正文部分\r
+            DataInputStream in = new DataInputStream(new FileInputStream(file));\r
+            int bytes = 0;\r
+            byte[] bufferOut = new byte[1024];\r
+            while ((bytes = in.read(bufferOut)) != -1) {\r
+                out.write(bufferOut, 0, bytes);\r
+            }\r
+            in.close();\r
+\r
+            // 结尾部分\r
+            byte[] foot = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("utf-8");// 定义最后数据分隔线\r
+            out.write(foot);\r
+            out.flush();\r
+            out.close();\r
+\r
+            int statusCode = con.getResponseCode();\r
+            String msg=con.getResponseMessage();\r
+            Log.e(TAG,msg);\r
+            if (statusCode == 200) {\r
+                result = true;\r
+            }\r
+        } catch (Exception e) {\r
+            e.printStackTrace();\r
+        }\r
+        return result;\r
+    }\r
+}\r
index 6783d34..e0ba83b 100644 (file)
@@ -12,19 +12,30 @@ import android.net.wifi.WifiManager;
 import android.os.Build;\r
 \r
 \r
+import java.io.BufferedInputStream;\r
+import java.io.BufferedOutputStream;\r
 import java.io.ByteArrayOutputStream;\r
 import java.io.ByteArrayInputStream;\r
 import java.io.File;\r
 import java.io.FileInputStream;\r
 import java.io.FileOutputStream;\r
 import java.io.IOException;\r
+import java.io.InputStream;\r
+import java.io.OutputStream;\r
 import java.lang.reflect.Method;\r
 import java.net.InetAddress;\r
 import java.nio.ByteBuffer;\r
 import java.nio.charset.Charset;\r
 import java.util.ArrayList;\r
+import java.util.Enumeration;\r
 import java.util.Iterator;\r
+import java.util.List;\r
 import java.util.UUID;\r
+import java.util.zip.CRC32;\r
+import java.util.zip.CheckedOutputStream;\r
+import java.util.zip.ZipEntry;\r
+import java.util.zip.ZipFile;\r
+import java.util.zip.ZipOutputStream;\r
 \r
 import okio.BufferedSink;\r
 import okio.Okio;\r
@@ -37,6 +48,10 @@ import com.enqualcomm.support.bean.voicePacket;
 \r
 import static android.content.Context.CONNECTIVITY_SERVICE;\r
 import static android.content.Context.WIFI_SERVICE;\r
+import static chestnut.utils.FileUtils.closeIO;\r
+import static chestnut.utils.FileUtils.createOrExistsDir;\r
+import static chestnut.utils.FileUtils.createOrExistsFile;\r
+import static chestnut.utils.StringUtils.isSpace;\r
 \r
 public class Util {\r
   public static Charset UTF_16 = Charset.forName("UTF-16LE");\r
@@ -377,9 +392,137 @@ public class Util {
     return file.getAbsolutePath();\r
   }\r
 \r
-  public static String getServerLogfilePath(String serverhost,String timefolder,String logfilename) {\r
+\r
+  private static int BUFFER_LEN=1024;\r
+  /**\r
+   * 压缩文件\r
+   * @param srcFile 待压缩的源文件\r
+   * @param rootPath 源文件的根路径\r
+   * @param zos Zip输出流\r
+   * @param comment 备注\r
+   * @return 压缩成功返回true\r
+   * @throws IOException\r
+   */\r
+  public static boolean zipFile(final File srcFile, String rootPath ,final  ZipOutputStream zos ,final String comment) throws IOException {\r
+    rootPath = rootPath + (isSpace(rootPath) ? "" : File.separator) + srcFile.getName();\r
+\r
+    if (srcFile.isDirectory()) {\r
+      File[] fileList = srcFile.listFiles();\r
+      if (fileList == null || fileList.length <= 0) {\r
+        ZipEntry entry = new ZipEntry(rootPath + '/');\r
+        entry.setComment(comment);\r
+        zos.putNextEntry(entry);\r
+        zos.closeEntry();\r
+      } else {\r
+        for (File file : fileList) {\r
+          if (!zipFile(file, rootPath, zos, comment)) return false;\r
+        }\r
+      }\r
+    } else {\r
+      InputStream is = null;\r
+      try {\r
+        is = new BufferedInputStream(new FileInputStream(srcFile));\r
+        ZipEntry entry = new ZipEntry(rootPath);\r
+        entry.setComment(comment);\r
+        zos.putNextEntry(entry);\r
+        byte buffer[] = new byte[BUFFER_LEN];\r
+        int len;\r
+        while ((len = is.read(buffer, 0, BUFFER_LEN)) != -1) {\r
+          zos.write(buffer, 0, len);\r
+        }\r
+        zos.closeEntry();\r
+      } finally {\r
+        if(is!=null)\r
+          closeIO(is);\r
+          is=null;\r
+      }\r
+    }\r
+    return true;\r
+  }\r
+  /**\r
+   * Unzip the file by keyword.\r
+   *\r
+   * @param zipFile The ZIP file.\r
+   * @param destDir The destination directory.\r
+   * @param keyword The keyboard.\r
+   * @return the unzipped files\r
+   * @throws IOException if unzip unsuccessfully\r
+   */\r
+  public static List<File> unzipFileByKeyword(final File zipFile,final File destDir,final String keyword) throws IOException {\r
+    if (zipFile == null || destDir == null) return null;\r
+    List<File> files = new ArrayList<>();\r
+    ZipFile zip = new ZipFile(zipFile);\r
+    Enumeration<?> entries = zip.entries();\r
+    try {\r
+      if (isSpace(keyword)) {\r
+        while (entries.hasMoreElements()) {\r
+          ZipEntry entry = ((ZipEntry) entries.nextElement());\r
+          String entryName = entry.getName();\r
+          if (entryName.contains("../")) {\r
+            ICLogger.log("ZipUtils", "it's dangerous!");//防止被利用漏洞恶意修改文件\r
+            return files;\r
+          }\r
+          if (!unzipChildFile(destDir, files, zip, entry)) return files;\r
+        }\r
+      } else {\r
+        while (entries.hasMoreElements()) {\r
+          ZipEntry entry = ((ZipEntry) entries.nextElement());\r
+          String entryName = entry.getName();\r
+          if (entryName.contains("../")) {\r
+            ICLogger.log("ZipUtils", "it's dangerous!");\r
+            return files;\r
+          }\r
+          if (entryName.contains(keyword)) {\r
+            if (!unzipChildFile(destDir, files, zip, entry)) return files;\r
+          }\r
+        }\r
+      }\r
+    } finally {\r
+      zip.close();\r
+    }\r
+    return files;\r
+  }\r
+\r
+  private static boolean unzipChildFile(final File destDir, final List<File> files, final ZipFile zip, final ZipEntry entry)\r
+          throws IOException {\r
+    File file = new File(destDir, entry.getName());\r
+    files.add(file);\r
+    if (entry.isDirectory()) {\r
+      return createOrExistsDir(file);//创建文件夹\r
+    } else {\r
+      if (!createOrExistsFile(file)) return false;\r
+      InputStream in = null;\r
+      OutputStream out = null;\r
+      try {\r
+        in = new BufferedInputStream(zip.getInputStream(entry));\r
+        out = new BufferedOutputStream(new FileOutputStream(file));\r
+        byte buffer[] = new byte[BUFFER_LEN];\r
+        int len;\r
+        while ((len = in.read(buffer)) != -1) {\r
+          out.write(buffer, 0, len);\r
+        }\r
+      } finally {\r
+        if (in != null) {\r
+          in.close();\r
+        }\r
+        if (out != null) {\r
+          out.close();\r
+        }\r
+      }\r
+    }\r
+    return true;\r
+  }\r
+\r
+  public static String getServerLogfilePath(String serverhost,String timefolder,String logfilename ,Runtime runtime) {\r
     StringBuilder urlbuilder=new StringBuilder();\r
-    urlbuilder.append("ftp://").append(serverhost).append("/")\r
+    String srvIP=serverhost;\r
+    if (SimSignalUtil.checkNet(runtime.getContextProxy().context) ) {\r
+       srvIP=runtime.getDnsUtil().getServerIP_ByDNSCache("http://"+serverhost);\r
+      if (null == srvIP  ) {\r
+        srvIP=serverhost;\r
+      }\r
+    }\r
+    urlbuilder.append("ftp://").append(srvIP).append("/")\r
             .append("ftp/log/")\r
             .append(DeviceInfoUtil.getModule()).append("/")\r
             .append(DeviceInfoUtil.getSWVersionDisplayName()).append("/")\r
index 916a26d..265e565 100644 (file)
@@ -1,2 +1,2 @@
-#Sat Feb 29 18:14:15 CST 2020\r
-VERSION_CODE=364\r
+#Mon Mar 02 00:29:11 CST 2020\r
+VERSION_CODE=365\r
index 9b2d3d5..6d5b5fd 100644 (file)
@@ -3,6 +3,8 @@
  */
 package com.sina.util.dnscache.net;
 
+import android.util.Log;
+
 import java.io.BufferedReader;
 import java.io.ByteArrayOutputStream;
 import java.io.DataInputStream;
@@ -18,6 +20,7 @@ import java.net.URI;
 import java.net.URL;
 import java.util.HashMap;
 import java.util.Map.Entry;
+import java.util.logging.Logger;
 
 import org.apache.http.HttpResponse;
 import org.apache.http.client.HttpClient;
@@ -38,6 +41,8 @@ import org.apache.http.params.HttpParams;
 
 import com.sina.util.dnscache.Tools;
 
+import static android.content.ContentValues.TAG;
+
 /**
  * 
  * 项目名称: DNSCache 类名称: ApacheHttpClientNetworkRequests 
@@ -255,6 +260,8 @@ public class ApacheHttpClientNetworkRequests implements INetworkRequests {
             out.close();
 
             int statusCode = con.getResponseCode();
+            String msg=con.getResponseMessage();
+            Log.e(TAG,msg);
             if (statusCode == 200) {
                 result = true;
             }