]> git.proxmox.com Git - ceph.git/blob - ceph/src/ceph-crash.in
import ceph 14.2.5
[ceph.git] / ceph / src / ceph-crash.in
1 #!@PYTHON_EXECUTABLE@
2 # -*- mode:python -*-
3 # vim: ts=4 sw=4 smarttab expandtab
4
5 import argparse
6 import logging
7 import os
8 import socket
9 import subprocess
10 import sys
11 import time
12
13 logging.basicConfig(level=logging.INFO)
14 log = logging.getLogger(__name__)
15
16 auth_names = ['client.crash.%s' % socket.gethostname(),
17 'client.crash',
18 'client.admin']
19
20 def parse_args():
21 parser = argparse.ArgumentParser()
22 parser.add_argument(
23 '-p', '--path', default='/var/lib/ceph/crash',
24 help='base path to monitor for crash dumps')
25 parser.add_argument(
26 '-d', '--delay', default=10.0, type=float,
27 help='minutes to delay between scans (0 to exit after one)',
28 )
29 parser.add_argument(
30 '--name', '-n',
31 help='ceph name to authenticate as (default: try client.crash, client.admin)')
32 return parser.parse_args()
33
34
35 def post_crash(path):
36 rc = 0
37 for n in auth_names:
38 pr = subprocess.Popen(
39 args=['timeout', '30', 'ceph',
40 '-n', n,
41 'crash', 'post', '-i', '-'],
42 stdin=subprocess.PIPE,
43 stdout=subprocess.PIPE,
44 stderr=subprocess.PIPE,
45 )
46 f = open(os.path.join(path, 'meta'), 'rb')
47 stdout, stderr = pr.communicate(input=f.read())
48 rc = pr.wait()
49 f.close()
50 if rc != 0:
51 log.warning('post %s as %s failed: %s' % (path, n, stderr))
52 if rc == 0:
53 break
54 return rc
55
56
57 def scrape_path(path):
58 for p in os.listdir(path):
59 crashpath = os.path.join(path, p)
60 metapath = os.path.join(crashpath, 'meta')
61 donepath = os.path.join(crashpath, 'done')
62 if os.path.isfile(metapath):
63 if not os.path.isfile(donepath):
64 # hang out just for a bit; either we interrupted the dump
65 # or the daemon crashed before finishing it
66 time.sleep(1)
67 if not os.path.isfile(donepath):
68 return
69 # ok, we can process this one
70 rc = post_crash(crashpath)
71 if rc == 0:
72 os.rename(crashpath, os.path.join(path, 'posted/', p))
73 log.debug(
74 "posted %s and renamed %s -> %s " %
75 (metapath, p, os.path.join('posted/', p))
76 )
77
78
79 def main():
80 args = parse_args()
81 postdir = os.path.join(args.path, 'posted')
82 if args.name:
83 auth_names = [args.name]
84
85 while not os.path.isdir(postdir):
86 log.error("directory %s does not exist; please create" % postdir)
87 time.sleep(30)
88
89 log.info("monitoring path %s, delay %ds" % (args.path, args.delay * 60.0))
90 while True:
91 scrape_path(args.path)
92 if args.delay == 0:
93 sys.exit(0)
94 time.sleep(args.delay * 60)
95
96
97 if __name__ == "__main__":
98 main()