Esempio n. 1
0
    def test_configuration_schema_validation_from_file(self):
        schemas_git_dir = tempfile.mkdtemp(prefix='irods-test_configuration_schema_validation_from_file-git')
        with lib.directory_deleter(schemas_git_dir):
            schemas_repo = 'https://github.com/irods/irods_schema_configuration'
            lib.run_command(['git', 'clone', schemas_repo, schemas_git_dir])
            schemas_branch = 'v3'
            lib.run_command(['git', 'checkout', schemas_branch], cwd=schemas_git_dir)
            schemas_deploy_dir = tempfile.mkdtemp(prefix='irods-test_configuration_schema_validation_from_file-schemas')
            with lib.directory_deleter(schemas_deploy_dir):
                lib.assert_command(['python', os.path.join(schemas_git_dir, 'deploy_schemas_locally.py'), '--output_directory_base', schemas_deploy_dir])
                with lib.file_backed_up(os.path.join(lib.get_irods_config_dir(), 'server_config.json')) as server_config_filename:
                    with open(server_config_filename) as f:
                        server_config = json.load(f)
                    server_config['schema_validation_base_uri'] = 'file://' + schemas_deploy_dir
                    lib.update_json_file_from_dict(server_config_filename, server_config)
                    irodsctl_fullpath = os.path.join(lib.get_irods_top_level_dir(), 'iRODS', 'irodsctl')

                    if lib.is_jsonschema_installed():
                        expected_lines = ['Validating [{0}]... Success'.format(os.path.expanduser('~/.irods/irods_environment.json')),
                                          'Validating [{0}/server_config.json]... Success'.format(lib.get_irods_config_dir()),
                                          'Validating [{0}/VERSION.json]... Success'.format(lib.get_irods_top_level_dir()),
                                          'Validating [{0}/hosts_config.json]... Success'.format(lib.get_irods_config_dir()),
                                          'Validating [{0}/host_access_control_config.json]... Success'.format(lib.get_irods_config_dir())]
                        if not configuration.TOPOLOGY_FROM_RESOURCE_SERVER:
                            expected_lines.append('Validating [{0}/database_config.json]... Success'.format(lib.get_irods_config_dir()))
                        lib.assert_command([irodsctl_fullpath, 'restart'], 'STDOUT_MULTILINE', expected_lines)
                    else:
                        lib.assert_command([irodsctl_fullpath, 'restart'], 'STDERR_SINGLELINE', 'jsonschema not installed', desired_rc=0)
Esempio n. 2
0
    def test_authentication_PAM_with_server_params(self):
        ## set up client and server side for ssl handshake
        # server side certificate setup
        os.system('openssl genrsa -out server.key')
        os.system('openssl req -batch -new -x509 -key server.key -out server.crt -days 365')
        os.system('mv server.crt chain.pem')
        os.system('openssl dhparam -2 -out dhparams.pem 100')  # normally 2048, but smaller size here for speed

        # server side environment variables
        os.environ['irodsSSLCertificateChainFile'] = lib.get_irods_top_level_dir() + '/tests/pydevtest/chain.pem'
        os.environ['irodsSSLCertificateKeyFile'] = lib.get_irods_top_level_dir() + '/tests/pydevtest/server.key'
        os.environ['irodsSSLDHParamsFile'] = lib.get_irods_top_level_dir() + '/tests/pydevtest/dhparams.pem'

        # client side environment variables
        backup_env_contents = copy.deepcopy(self.auth_session.environment_file_contents)
        self.auth_session.environment_file_contents['irods_ssl_verify_server'] = 'none'
        self.auth_session.environment_file_contents['irods_client_server_policy'] = 'CS_NEG_REQUIRE'
        self.auth_session.environment_file_contents['irods_authentication_scheme'] = 'PaM'

        # add server_config.json settings
        serverConfigFile = lib.get_irods_config_dir() + "/server_config.json"
        with open(serverConfigFile) as f:
            contents = json.load(f)
        os.system("cp %s %sOrig" % (serverConfigFile, serverConfigFile))
        contents['pam_password_length'] = 20
        contents['pam_no_extend'] = False
        contents['pam_password_min_time'] = 121
        contents['pam_password_max_time'] = 1209600
        with open(serverConfigFile, 'w') as f:
            json.dump(contents, f)

        # server reboot to pick up new irodsEnv and server settings
        lib.restart_irods_server()

        # do the reauth
        self.auth_session.assert_icommand(['iinit', self.auth_session.password])
        # connect and list some files
        self.auth_session.assert_icommand("icd")
        self.auth_session.assert_icommand("ils -L", 'STDOUT', "home")

        # reset client environment to original
        self.auth_session.environment_file_contents = backup_env_contents


        # clean up
        for file in ['server.key', 'chain.pem', 'dhparams.pem']:
            os.unlink(file)

        # reset server_config.json to original
        os.system('mv %sOrig %s' % (serverConfigFile, serverConfigFile))

        # server reboot to revert to previous server configuration
        os.system(lib.get_irods_top_level_dir() + '/iRODS/irodsctl stop')
        os.system(lib.get_irods_top_level_dir() + '/tests/zombiereaper.sh')
        os.system(lib.get_irods_top_level_dir() + '/iRODS/irodsctl start')
