GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.

Daemon   A
last analyzed

Complexity

Total Complexity 19

Size/Duplication

Total Lines 126
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
dl 0
loc 126
rs 10
c 2
b 0
f 0
wmc 19

7 Methods

Rating   Name   Duplication   Size   Complexity  
B daemonize() 0 48 5
C stop() 0 28 7
A start() 0 18 3
A __init__() 0 6 1
A restart() 0 4 1
A run() 0 6 1
A delpid() 0 2 1
1
#!/usr/bin/env python
2
3
import sys
4
import os
5
import time
6
import atexit
7
from signal import SIGTERM
8
9
10
class Daemon(object):
11
12
    """
13
    Generic daemon class.
14
15
    Usage: subclass the Daemon class and override the run() method
16
    """
17
18
    def __init__(self, pidfile, stdin='/dev/null', stdout='/dev/null',
19
                 stderr='/dev/null'):
20
        self.stdin = stdin
21
        self.stdout = stdout
22
        self.stderr = stderr
23
        self.pidfile = pidfile
24
25
    def daemonize(self):
26
        """
27
        Do the UNIX double-fork magic.
28
29
        See Stevens' "Advanced Programming in the UNIX Environment"
30
        http://www.erlenstar.demon.co.uk/unix/faq_2.html#SEC16
31
        (ISBN 0201563177)
32
        """
33
        try:
34
            pid = os.fork()
35
            if pid > 0:
36
                # exit first parent
37
                sys.exit(0)
38
        except OSError as e:
39
            sys.stderr.write("fork #1 failed: %d (%s)\n"
40
                             % (e.errno, e.strerror))
41
            sys.exit(1)
42
43
        # decouple from parent environment
44
        os.chdir("/")
45
        os.setsid()
46
        os.umask(0)
47
48
        # do second fork
49
        try:
50
            pid = os.fork()
51
            if pid > 0:
52
                # exit from second parent
53
                sys.exit(0)
54
        except OSError as e:
55
            sys.stderr.write("fork #2 failed: %d (%s)\n"
56
                             % (e.errno, e.strerror))
57
            sys.exit(1)
58
59
        # redirect standard file descriptors
60
        sys.stdout.flush()
61
        sys.stderr.flush()
62
        si = file(self.stdin, 'r')
63
        so = file(self.stdout, 'a+')
64
        se = file(self.stderr, 'a+', 0)
65
        os.dup2(si.fileno(), sys.stdin.fileno())
66
        os.dup2(so.fileno(), sys.stdout.fileno())
67
        os.dup2(se.fileno(), sys.stderr.fileno())
68
69
        # write pidfile
70
        atexit.register(self.delpid)
71
        pid = str(os.getpid())
72
        file(self.pidfile, 'w+').write("%s\n" % pid)
73
74
    def delpid(self):
75
        os.remove(self.pidfile)
76
77
    def start(self):
78
        """Start the daemon."""
79
        # Check for a pidfile to see if the daemon already runs
80
        try:
81
            pf = file(self.pidfile, 'r')
82
            pid = int(pf.read().strip())
83
            pf.close()
84
        except IOError:
85
            pid = None
86
87
        if pid:
88
            message = "pidfile %s already exists. Daemon already running?\n"
89
            sys.stderr.write(message % self.pidfile)
90
            sys.exit(1)
91
92
        # Start the daemon
93
        self.daemonize()
94
        self.run()
95
96
    def stop(self):
97
        """Stop the daemon."""
98
        # Get the pid from the pidfile
99
        try:
100
            pf = file(self.pidfile, 'r')
101
            pid = int(pf.read().strip())
102
            pf.close()
103
        except IOError:
104
            pid = None
105
106
        if not pid:
107
            message = "pidfile %s does not exist. Daemon not running?\n"
108
            sys.stderr.write(message % self.pidfile)
109
            return  # not an error in a restart
110
111
        # Try killing the daemon process
112
        try:
113
            while True:
114
                os.kill(pid, SIGTERM)
115
                time.sleep(0.1)
116
        except OSError as err:
117
            err = str(err)
118
            if err.find("No such process") > 0:
119
                if os.path.exists(self.pidfile):
120
                    os.remove(self.pidfile)
121
            else:
122
                print(str(err))
123
                sys.exit(1)
124
125
    def restart(self):
126
        """Restart the daemon."""
127
        self.stop()
128
        self.start()
129
130
    def run(self):
131
        """
132
        You should override this method when you subclass Daemon.
133
        It will be called after the process has been
134
        daemonized by start() or restart().
135
        """
136