package-relation/operation.py

138 lines
4.3 KiB
Python
Raw Normal View History

2024-09-05 07:56:29 +00:00
import subprocess,re,os,time
import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
package_list = []
result_list = []
G = nx.DiGraph()
def download_source(package):
package_folder = os.getcwd() + "/tmp/" + package
if os.path.exists(package_folder) == False:
cmd = "mkdir " + package_folder + " && cd " + package_folder + " && apt source " + package
#print(cmd)
intofolder_source = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE) #cd /tmp && apt source wpasupplicant
intofolder_source.wait()
def get_source_name(package):
package_folder = os.getcwd() + "/tmp/" + package
#print(package_folder)
path_list = os.listdir(package_folder)
for path in path_list:
if '_' in path:
source_name = path.split("_")[0]
else:
source_name = path.split("-")[0]
break
print("package = ",package)
print("-----source_name = ",source_name)
cmd = "rm -rf " + package_folder
#print(cmd)
rm_source = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE) #cd /tmp && apt source wpasupplicant
rm_source.wait()
print(type(source_name))
return source_name
def list_del(list):
for package in list:
if '|' in package:
package_test = package.split("|")
if package_test [0] in package_list:
list.remove(package)
list.append(package_test[0])
else:
list.remove(package)
list.append(package_test[1])
return list
def dpkg_analyze(package):
cmd = "dpkg -s " + package + " |grep Depends:"
#print(package)
dpkg_depends = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE) #dpkg -s wpasupplicant
result_stdout = dpkg_depends.stdout.readline()
result_without = re.sub(u"\\(.*?\\)", "", str(result_stdout,encoding= " utf-8"))
result = result_without.replace('Depends: ','')
result = result.replace(' ','')
result = result.replace('\n','')
result_list = result.split(",")
return list_del(result_list)
f = open ("ubuntu2204-package.txt")
lines = f.readlines()
number = 0
count = 0
for line in lines:
number = number + 1
#if number > 5 and number < 10:
if number > 5:
package_name = line.split()[1].replace(':amd64','')
if "linux-" not in package_name:
package_list.append(package_name) #add package name to list
##初始化使用
#a = np.array([['1','2']],dtype="<U1000")
#b = np.array([['1','2']])
#final_np = np.insert(a, 0, values=b, axis=0)
#for i in range(len(package_list)-1):
# final_np = np.insert(final_np, 0, values=b, axis=0)
##初始化使用2
final_np = np.loadtxt("temp.csv", delimiter=",", dtype="<U1000")
if np.any(final_np == "accountsservice") == False:
final_np = np.empty((len(package_list), 2),dtype="<U1000")
print(final_np)
##加载数据
#final_np = np.loadtxt("temp.csv", delimiter=",", dtype="<U1000")
#print(np.any(final_np == "os-prober"))
#print(final_np)
#exit(0)
###test
#print(package_list)
#list_test = ['hicolor-icon-theme', 'gtk-update-icon-cache', 'ubuntu-mono|adwaita-icon-theme-full']
#list_del(list_test)
#print(list_test)
print("len(package_list) = ", len(package_list)) ##1628个
#print("package_list = ", package_list)
line = 0
#print(np.any(final_np == "os-prober"))
#exit(0)
for package in package_list:
print(package)
if np.any(final_np == package) == False:
print(line)
download_source(package)
final_np[line][0] = package
final_np[line][1] = get_source_name(package)
else:
final_np[line][0] = final_np[line][0]
final_np[line][1] = final_np[line][1]
if len(final_np[line][1]) != 0:
print(final_np[line][1])
result_list.append(final_np[line][1])
G.add_node(final_np[line][1])
np.savetxt("temp.csv", final_np, delimiter=",", fmt='%s')
line = line + 1
print(final_np)
#print("result_list = " , result_list)
print("len(result_list)) = ", len(result_list))
np.savetxt("temp.csv", final_np, delimiter=",")
#for package in package_list:
# depend_list = dpkg_analyze(package)
# print(depend_list)
# if len(depend_list) > 0 and len(get_source_name(package)) != 0:
# for depend in depend_list:
# G.add_edge(get_source_name(package),get_source_name(depend))
#pos = nx.spring_layout(G)
#nx.draw(G,pos,with_labels=True)
#plt.show()