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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#/usr/bin/env python
# -*- coding: UTF-8 -*-
import os, sys
import json
from io import StringIO
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
from utils.parsePortage import PortageConfig
# создаём раcширенную базу пакетов с приблизительной структурой
# pkg_list ={"category": [{name: name_pkg, versions:[list_version]}]}
# и кладём это всё в json
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]
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
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()
#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()
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")