From 4f5cf2fed2ee4fc538cb572761afab226c1c686c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Tue, 5 May 2020 11:58:13 +0700 Subject: [PATCH] Add files via upload --- CompileToExe.txt | 4 +- data/About.ui | 16 ++-- data/DoubleClick.ui | 3 + data/LicenseChecker.ico | Bin 67852 -> 13942 bytes data/Media.ui | 6 ++ data/RuchPoisk.ui | 6 ++ data/Spravka.ui | 8 +- data/ViewBD.ui | 3 + main.pyw | 55 ++++++++--- parametr.py | 198 ++++++++++++++++++++++++++++++++++++++++ reestr.py | 6 ++ 11 files changed, 280 insertions(+), 25 deletions(-) create mode 100644 parametr.py diff --git a/CompileToExe.txt b/CompileToExe.txt index 06313eb..9ddf18c 100644 --- a/CompileToExe.txt +++ b/CompileToExe.txt @@ -1,3 +1,3 @@ -pyinstaller --onedir --clean --noconsole --distpath=D:\LicenseChecker\1.2\exe --icon=data\LicenseChecker.ico --add-data=data\LicenseChecker.ico;data --add-data=data\Lpro.db;data --add-data=data\LicenseChecker.png;data --add-data=data\gpl-2.0.rtf;data --add-data=data\python-powered.png;data --add-data=data\User-DB.db;data --add-data=data\About.ui;data --add-data=data\main.ui;data --add-data=data\DoubleClick.ui;data --add-data=data\PoisZamen.ui;data --add-data=data\Spravka.ui;data --add-data=data\ViewBD.ui;data --add-data=data\RuchPoisk.ui;data --add-data=data\Media.ui;data --add-data=data\settings.ui;data --add-data=data\settings.ini;data --name=LicenseChecker "D:\LicenseChecker\1.2\main.pyw" +pyinstaller --onedir --clean --noconsole --distpath=D:\LicenseChecker\1.3\exe --icon=data\LicenseChecker.ico --add-data=data\LicenseChecker.ico;data --add-data=data\Lpro.db;data --add-data=data\LicenseChecker.png;data --add-data=data\gpl-2.0.rtf;data --add-data=data\python-powered.png;data --add-data=data\User-DB.db;data --add-data=data\About.ui;data --add-data=data\main.ui;data --add-data=data\DoubleClick.ui;data --add-data=data\PoisZamen.ui;data --add-data=data\Spravka.ui;data --add-data=data\ViewBD.ui;data --add-data=data\RuchPoisk.ui;data --add-data=data\Media.ui;data --add-data=data\settings.ui;data --add-data=data\settings.ini;data --add-data=data\cat-auto.png;data --add-data=data\cat-bd.png;data --add-data=data\cat-media.png;data --add-data=data\cat-ruch.png;data --add-data=data\cat-zamena.png;data --name=LicenseChecker "D:\LicenseChecker\1.3\main.pyw" - cd /d D:\LicenseChecker\1.2 +cd /d D:\LicenseChecker\1.3 diff --git a/data/About.ui b/data/About.ui index b5535f3..f8bc4d3 100644 --- a/data/About.ui +++ b/data/About.ui @@ -37,7 +37,7 @@ - LicenseChecker 1.2 + LicenseChecker 1.3 @@ -70,13 +70,13 @@ <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">Цель:</span><span style=" font-family:'MS Shell Dlg 2';"> Помочь разобраться с лицензиями на программное обеспечение</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2';"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">Лицензия:</span><span style=" font-family:'MS Shell Dlg 2';"> GNU GPL v2</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2';"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">Разработчик:</span><span style=" font-family:'MS Shell Dlg 2';"> Алексей Черемных (mrKaban) </span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2';"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-weight:600;">Официальный сайт: </span><span style=" font-family:'MS Shell Dlg 2';">КонтинентСвободы.рф</span></p></body></html> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Цель:</span> Помочь разобраться с лицензиями на программное обеспечение</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Лицензия:</span> GNU GPL v2</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Разработчик:</span> Алексей Черемных (mrKaban) </p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Официальный сайт: </span>КонтинентСвободы.рф</p></body></html> diff --git a/data/DoubleClick.ui b/data/DoubleClick.ui index 33370de..ead0c55 100644 --- a/data/DoubleClick.ui +++ b/data/DoubleClick.ui @@ -32,6 +32,9 @@ 281 + + false + diff --git a/data/LicenseChecker.ico b/data/LicenseChecker.ico index c35a08a44925281f78795320564cc508bf693c0d..3d41b89b2dad1dd3cd0508dc94afe3e43223734e 100644 GIT binary patch delta 53 zcmeB~#PTgim4Shgfr&vu0Yob>tPo&eP-9?VFff4ff%4}B7&hn1ZWq{m#%7i(0PvOy AmH+?% literal 67852 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 z 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 + + true + + + false + diff --git a/data/RuchPoisk.ui b/data/RuchPoisk.ui index b514d9c..cd02789 100644 --- a/data/RuchPoisk.ui +++ b/data/RuchPoisk.ui @@ -26,6 +26,12 @@ 231 + + true + + + false + diff --git a/data/Spravka.ui b/data/Spravka.ui index c97016f..5a691e4 100644 --- a/data/Spravka.ui +++ b/data/Spravka.ui @@ -50,7 +50,7 @@ <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Автоматический поиск срабатывает при запуске программы. Пользователь при появлении окна видит его результаты. Все данные берутся из системного реестра Windows. Названия фильтруются от версий, так как часто разработчики названия своих программ в реестре указывают с версиями. Цены указываются примерные, поэтому могут не совпадать с реальными. При двойном клике по строке открываются подробности. В контекстном меню присутствует пункт копировать.</span></p></body></html> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;">Автоматический поиск срабатывает при запуске программы. Пользователь при появлении окна видит его результаты. Все данные берутся из системного реестра Windows. Названия фильтруются от версий, так как часто разработчики названия своих программ в реестре указывают с версиями. Цены указываются примерные, поэтому могут не совпадать с реальными. При двойном клике по строке открываются подробности. Копировать содержимое можно при помощи сочетания клавиш CTRL + C.</span></p></body></html> @@ -72,7 +72,7 @@ p, li { white-space: pre-wrap; } <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Ручной поиск программ в указанной директории ищет все исполняемые файлы, собирает их в один список, а далее сравнивает элементы списка с базой данных. Можно указывать отдельную папку, или весь жесткий диск. Степень обнаружения зависит от наполнения имен файл в базе или совпадением имени файла с названием программы. При поиске учитываются только exe файлы.</span></p></body></html> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;">Ручной поиск программ в указанной директории ищет все исполняемые файлы, собирает их в один список, а далее сравнивает элементы списка с базой данных. Можно указывать отдельную папку, или весь жесткий диск. Степень обнаружения зависит от наполнения имен файл в базе или совпадением имени файла с названием программы. При поиске учитываются только exe файлы. Можно указать сразу несколько директорий для поиска. Вручную написать можно только одну директорию.</span></p></body></html> @@ -94,7 +94,7 @@ p, li { white-space: pre-wrap; } <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Медиа поиск позволяет найти в указанной папке все изображения, аудио и видео наиболее популярных форматов (.tiff, .jpeg, .bmp, .jpe, .jpg, .png, .gif, .psd, .mpeg, .flv, .mov, .m4a, .ac3, .aac, .h264, .m4v, .mkv, .mp4, .3gp, .avi, .ogg, .vob, .wma, .mp3, .wav, .mpg, .wmv). Можно указать минимальный размер обнаруживаемых файлов. Для поиска можно указывать отдельные папки или весь диск.</span></p></body></html> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;">Медиа поиск позволяет найти в указанной папке все изображения, аудио и видео наиболее популярных форматов (.tiff, .jpeg, .bmp, .jpe, .jpg, .png, .gif, .psd, .mpeg, .flv, .mov, .m4a, .ac3, .aac, .h264, .m4v, .mkv, .mp4, .3gp, .avi, .ogg, .vob, .wma, .mp3, .wav, .mpg, .wmv). Можно указать минимальный размер обнаруживаемых файлов. Для поиска можно указывать отдельные папки или весь диск.</span></p></body></html> @@ -116,7 +116,7 @@ p, li { white-space: pre-wrap; } <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">Поиск в базе позволяет найти в ней программу по части названия. Например, 'Архиватор WinRaR 3.53', в базе достаточно набрать 'Winrar' Сама база данных хранится в папке с программой \\data\\Lpro.db.</span></p></body></html> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt;">Поиск в базе позволяет найти в ней программу по части названия. Например, 'Архиватор WinRaR 3.53', в базе достаточно набрать 'Winrar' Сама база данных хранится в папке с программой \\data\\Lpro.db.</span></p></body></html> diff --git a/data/ViewBD.ui b/data/ViewBD.ui index f8fcb2e..d6ea16f 100644 --- a/data/ViewBD.ui +++ b/data/ViewBD.ui @@ -88,6 +88,9 @@ 201 + + true + diff --git a/main.pyw b/main.pyw index eb9447c..7fcc626 100644 --- a/main.pyw +++ b/main.pyw @@ -19,6 +19,7 @@ import urllib.request #для проверки наличия новых вер from PyQt5.QtWidgets import QStyledItemDelegate #Для окрашивания строк from PyQt5.QtGui import QColor, QPalette #Для окрашивания строк import configparser #для создания настроек +import parametr @@ -143,6 +144,8 @@ def Avtopoisk(self=None): if os.path.exists(s3) or os.path.isfile(s3): data.append(('Путь:', s3)) #data.append(('Путь:', IntallPath[s])) + if s3 == 'undefined': + data.append(('Путь:', 'Неизвестно')) except KeyError: #если в реестре он не указан data.append(('Путь:', 'Неизвестно')) try:#Ищим основной исполняемый для подтверждения @@ -425,7 +428,7 @@ def UpdateProg(): #QMessageBox.about(self, "Файл сохранен", "Файл успешно сохранен: " + fileName[0]) QMessageBox.critical(win, "Нет соединения с сервером", "Не удалось проверить наличие обновлений.") return - search_exemple = re.search(r'1.2', h, re.M|re.I) # ТУТ НАДО ИСПРАВИТЬ ВЕРСИЮ ПРОГРАММЫ!!!!!!!!!!!!!!!!!!!!!!!!!!! + search_exemple = re.search(r'1.3', h, re.M|re.I) # ТУТ НАДО ИСПРАВИТЬ ВЕРСИЮ ПРОГРАММЫ!!!!!!!!!!!!!!!!!!!!!!!!!!! if not search_exemple: try: QMessageBox.about(win, "Обнаружена новая версия", "Сейчас будет открыта веб-страница с доступными релизами.\ @@ -598,25 +601,35 @@ def RuchPoisk(): dirlist = [] def OpenKatalog(): """Открыть каталог""" + try: + PredKatalog = winRuchPoisk.leKatalog.text() + try: + nachalo = PredKatalog.find(' ') + konets = len(PredKatalog) + PredKatalog.replace(PredKatalog[nachalo:konets], '') + except: + pass + except: + PredKatalog = "." winRuchPoisk.leKatalog.setText("") winRuchPoisk.tableWidgetRuch.clear() dirlist.clear() if winRuchPoisk.rb1kat.isChecked(): - d = QFileDialog.getExistingDirectory(winRuchPoisk,"Указать каталог для поиска остатков программ",".") + d = QFileDialog.getExistingDirectory(winRuchPoisk,"Указать каталог для поиска остатков программ", PredKatalog) dirlist.append(d) winRuchPoisk.leKatalog.setText(dirlist[0]) if winRuchPoisk.rb2kat.isChecked(): - d = QFileDialog.getExistingDirectory(winRuchPoisk,"Указать первый каталог для поиска остатков программ",".") + d = QFileDialog.getExistingDirectory(winRuchPoisk,"Указать первый каталог для поиска остатков программ", PredKatalog) dirlist.append(d) - d = QFileDialog.getExistingDirectory(winRuchPoisk,"Указать второй каталог для поиска остатков программ",".") + d = QFileDialog.getExistingDirectory(winRuchPoisk,"Указать второй каталог для поиска остатков программ", PredKatalog) dirlist.append(d) winRuchPoisk.leKatalog.setText(dirlist[0] + ' ' + dirlist[1]) if winRuchPoisk.rb3kat.isChecked(): - d = QFileDialog.getExistingDirectory(winRuchPoisk,"Указать первый каталог для поиска остатков программ",".") + d = QFileDialog.getExistingDirectory(winRuchPoisk,"Указать первый каталог для поиска остатков программ", PredKatalog) dirlist.append(d) - d = QFileDialog.getExistingDirectory(winRuchPoisk,"Указать второй каталог для поиска остатков программ",".") + d = QFileDialog.getExistingDirectory(winRuchPoisk,"Указать второй каталог для поиска остатков программ", PredKatalog) dirlist.append(d) - d = QFileDialog.getExistingDirectory(winRuchPoisk,"Указать третий каталог для поиска остатков программ",".") + d = QFileDialog.getExistingDirectory(winRuchPoisk,"Указать третий каталог для поиска остатков программ", PredKatalog) dirlist.append(d) winRuchPoisk.leKatalog.setText(dirlist[0] + ' ' + dirlist[1] + ' ' + dirlist[2]) winRuchPoisk.pbObzor.clicked.connect(OpenKatalog) @@ -826,9 +839,13 @@ def MediaPoisk(): """Открыть каталог""" global katalog katalog = None + try: + PredKatalog = winMediaPoisk.leKatalog.text() + except: + PredKatalog = "." winMediaPoisk.leKatalog.setText("") #winMediaPoisk.tableWidgetMedia.clear() - katalog = QFileDialog.getExistingDirectory(winMediaPoisk,"Указать каталог для медиа-файлов",".") + katalog = QFileDialog.getExistingDirectory(winMediaPoisk,"Указать каталог для медиа-файлов", PredKatalog) winMediaPoisk.leKatalog.setText(katalog) winMediaPoisk.pbObzor.clicked.connect(OpenMedKatalog) def ButtonMediaPoisk(): @@ -975,6 +992,22 @@ def MediaPoisk(): winMediaPoisk.pbSave.clicked.connect(SaveMedia) winMediaPoisk.show() win.mMediaPoisk.triggered.connect(MediaPoisk) -Avtopoisk() -win.show() -sys.exit(app.exec()) + +#Пример ярлыка для запуска с параметрами: +#D:\LicenseChecker\1.3\exe\LicenseChecker\LicenseChecker.exe AutoHidden "D:\\Public\\2.html" +#D:\LicenseChecker\1.3\exe\LicenseChecker\LicenseChecker.exe AutoHidden "default" +#D:\LicenseChecker\1.3\exe\LicenseChecker\LicenseChecker.exe RuchHidden "C:\\Program Files" "D:\\Public\\3.html" +#D:\LicenseChecker\1.3\exe\LicenseChecker\LicenseChecker.exe RuchHidden "C:\\Program Files" "default" +try: + if sys.argv[1] == 'AutoHidden': + parametr.AutoHidden() + elif sys.argv[1] == 'RuchHidden': + parametr.RuchHidden() + else: + Avtopoisk() + win.show() + sys.exit(app.exec()) +except: + Avtopoisk() + win.show() + sys.exit(app.exec()) diff --git a/parametr.py b/parametr.py new file mode 100644 index 0000000..2b68af0 --- /dev/null +++ b/parametr.py @@ -0,0 +1,198 @@ +from CheckOS import * +import sys +from reestr import foo #функция получения данных из реестра +import winreg #Нужна для работы со значением типа реестр +from filtr import filter #Фильтрация автопоиска +import sqlite3 #База данных SQLite +from datetime import datetime #какая дата и время +import socket #Для получения имени компьютера +import webbrowser #Для открытия веб-страницы +import os #Для поиска файлов + + +def AutoHidden(self=None): + """Автопоиск при запуске с параметрами""" + #Получаем данные из реестра в список(словари) + software_list = foo(winreg.HKEY_LOCAL_MACHINE, winreg.KEY_WOW64_32KEY) + foo(winreg.HKEY_LOCAL_MACHINE, winreg.KEY_WOW64_64KEY)+ foo(winreg.HKEY_CURRENT_USER, 0) + #Добавляю ОС и стоимость + name_os, cena_os = DetectOS() + data = [] + data.append((name_os, 'Платное ПО', 'Shareware', cena_os)) + slovarSave = {}#Словарь для сохранения результатов поиска в HTML + #Пробую работать с SQLite + BaseLpro = sqlite3.connect(r"data\Lpro.db", uri=True) + BaseLpro.row_factory = sqlite3.Row + CurBLpro = BaseLpro.cursor() + IntallPath = {} + i = 2 + software_list = sorted(software_list, key=lambda x: x['name']) #Сортировка списка словарей в автопоиске + n1 = [] #список для удаления дублей, в него добавляю, чтобы сравнить есть ли уже этот элемент + for itemsoft in software_list: + NameP=filter(itemsoft['name']) + if NameP not in n1: #Удаляю дубли + n1.append(NameP) + else: + continue #иначе переходим к следующей итеоации + try: + IntallPath[NameP] = itemsoft['InstallLocation'] + except: + IntallPath[itemsoft['name']] = itemsoft['InstallLocation'] + s = 'SELECT * FROM program WHERE (name LIKE "' + NameP + '%%")' + CurBLpro.execute(s) + records = CurBLpro.fetchall() + added = False + for row in records: + #tree.insert("" , i-1, text=i, values=(NameP, row[2], row[3], row[4])) + h = row[4] + h = h.replace("\n", "") + data.append((NameP, row[2], row[3], h)) + slovarSave[NameP] = {'Name':NameP, 'TipPO':row[2], 'License':row[3], 'Cena':h} + added = True + break + if added == False: + #tree.insert("" , i-1, text=i, values=(itemsoft['name'], "Неизвестно", "Неизвестно", "???")) + data.append((itemsoft['name'], "Неизвестно", "Неизвестно", "???")) + slovarSave[NameP] = {'Name':NameP, 'TipPO':"Неизвестно", 'License':"Неизвестно", 'Cena':"???"} + i += 1 + CurBLpro.close() + BaseLpro.close() + #Сохраняем отчет автопоиска в HTML + SbHTML = """ + + + +

