package-relation/operation.py

145 lines
4.9 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 = []
2024-09-06 02:16:15 +00:00
linux_list = []
2024-09-05 07:56:29 +00:00
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
2024-09-06 02:16:15 +00:00
#print("package = ",package)
#print("-----source_name = ",source_name)
2024-09-05 07:56:29 +00:00
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()
return source_name
def list_del(list):
2024-09-06 02:16:15 +00:00
remove_list = []
2024-09-05 07:56:29 +00:00
for package in list:
if '|' in package:
package_test = package.split("|")
2024-09-06 02:16:15 +00:00
for i in range(len(package_test)):
if package_test [i] in package_list:
list.append(package_test[i])
remove_list.append(package)
elif package not in package_list:
remove_list.append(package)
print(remove_list)
for i in remove_list:
list.remove(i)
2024-09-05 07:56:29 +00:00
return list
2024-09-06 02:16:15 +00:00
2024-09-05 07:56:29 +00:00
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"))
2024-09-06 02:16:15 +00:00
print(result_without)
result = result_without.replace('Pre-Depends: ','')
result = result.replace('Depends: ','')
2024-09-05 07:56:29 +00:00
result = result.replace(' ','')
result = result.replace('\n','')
2024-09-06 02:16:15 +00:00
result = result.replace(':any','')
result = result.replace(':amd64','')
result = result.replace(':i386','')
2024-09-05 07:56:29 +00:00
result_list = result.split(",")
2024-09-06 02:16:15 +00:00
print(result_list)
2024-09-05 07:56:29 +00:00
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
2024-09-06 02:16:15 +00:00
else:
linux_list.append(package_name)
2024-09-05 07:56:29 +00:00
2024-09-06 02:16:15 +00:00
##初始化
2024-09-05 07:56:29 +00:00
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)
###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个
2024-09-06 02:16:15 +00:00
#print(package_list.index("dbus-daemon"))
2024-09-05 07:56:29 +00:00
#print("package_list = ", package_list)
2024-09-06 02:16:15 +00:00
#print(dpkg_analyze("gdm3"))
#exit(0)
2024-09-05 07:56:29 +00:00
line = 0
for package in package_list:
2024-09-06 02:16:15 +00:00
#print("package = ",package)
2024-09-05 07:56:29 +00:00
if np.any(final_np == package) == False:
2024-09-06 02:16:15 +00:00
#print(line)
2024-09-05 07:56:29 +00:00
download_source(package)
final_np[line][0] = package
final_np[line][1] = get_source_name(package)
elif len(final_np[line][1]) == 0:
2024-09-06 02:16:15 +00:00
#print(line)
download_source(package)
final_np[line][0] = package
final_np[line][1] = get_source_name(package)
2024-09-05 07:56:29 +00:00
else:
final_np[line][0] = package
2024-09-05 07:56:29 +00:00
final_np[line][1] = final_np[line][1]
if len(final_np[line][1]) != 0:
2024-09-06 02:16:15 +00:00
#print("depend = ",final_np[line][1])
2024-09-05 07:56:29 +00:00
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
2024-09-06 02:16:15 +00:00
#print(final_np)
#print(final_np[package_list.index("xorg")][0])
#exit(0)
2024-09-05 07:56:29 +00:00
#print("result_list = " , result_list)
print("len(result_list)) = ", len(result_list))
2024-09-06 02:16:15 +00:00
for package in package_list:
depend_list = dpkg_analyze(package)
print("package = ",package)
print("depend_list = ",depend_list)
if len(depend_list) > 0 and len(final_np[package_list.index(package)][1]) != 0 and depend_list[0] != '':
for depend in depend_list:
if "linux-" not in depend and "linux-" not in final_np[package_list.index(depend)][1] and "linux-" not in final_np[package_list.index(package)][1]:
G.add_edge(final_np[package_list.index(package)][1],final_np[package_list.index(depend)][1])
2024-09-05 07:56:29 +00:00
2024-09-06 02:16:15 +00:00
pos = nx.spring_layout(G)
nx.draw(G,pos,with_labels=True)
plt.show()