From 5b38d0362e73afd8a3cd16fdd1e32dfd7cde00ba Mon Sep 17 00:00:00 2001
From: xuezhixin <xuezhixin@uniontech.com>
Date: Mon, 13 Nov 2023 10:45:29 +0800
Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0ELF=E5=AF=B9=E6=AF=94?=
 =?UTF-8?q?=E5=87=BD=E6=95=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 sysmig_agent/Abisystmcompchk.py | 107 +++++++++++++++++++++++++++++++-
 1 file changed, 106 insertions(+), 1 deletion(-)

diff --git a/sysmig_agent/Abisystmcompchk.py b/sysmig_agent/Abisystmcompchk.py
index 14cad1d..d3c09e6 100644
--- a/sysmig_agent/Abisystmcompchk.py
+++ b/sysmig_agent/Abisystmcompchk.py
@@ -322,6 +322,7 @@ def get_system_pkg_name(flag, mig_logger):
             return False
 
 
+
 class myThread (threading.Thread):
     def __init__(self, threadID, name, q, lock, fpw, fpr, q_query, log):
         threading.Thread.__init__(self)
@@ -338,7 +339,6 @@ class myThread (threading.Thread):
         process_data(self.name, self.q, self.lock, self.fpw, self.fpr, self.q_query, self.log)
         self.log.info ("Exit the thread" + self.name)
 
-
 def is_binwary_file(filename):
     TEXT_BOMS = {
         codecs.BOM_UTF16_BE,
@@ -352,3 +352,108 @@ def is_binwary_file(filename):
         initial_bytes = file.read(CHUNKSIZE)
         file.close
     return not any(initial_bytes.startswith(bom) for bom in TEXT_BOMS) and b'\0' in initial_bytes
+
+def incomp_binwary_desc(binwary_file):
+    if binwary_file.endswith('.so'):
+        incomp_info_desc = '库差异'
+    elif binwary_file.endswith('.exec'):
+        incomp_info_desc = '可执行文件'
+    elif binwary_file.endswith('.mod'):
+        incomp_info_desc = '视频文件'
+    else:
+        incomp_info_desc = '二进制差异'
+    return incomp_info_desc
+
+def deal_files_list(fwincomp, fwcomp, cur_file_list, trn_file_list, rpm_full_pkg_name, list_log):
+    #compatiable
+    comp_flag=1
+    link_flag = '0'
+    cur_file_deal = ''
+
+    rpm_pkg_dir = local_dir + 'uos/rpms'
+    rpm_pkg_name = rpm_full_pkg_name.rsplit('-',2)[0]
+    pkg_version = rpm_full_pkg_name.rsplit('-',2)[1]
+
+    for cur_file_name in cur_file_list:
+
+        cur_file_binwary = cur_file_name.strip('\n')
+
+        if not os.path.exists(cur_file_binwary):
+            continue
+
+        if os.path.isdir(cur_file_binwary):
+            continue
+
+        if '.' in cur_file_binwary.rsplit('/',1)[1]:
+            if '.'+cur_file_binwary.rsplit('.',1)[1] in suffix_list:
+                continue
+
+        if not is_ELFfile(cur_file_binwary, list_log):
+            continue
+
+        if is_binwary_file(cur_file_binwary):
+            trn_file_deal = rpm_pkg_dir + cur_file_binwary
+            if not os.path.exists(trn_file_deal):
+                continue
+
+            #link file realpath
+            if os.path.islink(cur_file_binwary):
+                cur_file_deal = os.path.realpath(cur_file_binwary)
+                if cur_file_name in trn_file_list:
+                    trn_file_deal_tmp = rpm_pkg_dir + cur_file_binwary
+                    trn_file_deal = os.path.realpath(trn_file_deal_tmp)
+                    link_flag = '1'
+                else:
+                    continue
+            else:
+                if link_flag:
+                    link_flag = '0'
+                    continue
+                if cur_file_name in trn_file_list:
+                    trn_file_deal = rpm_pkg_dir + cur_file_binwary
+                    cur_file_deal = cur_file_binwary
+                else:
+                    continue
+
+            abidiff_rst_list = list(os.popen('abidiff  %s %s' %(trn_file_deal, cur_file_binwary)))
+            if len(abidiff_rst_list):
+                i = 0
+                if cur_file_binwary.endswith('.exec'):
+                    while i < 2:
+                        for line in abidiff_rst_list[i].split(':',1)[1].split(','):
+                            if line.split(' ', 2)[1] != '0':
+                                bin_name = cur_file_name.strip('\n').rsplit('/', 1)[1]
+                                compatiablity='N'
+                                incomp_reason = incomp_binwary_desc(bin_name)
+                                diff_detail = abidiff_rst_list[i].split(':', 1)[1]
+                                fwincomp.write(rpm_pkg_name+','+bin_name+','+pkg_version+','+compatiablity+','+incomp_reason+','+diff_detail)
+                                comp_flag = 0
+                        i = i + 1
+                #20220112 lihp: add if branch
+                elif abidiff_rst_list[0].startswith('ELF SONAME'):
+                    i = i + 1
+                    while i < 2:
+                        for line in abidiff_rst_list[i].split(':',1)[1].split(','):
+                            if line.split(' ', 2)[1] != '0':
+                                bin_name = cur_file_name.strip('\n').rsplit('/', 1)[1]
+                                compatiablity='N'
+                                incomp_reason = incomp_binwary_desc(bin_name)
+                                diff_detail = abidiff_rst_list[i].split(':', 1)[1]
+                                fwincomp.write(rpm_pkg_name+','+bin_name+','+pkg_version+','+compatiablity+','+incomp_reason+','+diff_detail)
+                                comp_flag = 0
+                        i = i + 1
+                else:
+                    while i < 4:
+                        for line in abidiff_rst_list[i].split(':',1)[1].split(','):
+                            if line.split(' ', 2)[1] != '0':
+                                bin_name = cur_file_name.strip('\n').rsplit('/', 1)[1]
+                                compatiablity='N'
+                                incomp_reason = incomp_binwary_desc(bin_name)
+                                diff_detail = abidiff_rst_list[i].split(':', 1)[1]
+                                fwincomp.write(rpm_pkg_name+','+bin_name+','+pkg_version+','+compatiablity+','+incomp_reason+','+diff_detail)
+                                comp_flag = 0
+                        i = i + 1
+            else:
+                continue
+    if comp_flag:
+        fwcomp.write(rpm_pkg_name + ',' + ',' + ',' + 'Y,' + ',' + '\n')
\ No newline at end of file
-- 
2.20.1

