def setUp(self):
     self.s = FuncSystem()
class TestFuncSystem(unittest.TestCase):


    def createTempDir(self):
        """ Создаёт временную директорию во временной папке и возсращает путь к ней.

        Возвращает:
            (string) - путь к временной папке.

        """
        tmpPathName = os.getenv("TEMP")
        tmpDirName = ''.join([random.choice(string.ascii_letters + string.digits) for i in range(10)])  # Временная директория для тестирования.        tmpPathName = os.getenv("TEMP")  # Путь к временной директории.
        tmpDir = "%s\\!_%s" % (tmpPathName, tmpDirName)
        os.mkdir(tmpDir)
        return tmpDir


    def createTempDirAndFiles(self):
        """ Создайт временные директории во временной папке Windows, создаёт в ней несколько файлов (0.txt, 1.txt, 2.txt) и возвращает путь к ней.

        Возвращает:
            (string) - путь к временной папке.

        """
        # Создаём файлы в выбранной диретори
        tmpDir = self.createTempDir()
        for x in range(3):
            f = open("%s\\%s.txt" % (tmpDir, x), "w")
            f.close()
        return tmpDir


    def setUp(self):
        self.s = FuncSystem()


    def testGetProcent(self):
        self.assertEquals(self.s.getProcent(0, 0), 0)
        self.assertEquals(self.s.getProcent(100, 0), 0)
        self.assertEquals(self.s.getProcent(100, 100), 100)
        self.assertRaises(ValueError, self.s.getProcent, 0, 100)
        self.assertRaises(ValueError, self.s.getProcent, 100, -1)
        self.assertRaises(ValueError, self.s.getProcent, -1, 100)
        self.assertRaises(TypeError, self.s.getProcent, "xxxx", "cccc")


    def testConvertBytes(self):
        self.assertEquals(self.s.convertBytes(0), "0.0b")
        self.assertEquals(self.s.convertBytes(1), "1.0b")
        self.assertEquals(self.s.convertBytes(10000), "9.8Kb")
        self.assertEquals(self.s.convertBytes(20000000), "19.1Mb")
        self.assertEquals(self.s.convertBytes(2000000000), "1.9Gb")
        self.assertEquals(self.s.convertBytes(2000000000000), "1.8Tb")
        self.assertEquals(self.s.convertBytes(100000000), "95.4Mb")
        self.assertRaises(TypeError, self.s.convertBytes, "cccc")


    def testGetWindowsVersion(self):
        self.assertRegexpMatches(self.s.getWindowsVersion(), r"^\d+\.\d+$")


    def testGetFilePath(self):
        self.assertEquals(self.s.getFilePath("HsjHDJej.exe"), None)
        self.assertEquals(self.s.getFilePath("explorer.exe"), "C:\\Windows\\explorer.exe")


    def testGetFoldersFromPath(self):
        self.assertEquals(self.s.getFoldersFromPath("c:\\fJDJjbdKDjf"), [])


    def testDeleteFolder(self):
        tmpDir = self.createTempDirAndFiles()
        self.assertEqual(self.s.deleteFolder(tmpDir), True)
        self.assertEqual(self.s.deleteFolder(tmpDir), False)
示例#3
0
 def __init__(self):
     self.funcSystem = FuncSystem()
     self.workSystemInfo = WorkSystemInfo()
     self.workArchiveDelete = WorkArchivDelete()