Esempio n. 3
0
    def test_rulebase_update__2585(self):
        rule_file = 'my_rule.r'
        test_re = os.path.join(lib.get_core_re_dir(), 'test.re')
        my_rule = """
my_rule {
    delay("<PLUSET>1s</PLUSET>") {
        do_some_stuff();
    }
}
INPUT null
OUTPUT ruleExecOut
        """
        with open(rule_file, 'w') as f:
            f.write(my_rule)

        server_config_filename = lib.get_irods_config_dir() + '/server_config.json'
        with lib.file_backed_up(server_config_filename):
            # write new rule file to config dir
            test_rule = 'do_some_stuff() { writeLine( "serverLog", "TEST_STRING_TO_FIND_1_2585" ); }'
            with open(test_re, 'w') as f:
                f.write(test_rule)

            # update server config with additional rule file
            server_config_update = {
                "re_rulebase_set": [{"filename": "test"}, {"filename": "core"}]
            }
            lib.update_json_file_from_dict(server_config_filename, server_config_update)
            time.sleep(35)  # wait for delay rule engine to wake

            # checkpoint log to know where to look for the string
            initial_log_size = lib.get_log_size('re')
            self.admin.assert_icommand('irule -F ' + rule_file)
            time.sleep(35)  # wait for test to fire
            assert lib.count_occurrences_of_string_in_log('re', 'TEST_STRING_TO_FIND_1_2585', start_index=initial_log_size)

            # repave rule with new string
            test_rule = 'do_some_stuff() { writeLine( "serverLog", "TEST_STRING_TO_FIND_2_2585" ); }'
            os.unlink(test_re)
            with open(test_re, 'w') as f:
                f.write(test_rule)
            time.sleep(35)  # wait for delay rule engine to wake

            # checkpoint log to know where to look for the string
            initial_log_size = lib.get_log_size('re')
            self.admin.assert_icommand('irule -F ' + rule_file)
            time.sleep(35)  # wait for test to fire
            assert lib.count_occurrences_of_string_in_log('re', 'TEST_STRING_TO_FIND_2_2585', start_index=initial_log_size)

        # cleanup
        os.unlink(test_re)
        os.unlink(rule_file)
Esempio n. 4
0
    def test_authentication_PAM_with_server_params(self):
        lib.run_command('openssl genrsa -out server.key')
        lib.run_command('openssl req -batch -new -key server.key -out server.csr')
        lib.run_command('openssl req -batch -new -x509 -key server.key -out chain.pem -days 365')
        lib.run_command('openssl dhparam -2 -out dhparams.pem 1024')  # normally 2048, but smaller size here for speed

        service_account_environment_file_path = os.path.expanduser('~/.irods/irods_environment.json')
        with lib.file_backed_up(service_account_environment_file_path):
            server_update = {
                'irods_ssl_certificate_chain_file': os.path.join(lib.get_irods_top_level_dir(), 'tests/pydevtest/chain.pem'),
                'irods_ssl_certificate_key_file': os.path.join(lib.get_irods_top_level_dir(), 'tests/pydevtest/server.key'),
                'irods_ssl_dh_params_file': os.path.join(lib.get_irods_top_level_dir(), 'tests/pydevtest/dhparams.pem'),
                'irods_ssl_verify_server': 'none',
            }
            lib.update_json_file_from_dict(service_account_environment_file_path, server_update)

            client_update = {
                'irods_ssl_certificate_chain_file': os.path.join(lib.get_irods_top_level_dir(), 'tests/pydevtest/chain.pem'),
                'irods_ssl_certificate_key_file': os.path.join(lib.get_irods_top_level_dir(), 'tests/pydevtest/server.key'),
                'irods_ssl_dh_params_file': os.path.join(lib.get_irods_top_level_dir(), 'tests/pydevtest/dhparams.pem'),
                'irods_ssl_verify_server': 'none',
                'irods_authentication_scheme': 'PaM',
                'irods_client_server_policy': 'CS_NEG_REQUIRE',
            }

            auth_session_env_backup = copy.deepcopy(self.auth_session.environment_file_contents)
            self.auth_session.environment_file_contents.update(client_update)

            server_config_filename = lib.get_irods_config_dir() + '/server_config.json'
            with lib.file_backed_up(server_config_filename):
                server_config_update = {
                    'pam_password_length': 20,
                    'pam_no_extend': False,
                    'pam_password_min_time': 121,
                    'pam_password_max_time': 1209600,
                }
                lib.update_json_file_from_dict(server_config_filename, server_config_update)

                lib.restart_irods_server()

                # the test
                self.auth_session.assert_icommand(['iinit', self.auth_session.password])
                self.auth_session.assert_icommand("icd")
                self.auth_session.assert_icommand("ils -L", 'STDOUT_SINGLELINE', "home")

        self.auth_session.environment_file_contents = auth_session_env_backup
        for file in ['tests/pydevtest/server.key', 'tests/pydevtest/chain.pem', 'tests/pydevtest/dhparams.pem']:
            os.unlink(os.path.join(lib.get_irods_top_level_dir(), file))

        lib.restart_irods_server()
Esempio n. 5
0
    def test_authentication_PAM_with_server_params(self):
        lib.run_command('openssl genrsa -out server.key')
        lib.run_command('openssl req -batch -new -key server.key -out server.csr')
        lib.run_command('openssl req -batch -new -x509 -key server.key -out chain.pem -days 365')
        lib.run_command('openssl dhparam -2 -out dhparams.pem 100')  # normally 2048, but smaller size here for speed

        service_account_environment_file_path = os.path.expanduser('~/.irods/irods_environment.json')
        with lib.file_backed_up(service_account_environment_file_path):
            server_update = {
                'irods_ssl_certificate_chain_file': os.path.join(lib.get_irods_top_level_dir(), 'tests/pydevtest/chain.pem'),
                'irods_ssl_certificate_key_file': os.path.join(lib.get_irods_top_level_dir(), 'tests/pydevtest/server.key'),
                'irods_ssl_dh_params_file': os.path.join(lib.get_irods_top_level_dir(), 'tests/pydevtest/dhparams.pem'),
                'irods_ssl_verify_server': 'none',
            }
            lib.update_json_file_from_dict(service_account_environment_file_path, server_update)

            client_update = {
                'irods_ssl_certificate_chain_file': os.path.join(lib.get_irods_top_level_dir(), 'tests/pydevtest/chain.pem'),
                'irods_ssl_certificate_key_file': os.path.join(lib.get_irods_top_level_dir(), 'tests/pydevtest/server.key'),
                'irods_ssl_dh_params_file': os.path.join(lib.get_irods_top_level_dir(), 'tests/pydevtest/dhparams.pem'),
                'irods_ssl_verify_server': 'none',
                'irods_authentication_scheme': 'PaM',
                'irods_client_server_policy': 'CS_NEG_REQUIRE',
            }

            auth_session_env_backup = copy.deepcopy(self.auth_session.environment_file_contents)
            self.auth_session.environment_file_contents.update(client_update)

            server_config_filename = lib.get_irods_config_dir() + '/server_config.json'
            with lib.file_backed_up(server_config_filename):
                server_config_update = {
                    'pam_password_length': 20,
                    'pam_no_extend': False,
                    'pam_password_min_time': 121,
                    'pam_password_max_time': 1209600,
                }
                lib.update_json_file_from_dict(server_config_filename, server_config_update)

                lib.restart_irods_server()

                # the test
                self.auth_session.assert_icommand(['iinit', self.auth_session.password])
                self.auth_session.assert_icommand("icd")
                self.auth_session.assert_icommand("ils -L", 'STDOUT_SINGLELINE', "home")

        self.auth_session.environment_file_contents = auth_session_env_backup
        for file in ['tests/pydevtest/server.key', 'tests/pydevtest/chain.pem', 'tests/pydevtest/dhparams.pem']:
            os.unlink(os.path.join(lib.get_irods_top_level_dir(), file))

        lib.restart_irods_server()
