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

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

# Copyright (c) 2014, Facebook, Inc.  All rights reserved. 

# 

# This source code is licensed under the BSD-style license found in the 

# LICENSE file in the root directory of this source tree. An additional grant 

# of patent rights can be found in the PATENTS file in the same directory. 

# 

from __future__ import absolute_import 

 

import dbus.service 

from .ttypes import fb_status 

 

import datetime 

import logging 

import functools 

import os 

 

 

# TODO- move this somewhere else 

def log_unhandled(func): 

    @functools.wraps(func) 

    def wrapped(*args, **kwargs): 

        try: 

            return func(*args, **kwargs) 

        except: 

            logging.getLogger('sparts.dbus.fb303') \ 

                .exception('Unhandled Exception in dbus method') 

            raise 

    return wrapped 

 

class FB303DbusService(dbus.service.Object): 

    def __init__(self, bus, handler, name=None): 

        parts = ['', 'fb303'] 

        if name: 

            parts.insert(1, name) 

        path = '/'.join(parts) 

        dbus.service.Object.__init__(self, bus, path) 

        self.bus = bus 

        self.handler = handler 

        self.logger = logging.getLogger('sparts.fb303.dbus') 

 

    @dbus.service.method(dbus_interface='com.facebook.fb303.Service', 

                         in_signature='', out_signature='s') 

    def getName(self): 

        return self.handler.getName() 

 

    @dbus.service.method(dbus_interface='com.facebook.fb303.Service', 

                         in_signature='', out_signature='s') 

    def getVersion(self): 

        return self.handler.getVersion() 

 

    @dbus.service.method(dbus_interface='com.facebook.fb303.Service', 

                         in_signature='', out_signature='s') 

    def getStatus(self): 

        return fb_status._VALUES_TO_NAMES[self.handler.getStatus()] 

 

    @dbus.service.method(dbus_interface='com.facebook.fb303.Service', 

                         in_signature='', out_signature='s') 

    def getStatusDetails(self): 

        return self.handler.getStatusDetails() 

 

    @dbus.service.method(dbus_interface='com.facebook.fb303.Service', 

                         in_signature='', out_signature='a{sx}') 

    def getCounters(self): 

        return self.handler.getCounters() 

 

    @dbus.service.method(dbus_interface='com.facebook.fb303.Service', 

                         in_signature='s', out_signature='x') 

    def getCounter(self, key): 

        return self.handler.getCounter(key) 

 

    @dbus.service.method(dbus_interface='com.facebook.fb303.Service', 

                         in_signature='ss', out_signature='') 

    def setOption(self, key, value): 

        if value == '__None__': 

            value = None 

        return self.handler.setOption(key, value) 

 

    @dbus.service.method(dbus_interface='com.facebook.fb303.Service', 

                         in_signature='s', out_signature='s') 

    def getOption(self, key): 

        value = self.handler.getOption(key) 

        if value is None: 

            value = '__None__' 

        return str(value) 

 

    @log_unhandled 

    @dbus.service.method(dbus_interface='com.facebook.fb303.Service', 

                         in_signature='', out_signature='a{ss}') 

    def getOptions(self): 

        result = {} 

        for k in self.handler.getOptions().iterkeys(): 

            result[k] = self.getOption(k) 

        return result 

 

    @log_unhandled 

    @dbus.service.method(dbus_interface='com.facebook.fb303.Service', 

                         in_signature='i', out_signature='s') 

    def getCpuProfile(self, profileDurationInSec): 

        logging.getLogger('sparts.dbus').debug('[%s] startProfile', os.getpid()) 

        return self.handler.getCpuProfile(profileDurationInSec) 

 

    @dbus.service.method(dbus_interface='com.facebook.fb303.Service', 

                         in_signature='', out_signature='x') 

    def aliveSince(self): 

        return self.handler.aliveSince() 

 

    @dbus.service.method(dbus_interface='com.facebook.fb303.Service', 

                         in_signature='', out_signature='') 

    def reinitialize(self): 

        return self.handler.reinitialize() 

 

    @dbus.service.method(dbus_interface='com.facebook.fb303.Service', 

                         in_signature='', out_signature='') 

    def shutdown(self): 

        return self.handler.shutdown() 

 

    @dbus.service.method(dbus_interface='org.sparts.FB303Service', 

                         in_signature='sv', out_signature='') 

    def setOptionV(self, key, value): 

        self.handler.setOption(key, str(value)) 

 

 

    @dbus.service.method(dbus_interface='org.sparts.FB303Service', 

                         in_signature='', out_signature='s') 

    def aliveSinceStr(self): 

        return datetime.datetime.fromtimestamp(self.handler.aliveSince()) \ 

                .strftime('%Y-%m-%d %H:%M:%S')