def testFileEndsWithNewline(temporarySudoersFile):
    patchSudoersFileForOpsi(sudoersFile=temporarySudoersFile)

    with open(temporarySudoersFile) as changedFile:
        for line in changedFile:
            lastLine = line

    assert '\n' == lastLine
def testDoNotAlterFileIfEntryAlreadyExisting(temporarySudoersFile):
    fileName = temporarySudoersFile
    patchSudoersFileForOpsi(sudoersFile=fileName)
    with open(fileName) as first:
        contentAfterFirstPatch = first.readlines()

    patchSudoersFileForOpsi(sudoersFile=fileName)
    with open(fileName) as second:
        contentAfterSecondPatch = second.readlines()

    assert contentAfterFirstPatch == contentAfterSecondPatch
def testAlterFileIfPartOfPreviousPatchWasMissing(temporarySudoersFile):
    fileName = temporarySudoersFile
    patchSudoersFileForOpsi(sudoersFile=fileName)
    with open(fileName) as before:
        lines = before.readlines()

    lines = [line for line in lines if not line.startswith('opsiconfd')]
    with open(fileName, 'w') as before:
        before.writelines(lines)

    patchSudoersFileForOpsi(sudoersFile=fileName)
    with open(fileName) as after:
        assert any(line.startswith('opsiconfd') for line in after)
def testExecutingServiceDoesNotRequireTTY(temporarySudoersFile):
    fileName = temporarySudoersFile
    with open(fileName) as pre:
        for line in pre:
            if _NO_TTY_FOR_SERVICE_REQUIRED in line:
                pytest.skip(u'Command already existing. Can\'t check.')

    patchSudoersFileForOpsi(fileName)

    with open(fileName) as post:
        assert any(_NO_TTY_FOR_SERVICE_REQUIRED in line
                   for line in post), u"Expected {0} in patched file.".format(
                       _NO_TTY_FOR_SERVICE_REQUIRED)
def testBackupIsCreated(tempDir):
    def showFolderInfo():
        print(u'Files in {0}: {1}'.format(tempDir, filesInTemporaryFolder))

    with createTemporaryTestfile(SUDOERS_WITHOUT_ENTRIES,
                                 tempDir=tempDir) as fileName:
        filesInTemporaryFolder = os.listdir(tempDir)

        showFolderInfo()
        assert 1 == len(filesInTemporaryFolder)

        patchSudoersFileForOpsi(sudoersFile=fileName)

        filesInTemporaryFolder = os.listdir(tempDir)
        showFolderInfo()
        assert 2 == len(filesInTemporaryFolder)
def testOpsiconfdDoesNotRequireTTY(temporarySudoersFile):
    fileName = temporarySudoersFile

    with open(fileName) as pre:
        for line in pre:
            if _NO_TTY_REQUIRED_DEFAULT in line:
                pytest.skip(u'Command already existing. Can\'t check.')

    with mock.patch('OPSI.Util.Task.Sudoers.distributionRequiresNoTtyPatch',
                    lambda: True):
        patchSudoersFileForOpsi(fileName)

    with open(fileName) as post:
        assert any(_NO_TTY_REQUIRED_DEFAULT in line
                   for line in post), u"Expected {0} in patched file.".format(
                       _NO_TTY_REQUIRED_DEFAULT)
def testDoNotAddDuplicates(temporarySudoersFile):
    adminGroup = u'%{group}'.format(group=FILE_ADMIN_GROUP)

    fileName = temporarySudoersFile
    patchSudoersFileForOpsi(sudoersFile=fileName)
    with open(fileName) as before:
        lines = before.readlines()

    lines = [line for line in lines if not line.startswith('opsiconfd')]
    assert 1 == len([line for line in lines if line.startswith(adminGroup)])

    with open(fileName, 'w') as before:
        before.writelines(lines)

    patchSudoersFileForOpsi(sudoersFile=fileName)
    with open(fileName) as after:
        afterLines = after.readlines()

    assert 1 == len(
        [line for line in afterLines if line.startswith(adminGroup)])