Esempio n. 6
0
    def test_configuration_schema_validation_from_file(self):
        schemas_git_dir = tempfile.mkdtemp(
            prefix='irods-test_configuration_schema_validation_from_file-git')
        with lib.directory_deleter(schemas_git_dir):
            schemas_repo = 'https://github.com/irods/irods_schema_configuration'
            lib.run_command(['git', 'clone', schemas_repo, schemas_git_dir])
            schemas_branch = 'v3'
            lib.run_command(['git', 'checkout', schemas_branch],
                            cwd=schemas_git_dir)
            schemas_deploy_dir = tempfile.mkdtemp(
                prefix=
                'irods-test_configuration_schema_validation_from_file-schemas')
            with lib.directory_deleter(schemas_deploy_dir):
                lib.assert_command([
                    'python',
                    os.path.join(schemas_git_dir, 'deploy_schemas_locally.py'),
                    '--output_directory_base', schemas_deploy_dir
                ])
                with lib.file_backed_up(
                        os.path.join(
                            lib.get_irods_config_dir(),
                            'server_config.json')) as server_config_filename:
                    with open(server_config_filename) as f:
                        server_config = json.load(f)
                    server_config[
                        'schema_validation_base_uri'] = 'file://' + schemas_deploy_dir
                    lib.update_json_file_from_dict(server_config_filename,
                                                   server_config)
                    irodsctl_fullpath = os.path.join(
                        lib.get_irods_top_level_dir(), 'iRODS', 'irodsctl')

                    if lib.is_jsonschema_installed():
                        expected_lines = [
                            'Validating [/var/lib/irods/.irods/irods_environment.json]... Success',
                            'Validating [/etc/irods/server_config.json]... Success',
                            'Validating [/var/lib/irods/VERSION.json]... Success',
                            'Validating [/etc/irods/hosts_config.json]... Success',
                            'Validating [/etc/irods/host_access_control_config.json]... Success'
                        ]
                        if not configuration.TOPOLOGY_FROM_RESOURCE_SERVER:
                            expected_lines.append(
                                'Validating [/etc/irods/database_config.json]... Success'
                            )
                        lib.assert_command([irodsctl_fullpath, 'restart'],
                                           'STDOUT_MULTILINE', expected_lines)
                    else:
                        lib.assert_command([irodsctl_fullpath, 'restart'],
                                           'STDERR_SINGLELINE',
                                           'jsonschema not installed',
                                           desired_rc=0)
Esempio n. 7
0
class Test_Xmsg(unittest.TestCase):
    serverConfigFile = lib.get_irods_config_dir() + '/server_config.json'
    serverConfigFileBackup = serverConfigFile + '_orig'
    xmsgHost = 'localhost'
    xmsgPort = 1279

    def setUp(self):
        # add Xmsg settings to server_config.json
        shutil.copyfile(self.serverConfigFile, self.serverConfigFileBackup)
        contents = lib.open_and_load_json_ascii(self.serverConfigFile)
        update = {
            'xmsg_host': self.xmsgHost,
            'xmsg_port': self.xmsgPort,
        }
        lib.update_json_file_from_dict(self.serverConfigFile, update)

        # apparently needed by the server too...
        my_env = os.environ.copy()
        my_env['XMSG_HOST'] = self.xmsgHost
        my_env['XMSG_PORT'] = str(self.xmsgPort)
        lib.restart_irods_server(env=my_env)

    def tearDown(self):
        os.rename(self.serverConfigFileBackup, self.serverConfigFile)
        lib.restart_irods_server()

    @unittest.skipIf(configuration.TOPOLOGY_FROM_RESOURCE_SERVER
                     or configuration.USE_SSL,
                     "Skip for topology testing from resource server or SSL")
    def test_send_and_receive_one_xmsg(self):
        message = 'Hello World!'

        # set up Xmsg in client environment
        my_env = os.environ.copy()
        my_env['XMSG_HOST'] = self.xmsgHost
        my_env['XMSG_PORT'] = str(self.xmsgPort)

        # send msg
        args = ['/usr/bin/ixmsg', 's', '-M "{0}"'.format(message)]
        subprocess.Popen(args, env=my_env).communicate()

        # receive msg
        args = ['/usr/bin/ixmsg', 'r', '-n 1']
        res = subprocess.Popen(args, env=my_env,
                               stdout=subprocess.PIPE).communicate()

        # assertion
        print 'looking for "{0}" in "{1}"'.format(message, res[0].rstrip())
        assert res[0].find(message) >= 0