示例#4
0
class Menu():


    def __init__(self):
        self.funcSystem = FuncSystem()
        self.workSystemInfo = WorkSystemInfo()
        self.workArchiveDelete = WorkArchivDelete()


    def checkWindowsVersion(self):
        """ Определение версии ОС Windows.

        Возвращает:
            (string) абревиатура версии операционной системы (5.1, 6.1).

        """
        return self.funcSystem.getWindowsVersion()


    def checkFilePath(self, fileName):
        """ Проверяет наличие указанного файла.

        Аргументы:
            fileName - (string) имя искомого файла.

        Вовзращает:
            (string) - абсолютный путь к искомогу файлу.
            None - если файл не найден.

        """
        return self.funcSystem.getFilePath(fileName)


    def checkSystemEnvironment(self):
        """ Проведение проверки на наличие всех необходимых инструметов и условий для работы программы.

        Возвращает:
            True/False - результат проверки на совместимость. При ошибке, на консоль выводятся сообщения об недостатках.

        """
        # Проверка версии ОС.
        try:
            ("5.1", "5.2", "6.0", "6.1").index(self.checkWindowsVersion())
        except Exception:
            cprint(u"ОШИБКА: ", "red", newline=False)
            print(u"неподдерживаемая операционная система версии %s" % self.checkWindowsVersion())
            return False
        # Проверка наличия утилиты taskkill.exe.
        fileNames = ("taskkill.exe",)
        for item in fileNames:
            if not self.checkFilePath(item):
                cprint(u"ОШИБКА: ", "red", newline=False)
                print(u"не найден необходимый для работы программы файл %s" % item)
                return False
        return True


    def help(self):
        """ Пункт меню "помощь". """
        cprint(u"\n\n____----******* ПОМОЩЬ ********----____\n", "magenta")
        print u"В процессе оформления..."
        print u"В процессе оформления..."
        print u"В процессе оформления..."
        print u"В процессе оформления..."
        print u"В процессе оформления..."
        cprint(u"\n****----_______________________----****\n", "magenta")
        raw_input(u"[ENTER для продолжения]")
        print "\n"


    def writeInfoLine(self, type_, text, title=""):
        """ Оформление вывода сообщение о текущем действиии рабочего класса (описывает загрушку метода writeInfoLine)

        Аргументы:
            type_ - (string) тип сообщения (ok, warning, error, fatal, info)
            text - текст сообщения
            title - заголовок сообщения (пишется перед текстом цвета, указанного в type_)

        """
        # Проверка входящих данных:
        try:
            ("ok", "warning", "error", "fatal", "info").index(type_)
        except Exception:
            raise ValueError(u"Передано некорректное значение параметра type_ - %s" % type_)
        # Вывод информации на консоль:
        color = {
            "ok": "green",
            "warning": "yellow",
            "error": "red",
            "fatal": "red",
            "info": ""
            }
        about = {
            "ok": u"ОК",
            "warning": u"ВНИМАНИЕ",
            "error": u"ОШИБКА",
            "fatal": u"ФАТАЛЬНАЯ ОШИБКА",
            "info": ""
        }
        if title:
            cprint(u"  " + title + ": ", f=color[type_], newline=False)
            print text
        elif type_ == "info":
            cprint(u"  " + text, f=color[type_])
        else:
            cprint(u"  " + about[type_] + ": ", f=color[type_], newline=False)
            print text
        return None


    def syncComp(self):
        """ Пункт меню "указать компьютер синхроинзации"  """
        pass


    def test(self):
        """ Пункт меню "тестирование комьютера"

        Возвращает:
            True/False - результат сбора информации.

        """

        workList = (
            {
                "name": u"СБОР ИНФОРМАЦИИ О КОМПЬЮТЕРЕ:\n",  # Описание процесса.
                "print": True,  # Выводить информацию о ходе работы на консоль.
                "process": self.workSystemInfo,  # Класс, обрабатывающий задание.
                "critical": False,  # Завершать-ли обработку при некорректном завершении обработки задания.
            },
            {
                "name": u"ИНФОРМАЦИЯ ОБ АРХИВЕ:\n",
                "print": True,
                "process": self.workArchiveDelete,
                "critical": True,
            },

        )

        # Запуск процесса сбора информации:
        resultAll = True
        for workProcess in workList:
            workProcess["process"].writeInfoLine = self.writeInfoLine
            cprint(u"\n%s\n" % workProcess["name"], "blue", newline=False)
            if workProcess["print"]:
                workProcess["process"].print_ = True
            result = workProcess["process"].readInfo()  # Чтение рабочей информации.
            if not workProcess["print"]:
                if result:
                    cprint(u"ОК", "green")
                else:
                    cprint(u"ОШИБКА: ", "red", newline=False)
                    if workProcess["process"].errorMessage:
                        print workProcess["process"].errorMessage
                    else:
                        print u"неописанная ошибка."
            if not result and workProcess["critical"]:  # Если сбой в сборе информации критический - вернуть False.
                resultAll = False
                break

        return resultAll


    def reglament(self):
        """ Пункт меню "регламентные работы" """
        # Сначала производим сбор информации через метод self.test и если сбор произошол успешный,
        # продолжаем работу. Иначе завершаем работу с сообщеинем об невозможности проветси регламент.
        testResult = self.test()
        if not testResult:
            cprint(u"\nОШИБКА ПРОВЕДЕНИЯ ТЕСТИРОВАНИЯ: ", "red", newline=False)
            print u"проведение регламентных работ невозможно\nдо устранения неисправностей, проявившихся при тестировании.\n"
        else:

            workList = (
                    {
                    "name": u"ОЧИСТКА АРХИВА:\n",
                    "print": True,
                    "process": self.workArchiveDelete,
                    "critical": True,
                    },

                )

            # Запуск процесса регламента:
            for workProcess in workList:
                workProcess["process"].writeInfoLine = self.writeInfoLine
                cprint(u"\n%s\n" % workProcess["name"], "blue", newline=False)
                if workProcess["print"]:
                    workProcess["process"].print_ = True
                result = workProcess["process"].execReglament()  # Проведение регламента.

                if not workProcess["print"]:
                    if result:
                        cprint(u"ОК", "green")
                    else:
                        cprint(u"ОШИБКА: ", "red", newline=False)
                        if workProcess["process"].errorMessage:
                            print workProcess["process"].errorMessage
                        else:
                            print u"неописанная ошибка."
                if not result and workProcess["critical"]:
                    break

            exit(1)



    def mainMenu(self):
        """ Основное меню программы """
        while True:
            cprint(u"\n\n____----**** ОСНОВНОЕ МЕНЮ ****----____", "magenta")
            cprint(u"1. ТЕСТИРОВАНИЕ компьютера (без обработки);", "yellow")
            cprint(u"2. провести РЕГЛАМЕНТНЫЕ работы на компьютере;", "yellow")
            cprint(u"3. указать компьютера СИНХРОНИЗАЦИИ;", "yellow")
            cprint(u"4. ПОМОЩЬ;", "yellow")
            cprint(u"0. ВЫХОД;", "red")
            cprint(u"****----_______________________----****\n", "magenta")
            # Обработка ошибок ввода:
            try:
                input_ = input(u"ВВОД: ")
                try:
                    (0, 1, 2, 3).index(input_)
                except Exception:
                    cprint(u"\nОШИБКА: ", "red", newline=False)
                    print u"необходимо ввести цифру иеню 1-3, или 0 для выхода из программы."
                    time.sleep(1)
                    continue
            except Exception:
                cprint(u"\nОШИБКА: ", "red", newline=False)
                print u"необходимо вводить только цифры номеров элементов меню."
                time.sleep(1)
                continue
            # Обработка элементов меню.
            if not input_:  # Выход из программы.
                return
            elif input_ == 1:  # Тестирование комьпютера.
                cprint(u"\n\n____----**** ТЕСТИРОВАНИЕ КОМПЬЮТЕРА ****----____\n", "magenta")
                self.test()
                cprint(u"\n****----_________________________________----****\n", "magenta")
                raw_input(u"[ENTER для продолжения]")
            elif input_ == 2:  # Регламентные работы.
                cprint(u"\n\n____----**** РЕГЛАМЕНТНЫЕ РАБОТЫ ****----____\n", "magenta")
                self.reglament()
                cprint(u"\n****----_________________________________----****\n", "magenta")
                raw_input(u"[ENTER для продолжения]")
            elif input_ == 3:  # Указать компьютер синхронизации.
                pass
            elif input_ == 4:  # Помощь.
                self.help()
 def __init__(self):
     """ Конструктор класса  """
     # Путь в реестре к параметрам ПО Интеллект в зависимости от платформы x86-x64:
     self.regPath = 'SOFTWARE\\Wow6432Node\\ITV\\INTELLECT' if get_platform() == "win-amd64" else 'SOFTWARE\\ITV\\INTELLECT'
     self.funcSystem = FuncSystem()
