You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

243 lines
8.5 KiB

#/usr/bin/env python
# -*- coding: UTF-8 -*-
import os, sys
import json
from io import StringIO
2 years ago
from utils.utils import get_list_overlays, sort_install_pkg, load_config
from utils.GenRecovers import ScanRecoverFile
from utils.getUses import get_global_USE, get_local_USE
from utils.package import search
2 years ago
from utils.parsePortage import PortageConfig
# создаём раcширенную базу пакетов с приблизительной структурой
# pkg_list ={"category": [{name: name_pkg, versions:[list_version]}]}
# и кладём это всё в json
2 years ago
class PortageConfig():
def __init__(self):
self.Config = load_config()
self.TargetParse =['USE', 'USE_EXPAN', 'VIDEO_CARDS', 'ACCEPT_CHOSTS', 'ACCEPT_LICENSE','CCACHE_DIR', 'CCACHE_SIZE',
'EMERGE_DEFAULT_OPTS', 'CFLAGS', 'CXXFLAGS', 'MAKEOPTS']
self.MakeConfig={}
self.EnvPortaga ={}
#super().__init__(self.run())
def getLines(self, filename):
if os.path.exists(filename):
with open (filename, 'r') as f:
lines = f.read().split("\n")
else:
print("path is not Found")
return lines
def parseMakeConf(self):
StateBox = 'Null'
Lines = self.getLines(self.Config['Portage']['make.conf'])
for line in Lines:
if not line.startswith('#') and len(line.split("="))>1:
line.replace('"', "")
if StateBox == 'Null' and not line.endswith('"'):
StateBox = line.split('=')[0]
self.MakeConfig[StateBox] =[]
self.MakeConfig[StateBox] = line.split('=')[1].split(" ")
for i in line.split('=')[1].split(" "):
self.MakeConfig[split('=')[0]].append(i)
elif StateBox !='Null' and not line.endswith('"'):
StateBox = line.split('=')[1]
for i in line.split('=')[1].split(" "):
self.MakeConfig[line.split('=')[0]].append(i)
elif StateBox == 'Null' and line.endswith('"'):
#line.replace('"', "")
self.MakeConfig[line.split('=')[0]] = line.split('="')[1].split(" ")
self.EnvPortaga['make.conf'] = self.MakeConfig
print(self.MakeConfig)
def templParse(self, parm, res=False):
self.MakeConfig[parm] =[]
Lines = self.getLines(self.Config['Portage'][parm])
for i in Lines:
if not i.startswith('#'):
self.MakeConfig[parm].append(dict(Name=i.split(" ")[0], Uses=i.split(" ")[1:]))
if res:
print(self.MakeConfig[parm])
return self.MakeConfig[parm]
2 years ago
self.EnvPortaga[pam] = self.MakeConfig[parm]
def parsePackageUse(self):
self.templParse('package.use')
def parsePackageMasks(self):
sel.templParse('package.mask')
def parsePakageUnmask(self):
self.templParse("package.unmask")
def parsePackageKeywords(self):
self.templParse('package.accept_keywords')
def run(self):
self.parseMakeConf()
self.templParse('package.use', res=True)
self.templParse('package.mask', res=True)
self.templParse('package.unmask', res=True)
self.templParse('package.accept_keywords', res=True)
return self.EnvPortaga
2 years ago
if __name__ == '__main__':
Test = PortageConfig()
if sys.argv[1] == "envMake":
Test.parseMakeConf()
elif sys.argv[1] == "use":
Test.templParse('package.use', res=True)
elif sys.argv[1] == "mask":
Test.templParse('package.mask', res=True)
elif sys.argv[1] == "unmask":
Test.templParse('package.unmask', res=True)
else:
pass
#
AliaseCategory ={
"app-crypt":"Шифрование",
"app-dicts":"Словари",
"app-editors":"Текстовые редакторы",
"www-client":"Браузеры",
"www-servers": "Веб-серверы",
'app-etitor':"Текстовые редакторы",
"game":"Игры",
"dev-lang":" Языкы программирования",
"media-video": "Видео",
"media-sound": "Аудио",
"dev-erlang":"Erlang",
"dev-java":"Java",
"dev-perl":"Perl",
"dev-python":"Python",
"net-voip":"VoIP",
"media-fonts":"Шрифты",
"media-gfx":"Графика",
"media-radio":"Радио",
"media-tv":"ТВ",
"net-vpn":"VPN",
"sci-chemistry":"Химия",
"sci-electronics":"Электроника",
"sci-biology":"Биология",
"sci-astronomy":"Астрономия",
"sci-geosciences":"География",
"sci-mathematics":"Математика",
"sci-physics":"Физика",
"app-office":"Офис",
"mail-client":"Клиент e-mail",
"net-dns":"DNS-сервера",
"sys-apps":"Системное",
"sys-kernel":"Ядра",
"11-themes":"Темы",
"app-emulation":"Виртуализация",
"x11-drivers":"Видеодрайвера",
"app-antivirus":"Антивирус",
"games-fps":"Шутеры",
"games-kids":"Детские игры",
"games-rpg":"RPG Игры",
"games-puzzle":"Головоломки",
"games-strategy":"Стратегии",
}
def create_db():
#overlays = get_list_overlays()
#recovers = ScanRecoverFile()
pkg_list = {}
listUses = dict(LocalUSE = get_local_USE(), GlobalUSE = get_global_USE()) #[0] LocalUSE = get_local_USE(),
#InstallPkgs = sort_install_pkg()
2 years ago
#portage_list = {}
#PortEnv = PortageConfig().run()
port_dir = ["/var/db/repos", "/usr/portage"]
if not os.path.exists('./pkgs.json'):
print("Create ramdb")
pkg_name = ""
all_pkgs = {}
with open('./pkgs.json', 'a') as fn:
for p in port_dir:
for d, dirs, files in os.walk(p):
for f in files:
if f.endswith('.ebuild'):
#print(d +"/" + f)
pkg_name = ""
try:
#ver = int(f.replace('.ebuild', '').split('-')[-1][0])
for pn in f.replace('.ebuild', '').split('-')[:-1]:
pkg_name = pkg_name + pn + "-"
except TypeError:
for pn in f.replace('.ebuild', '').split('-')[:-2]:
pkg_name = pkg_name + pn + "-"
except Exception as e:
print(e)
if not pkg_name[:-1] in all_pkgs:
#portage_list[pkg_name] = search(pkg_name)
#print
#print(str(d.split("/")[-2] +"/" + d.split("/")[-1] +"\n"))
if str(d.split("/")[-2] +"/" + d.split("/")[-1]) in AliaseCategory:
all_pkgs.append(AliaseCategory[d])
else:
all_pkgs[str(d.split("/")[-2] +"/" + d.split("/")[-1])] = str(d.split("/")[-2] +"/" + d.split("/")[-1])
#portage_list[str(d.split("/")[-2] +"/" + d.split("/")[-1])] = search(str(d.split("/")[-2] +"/" + d.split("/")[-1]))
if d.split("/")[-2] not in pkg_list.keys():
pkg_list[str(d.split("/")[-2])] = []
pkg_list[d.split("/")[-2]].append(d.split('/')[-1])
#if search(str(d.split("/")[-2]))['Name'] != 'Package is not Found':
#portage_list[str(d.split("/")[-2] +"/" + d.split("/")[-1])] = search(str(d.split("/")[-2]))
# print([d.split("/")[-2]])
else:
if d.split('/')[-1] not in pkg_list[d.split('/')[-2]]:
pkg_list[d.split("/")[-2]].append(d.split('/')[-1])
#print([d.split('/')[-1]])
#"all_pkgs": all_pkgs, [0]
InstallPkgs = sort_install_pkg(all_pkgs)
fn.write(json.dumps({ "all_pkgs": all_pkgs, "Catalog": pkg_list, "overlays": get_list_overlays(), "aliases": AliaseCategory, "recovers": ScanRecoverFile(), "usesDecription":listUses, "InstallPkgs":sort_install_pkg(), 'EnvPortage': PortageConfig().run()}))
print(len(pkg_list))
"""
with open('./portage.json', 'w') as p:
p.write(json.dumps({'portage': portage_list}))
#print("Found:\t"+ str(len(pkg_list.keys())) + " category\n" + str(len(all_pkgs)) +"packages\n")
"""
def on_find(p_v):
if not os.path.exists('./pkgs.json'):
create_db()
p = []
ret_p = ""
ret = {}
with open('./pkgs.json', 'r') as fn:
data = fn.read()
#pkg_list = fn.read()
3 years ago
pkg_list = data.split("\n")
for i in pkg_list:
if p_v in i and not i in p:
print(i)
p.append(str(i))
#ret_p = ret_p +"\t" + i
print("Find in template:\t" + str(len(p)))
#ret = {"Name": ret_p.split("\t")}
#print(ret_p)
#print(p)
return pkg_list #json.dumps(ret)
if __name__ == '__main__':
if not os.path.exists('./pkgs.txt'):
create_db()
if len(sys.argv) >= 2:
on_find(sys.argv[1])
else:
print("No element to find")