Esempio n. 8
0
    def test_authentication_OSAuth(self):
        self.auth_session.environment_file_contents['irods_authentication_scheme'] = 'OSAuth'

        # setup the irods.key file necessary for OSAuth
        keyfile_path = os.path.join(lib.get_irods_config_dir(), 'irods.key')
        with open(keyfile_path, 'w') as f:
            f.write('gibberish\n')

        # do the reauth
        self.auth_session.assert_icommand('iexit full')
        self.auth_session.assert_icommand(['iinit', self.auth_session.password])
        # connect and list some files
        self.auth_session.assert_icommand('icd')
        self.auth_session.assert_icommand('ils -L', 'STDOUT_SINGLELINE', 'home')

        # reset client environment to original
        del self.auth_session.environment_file_contents['irods_authentication_scheme']

        # clean up keyfile
        os.unlink(keyfile_path)
Esempio n. 9
0
    def test_authentication_OSAuth(self):
        self.auth_session.environment_file_contents['irods_authentication_scheme'] = 'OSAuth'

        # setup the irods.key file necessary for OSAuth
        keyfile_path = os.path.join(lib.get_irods_config_dir(), 'irods.key')
        with open(keyfile_path, 'w') as f:
            f.write('gibberish\n')

        # do the reauth
        self.auth_session.assert_icommand('iexit full')
        self.auth_session.assert_icommand(['iinit', self.auth_session.password])
        # connect and list some files
        self.auth_session.assert_icommand('icd')
        self.auth_session.assert_icommand('ils -L', 'STDOUT_SINGLELINE', 'home')

        # reset client environment to original
        del self.auth_session.environment_file_contents['irods_authentication_scheme']

        # clean up keyfile
        os.unlink(keyfile_path)
Esempio n. 10
0
    def test_rulebase_update__2585(self):
        rule_file = 'my_rule.r'
        test_re = os.path.join(lib.get_core_re_dir(), 'test.re')
        my_rule = """
my_rule {
    delay("<PLUSET>1s</PLUSET>") {
        do_some_stuff();
    }
}
INPUT null
OUTPUT ruleExecOut
        """
        with open(rule_file, 'w') as f:
            f.write(my_rule)

        server_config_filename = lib.get_irods_config_dir(
        ) + '/server_config.json'
        with lib.file_backed_up(server_config_filename):
            # write new rule file to config dir
            test_rule = 'do_some_stuff() { writeLine( "serverLog", "TEST_STRING_TO_FIND_1_2585" ); }'
            with open(test_re, 'w') as f:
                f.write(test_rule)

            # update server config with additional rule file
            server_config_update = {
                "re_rulebase_set": [{
                    "filename": "test"
                }, {
                    "filename": "core"
                }]
            }
            lib.update_json_file_from_dict(server_config_filename,
                                           server_config_update)
            time.sleep(35)  # wait for delay rule engine to wake

            # checkpoint log to know where to look for the string
            initial_log_size = lib.get_log_size('re')
            self.admin.assert_icommand('irule -F ' + rule_file)
            time.sleep(35)  # wait for test to fire
            assert lib.count_occurrences_of_string_in_log(
                're',
                'TEST_STRING_TO_FIND_1_2585',
                start_index=initial_log_size)

            # repave rule with new string
            test_rule = 'do_some_stuff() { writeLine( "serverLog", "TEST_STRING_TO_FIND_2_2585" ); }'
            os.unlink(test_re)
            with open(test_re, 'w') as f:
                f.write(test_rule)
            time.sleep(35)  # wait for delay rule engine to wake

            # checkpoint log to know where to look for the string
            initial_log_size = lib.get_log_size('re')
            self.admin.assert_icommand('irule -F ' + rule_file)
            time.sleep(35)  # wait for test to fire
            assert lib.count_occurrences_of_string_in_log(
                're',
                'TEST_STRING_TO_FIND_2_2585',
                start_index=initial_log_size)

        # cleanup
        os.unlink(test_re)
        os.unlink(rule_file)
Esempio n. 11
0
    def test_acPostProcForOpen__3024(self):
        test_re = os.path.join(lib.get_core_re_dir(), 'test.re')
        server_config_filename = lib.get_irods_config_dir() + '/server_config.json'

        # get PEP name from function name
        pep_name = inspect.stack()[0][3].split('_')[1]

        # user session
        sesh = self.user0
        testfile = self.testfile
        target_obj = os.path.join(sesh.session_collection, testfile)

        # prepare rule file
        rule_file = "test_rule_file.r"
        rule_string = '''
test_acPostProcForCreate__3024 {{
    msiDataObjOpen("{target_obj}",*FD);
    msiDataObjClose(*FD,*Status);
}}
INPUT null
OUTPUT ruleExecOut
'''.format(**locals())

        with open(rule_file, 'w') as f:
            f.write(rule_string)

        # query for resource properties
        columns = ('RESC_ZONE_NAME, '
                   'RESC_FREE_SPACE, '
                   'RESC_STATUS, '
                   'RESC_ID, '
                   'RESC_NAME, '
                   'RESC_TYPE_NAME, '
                   'RESC_LOC, '
                   'RESC_CLASS_NAME, '
                   'RESC_VAULT_PATH, '
                   'RESC_INFO, '
                   'RESC_COMMENT, '
                   'RESC_CREATE_TIME, '
                   'RESC_MODIFY_TIME')
        resource = sesh.default_resource
        query = '''iquest "SELECT {columns} WHERE RESC_NAME ='{resource}'"'''.format(**locals())
        result = sesh.run_icommand(query)[1]

        # last line is iquest default formatting separator
        resource_property_list = result.splitlines()[:-1]

        with lib.file_backed_up(server_config_filename):
            # prepare rule
            # rule will write PEP name as well as
            # resource related rule session vars to server log
            rule_body = 'writeLine("serverLog", "{pep_name}");'.format(**locals())
            rule_body += ('writeLine("serverLog", $KVPairs.zoneName);'
                          'writeLine("serverLog", $KVPairs.freeSpace);'
                          'writeLine("serverLog", $KVPairs.quotaLimit);'
                          'writeLine("serverLog", $KVPairs.rescStatus);'
                          'writeLine("serverLog", $KVPairs.rescId);'
                          'writeLine("serverLog", $KVPairs.rescName);'
                          'writeLine("serverLog", $KVPairs.rescType);'
                          'writeLine("serverLog", $KVPairs.rescLoc);'
                          'writeLine("serverLog", $KVPairs.rescClass);'
                          'writeLine("serverLog", $KVPairs.rescVaultPath);'
                          'writeLine("serverLog", $KVPairs.rescInfo);'
                          'writeLine("serverLog", $KVPairs.rescComments);'
                          'writeLine("serverLog", $KVPairs.rescCreate);'
                          'writeLine("serverLog", $KVPairs.rescModify);')
            test_rule = '{pep_name} {{ {rule_body} }}'.format(**locals())

            # write new rule file
            with open(test_re, 'w') as f:
                f.write(test_rule)

            # update server config with additional rule file
            server_config_update = {
                "re_rulebase_set": [{"filename": "test"}, {"filename": "core"}]
            }
            lib.update_json_file_from_dict(server_config_filename, server_config_update)

            # iput test file
            sesh.assert_icommand('iput -f {testfile}'.format(**locals()))

            # checkpoint log to know where to look for the string
            initial_log_size = lib.get_log_size('server')

            # invoke irule to trigger PEP
            sesh.assert_icommand('irule -F {rule_file}'.format(**locals()))

            # confirm that PEP was hit by looking for pep name in server log
            assert lib.count_occurrences_of_string_in_log('server', pep_name, start_index=initial_log_size)

            # check that resource session vars were written to the server log
            for line in resource_property_list:
                column = line.rsplit('=', 1)[0].strip()
                property = line.rsplit('=', 1)[1].strip()
                if property:
                    if column != 'RESC_MODIFY_TIME':
                        assert lib.count_occurrences_of_string_in_log('server', property, start_index=initial_log_size)
                    else:
                        # for resource modify time skip last 2 second digits
                        assert lib.count_occurrences_of_string_in_log('server', property[:-2], start_index=initial_log_size)

        # cleanup
        sesh.run_icommand('irm -f {target_obj}'.format(**locals()))
        os.unlink(rule_file)
        os.unlink(test_re)
