def index(self): t = PageTemplate(rh=self, filename="config.mako") try: # noinspection PyUnresolvedReferences import pwd sr_user = pwd.getpwuid(os.getuid()).pw_name except ImportError: try: import getpass sr_user = getpass.getuser() except StandardError: sr_user = '******' try: import locale sr_locale = locale.getdefaultlocale() except StandardError: sr_locale = 'Unknown', 'Unknown' try: import ssl ssl_version = ssl.OPENSSL_VERSION except StandardError: ssl_version = 'Unknown' sr_version = '' if sickbeard.VERSION_NOTIFY: updater = CheckVersion().updater if updater: updater.need_update() sr_version = updater.get_cur_version() return t.render(submenu=self.ConfigMenu(), title=_('SickChill Configuration'), header=_('SickChill Configuration'), topmenu="config", sr_user=sr_user, sr_locale=sr_locale, ssl_version=ssl_version, sr_version=sr_version)
def index(self): """ Render the Help & Info page """ t = PageTemplate(rh=self, filename='config.mako') try: import pwd sr_user = pwd.getpwuid(os.getuid()).pw_name except ImportError: try: import getpass sr_user = getpass.getuser() except StandardError: sr_user = '******' try: import locale sr_locale = locale.getdefaultlocale() except StandardError: sr_locale = 'Unknown', 'Unknown' try: import ssl ssl_version = ssl.OPENSSL_VERSION except StandardError: ssl_version = 'Unknown' sr_version = '' if sickbeard.VERSION_NOTIFY: updater = CheckVersion().updater if updater: sr_version = updater.get_cur_version() return t.render( submenu=self.ConfigMenu(), title='Medusa Configuration', header='Medusa Configuration', topmenu='config', sr_user=sr_user, sr_locale=sr_locale, ssl_version=ssl_version, sr_version=sr_version )
def submit_errors(self): submitter_result = u'' issue_id = None # pylint: disable=R0912,R0914,R0915 if not (sickbeard.GIT_USERNAME and sickbeard.GIT_PASSWORD and sickbeard.DEBUG and len(classes.ErrorViewer.errors) > 0): submitter_result = u'Please set your GitHub username and password in the config and enable debug. Unable to submit issue ticket to GitHub!' return submitter_result, issue_id try: from sickbeard.versionChecker import CheckVersion checkversion = CheckVersion() checkversion.check_for_new_version() commits_behind = checkversion.updater.get_num_commits_behind() except Exception: submitter_result = u'Could not check if your SickRage is updated, unable to submit issue ticket to GitHub!' return submitter_result, issue_id if commits_behind is None or commits_behind > 0: submitter_result = u'Please update SickRage, unable to submit issue ticket to GitHub with an outdated version!' return submitter_result, issue_id if self.submitter_running: submitter_result = u'Issue submitter is running, please wait for it to complete' return submitter_result, issue_id self.submitter_running = True gh_org = sickbeard.GIT_ORG or 'SiCKRAGETV' gh_repo = 'sickrage-issues' gh = Github(login_or_token=sickbeard.GIT_USERNAME, password=sickbeard.GIT_PASSWORD, user_agent="SiCKRAGE") try: # read log file log_data = None if os.path.isfile(self.logFile): with ek(codecs.open, *[self.logFile, 'r', 'utf-8']) as f: log_data = f.readlines() for i in range(1, int(sickbeard.LOG_NR)): if os.path.isfile(self.logFile + "." + str(i)) and (len(log_data) <= 500): with ek(codecs.open, *[self.logFile + "." + str(i), 'r', 'utf-8']) as f: log_data += f.readlines() log_data = [line for line in reversed(log_data)] # parse and submit errors to issue tracker for curError in sorted(classes.ErrorViewer.errors, key=lambda error: error.time, reverse=True)[:500]: try: title_Error = str(curError.title) if not len(title_Error) or title_Error == 'None': title_Error = re.match(r"^[A-Z0-9\-\[\] :]+::\s*(.*)$", ss(str(curError.message))).group(1) # if len(title_Error) > (1024 - len(u"[APP SUBMITTED]: ")): # 1000 just looks better than 1007 and adds some buffer if len(title_Error) > 1000: title_Error = title_Error[0:1000] except Exception as e: self.log("Unable to get error title : " + ex(e), ERROR) gist = None regex = r"^(%s)\s+([A-Z]+)\s+([0-9A-Z\-]+)\s*(.*)$" % curError.time for i, x in enumerate(log_data): x = ss(x) match = re.match(regex, x) if match: level = match.group(2) if reverseNames[level] == ERROR: paste_data = "".join(log_data[i:i+50]) if paste_data: gist = gh.get_user().create_gist(True, {"sickrage.log": InputFileContent(paste_data)}) break else: gist = 'No ERROR found' message = u"### INFO\n" message += u"Python Version: **" + sys.version[:120].replace('\n', '') + "**\n" message += u"Operating System: **" + platform.platform() + "**\n" if not 'Windows' in platform.platform(): try: message += u"Locale: " + locale.getdefaultlocale()[1] + "\n" except Exception: message += u"Locale: unknown" + "\n" message += u"Branch: **" + sickbeard.BRANCH + "**\n" message += u"Commit: SiCKRAGETV/SickRage@" + sickbeard.CUR_COMMIT_HASH + "\n" if gist and gist != 'No ERROR found': message += u"Link to Log: " + gist.html_url + "\n" else: message += u"No Log available with ERRORS: " + "\n" message += u"### ERROR\n" message += u"```\n" message += curError.message + "\n" message += u"```\n" message += u"---\n" message += u"_STAFF NOTIFIED_: @SiCKRAGETV/owners @SiCKRAGETV/moderators" title_Error = u"[APP SUBMITTED]: " + title_Error reports = gh.get_organization(gh_org).get_repo(gh_repo).get_issues(state="all") issue_found = False for report in reports: if title_Error == report.title: issue_id = report.number if not report.locked: if report.create_comment(message): submitter_result = u'Commented on existing issue #%s successfully!' % issue_id else: submitter_result = u'Failed to comment on found issue #%s!' % issue_id else: submitter_result = u'Issue #%s is locked, check github to find info about the error.' % issue_id issue_found = True break if not issue_found: issue = gh.get_organization(gh_org).get_repo(gh_repo).create_issue(title_Error, message) if issue: issue_id = issue.number submitter_result = u'Your issue ticket #%s was submitted successfully!' % issue_id else: submitter_result = u'Failed to create a new issue!' if issue_id: # clear error from error list classes.ErrorViewer.errors.remove(curError) except Exception as e: self.log(traceback.format_exc(), ERROR) submitter_result = u'Exception generated in issue submitter, please check the log' issue_id = None finally: self.submitter_running = False return submitter_result, issue_id
def submit_errors(self): # pylint: disable=too-many-branches,too-many-locals submitter_result = '' issue_id = None gh_credentials = (sickbeard.GIT_AUTH_TYPE == 0 and sickbeard.GIT_USERNAME and sickbeard.GIT_PASSWORD) \ or (sickbeard.GIT_AUTH_TYPE == 1 and sickbeard.GIT_TOKEN) if not all((gh_credentials, sickbeard.DEBUG, sickbeard.gh, classes.ErrorViewer.errors)): submitter_result = 'Please set your GitHub token or username and password in the config and enable debug. Unable to submit issue ticket to GitHub!' return submitter_result, issue_id try: from sickbeard.versionChecker import CheckVersion checkversion = CheckVersion() checkversion.check_for_new_version() commits_behind = checkversion.updater.get_num_commits_behind() except Exception: # pylint: disable=broad-except submitter_result = 'Could not check if your SickRage is updated, unable to submit issue ticket to GitHub!' return submitter_result, issue_id if commits_behind is None or commits_behind > 0: submitter_result = 'Please update SickRage, unable to submit issue ticket to GitHub with an outdated version!' return submitter_result, issue_id if self.submitter_running: submitter_result = 'Issue submitter is running, please wait for it to complete' return submitter_result, issue_id self.submitter_running = True try: # read log file __log_data = None if ek(os.path.isfile, self.log_file): with io.open(self.log_file, encoding='utf-8') as log_f: __log_data = log_f.readlines() for i in range(1, int(sickbeard.LOG_NR)): f_name = '{0}.{1:d}'.format(self.log_file, i) if ek(os.path.isfile, f_name) and (len(__log_data) <= 500): with io.open(f_name, encoding='utf-8') as log_f: __log_data += log_f.readlines() __log_data = list(reversed(__log_data)) # parse and submit errors to issue tracker for cur_error in sorted(classes.ErrorViewer.errors, key=lambda error: error.time, reverse=True)[:500]: try: title_error = ss(str(cur_error.title)) if not title_error or title_error == 'None': title_error = re.match( r'^[A-Z0-9\-\[\] :]+::\s*(.*)(?: \[[\w]{7}\])$', ss(cur_error.message)).group(1) if len(title_error) > 1000: title_error = title_error[0:1000] except Exception as err_msg: # pylint: disable=broad-except self.log( 'Unable to get error title : {0}'.format(ex(err_msg)), ERROR) title_error = 'UNKNOWN' gist = None regex = r'^({0})\s+([A-Z]+)\s+([0-9A-Z\-]+)\s*(.*)(?: \[[\w]{{7}}\])$'.format( cur_error.time) for i, data in enumerate(__log_data): match = re.match(regex, data) if match: level = match.group(2) if LOGGING_LEVELS[level] == ERROR: paste_data = ''.join(__log_data[i:i + 50]) if paste_data: gist = sickbeard.gh.get_user().create_gist( False, { 'sickrage.log': InputFileContent(paste_data) }) break else: gist = 'No ERROR found' try: locale_name = locale.getdefaultlocale()[1] except Exception: # pylint: disable=broad-except locale_name = 'unknown' if gist and gist != 'No ERROR found': log_link = 'Link to Log: {0}'.format(gist.html_url) else: log_link = 'No Log available with ERRORS:' msg = [ '### INFO', 'Python Version: **{0}**'.format(sys.version[:120].replace( '\n', '')), 'Operating System: **{0}**'.format(platform.platform()), 'Locale: {0}'.format(locale_name), 'Branch: **{0}**'.format(sickbeard.BRANCH), 'Commit: SickRage/SickRage@{0}'.format( sickbeard.CUR_COMMIT_HASH), log_link, '### ERROR', '```', cur_error.message, '```', '---', '_STAFF NOTIFIED_: @SickRage/owners @SickRage/moderators', ] message = '\n'.join(msg) title_error = '[APP SUBMITTED]: {0}'.format(title_error) repo = sickbeard.gh.get_organization( sickbeard.GIT_ORG).get_repo(sickbeard.GIT_REPO) reports = repo.get_issues(state='all') def is_ascii_error(title): # [APP SUBMITTED]: 'ascii' codec can't encode characters in position 00-00: ordinal not in range(128) # [APP SUBMITTED]: 'charmap' codec can't decode byte 0x00 in position 00: character maps to <undefined> return re.search( r'.* codec can\'t .*code .* in position .*:', title) is not None def is_malformed_error(title): # [APP SUBMITTED]: not well-formed (invalid token): line 0, column 0 return re.search( r'.* not well-formed \(invalid token\): line .* column .*', title) is not None ascii_error = is_ascii_error(title_error) malformed_error = is_malformed_error(title_error) issue_found = False for report in reports: if title_error.rsplit(' :: ')[-1] in report.title or \ (malformed_error and is_malformed_error(report.title)) or \ (ascii_error and is_ascii_error(report.title)): issue_id = report.number if not report.raw_data['locked']: if report.create_comment(message): submitter_result = 'Commented on existing issue #{0} successfully!'.format( issue_id) else: submitter_result = 'Failed to comment on found issue #{0}!'.format( issue_id) else: submitter_result = 'Issue #{0} is locked, check GitHub to find info about the error.'.format( issue_id) issue_found = True break if not issue_found: issue = repo.create_issue(title_error, message) if issue: issue_id = issue.number submitter_result = 'Your issue ticket #{0} was submitted successfully!'.format( issue_id) else: submitter_result = 'Failed to create a new issue!' if issue_id and cur_error in classes.ErrorViewer.errors: # clear error from error list classes.ErrorViewer.errors.remove(cur_error) except Exception: # pylint: disable=broad-except self.log(traceback.format_exc(), ERROR) submitter_result = 'Exception generated in issue submitter, please check the log' issue_id = None finally: self.submitter_running = False return submitter_result, issue_id
def submit_errors(self): # Too many local variables, too many branches, pylint: disable=too-many-branches,too-many-locals submitter_result = u'' issue_id = None if not (sickbeard.GIT_USERNAME and sickbeard.GIT_PASSWORD and sickbeard.DEBUG and len(classes.ErrorViewer.errors) > 0): submitter_result = u'Please set your GitHub username and password in the config and enable debug. Unable to submit issue ticket to GitHub!' return submitter_result, issue_id try: from sickbeard.versionChecker import CheckVersion checkversion = CheckVersion() checkversion.check_for_new_version() commits_behind = checkversion.updater.get_num_commits_behind() except Exception: submitter_result = u'Could not check if your SickRage is updated, unable to submit issue ticket to GitHub!' return submitter_result, issue_id if commits_behind is None or commits_behind > 0: submitter_result = u'Please update SickRage, unable to submit issue ticket to GitHub with an outdated version!' return submitter_result, issue_id if self.submitter_running: submitter_result = u'Issue submitter is running, please wait for it to complete' return submitter_result, issue_id self.submitter_running = True gh_org = sickbeard.GIT_ORG or 'SickRage' gh_repo = 'sickrage-issues' gh = Github(login_or_token=sickbeard.GIT_USERNAME, password=sickbeard.GIT_PASSWORD, user_agent="SiCKRAGE") try: # read log file log_data = None if ek(os.path.isfile, self.logFile): with io.open(self.logFile, 'r', encoding='utf-8') as f: log_data = f.readlines() for i in range(1, int(sickbeard.LOG_NR)): if ek(os.path.isfile, self.logFile + ".%i" % i) and (len(log_data) <= 500): with io.open(self.logFile + ".%i" % i, 'r', encoding='utf-8') as f: log_data += f.readlines() log_data = [line for line in reversed(log_data)] # parse and submit errors to issue tracker for curError in sorted(classes.ErrorViewer.errors, key=lambda error: error.time, reverse=True)[:500]: try: title_Error = ss(str(curError.title)) if not len(title_Error) or title_Error == 'None': title_Error = re.match(r"^[A-Z0-9\-\[\] :]+::\s*(.*)(?: \[[\w]{7}\])$", ss(curError.message)).group(1) if len(title_Error) > 1000: title_Error = title_Error[0:1000] except Exception as e: self.log("Unable to get error title : " + ex(e), ERROR) gist = None regex = ur"^(%s)\s+([A-Z]+)\s+([0-9A-Z\-]+)\s*(.*)(?: \[[\w]{7}\])$" % curError.time for i, x in enumerate(log_data): match = re.match(regex, x) if match: level = match.group(2) if reverseNames[level] == ERROR: paste_data = u"".join(log_data[i:i + 50]) if paste_data: gist = gh.get_user().create_gist(True, {"sickrage.log": InputFileContent(paste_data)}) break else: gist = 'No ERROR found' message = u"### INFO\n" message += u"Python Version: **" + sys.version[:120].replace('\n', '') + "**\n" message += u"Operating System: **" + platform.platform() + "**\n" try: message += u"Locale: " + locale.getdefaultlocale()[1] + "\n" except Exception: message += u"Locale: unknown" + "\n" message += u"Branch: **" + sickbeard.BRANCH + "**\n" message += u"Commit: SickRage/SickRage@" + sickbeard.CUR_COMMIT_HASH + "\n" if gist and gist != 'No ERROR found': message += u"Link to Log: " + gist.html_url + "\n" else: message += u"No Log available with ERRORS: " + "\n" message += u"### ERROR\n" message += u"```\n" message += curError.message + "\n" message += u"```\n" message += u"---\n" message += u"_STAFF NOTIFIED_: @SickRage/owners @SickRage/moderators" title_Error = u"[APP SUBMITTED]: " + title_Error reports = gh.get_organization(gh_org).get_repo(gh_repo).get_issues(state="all") def is_ascii_error(title): # [APP SUBMITTED]: 'ascii' codec can't encode characters in position 00-00: ordinal not in range(128) # [APP SUBMITTED]: 'charmap' codec can't decode byte 0x00 in position 00: character maps to <undefined> return re.search(ur".* codec can't .*code .* in position .*:", title) is not None def is_malformed_error(title): # [APP SUBMITTED]: not well-formed (invalid token): line 0, column 0 return re.search(ur".* not well-formed \(invalid token\): line .* column .*", title) is not None ascii_error = is_ascii_error(title_Error) malformed_error = is_malformed_error(title_Error) issue_found = False for report in reports: if title_Error.rsplit(' :: ')[-1] in report.title or \ (malformed_error and is_malformed_error(report.title)) or \ (ascii_error and is_ascii_error(report.title)): issue_id = report.number if not report.raw_data['locked']: if report.create_comment(message): submitter_result = u'Commented on existing issue #%s successfully!' % issue_id else: submitter_result = u'Failed to comment on found issue #%s!' % issue_id else: submitter_result = u'Issue #%s is locked, check github to find info about the error.' % issue_id issue_found = True break if not issue_found: issue = gh.get_organization(gh_org).get_repo(gh_repo).create_issue(title_Error, message) if issue: issue_id = issue.number submitter_result = u'Your issue ticket #%s was submitted successfully!' % issue_id else: submitter_result = u'Failed to create a new issue!' if issue_id and curError in classes.ErrorViewer.errors: # clear error from error list classes.ErrorViewer.errors.remove(curError) except Exception as e: self.log(traceback.format_exc(), ERROR) submitter_result = u'Exception generated in issue submitter, please check the log' issue_id = None finally: self.submitter_running = False return submitter_result, issue_id
def submit_errors(self): # pylint: disable=too-many-branches,too-many-locals submitter_result = '' issue_id = None if not (sickbeard.GIT_USERNAME and sickbeard.GIT_PASSWORD and sickbeard.DEBUG and len(classes.ErrorViewer.errors) > 0): submitter_result = 'Please set your GitHub username and password in the config and enable debug. Unable to submit issue ticket to GitHub!' return submitter_result, issue_id try: from sickbeard.versionChecker import CheckVersion checkversion = CheckVersion() checkversion.check_for_new_version() commits_behind = checkversion.updater.get_num_commits_behind() except Exception: # pylint: disable=broad-except submitter_result = 'Could not check if your SickRage is updated, unable to submit issue ticket to GitHub!' return submitter_result, issue_id if commits_behind is None or commits_behind > 0: submitter_result = 'Please update SickRage, unable to submit issue ticket to GitHub with an outdated version!' return submitter_result, issue_id if self.submitter_running: submitter_result = 'Issue submitter is running, please wait for it to complete' return submitter_result, issue_id self.submitter_running = True gh_org = sickbeard.GIT_ORG or 'SickRage' gh_repo = 'sickrage-issues' git = Github(login_or_token=sickbeard.GIT_USERNAME, password=sickbeard.GIT_PASSWORD, user_agent='SickRage') try: # pylint: disable=too-many-nested-blocks # read log file log_data = None if ek(os.path.isfile, self.log_file): with io.open(self.log_file, encoding='utf-8') as log_f: log_data = log_f.readlines() for i in range(1, int(sickbeard.LOG_NR)): f_name = '%s.%i' % (self.log_file, i) if ek(os.path.isfile, f_name) and (len(log_data) <= 500): with io.open(f_name, encoding='utf-8') as log_f: log_data += log_f.readlines() log_data = [line for line in reversed(log_data)] # parse and submit errors to issue tracker for cur_error in sorted(classes.ErrorViewer.errors, key=lambda error: error.time, reverse=True)[:500]: try: title_error = ss(str(cur_error.title)) if not title_error or title_error == 'None': title_error = re.match(r'^[A-Z0-9\-\[\] :]+::\s*(.*)(?: \[[\w]{7}\])$', ss(cur_error.message)).group(1) if len(title_error) > 1000: title_error = title_error[0:1000] except Exception as err_msg: # pylint: disable=broad-except self.log('Unable to get error title : %s' % ex(err_msg), ERROR) gist = None regex = r'^(%s)\s+([A-Z]+)\s+([0-9A-Z\-]+)\s*(.*)(?: \[[\w]{7}\])$' % cur_error.time for i, data in enumerate(log_data): match = re.match(regex, data) if match: level = match.group(2) if LOGGING_LEVELS[level] == ERROR: paste_data = ''.join(log_data[i:i + 50]) if paste_data: gist = git.get_user().create_gist(False, {'sickrage.log': InputFileContent(paste_data)}) break else: gist = 'No ERROR found' try: locale_name = locale.getdefaultlocale()[1] except Exception: # pylint: disable=broad-except locale_name = 'unknown' if gist and gist != 'No ERROR found': log_link = 'Link to Log: %s' % gist.html_url else: log_link = 'No Log available with ERRORS:' msg = [ '### INFO', 'Python Version: **%s**' % sys.version[:120].replace('\n', ''), 'Operating System: **%s**' % platform.platform(), 'Locale: %s' % locale_name, 'Branch: **%s**' % sickbeard.BRANCH, 'Commit: SickRage/SickRage@%s' % sickbeard.CUR_COMMIT_HASH, log_link, '### ERROR', '```', cur_error.message, '```', '---', '_STAFF NOTIFIED_: @SickRage/owners @SickRage/moderators', ] message = '\n'.join(msg) title_error = '[APP SUBMITTED]: %s' % title_error reports = git.get_organization(gh_org).get_repo(gh_repo).get_issues(state='all') def is_ascii_error(title): # [APP SUBMITTED]: 'ascii' codec can't encode characters in position 00-00: ordinal not in range(128) # [APP SUBMITTED]: 'charmap' codec can't decode byte 0x00 in position 00: character maps to <undefined> return re.search(r'.* codec can\'t .*code .* in position .*:', title) is not None def is_malformed_error(title): # [APP SUBMITTED]: not well-formed (invalid token): line 0, column 0 return re.search(r'.* not well-formed \(invalid token\): line .* column .*', title) is not None ascii_error = is_ascii_error(title_error) malformed_error = is_malformed_error(title_error) issue_found = False for report in reports: if title_error.rsplit(' :: ')[-1] in report.title or \ (malformed_error and is_malformed_error(report.title)) or \ (ascii_error and is_ascii_error(report.title)): issue_id = report.number if not report.raw_data['locked']: if report.create_comment(message): submitter_result = 'Commented on existing issue #%s successfully!' % issue_id else: submitter_result = 'Failed to comment on found issue #%s!' % issue_id else: submitter_result = 'Issue #%s is locked, check GitHub to find info about the error.' % issue_id issue_found = True break if not issue_found: issue = git.get_organization(gh_org).get_repo(gh_repo).create_issue(title_error, message) if issue: issue_id = issue.number submitter_result = 'Your issue ticket #%s was submitted successfully!' % issue_id else: submitter_result = 'Failed to create a new issue!' if issue_id and cur_error in classes.ErrorViewer.errors: # clear error from error list classes.ErrorViewer.errors.remove(cur_error) except Exception: # pylint: disable=broad-except self.log(traceback.format_exc(), ERROR) submitter_result = 'Exception generated in issue submitter, please check the log' issue_id = None finally: self.submitter_running = False return submitter_result, issue_id
def submit_errors(self): # pylint: disable=too-many-branches,too-many-locals submitter_result = '' issue_id = None gh_credentials = (sickbeard.GIT_AUTH_TYPE == 0 and sickbeard.GIT_USERNAME and sickbeard.GIT_PASSWORD) \ or (sickbeard.GIT_AUTH_TYPE == 1 and sickbeard.GIT_TOKEN) if not all((gh_credentials, sickbeard.DEBUG, sickbeard.gh, classes.ErrorViewer.errors)): submitter_result = 'Please set your GitHub token or username and password in the config and enable debug. Unable to submit issue ticket to GitHub!' return submitter_result, issue_id try: from sickbeard.versionChecker import CheckVersion checkversion = CheckVersion() checkversion.check_for_new_version() commits_behind = checkversion.updater.get_num_commits_behind() except Exception: # pylint: disable=broad-except submitter_result = 'Could not check if your SickRage is updated, unable to submit issue ticket to GitHub!' return submitter_result, issue_id if commits_behind is None or commits_behind > 0: submitter_result = 'Please update SickRage, unable to submit issue ticket to GitHub with an outdated version!' return submitter_result, issue_id if self.submitter_running: submitter_result = 'Issue submitter is running, please wait for it to complete' return submitter_result, issue_id self.submitter_running = True try: # read log file __log_data = None if ek(os.path.isfile, self.log_file): with io.open(self.log_file, encoding='utf-8') as log_f: __log_data = log_f.readlines() for i in range(1, int(sickbeard.LOG_NR)): f_name = '{0}.{1:d}'.format(self.log_file, i) if ek(os.path.isfile, f_name) and (len(__log_data) <= 500): with io.open(f_name, encoding='utf-8') as log_f: __log_data += log_f.readlines() __log_data = list(reversed(__log_data)) # parse and submit errors to issue tracker for cur_error in sorted(classes.ErrorViewer.errors, key=lambda error: error.time, reverse=True)[:500]: try: title_error = ss(str(cur_error.title)) if not title_error or title_error == 'None': title_error = re.match(r'^[A-Za-z0-9\-\[\] :]+::\s(?:\[[\w]{7}\])\s*(.*)$', ss(cur_error.message)).group(1) if len(title_error) > 1000: title_error = title_error[0:1000] except Exception as err_msg: # pylint: disable=broad-except self.log('Unable to get error title : {0}'.format(ex(err_msg)), ERROR) title_error = 'UNKNOWN' gist = None regex = r'^({0})\s+([A-Z]+)\s+[A-Za-z0-9\-\[\] :]+::\s(?:\[[\w]{{7}}\]).*$'.format(re.escape(cur_error.time)) for i, data in enumerate(__log_data): match = re.match(regex, data) if match: level = match.group(1) if LOGGING_LEVELS[level] == ERROR: paste_data = ''.join(__log_data[i:i + 50]) if paste_data: gist = sickbeard.gh.get_user().create_gist(False, {'sickrage.log': InputFileContent(paste_data)}) break else: gist = 'No ERROR found' try: locale_name = locale.getdefaultlocale()[1] except Exception: # pylint: disable=broad-except locale_name = 'unknown' if gist and gist != 'No ERROR found': log_link = 'Link to Log: {0}'.format(gist.html_url) else: log_link = 'No Log available with ERRORS:' msg = [ '### INFO', 'Python Version: **{0}**'.format(sys.version[:120].replace('\n', '')), 'Operating System: **{0}**'.format(platform.platform()), 'Locale: {0}'.format(locale_name), 'Branch: **{0}**'.format(sickbeard.BRANCH), 'Commit: SickRage/SickRage@{0}'.format(sickbeard.CUR_COMMIT_HASH), log_link, '### ERROR', '```', cur_error.message, '```', '---', '_STAFF NOTIFIED_: @SickRage/owners @SickRage/moderators', ] message = '\n'.join(msg) title_error = '[APP SUBMITTED]: {0}'.format(title_error) repo = sickbeard.gh.get_organization(sickbeard.GIT_ORG).get_repo(sickbeard.GIT_REPO) reports = repo.get_issues(state='all') def is_ascii_error(title): # [APP SUBMITTED]: 'ascii' codec can't encode characters in position 00-00: ordinal not in range(128) # [APP SUBMITTED]: 'charmap' codec can't decode byte 0x00 in position 00: character maps to <undefined> return re.search(r'.* codec can\'t .*code .* in position .*:', title) is not None def is_malformed_error(title): # [APP SUBMITTED]: not well-formed (invalid token): line 0, column 0 return re.search(r'.* not well-formed \(invalid token\): line .* column .*', title) is not None ascii_error = is_ascii_error(title_error) malformed_error = is_malformed_error(title_error) issue_found = False for report in reports: if title_error.rsplit(' :: ')[-1] in report.title or \ (malformed_error and is_malformed_error(report.title)) or \ (ascii_error and is_ascii_error(report.title)): issue_id = report.number if not report.raw_data['locked']: if report.create_comment(message): submitter_result = 'Commented on existing issue #{0} successfully!'.format(issue_id) else: submitter_result = 'Failed to comment on found issue #{0}!'.format(issue_id) else: submitter_result = 'Issue #{0} is locked, check GitHub to find info about the error.'.format(issue_id) issue_found = True break if not issue_found: issue = repo.create_issue(title_error, message) if issue: issue_id = issue.number submitter_result = 'Your issue ticket #{0} was submitted successfully!'.format(issue_id) else: submitter_result = 'Failed to create a new issue!' if issue_id and cur_error in classes.ErrorViewer.errors: # clear error from error list classes.ErrorViewer.errors.remove(cur_error) except RateLimitExceededException: submitter_result = 'Your Github user has exceeded its API rate limit, please try again later' issue_id = None except TwoFactorException: submitter_result = ('Your Github account requires Two-Factor Authentication, ' 'please change your auth method in the config') issue_id = None except Exception: # pylint: disable=broad-except self.log(traceback.format_exc(), ERROR) submitter_result = 'Exception generated in issue submitter, please check the log' issue_id = None finally: self.submitter_running = False return submitter_result, issue_id
def submit_errors(self): # Too many local variables, too many branches, pylint: disable=R0912,R0914 submitter_result = u'' issue_id = None if not (sickbeard.GIT_USERNAME and sickbeard.GIT_PASSWORD and sickbeard.DEBUG and len(classes.ErrorViewer.errors) > 0): submitter_result = u'Please set your GitHub username and password in the config and enable debug. Unable to submit issue ticket to GitHub!' return submitter_result, issue_id try: from sickbeard.versionChecker import CheckVersion checkversion = CheckVersion() checkversion.check_for_new_version() commits_behind = checkversion.updater.get_num_commits_behind() except Exception: submitter_result = u'Could not check if your SickRage is updated, unable to submit issue ticket to GitHub!' return submitter_result, issue_id if commits_behind is None or commits_behind > 0: submitter_result = u'Please update SickRage, unable to submit issue ticket to GitHub with an outdated version!' return submitter_result, issue_id if self.submitter_running: submitter_result = u'Issue submitter is running, please wait for it to complete' return submitter_result, issue_id self.submitter_running = True gh_org = sickbeard.GIT_ORG or 'SickRage' gh_repo = 'sickrage-issues' gh = Github(login_or_token=sickbeard.GIT_USERNAME, password=sickbeard.GIT_PASSWORD, user_agent="SiCKRAGE") try: # read log file log_data = None if os.path.isfile(self.logFile): with io.open(self.logFile, 'r', encoding='utf-8') as f: log_data = f.readlines() for i in range(1, int(sickbeard.LOG_NR)): if os.path.isfile(self.logFile + ".%i" % i) and (len(log_data) <= 500): with io.open(self.logFile + ".%i" % i, 'r', encoding='utf-8') as f: log_data += f.readlines() log_data = [line for line in reversed(log_data)] # parse and submit errors to issue tracker for curError in sorted(classes.ErrorViewer.errors, key=lambda error: error.time, reverse=True)[:500]: try: title_Error = ss(str(curError.title)) if not len(title_Error) or title_Error == 'None': title_Error = re.match(r"^[A-Z0-9\-\[\] :]+::\s*(.*)$", ss(curError.message)).group(1) if len(title_Error) > 1000: title_Error = title_Error[0:1000] except Exception as e: self.log("Unable to get error title : " + ex(e), ERROR) gist = None regex = ur"^(%s)\s+([A-Z]+)\s+([0-9A-Z\-]+)\s*(.*)$" % curError.time for i, x in enumerate(log_data): match = re.match(regex, x) if match: level = match.group(2) if reverseNames[level] == ERROR: paste_data = u"".join(log_data[i:i+50]) if paste_data: gist = gh.get_user().create_gist(True, {"sickrage.log": InputFileContent(paste_data)}) break else: gist = 'No ERROR found' message = u"### INFO\n" message += u"Python Version: **" + sys.version[:120].replace('\n', '') + "**\n" message += u"Operating System: **" + platform.platform() + "**\n" try: message += u"Locale: " + locale.getdefaultlocale()[1] + "\n" except Exception: message += u"Locale: unknown" + "\n" message += u"Branch: **" + sickbeard.BRANCH + "**\n" message += u"Commit: SickRage/SickRage@" + sickbeard.CUR_COMMIT_HASH + "\n" if gist and gist != 'No ERROR found': message += u"Link to Log: " + gist.html_url + "\n" else: message += u"No Log available with ERRORS: " + "\n" message += u"### ERROR\n" message += u"```\n" message += curError.message + "\n" message += u"```\n" message += u"---\n" message += u"_STAFF NOTIFIED_: @SickRage/owners @SickRage/moderators" title_Error = u"[APP SUBMITTED]: " + title_Error reports = gh.get_organization(gh_org).get_repo(gh_repo).get_issues(state="all") def is_ascii_error(title): # [APP SUBMITTED]: 'ascii' codec can't encode characters in position 00-00: ordinal not in range(128) # [APP SUBMITTED]: 'charmap' codec can't decode byte 0x00 in position 00: character maps to <undefined> return re.search(ur".* codec can't .*code .* in position .*:", title) is not None def is_malformed_error(title): # [APP SUBMITTED]: not well-formed (invalid token): line 0, column 0 return re.search(ur".* not well-formed \(invalid token\): line .* column .*", title) is not None ascii_error = is_ascii_error(title_Error) malformed_error = is_malformed_error(title_Error) issue_found = False for report in reports: if title_Error.rsplit(' :: ')[-1] in report.title or \ (malformed_error and is_malformed_error(report.title)) or \ (ascii_error and is_ascii_error(report.title)): issue_id = report.number if not report.raw_data['locked']: if report.create_comment(message): submitter_result = u'Commented on existing issue #%s successfully!' % issue_id else: submitter_result = u'Failed to comment on found issue #%s!' % issue_id else: submitter_result = u'Issue #%s is locked, check github to find info about the error.' % issue_id issue_found = True break if not issue_found: issue = gh.get_organization(gh_org).get_repo(gh_repo).create_issue(title_Error, message) if issue: issue_id = issue.number submitter_result = u'Your issue ticket #%s was submitted successfully!' % issue_id else: submitter_result = u'Failed to create a new issue!' if issue_id and curError in classes.ErrorViewer.errors: # clear error from error list classes.ErrorViewer.errors.remove(curError) except Exception as e: self.log(traceback.format_exc(), ERROR) submitter_result = u'Exception generated in issue submitter, please check the log' issue_id = None finally: self.submitter_running = False return submitter_result, issue_id
def submit_errors(self): # pylint: disable=too-many-branches,too-many-locals submitter_result = "" issue_id = None if not all( (sickbeard.GIT_USERNAME, sickbeard.GIT_PASSWORD, sickbeard.DEBUG, sickbeard.gh, classes.ErrorViewer.errors) ): submitter_result = "Please set your GitHub username and password in the config and enable debug. Unable to submit issue ticket to GitHub!" return submitter_result, issue_id try: from sickbeard.versionChecker import CheckVersion checkversion = CheckVersion() checkversion.check_for_new_version() commits_behind = checkversion.updater.get_num_commits_behind() except Exception: # pylint: disable=broad-except submitter_result = "Could not check if your SickRage is updated, unable to submit issue ticket to GitHub!" return submitter_result, issue_id if commits_behind is None or commits_behind > 0: submitter_result = ( "Please update SickRage, unable to submit issue ticket to GitHub with an outdated version!" ) return submitter_result, issue_id if self.submitter_running: submitter_result = "Issue submitter is running, please wait for it to complete" return submitter_result, issue_id self.submitter_running = True try: # read log file log_data = None if ek(os.path.isfile, self.log_file): with io.open(self.log_file, encoding="utf-8") as log_f: log_data = log_f.readlines() for i in range(1, int(sickbeard.LOG_NR)): f_name = "{0}.{1:d}".format(self.log_file, i) if ek(os.path.isfile, f_name) and (len(log_data) <= 500): with io.open(f_name, encoding="utf-8") as log_f: log_data += log_f.readlines() log_data = [line for line in reversed(log_data)] # parse and submit errors to issue tracker for cur_error in sorted(classes.ErrorViewer.errors, key=lambda error: error.time, reverse=True)[:500]: try: title_error = ss(str(cur_error.title)) if not title_error or title_error == "None": title_error = re.match( r"^[A-Z0-9\-\[\] :]+::\s*(.*)(?: \[[\w]{7}\])$", ss(cur_error.message) ).group(1) if len(title_error) > 1000: title_error = title_error[0:1000] except Exception as err_msg: # pylint: disable=broad-except self.log("Unable to get error title : {0}".format(ex(err_msg)), ERROR) title_error = "UNKNOWN" gist = None regex = r"^({0})\s+([A-Z]+)\s+([0-9A-Z\-]+)\s*(.*)(?: \[[\w]{{7}}\])$".format(cur_error.time) for i, data in enumerate(log_data): match = re.match(regex, data) if match: level = match.group(2) if LOGGING_LEVELS[level] == ERROR: paste_data = "".join(log_data[i : i + 50]) if paste_data: gist = sickbeard.gh.get_user().create_gist( False, {"sickrage.log": InputFileContent(paste_data)} ) break else: gist = "No ERROR found" try: locale_name = locale.getdefaultlocale()[1] except Exception: # pylint: disable=broad-except locale_name = "unknown" if gist and gist != "No ERROR found": log_link = "Link to Log: {0}".format(gist.html_url) else: log_link = "No Log available with ERRORS:" msg = [ "### INFO", "Python Version: **{0}**".format(sys.version[:120].replace("\n", "")), "Operating System: **{0}**".format(platform.platform()), "Locale: {0}".format(locale_name), "Branch: **{0}**".format(sickbeard.BRANCH), "Commit: SickRage/SickRage@{0}".format(sickbeard.CUR_COMMIT_HASH), log_link, "### ERROR", "```", cur_error.message, "```", "---", "_STAFF NOTIFIED_: @SickRage/owners @SickRage/moderators", ] message = "\n".join(msg) title_error = "[APP SUBMITTED]: {0}".format(title_error) repo = sickbeard.gh.get_organization(sickbeard.GIT_ORG).get_repo(sickbeard.GIT_REPO) reports = repo.get_issues(state="all") def is_ascii_error(title): # [APP SUBMITTED]: 'ascii' codec can't encode characters in position 00-00: ordinal not in range(128) # [APP SUBMITTED]: 'charmap' codec can't decode byte 0x00 in position 00: character maps to <undefined> return re.search(r".* codec can\'t .*code .* in position .*:", title) is not None def is_malformed_error(title): # [APP SUBMITTED]: not well-formed (invalid token): line 0, column 0 return re.search(r".* not well-formed \(invalid token\): line .* column .*", title) is not None ascii_error = is_ascii_error(title_error) malformed_error = is_malformed_error(title_error) issue_found = False for report in reports: if ( title_error.rsplit(" :: ")[-1] in report.title or (malformed_error and is_malformed_error(report.title)) or (ascii_error and is_ascii_error(report.title)) ): issue_id = report.number if not report.raw_data["locked"]: if report.create_comment(message): submitter_result = "Commented on existing issue #{0} successfully!".format(issue_id) else: submitter_result = "Failed to comment on found issue #{0}!".format(issue_id) else: submitter_result = "Issue #{0} is locked, check GitHub to find info about the error.".format( issue_id ) issue_found = True break if not issue_found: issue = repo.create_issue(title_error, message) if issue: issue_id = issue.number submitter_result = "Your issue ticket #{0} was submitted successfully!".format(issue_id) else: submitter_result = "Failed to create a new issue!" if issue_id and cur_error in classes.ErrorViewer.errors: # clear error from error list classes.ErrorViewer.errors.remove(cur_error) except Exception: # pylint: disable=broad-except self.log(traceback.format_exc(), ERROR) submitter_result = "Exception generated in issue submitter, please check the log" issue_id = None finally: self.submitter_running = False return submitter_result, issue_id
def submit_errors(self): # pylint: disable=R0912,R0914,R0915 if not (sickbeard.GIT_USERNAME and sickbeard.GIT_PASSWORD and sickbeard.DEBUG and len(classes.ErrorViewer.errors) > 0): self.log( 'Please set your GitHub username and password in the config and enable debug. Unable to submit issue ticket to GitHub!' ) return try: from sickbeard.versionChecker import CheckVersion checkversion = CheckVersion() checkversion.check_for_new_version() commits_behind = checkversion.updater.get_num_commits_behind() except Exception: self.log( 'Could not check if your SickRage is updated, unable to submit issue ticket to GitHub!' ) return if commits_behind is None or commits_behind > 0: self.log( 'Please update SickRage, unable to submit issue ticket to GitHub with an outdated version!' ) return if self.submitter_running: return 'RUNNING' self.submitter_running = True gh_org = sickbeard.GIT_ORG or 'SiCKRAGETV' gh_repo = 'sickrage-issues' gh = Github(login_or_token=sickbeard.GIT_USERNAME, password=sickbeard.GIT_PASSWORD, user_agent="SiCKRAGE") try: # read log file log_data = None if os.path.isfile(self.logFile): with ek(codecs.open, *[self.logFile, 'r', 'utf-8']) as f: log_data = f.readlines() for i in range(1, int(sickbeard.LOG_NR)): if os.path.isfile(self.logFile + "." + str(i)) and (len(log_data) <= 500): with ek(codecs.open, *[self.logFile + "." + str(i), 'r', 'utf-8']) as f: log_data += f.readlines() log_data = [line for line in reversed(log_data)] # parse and submit errors to issue tracker for curError in sorted(classes.ErrorViewer.errors, key=lambda error: error.time, reverse=True)[:500]: try: title_Error = str(curError.title) if not len(title_Error) or title_Error == 'None': title_Error = re.match(r"^[A-Z0-9\-\[\] :]+::\s*(.*)$", ss(str( curError.message))).group(1) # if len(title_Error) > (1024 - len(u"[APP SUBMITTED]: ")): # 1000 just looks better than 1007 and adds some buffer if len(title_Error) > 1000: title_Error = title_Error[0:1000] except Exception as e: self.log("Unable to get error title : " + ex(e), ERROR) gist = None regex = r"^(%s)\s+([A-Z]+)\s+([0-9A-Z\-]+)\s*(.*)$" % curError.time for i, x in enumerate(log_data): x = ss(x) match = re.match(regex, x) if match: level = match.group(2) if reverseNames[level] == ERROR: paste_data = "".join(log_data[i:i + 50]) if paste_data: gist = gh.get_user().create_gist( True, { "sickrage.log": InputFileContent(paste_data) }) break else: gist = 'No ERROR found' message = u"### INFO\n" message += u"Python Version: **" + sys.version[:120].replace( '\n', '') + "**\n" message += u"Operating System: **" + platform.platform( ) + "**\n" if not 'Windows' in platform.platform(): try: message += u"Locale: " + locale.getdefaultlocale( )[1] + "\n" except Exception: message += u"Locale: unknown" + "\n" message += u"Branch: **" + sickbeard.BRANCH + "**\n" message += u"Commit: SiCKRAGETV/SickRage@" + sickbeard.CUR_COMMIT_HASH + "\n" if gist and gist != 'No ERROR found': message += u"Link to Log: " + gist.html_url + "\n" else: message += u"No Log available with ERRORS: " + "\n" message += u"### ERROR\n" message += u"```\n" message += curError.message + "\n" message += u"```\n" message += u"---\n" message += u"_STAFF NOTIFIED_: @SiCKRAGETV/owners @SiCKRAGETV/moderators" title_Error = u"[APP SUBMITTED]: " + title_Error reports = gh.get_organization(gh_org).get_repo( gh_repo).get_issues(state="all") issue_found = False issue_id = 0 for report in reports: if title_Error == report.title: comment = report.create_comment(message) if comment: issue_id = report.number self.log( 'Commented on existing issue #%s successfully!' % issue_id) issue_found = True break if not issue_found: issue = gh.get_organization(gh_org).get_repo( gh_repo).create_issue(title_Error, message) if issue: issue_id = issue.number self.log( 'Your issue ticket #%s was submitted successfully!' % issue_id) # clear error from error list classes.ErrorViewer.errors.remove(curError) self.submitter_running = False return issue_id except Exception as e: self.log(ex(e), ERROR) self.submitter_running = False