Отчет автопоиска LicenseChecker

""" + SbHTML = SbHTML + '

ПК: '+socket.gethostname() + ' в ' + datetime.strftime(datetime.now(), "%d.%m.%Y %H:%M:%S") +'

' + SbHTML = SbHTML + """ + + + + """ + s='' + s1='' + for itemsoft in slovarSave: + s = slovarSave[itemsoft] + s1 = '
Название в БД + Тип ПО + Лицензия + Стоимость +
' + s['Name'] + '\n' + ' ' + s['TipPO'] + '\n' + s1 = s1 + ' ' + s['License'] + '\n' + ' ' + s['Cena'] + '\n' + SbHTML = SbHTML + s1 + s2 = """ +
+

Официальный сайт: КонтинентСвободы.рф

+ + """ + SbHTML = SbHTML + s2 + ftypes = [('HTML', '.html')] #Указываю тип расширение + #options = QFileDialog.Options() + #fileName = 'D:\\Public\\1.html' + fileName = sys.argv[2] + if fileName == 'default': + sdf = socket.gethostname() + datetime.strftime(datetime.now(), "_%d-%m-%Y_%H-%M-%S") + fileName = str(os.path.dirname(os.path.abspath(__file__))) +'\\' + 'auto_' + sdf +'.html' + try: + f = open(fileName,'w+') + f.write(SbHTML) #Записываем в файл + f.close() + except: + sdf = socket.gethostname() + datetime.strftime(datetime.now(), "_%d-%m-%Y_%H-%M-%S") + fileName = str(os.path.dirname(os.path.abspath(__file__))) +'\\' + 'auto_' + sdf +'.html' + f = open(fileName,'w+') + f.write(SbHTML) #Записываем в файл + f.close() +def RuchHidden(self=None): + """Ручной поиск при запуске с параметрами""" + slovarSave= {} + size_list=[] + dirlist = [] + dir = sys.argv[2] + #dir = 'C:\\Program Files' + spisok=[] + slovar={} + for root, dirs, files in os.walk(dir): # пройти по директории рекурсивно + for name in files: + if name[-4:]=='.exe': + fullname = os.path.join(root, name) # получаем полное имя файла + fullname = fullname.replace("/", "\\") + slovar[name]=fullname + spisok.append(name) + BaseLproRuch = sqlite3.connect(r"data\Lpro.db", uri=True) + BaseLproRuch.row_factory = sqlite3.Row #подключаем базу данных и курсор + CurBLproRuch = BaseLproRuch.cursor() + data = [] + added = False #Для отслеживания добавлен вариант из списка или нет + for itemsoft in spisok: #В списке имена файлом с расширением exe + NameP=itemsoft + NamePF = NameP.replace((NameP[NameP.find('.exe'):]), '') + s = 'SELECT * FROM program WHERE (file LIKE "' + NamePF + '")' + CurBLproRuch.execute(s) + records = CurBLproRuch.fetchall() + for row in records: + h = row[4] + h = h.replace("\n", "") + data.append((slovar[itemsoft], row[1], row[2], row[3], h)) + size_list.append(((len(slovar[itemsoft]))*6)) + #Создаю словари внутри словаря + slovarSave[row[1]] = {'Address':slovar[itemsoft], 'Name':row[1], 'TipPO':row[2], 'License':row[3], 'Cena':row[4]} + added = True + if added == False: + #Если не найдено в поле file, тогда ищем в поле name + s = 'SELECT * FROM program WHERE (name LIKE "' + NamePF + '%%")' + CurBLproRuch.execute(s) + records = CurBLproRuch.fetchall() + for row in records: + h = row[4] + h = h.replace("\n", "") + data.append((slovar[itemsoft], row[1], row[2], row[3], h)) + size_list.append(((len(slovar[itemsoft]))*6)) + #Создаю словари внутри словаря + slovarSave[row[1]] = {'Address':slovar[itemsoft], 'Name':row[1], 'TipPO':row[2], 'License':row[3], 'Cena':row[4]} + added = True + CurBLproRuch.close() #Закрываю соединение с базой и с курсором для базы + BaseLproRuch.close() + SbHTML = """ + + + +