Esempio n. 12
0
class Test_AllRules(resource_suite.ResourceBase, unittest.TestCase):
    __metaclass__ = metaclass_unittest_test_case_generator.MetaclassUnittestTestCaseGenerator

    global rules30dir
    currentdir = os.path.dirname(os.path.realpath(__file__))
    rules30dir = currentdir + "/../../iRODS/clients/icommands/test/rules3.0/"
    conf_dir = lib.get_irods_config_dir()

    def setUp(self):
        super(Test_AllRules, self).setUp()

        self.rods_session = lib.make_session_for_existing_admin(
        )  # some rules hardcode 'rods' and 'tempZone'

        hostname = socket.gethostname()
        hostuser = getpass.getuser()
        progname = __file__
        dir_w = rules30dir + ".."
        self.rods_session.assert_icommand(
            'icd'
        )  # to get into the home directory (for testallrules assumption)
        self.rods_session.assert_icommand('iadmin mkuser devtestuser rodsuser')
        self.rods_session.assert_icommand(
            'iadmin mkresc testallrulesResc unixfilesystem ' + hostname +
            ':/tmp/' + hostuser + '/pydevtest_testallrulesResc',
            'STDOUT_SINGLELINE', 'unixfilesystem')
        self.rods_session.assert_icommand('imkdir sub1')
        self.rods_session.assert_icommand('imkdir sub3')
        self.rods_session.assert_icommand('imkdir forphymv')
        self.rods_session.assert_icommand('imkdir ruletest')
        self.rods_session.assert_icommand('imkdir test')
        self.rods_session.assert_icommand('imkdir test/phypathreg')
        self.rods_session.assert_icommand('imkdir ruletest/subforrmcoll')
        self.rods_session.assert_icommand('iput ' + progname + ' test/foo1')
        self.rods_session.assert_icommand(
            'icp test/foo1 sub1/dcmetadatatarget')
        self.rods_session.assert_icommand('icp test/foo1 sub1/mdcopysource')
        self.rods_session.assert_icommand('icp test/foo1 sub1/mdcopydest')
        self.rods_session.assert_icommand('icp test/foo1 sub1/foo1')
        self.rods_session.assert_icommand('icp test/foo1 sub1/foo2')
        self.rods_session.assert_icommand('icp test/foo1 sub1/foo3')
        self.rods_session.assert_icommand('icp test/foo1 forphymv/phymvfile')
        self.rods_session.assert_icommand('icp test/foo1 sub1/objunlink1')
        self.rods_session.assert_icommand(
            'irm sub1/objunlink1')  # put it in the trash
        self.rods_session.assert_icommand('icp test/foo1 sub1/objunlink2')
        self.rods_session.assert_icommand(
            'irepl -R testallrulesResc sub1/objunlink2')
        self.rods_session.assert_icommand('icp test/foo1 sub1/freebuffer')
        self.rods_session.assert_icommand('icp test/foo1 sub1/automove')
        self.rods_session.assert_icommand('icp test/foo1 test/versiontest.txt')
        self.rods_session.assert_icommand(
            'icp test/foo1 test/metadata-target.txt')
        self.rods_session.assert_icommand('icp test/foo1 test/ERAtestfile.txt')
        self.rods_session.assert_icommand(
            'ichmod read devtestuser test/ERAtestfile.txt')
        self.rods_session.assert_icommand(
            'imeta add -d test/ERAtestfile.txt Fun 99 Balloons')
        self.rods_session.assert_icommand(
            'icp test/foo1 sub1/for_versioning.txt')
        self.rods_session.assert_icommand('imkdir sub1/SaveVersions')
        self.rods_session.assert_icommand(
            'iput ' + dir_w + '/misc/devtestuser-account-ACL.txt test')
        self.rods_session.assert_icommand('iput ' + dir_w +
                                          '/misc/load-metadata.txt test')
        self.rods_session.assert_icommand('iput ' + dir_w +
                                          '/misc/load-usermods.txt test')
        self.rods_session.assert_icommand('iput ' + dir_w +
                                          '/misc/sample.email test')
        self.rods_session.assert_icommand('iput ' + dir_w +
                                          '/misc/email.tag test')
        self.rods_session.assert_icommand(
            'iput ' + dir_w + '/misc/sample.email test/sample2.email')
        self.rods_session.assert_icommand('iput ' + dir_w +
                                          '/misc/email.tag test/email2.tag')

        # setup for rulemsiAdmChangeCoreRE and the likes
        empty_core_file_name = 'empty.test.re'
        new_core_file_name = 'new.test.re'
        with open(self.conf_dir + '/' + empty_core_file_name, 'w'):
            pass
        shutil.copy(self.conf_dir + "/core.re",
                    self.conf_dir + "/core.re.bckp")  # back up core.re
        shutil.copy(self.conf_dir + "/core.re",
                    self.conf_dir + "/" + new_core_file_name)  # copy core.re

    def tearDown(self):
        self.rods_session.assert_icommand(
            'icd')  # for home directory assumption
        self.rods_session.assert_icommand(
            ['ichmod', '-r', 'own', self.rods_session.username, '.'])
        self.rods_session.run_icommand([
            'imcoll', '-U',
            self.rods_session.home_collection + '/test/phypathreg'
        ])
        self.rods_session.run_icommand(
            'irm -rf test ruletest forphymv sub1 sub2 sub3 bagit rules bagit.tar /'
            + self.rods_session.zone_name + '/bundle/home/' +
            self.rods_session.username)
        self.rods_session.assert_icommand('iadmin rmresc testallrulesResc')
        self.rods_session.assert_icommand('iadmin rmuser devtestuser')
        self.rods_session.assert_icommand(
            'iqdel -a')  # remove all/any queued rules

        # cleanup mods in iRODS config dir
        lib.run_command('mv -f {0}/core.re.bckp {0}/core.re'.format(
            self.conf_dir, self.conf_dir))
        lib.run_command('rm -f %s/*.test.re' % self.conf_dir)

        self.rods_session.__exit__()
        super(Test_AllRules, self).tearDown()

    def generate_tests_allrules():
        def filter_rulefiles(rulefile):

            # skip rules that handle .irb files
            names_to_skip = [
                "rulemsiAdmAppendToTopOfCoreIRB",
                "rulemsiAdmChangeCoreIRB",
                "rulemsiGetRulesFromDBIntoStruct",
            ]
            for n in names_to_skip:
                if n in rulefile:
                    # print "skipping " + rulefile + " ----- RE"
                    return False

            # skip rules that fail by design
            names_to_skip = ["GoodFailure"]
            for n in names_to_skip:
                if n in rulefile:
                    # print "skipping " + rulefile + " ----- failbydesign"
                    return False

            for n in names_to_skip:
                if n in rulefile:
                    # print "skipping " + rulefile + " ----- failbydesign"
                    return False

            # skip if an action (run in the core.re), not enough input/output for irule
            names_to_skip = [
                "rulemsiAclPolicy",
                "rulemsiAddUserToGroup",
                "rulemsiCheckHostAccessControl",
                "rulemsiCheckOwner",
                "rulemsiCheckPermission",
                "rulemsiCommit",
                "rulemsiCreateCollByAdmin",
                "rulemsiCreateUser",
                "rulemsiDeleteCollByAdmin",
                "rulemsiDeleteDisallowed",
                "rulemsiDeleteUser",
                "rulemsiExtractNaraMetadata",
                "rulemsiOprDisallowed",
                "rulemsiRegisterData",
                "rulemsiRenameCollection",
                "rulemsiRenameLocalZone",
                "rulemsiRollback",
                "rulemsiSetBulkPutPostProcPolicy",
                "rulemsiSetDataObjAvoidResc",
                "rulemsiSetDataObjPreferredResc",
                "rulemsiSetDataTypeFromExt",
                "rulemsiSetDefaultResc",
                "rulemsiSetGraftPathScheme",
                "rulemsiSetMultiReplPerResc",
                "rulemsiSetNoDirectRescInp",
                "rulemsiSetNumThreads",
                "rulemsiSetPublicUserOpr",
                "rulemsiSetRandomScheme",
                "rulemsiSetRescQuotaPolicy",
                "rulemsiSetRescSortScheme",
                "rulemsiSetReServerNumProc",
                "rulemsiSetResource",
                "rulemsiSortDataObj",
                "rulemsiStageDataObj",
                "rulemsiSysChksumDataObj",
                "rulemsiSysMetaModify",
                "rulemsiSysReplDataObj",
                "rulemsiNoChkFilePathPerm",
                "rulemsiNoTrashCan",
            ]
            for n in names_to_skip:
                if n in rulefile:
                    # print "skipping " + rulefile + " ----- input/output"
                    return False

            # skip rules we are not yet supporting
            names_to_skip = [
                "rulemsiobj",
            ]
            for n in names_to_skip:
                if n in rulefile:
                    # print "skipping " + rulefile + " ----- msiobj"
                    return False

            # ERA
            names_to_skip = [
                "rulemsiFlagInfectedObjs",
                "rulemsiGetAuditTrailInfoByActionID",
                "rulemsiGetAuditTrailInfoByKeywords",
                "rulemsiGetAuditTrailInfoByObjectID",
                "rulemsiGetAuditTrailInfoByTimeStamp",
                "rulemsiGetAuditTrailInfoByUserID",
                "rulemsiMergeDataCopies",
                "rulemsiGetCollectionPSmeta-null"  # marked for removal - iquest now handles this natively
            ]
            for n in names_to_skip:
                if n in rulefile:
                    # print "skipping " + rulefile + " ----- ERA"
                    return False

            # XMSG
            names_to_skip = [
                "rulemsiCreateXmsgInp",
                "rulemsiRcvXmsg",
                "rulemsiSendXmsg",
                "rulemsiXmsgCreateStream",
                "rulemsiXmsgServerConnect",
                "rulemsiXmsgServerDisConnect",
                "rulereadXMsg",
                "rulewriteXMsg",
            ]
            for n in names_to_skip:
                if n in rulefile:
                    # print "skipping " + rulefile + " ----- XMSG"
                    return False

            # FTP
            names_to_skip = [
                "rulemsiFtpGet",
                "rulemsiTwitterPost",
            ]
            for n in names_to_skip:
                if n in rulefile:
                    # print "skipping " + rulefile + " ----- FTP"
                    return False

            # webservices
            names_to_skip = [
                "rulemsiConvertCurrency",
                "rulemsiGetQuote",
                "rulemsiIp2location",
                "rulemsiObjByName",
                "rulemsiSdssImgCutout_GetJpeg",
            ]
            for n in names_to_skip:
                if n in rulefile:
                    # print "skipping " + rulefile + " ----- webservices"
                    return False

            # XML
            names_to_skip = [
                "rulemsiLoadMetadataFromXml",
                "rulemsiXmlDocSchemaValidate",
                "rulemsiXsltApply",
            ]
            for n in names_to_skip:
                if n in rulefile:
                    # print "skipping " + rulefile + " ----- XML"
                    return False

            # transition to core microservices only
            names_to_skip = [
                "rulemsiAddKeyVal.r",
                "rulemsiApplyDCMetadataTemplate.r",
                "rulemsiAssociateKeyValuePairsToObj.r",
                "rulemsiCollectionSpider.r",
                "rulemsiCopyAVUMetadata.r",
                "rulemsiExportRecursiveCollMeta.r",
                "rulemsiFlagDataObjwithAVU.r",
                "rulemsiGetCollectionACL.r",
                "rulemsiGetCollectionContentsReport.r",
                "rulemsiGetCollectionPSmeta.r",
                "rulemsiGetCollectionSize.r",
                "rulemsiGetDataObjACL.r",
                "rulemsiGetDataObjAIP.r",
                "rulemsiGetDataObjAVUs.r",
                "rulemsiGetDataObjPSmeta.r",
                "rulemsiGetObjectPath.r",
                "rulemsiGetUserACL.r",
                "rulemsiGetUserInfo.r",
                "rulemsiGuessDataType.r",
                "rulemsiIsColl.r",
                "rulemsiIsData.r",
                "rulemsiLoadACLFromDataObj.r",
                "rulemsiLoadMetadataFromDataObj.r",
                "rulemsiLoadUserModsFromDataObj.r",
                "rulemsiPropertiesAdd.r",
                "rulemsiPropertiesClear.r",
                "rulemsiPropertiesClone.r",
                "rulemsiPropertiesExists.r",
                "rulemsiPropertiesFromString.r",
                "rulemsiPropertiesGet.r",
                "rulemsiPropertiesNew.r",
                "rulemsiPropertiesRemove.r",
                "rulemsiPropertiesSet.r",
                "rulemsiRecursiveCollCopy.r",
                "rulemsiRemoveKeyValuePairsFromObj.r",
                "rulemsiSetDataType.r",
                "rulemsiString2KeyValPair.r",
                "rulemsiStripAVUs.r",
                "rulemsiStructFileBundle.r",
                "rulewriteKeyValPairs.r",
            ]
            for n in names_to_skip:
                if n in rulefile:
                    # print "skipping " + rulefile + " ----- transition to core"
                    return False

            # skipping rules requiring additional .re files in community code
            names_to_skip = [
                "rulemsiAdmAddAppRuleStruct.r",
                "rulemsiAdmClearAppRuleStruct.r",
                "rulemsiAdmInsertRulesFromStructIntoDB.r",
                "rulemsiAdmReadRulesFromFileIntoStruct.r",
                "rulemsiAdmRetrieveRulesFromDBIntoStruct.r",
                "rulemsiAdmWriteRulesFromStructIntoFile.r",
            ]
            for n in names_to_skip:
                if n in rulefile:
                    # print "skipping " + rulefile + " ----- community"
                    return False

            # skipping for now, not sure why it's throwing a stacktrace at the moment
            if "rulemsiPropertiesToString" in rulefile:
                # print "skipping " + rulefile + " ----- b/c of stacktrace"
                return False

            # misc / other
            if "ruleintegrity" in rulefile:
                # print "skipping " + rulefile + " ----- integrityChecks"
                return False
            if "z3950" in rulefile:
                # print "skipping " + rulefile + " ----- z3950"
                return False
            if "rulemsiImage" in rulefile:
                # print "skipping " + rulefile + " ----- image"
                return False
            if "rulemsiRda" in rulefile:
                # print "skipping " + rulefile + " ----- RDA"
                return False
            if "rulemsiCollRepl" in rulefile:
                # print "skipping " + rulefile + " ----- deprecated"
                return False
            if "rulemsiTarFileExtract" in rulefile:
                # print "skipping " + rulefile + " ----- CAT_NO_ROWS_FOUND - failed in
                # call to getDataObjInfoIncSpecColl"
                return False
            if "rulemsiDataObjRsync" in rulefile:
                # print "skipping " + rulefile + " ----- tested separately"
                return False

            return True

        for rulefile in filter(filter_rulefiles,
                               sorted(os.listdir(rules30dir))):

            def make_test(rulefile):
                def test(self):
                    self.rods_session.assert_icommand("icd")
                    self.rods_session.assert_icommand(
                        "irule -vF " + rules30dir + rulefile,
                        'STDOUT_SINGLELINE', "completed successfully")

                return test

            yield 'test_' + rulefile.replace('.', '_'), make_test(rulefile)

    def test_rulemsiDataObjRsync(self):
        rulefile = 'rulemsiDataObjRsync.r'
        src_filename = 'source.txt'
        dest_filename = 'dest.txt'
        test_dir = '/tmp'
        test_coll = self.rods_session.home_collection + '/synctest'
        src_file = os.path.join(test_dir, src_filename)
        src_obj = test_coll + '/' + src_filename
        dest_obj = test_coll + '/' + dest_filename

        # create test collection
        self.rods_session.run_icommand(['imkdir', test_coll])

        # create source test file
        with open(src_file, 'a') as f:
            f.write('blah\n')

        # upload source test file
        self.rods_session.run_icommand(['iput', src_file, test_coll])

        # first rsync rule test
        self.rods_session.assert_icommand("irule -F " + rules30dir + rulefile,
                                          'STDOUT_SINGLELINE',
                                          "status = 99999992")

        # modify the source and try again
        for i in range(1, 5):
            with open(src_file, 'a') as f:
                f.write('blah_' + str(i) + '\n')

            # force upload source
            self.rods_session.run_icommand(['iput', '-f', src_file, test_coll])

            # sync test
            self.rods_session.assert_icommand(
                "irule -F " + rules30dir + rulefile, 'STDOUT_SINGLELINE',
                "status = 99999992")

        # cleanup
        self.rods_session.run_icommand(['irm', '-rf', test_coll])
        os.remove(src_file)

    def test_rulemsiPhyBundleColl(self):
        rulefile = 'rulemsiPhyBundleColl.r'

        # rule test
        self.rods_session.assert_icommand(
            "irule -F " + rules30dir + rulefile, 'STDOUT_SINGLELINE',
            "Create tar file of collection /tempZone/home/rods/test on resource testallrulesResc"
        )

        # look for the bundle
        bundle_path = '/tempZone/bundle/home/' + self.rods_session.username
        output = self.rods_session.run_icommand(['ils', '-L', bundle_path])

        # last token in stdout should be the bundle file's full physical path
        bundlefile = output[1].split()[-1]

        # check on the bundle file's name
        assert bundlefile.find('test.') >= 0

        # check physical path on resource
        assert os.path.isfile(bundlefile)

        # now try as a normal user (expect err msg)
        self.user0.assert_icommand("irule -F " + rules30dir + rulefile,
                                   'STDERR_SINGLELINE', "SYS_NO_API_PRIV")

        # cleanup
        self.rods_session.run_icommand(['irm', '-rf', bundle_path])

    def test_str_2528(self):
        self.rods_session.assert_icommand(
            '''irule "*a.a = 'A'; *a.b = 'B'; writeLine('stdout', str(*a))" null ruleExecOut''',
            'STDOUT_SINGLELINE', "a=A++++b=B")
Esempio n. 13
0
    def test_acPostProcForFilePathReg__3024(self):
        test_re = os.path.join(lib.get_core_re_dir(), 'test.re')
        server_config_filename = lib.get_irods_config_dir() + '/server_config.json'

        # get PEP name from function name
        pep_name = inspect.stack()[0][3].split('_')[1]

        # user session
        # use admin to be allowed to register stuff
        sesh = self.admin

        # test file for ireg
        username = sesh.username
        resc_vault_path = lib.get_vault_path(sesh)
        testfile = '{resc_vault_path}/home/{username}/foo.txt'.format(**locals())
        open(testfile, 'a').close()

        # query for resource properties
        columns = ('RESC_ZONE_NAME, '
                   'RESC_FREE_SPACE, '
                   'RESC_STATUS, '
                   'RESC_ID, '
                   'RESC_NAME, '
                   'RESC_TYPE_NAME, '
                   'RESC_LOC, '
                   'RESC_CLASS_NAME, '
                   'RESC_VAULT_PATH, '
                   'RESC_INFO, '
                   'RESC_COMMENT, '
                   'RESC_CREATE_TIME, '
                   'RESC_MODIFY_TIME')
        resource = sesh.default_resource
        query = '''iquest "SELECT {columns} WHERE RESC_NAME ='{resource}'"'''.format(**locals())
        result = sesh.run_icommand(query)[1]

        # last line is iquest default formatting separator
        resource_property_list = result.splitlines()[:-1]

        with lib.file_backed_up(server_config_filename):
            # prepare rule
            # rule will write PEP name as well as
            # resource related rule session vars to server log
            rule_body = 'writeLine("serverLog", "{pep_name}");'.format(**locals())
            rule_body += ('writeLine("serverLog", $KVPairs.zoneName);'
                          'writeLine("serverLog", $KVPairs.freeSpace);'
                          'writeLine("serverLog", $KVPairs.quotaLimit);'
                          'writeLine("serverLog", $KVPairs.rescStatus);'
                          'writeLine("serverLog", $KVPairs.rescId);'
                          'writeLine("serverLog", $KVPairs.rescName);'
                          'writeLine("serverLog", $KVPairs.rescType);'
                          'writeLine("serverLog", $KVPairs.rescLoc);'
                          'writeLine("serverLog", $KVPairs.rescClass);'
                          'writeLine("serverLog", $KVPairs.rescVaultPath);'
                          'writeLine("serverLog", $KVPairs.rescInfo);'
                          'writeLine("serverLog", $KVPairs.rescComments);'
                          'writeLine("serverLog", $KVPairs.rescCreate);'
                          'writeLine("serverLog", $KVPairs.rescModify);')
            test_rule = '{pep_name} {{ {rule_body} }}'.format(**locals())

            # write new rule file
            with open(test_re, 'w') as f:
                f.write(test_rule)

            # update server config with additional rule file
            server_config_update = {
                "re_rulebase_set": [{"filename": "test"}, {"filename": "core"}]
            }
            lib.update_json_file_from_dict(server_config_filename, server_config_update)

            # checkpoint log to know where to look for the string
            initial_log_size = lib.get_log_size('server')

            # ireg test file to trigger PEP
            target_obj = os.path.join(sesh.home_collection, os.path.basename(testfile))
            sesh.assert_icommand('ireg {testfile} {target_obj}'.format(**locals()))

            # confirm that PEP was hit by looking for pep name in server log
            assert lib.count_occurrences_of_string_in_log('server', pep_name, start_index=initial_log_size)

            # check that resource session vars were written to the server log
            for line in resource_property_list:
                column = line.rsplit('=', 1)[0].strip()
                property = line.rsplit('=', 1)[1].strip()
                if property:
                    if column != 'RESC_MODIFY_TIME':
                        assert lib.count_occurrences_of_string_in_log('server', property, start_index=initial_log_size)

        # cleanup
        sesh.run_icommand('irm -f {target_obj}'.format(**locals()))
        os.unlink(test_re)