class FuncIntellect():
    """ Коллекция методов для обработки ПО Интеллект  """

    def __init__(self):
        """ Конструктор класса  """
        # Путь в реестре к параметрам ПО Интеллект в зависимости от платформы x86-x64:
        self.regPath = 'SOFTWARE\\Wow6432Node\\ITV\\INTELLECT' if get_platform() == "win-amd64" else 'SOFTWARE\\ITV\\INTELLECT'
        self.funcSystem = FuncSystem()


    def getIntellectPath(self):
        """ Чтение пути к директории ПО Интеллект из реестра.

        Возвращает:
            Путь к папке с установленным ПО Интеллект,
            "None" при отсутвии значения в реестре (ПО Интеллект не установлено),
            или ValueError если из реестра возвращено некорректное значение.

        """
        path = None
        try:
            handle = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, self.regPath)
            path, tmp = _winreg.QueryValueEx(handle, 'InstallPath')
        except Exception:
            pass
        else:
            if not re.search(r"\w:\\.+", path, flags=re.IGNORECASE):  # Проверка на корректность результата:
                raise ValueError(u"Из реестра получено некооректное значение параметра InstallPath: %s", path)
        return path


    def getIntellectType(self):
        """ Определение типа установленной системы.

        Возвращает:
            'admin', 'client', 'server',
            None если определение не удалось (ПО Интеллект не установлено, или слишком старая версия программы, в которой тип не определялся)
            или ValueError если из реестра получены некорректные значения.

        """
        type_ = None
        try:
            handle = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, self.regPath)
            type_, tmp = _winreg.QueryValueEx(handle, 'InstallType')
            type_ = str(type_).lower()
        except Exception:
            pass
        else:
            # Проверка корректности полученных из реестра параметров:
            try: ("server", "admin", "client").index(type_)
            except: raise ValueError(u"Из реестра получено некооректное значение параметра InstallType: %s", type_)
        return type_


    def getIntellectVersion(self):
        """ Определение версии установленного ПО.

        Возвращает:
            (string) версию установленного ПО Интеллект (берёт из реестра),
            None если ПО Интеллект не установлено, или слишком старая версия, когда они ещё не писали её реестр,
            или ValueError если из реестра получены некорректные параметры.

        """
        version = None
        try:
            handle = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, self.regPath)
            version, tmp = _winreg.QueryValueEx(handle, 'InstallVersion')
        except Exception:
            pass
        else:
            if not re.search(r"\d+\.\d+\.\d+\.\d+", version):
                raise ValueError(u"Из реестра получено некооректное значение параметра InstallVersion: %s", version)
        return version


    def getProcessList(self):
        """ Чтение списка запущенных на локальном компьютере процессов.

        Возвращает:
            [string] список запущенных на компьютере процессов.
        """
        result = []
        wmi = GetObject('winmgmts:')
        processes = wmi.InstancesOf('Win32_Process')
        for item in processes:
            result.append(item.Properties_('Name').Value)
        return result


    def getIntellectExecState(self):
        """ Определяет текущее состояние загруженности ПО Интеллект.

        Возвращает:
            (string) тип запущенного ПО Интеллект "server", "admin", "client",
            None - если ПО Интеллект не загружено.

        """
        result = None  # Результат работы метода.
        processList = self.getProcessList()  # Список текущих процессов.
        intellectType = self.getIntellectType()  # Тип установелнного дистрибутива ПО Интеллект.
        intellectProc = {  # Статус процессов ПО Интеллект.
            "intellect.exe": False,
            "slave.exe": False
        }
        for item in processList:  # Поиск процессов ПО Интеллект:
            if str(item).lower() == "intellect.exe": intellectProc["intellect.exe"] = True
            if str(item).lower() == "slave.exe": intellectProc["slave.exe"] = True
        if intellectProc["intellect.exe"]:  # Формирование результата:
            result = "client" if intellectType == "client" else intellectType
        elif intellectProc["slave.exe"]:
            result = "client"
        return result


    def getArchiveDriveLetters(self):
        """ Определяем диски с архивом ПО Интеллект.

        Возвращает:
            [] - списко букв дисков, на которых расположен архив ПО Интеллект (папка X:\VIDEO) или
            пустой список если таковые на найдены.

        """
        result = []
        for item in self.funcSystem.getDiskLetters():
            if os.path.exists("%s:\\VIDEO" % item):
                result.append(item)
        return result