| 3665 | |
| 3666 | |
| 3667 | class InspectionWebServer(http_server.HTTPServer): |
| 3668 | |
| 3669 | def __init__(self, port_number, switches, minidump_name): |
| 3670 | super().__init__(('localhost', port_number), InspectionWebHandler) |
| 3671 | splitpath = os.path.split(minidump_name) |
| 3672 | self.dumppath = splitpath[0] |
| 3673 | self.dumpfilename = splitpath[1] |
| 3674 | self.default_formatter = InspectionWebFormatter( |
| 3675 | switches, minidump_name, self) |
| 3676 | self.formatters = { self.dumpfilename : self.default_formatter } |
| 3677 | self.switches = switches |
| 3678 | |
| 3679 | def output_dump_desc_field(self, f, name): |
| 3680 | try: |
| 3681 | descfile = open(os.path.join(self.dumppath, name + ".desc"), "r") |
| 3682 | desc = descfile.readline() |
| 3683 | descfile.close() |
| 3684 | except IOError: |
| 3685 | desc = "" |
| 3686 | f.write("<input type=\"text\" class=\"dumpcomments\" " |
| 3687 | "id=\"dump-%s\" onchange=\"dump_comment()\" value=\"%s\">\n" % |
| 3688 | (html.escape(name), desc)) |
| 3689 | |
| 3690 | def set_dump_desc(self, name, description): |
| 3691 | if not DUMP_FILE_RE.match(name): |
| 3692 | return False |
| 3693 | fname = os.path.join(self.dumppath, name) |
| 3694 | if not os.path.isfile(fname): |
| 3695 | return False |
| 3696 | fname = fname + ".desc" |
| 3697 | descfile = open(fname, "w") |
| 3698 | descfile.write(description) |
| 3699 | descfile.close() |
| 3700 | return True |
| 3701 | |
| 3702 | def get_dump_formatter(self, name): |
| 3703 | if name is None: |
| 3704 | return self.default_formatter |
| 3705 | else: |
| 3706 | if not DUMP_FILE_RE.match(name): |
| 3707 | raise WebParameterError("Invalid name '%s'" % name) |
| 3708 | formatter = self.formatters.get(name, None) |
| 3709 | if formatter is None: |
| 3710 | try: |
| 3711 | formatter = InspectionWebFormatter( |
| 3712 | self.switches, os.path.join(self.dumppath, name), self) |
| 3713 | self.formatters[name] = formatter |
| 3714 | except IOError: |
| 3715 | raise WebParameterError("Could not open dump '%s'" % name) |
| 3716 | return formatter |
| 3717 | |
| 3718 | def output_dumps(self, f): |
| 3719 | f.write(WEB_DUMPS_HEADER) |
| 3720 | f.write("<h3>List of available dumps</h3>") |
| 3721 | f.write("<table class=\"dumplist\">\n") |
| 3722 | f.write("<thead><tr>") |
| 3723 | f.write("<th>Name</th>") |
| 3724 | f.write("<th>File time</th>") |