Отчет ручного поиска LicenseChecker

""" + SbHTML = SbHTML + '

ПК: '+socket.gethostname() + ' в ' + datetime.strftime(datetime.now(), "%d.%m.%Y %H:%M:%S") +'

' + SbHTML = SbHTML + """ + + + + """ + s='' + s1='' + for itemsoft in slovarSave: + s = slovarSave[itemsoft] + s1 = '
Название в БД + Путь + Тип ПО + Лицензия + Стоимость +
' + s['Name'] + '\n' + ' ' + s['Address'] + '\n' + ' ' + s['TipPO'] + '\n' + s1 = s1 + ' ' + s['License'] + '\n' + ' ' + s['Cena'] + '\n' + SbHTML = SbHTML + s1 + s2 = """ +
+

Официальный сайт: КонтинентСвободы.рф

+ + """ + SbHTML = SbHTML + s2 + ftypes = [('HTML', '.html')] #Указываю тип расширение + fileName = sys.argv[3] + if fileName == 'default': + sdf = socket.gethostname() + datetime.strftime(datetime.now(), "_%d-%m-%Y_%H-%M-%S") + fileName = str(os.path.dirname(os.path.abspath(__file__))) +'\\' + 'ruch_' + sdf +'.html' + try: + f = open(fileName,'w+') + f.write(SbHTML) #Записываем в файл + f.close() + except: + sdf = socket.gethostname() + datetime.strftime(datetime.now(), "_%d-%m-%Y_%H-%M-%S") + fileName = str(os.path.dirname(os.path.abspath(__file__))) +'\\' + 'ruch_' + sdf +'.html' + f = open(fileName,'w+') + f.write(SbHTML) #Записываем в файл + f.close() diff --git a/reestr.py b/reestr.py index 43f983b..5ae2352 100644 --- a/reestr.py +++ b/reestr.py @@ -26,13 +26,19 @@ def foo(hive, flag): software['publisher'] = 'undefined' try: software['InstallLocation'] = winreg.QueryValueEx(asubkey, "InstallLocation")[0] + if software['InstallLocation'] == '' or software['InstallLocation'] == None: + software['InstallLocation'] = 'undefined' #except EnvironmentError: except: try: software['InstallLocation'] = winreg.QueryValueEx(asubkey, "InstallDir")[0] + if software['InstallLocation'] == '' or software['InstallLocation'] == None: + software['InstallLocation'] = 'undefined' except: try: software['InstallLocation'] = winreg.QueryValueEx(asubkey, "DisplayIcon")[0] + if software['InstallLocation'] == '' or software['InstallLocation'] == None: + software['InstallLocation'] = 'undefined' except: software['InstallLocation'] = 'undefined' #try: