Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

#!/usr/bin/env python 

# Licensed to Cloudera, Inc. under one 

# or more contributor license agreements.  See the NOTICE file 

# distributed with this work for additional information 

# regarding copyright ownership.  Cloudera, Inc. licenses this file 

# to you under the Apache License, Version 2.0 (the 

# "License"); you may not use this file except in compliance 

# with the License.  You may obtain a copy of the License at 

# 

#     http://www.apache.org/licenses/LICENSE-2.0 

# 

# Unless required by applicable law or agreed to in writing, software 

# distributed under the License is distributed on an "AS IS" BASIS, 

# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 

# See the License for the specific language governing permissions and 

# limitations under the License. 

# 

 

import re 

import socket 

import airflow.configuration as conf 

 

# Pattern to replace with hostname 

HOSTNAME_PATTERN = '_HOST' 

 

 

def get_kerberos_principal(principal, host): 

    components = get_components(principal) 

    if not components or len(components) != 3 or components[1] != HOSTNAME_PATTERN: 

        return principal 

    else: 

        if not host: 

            raise IOError("Can't replace %s pattern since host is null." % HOSTNAME_PATTERN) 

        return replace_hostname_pattern(components, host) 

 

 

def get_components(principal): 

    """ 

    get_components(principal) -> (short name, instance (FQDN), realm) 

 

    ``principal`` is the kerberos principal to parse. 

    """ 

    if not principal: 

        return None 

    return re.split('[\/@]', str(principal)) 

 

 

def replace_hostname_pattern(components, host=None): 

    fqdn = host 

    if not fqdn or fqdn == '0.0.0.0': 

        fqdn = get_localhost_name() 

    return '%s/%s@%s' % (components[0], fqdn.lower(), components[2]) 

 

 

def get_localhost_name(): 

    return socket.getfqdn() 

 

 

def get_fqdn(hostname_or_ip=None): 

    # Get hostname 

    try: 

        if hostname_or_ip: 

            fqdn = socket.gethostbyaddr(hostname_or_ip)[0] 

        else: 

            fqdn = get_localhost_name() 

    except IOError: 

        fqdn = hostname_or_ip 

 

    if fqdn == 'localhost': 

        fqdn = get_localhost_name() 

 

    return fqdn 

 

def principal_from_username(username): 

    realm = configuration.get("security", "default_realm") 

    if '@' not in username and realm: 

        username = "{}@{}".format(username, realm) 

 

    return username