def __callback(ch, method, properties, body):
    
    '''
        This is the callback function that is called when a message is delivered to the message queue
        IT SHOULD NOT BE CALLED DIRECTLY
        
        In this implementation we are forwarding these messages into the RT queue specified in the configuration file
    
    '''
    from rtkit.resource import RTResource
    from rtkit.authenticators import CookieAuthenticator
    from rtkit.errors import RTResourceError
    
    from rtkit import set_logging 
    import logging
    set_logging('error')
    logger = logging.getLogger('rtkit')
    
    auth = CookieAuthenticator(configInfo['RTUser'], configInfo['RTUserPass'])
    resource = RTResource('%s/REST/1.0/' % (configInfo['RTHost'],), auth)
    
    
    content = {'content':   {
                                'Queue': configInfo['RTQueueId'],
                                'Subject' : body,
                            }
               }
    try:
        response = resource.post(path='ticket/new', payload=content,)
        logger.info(response.parsed)
    except RTResourceError as e:
        logger.error(e.response.status_int)
        logger.error(e.response.status)
        logger.error(e.response.parsed)
 def comment_on_rt_ticket(self, rt_number, comment):
     full_rt_url = str(self.get_request_tracker_url()) + '/REST/1.0/'
     resource = RTResource(full_rt_url,
             self.rt_username,
             self.rt_password,
             CookieAuthenticator)
     content = {
         'content': {
             'id': rt_number,
             'Action': 'comment',
             'Text' : comment.replace('\n', '\n '),
         }
     }
     try:
         path = 'ticket/%s/comment' % (str(rt_number))
         response = resource.post(path=path, payload=content,)
     except RTResourceError as e:
         error_msg = str(e.response.status_int) + '\n'
         error_msg += str(e.response.status) + '\n'
         error_msg += str(e.response.parsed) + '\n'
         log.error(error_msg)
         raise ValueError(error_msg)
     if response.status_int != 200:
         error_msg = 'HTTP status %s when attempting to contact %s\n' % (str(response.status_int), str(full_rt_url))
         error_msg += str(response.status) + '\n'
         error_msg += str(response.parsed) + '\n'
         log.error(error_msg)
         raise ValueError(error_msg)
예제 #3
0
def logout():
    set_logging('debug')
    logger = logging.getLogger('rtkit')

    my_config = DITICConfig()
    system = my_config.get_system()

    resource = RTResource('http://localhost/rt/REST/1.0/', system['username'],
                          system['password'], CookieAuthenticator)

    #create a ticket
    content = {'content': {}}

    try:
        response = resource.post(
            path='logout/',
            payload=content,
        )
        logger.info(response.parsed)

    except RTResourceError as e:
        logger.error(e.response.status_int)
        logger.error(e.response.status)
        logger.error(e.response.parsed)
    redirect("/")
예제 #4
0
def create_ticket(mispid, subject):
    set_logging('error')
    logger = logging.getLogger('rtkit')
    resource = RTResource(rt_url, rt_user, rt_pass, CookieAuthenticator)

    emails = "*****@*****.**"

    subject = "%s - takedown" % (subject)
    body = "Automatically imported via MISP # %s" % (mispid)
    content = {
        'content': {
            'queue': 3,
            'requestor': emails,
            'subject': urllib.quote(subject),
            'text': body,
        }
    }

    try:
        response = resource.post(
            path='ticket/new',
            payload=content,
        )
        logger.info(response.parsed)
        for t in response.parsed:
            ticketid = t[0][1]
        return ticketid.replace('ticket/', '')
    except RTResourceError as e:
        logger.error(e.response.status_int)
        logger.error(e.response.status)
        logger.error(e.response.parsed)
예제 #5
0
def createTicket():
    global emailGlobal

    priority = ''

    priority = int(request.forms.get('priority'))

    if priority >= 200:
        setUrgent = 'yes'
    else:
        setUrgent = ''

    set_logging('debug')
    logger = logging.getLogger('rtkit')

    my_config = DITICConfig()
    system = my_config.get_system()

    resource = RTResource('http://localhost/rt/REST/1.0/', system['username'],
                          system['password'], CookieAuthenticator)

    #create a ticket
    content = {
        'content': {
            'Queue': request.forms.get(
                "queue"
            ),  #General - unassigned is the name of the desired queue
            'Requestors': emailGlobal,
            'Subject':
            request.forms.get("subject"),  #text to go into subject field
            'Text': request.forms.get("content"),
            'Priority': request.forms.get('priority'),
            'CF.{servico}': request.forms.get("servico"),
            'CF.{IS - Informatica e Sistemas}':
            request.forms.get("inforsistemas"),
            'CF.{DITIC - Interrupted}': '',
            'CF.{DITIC - Urgent}': setUrgent,
        }
    }

    try:
        response = resource.post(
            path='ticket/new',
            payload=content,
        )
        logger.info(response.parsed)

    except RTResourceError as e:
        logger.error(e.response.status_int)
        logger.error(e.response.status)
        logger.error(e.response.parsed)
예제 #6
0
def addComment(ticketID):
    set_logging('debug')
    logger = logging.getLogger('rtkit')

    my_config = DITICConfig()
    system = my_config.get_system()

    resource = RTResource('http://localhost/rt/REST/1.0/', system['username'],
                          system['password'], CookieAuthenticator)

    try:
        params = {
            'content': {
                'Action': 'comment',
                'Text': request.forms.get("content"),
            },
        }

        params2 = {
            'content': {
                'status': 'resolved',
            }
        }
        response = resource.post(
            path='ticket/' + ticketID + '/comment',
            payload=params,
        )
        response = resource.post(path='ticket/' + ticketID, payload=params2)
        for r in response.parsed:
            for t in r:
                logger.info(t)

    except RTResourceError as e:
        logger.error(e.response.status_int)
        logger.error(e.response.status)
        logger.error(e.response.parsed)
예제 #7
0
def updateTicket(ticketID):
    global emailGlobal

    priority = int(request.forms.get('priority'))

    if priority > 255:
        priority = 255

    if priority >= 200:
        setUrgent = 'yes'
    else:
        setUrgent = ''

    set_logging('debug')
    logger = logging.getLogger('rtkit')

    my_config = DITICConfig()
    system = my_config.get_system()

    resource = RTResource('http://localhost/rt/REST/1.0/', system['username'],
                          system['password'], CookieAuthenticator)

    #create a ticket
    content = {
        'content': {
            'Priority': str(priority),
            'cf.{ditic - urgent}': setUrgent,
        }
    }

    try:
        response = resource.post(
            path='ticket/' + ticketID,
            payload=content,
        )
        logger.info(response.parsed)

    except RTResourceError as e:
        logger.error(e.response.status_int)
        logger.error(e.response.status)
        logger.error(e.response.parsed)
def __callback(ch, method, properties, body):
    '''
        This is the callback function that is called when a message is delivered to the message queue
        IT SHOULD NOT BE CALLED DIRECTLY
        
        In this implementation we are forwarding these messages into the RT queue specified in the configuration file
    
    '''
    from rtkit.resource import RTResource
    from rtkit.authenticators import CookieAuthenticator
    from rtkit.errors import RTResourceError

    from rtkit import set_logging
    import logging
    set_logging('error')
    logger = logging.getLogger('rtkit')

    auth = CookieAuthenticator(configInfo['RTUser'], configInfo['RTUserPass'])
    resource = RTResource('%s/REST/1.0/' % (configInfo['RTHost'], ), auth)

    content = {
        'content': {
            'Queue': configInfo['RTQueueId'],
            'Subject': body,
        }
    }
    try:
        response = resource.post(
            path='ticket/new',
            payload=content,
        )
        logger.info(response.parsed)
    except RTResourceError as e:
        logger.error(e.response.status_int)
        logger.error(e.response.status)
        logger.error(e.response.parsed)
예제 #9
0
    def create_ticket(*args):

        url = "https://{0}/REST/1.0/".format(str(rtir_ip))
        resource = RTResource(url, username, password, CookieAuthenticator)

        ttime = time.strftime("%T").split(":")[0]

        raw_data = get_content()

        content = {
            'content': {
                'Queue': queue_number,
                'Subject': title,
                'Text': raw_data,
                'status': 'open',
                'Owner': owner,
                "Sla": urgency,
                "Requestor": req_email,
                "Cc": cc_email,
                "AdminCc": admin_cc_email
            }
        }

        print(dir(content))
        print(content)
        try:
            response = resource.post(
                path='ticket/new',
                payload=content,
            )

        except RTResourceError as e:

            logger.error(e.response.status_int)
            logger.error(e.response.status)
            logger.error(e.response.parsed)
예제 #10
0
def check_url_create_investigation(incident, template, url, override,
                                   onlinecheck):
    mypath = os.path.dirname(os.path.realpath(sys.argv[0]))
    template = os.path.join(mypath, template)
    global ua
    global min_size
    global override_email
    global event_tag
    # RT
    set_logging('error')
    logger = logging.getLogger('rtkit')
    resource = RTResource(rt_url, rt_user, rt_pass, CookieAuthenticator)
    open_tickets = open_tickets_for_url(url)
    if open_tickets > 0:
        return "URL %s was already handled in ticket %s" % (url, open_tickets)
    if onlinecheck is True:
        online, size = is_online(url)
        if not online:
            return "URL %s is offline (size: %s)" % (url, size)
    with nostdout():
        emails, text, asn = urlabuse.run_lookup(url)
    text = defang(urllib.quote(text))
    d = {'details': text}

    try:
        f = open(template)
        subject = f.readline().rstrip()
        templatecontent = Template(f.read())
        body = templatecontent.substitute(d)
    except:
        print "Couldn't open template file (%s)" % template
        sys.exit(1)
    f.close()
    if event_tag == "tlp:green":
        subject = "[TLP:GREEN] " + subject
    # Override emails destinations for test
    if override is True:
        emails = override_email

    asn_out = []
    for x in asn:
        asn_out.append(",".join(x))
    asn_out = "|".join(asn_out)
    subject = "%s (%s)" % (subject, asn_out)
    content = {
        'content': {
            'queue': 5,
            'requestor': emails,
            'subject': urllib.quote(subject),
            'text': body,
        }
    }

    if debug:
        sys.exit(42)

    try:
        response = resource.post(
            path='ticket/new',
            payload=content,
        )
        logger.info(response.parsed)
        for t in response.parsed:
            ticketid = t[0][1]
    except RTResourceError as e:
        logger.error(e.response.status_int)
        logger.error(e.response.status)
        logger.error(e.response.parsed)

    #update ticket link
    content = {
        'content': {
            'memberof': incident,
        }
    }
    try:
        ticketpath = "%s/links" % ticketid
        response = resource.post(
            path=ticketpath,
            payload=content,
        )
        logger.info(response.parsed)
        return "Investigation created for URL %s" % (url)
    except RTResourceError as e:
        logger.error(e.response.status_int)
        logger.error(e.response.status)
        logger.error(e.repoinse.parsed)
예제 #11
0
파일: tkt.py 프로젝트: 3oyka/python-rtkit
class TktTestCase(unittest.TestCase):
    def setUp(self):
        self.resource = RTResource('http://rtkit.test/', None, None, AbstractAuthenticator)
        self.content = {
            'content': {
                'Queue': 1,
                'Subject': 'New Ticket',
                'Text': 'My useless\ntext on\nthree lines.',
            }
        }
        self.req_body = 'content=Queue: 1\nText: My useless\n text on\n three lines.\nSubject: New Ticket'
        self.req_headers_get = {
            'connection': 'close',
            'user-agent': 'rtkit-ua',
            'host': 'rtkit.test',
            'accept': 'text/plain',
            'accept-encoding': 'identity',
        }
        self.req_headers_post = self.req_headers_get.copy()
        self.req_headers_post.update({
            'content-length': '76',
            'content-type': 'application/x-www-form-urlencoded; charset=utf-8',
        })

    @httprettified
    def test_http_error(self):
        HTTPretty.register_uri(HTTPretty.GET, 'http://rtkit.test/:GET:', status=404, body='Not Found')
        response = self.resource.get(':GET:', headers={'User-Agent': 'rtkit-ua', })
        self.assertEqual(response.parsed, [[]])
        self.assertEqual(response.status_int, 500)
        self.assertEqual(response.status, 'Not Found')

    @httprettified
    def assertPost(self, body, expected, content=None):
        HTTPretty.register_uri(HTTPretty.POST, 'http://rtkit.test/:POST:', body=body)
        response = self.resource.post(
            path=':POST:',
            payload=content or self.content,
            headers={'User-Agent': 'rtkit-ua', }
        )
        self.assertEqual(response.parsed, expected.parsed)
        self.assertEqual(response.status_int, expected.status_int)
        self.assertEqual(response.status, expected.status)
        self.assertEqual(HTTPretty.last_request.method, HTTPretty.POST)
        self.assertEqual(HTTPretty.last_request.path, '/:POST:')
        self.assertEqual(HTTPretty.last_request.body, expected.req_body)
        self.assertEqual(dict(HTTPretty.last_request.headers), expected.req_headers)

    @httprettified
    def assertGet(self, body, expected):
        HTTPretty.register_uri(HTTPretty.GET, 'http://rtkit.test/:GET:', body=body)
        response = self.resource.get(
            path=':GET:',
            headers={'User-Agent': 'rtkit-ua', }
        )
        self.assertEqual(response.parsed, expected.parsed)
        self.assertEqual(response.status_int, expected.status_int)
        self.assertEqual(response.status, expected.status)
        self.assertEqual(HTTPretty.last_request.method, HTTPretty.GET)
        self.assertEqual(HTTPretty.last_request.path, '/:GET:')
        self.assertEqual(HTTPretty.last_request.body, expected.req_body)
        self.assertEqual(dict(HTTPretty.last_request.headers), expected.req_headers)

    def test_create_tkt(self):
        expected = Expected(
            parsed=[[('id', 'ticket/1')]],
            status_int=200,
            status='200 Ok',
            req_body=self.req_body,
            req_headers=self.req_headers_post,
        )
        self.assertPost(
            body='RT/3.8.10 200 Ok\n\n# Ticket 1 created.\n\n',
            expected=expected,
        )

    def test_create_tkt_noqueue(self):
        expected = Expected(
            parsed=[],
            status_int=400,
            status='400 Could not create ticket. Queue not set',
            req_body=self.req_body,
            req_headers=self.req_headers_post,
        )
        self.assertPost(
            body='RT/3.8.10 200 Ok\n\n# Could not create ticket.\n# Could not create ticket. Queue not set\n\n',
            expected=expected,
        )

    def test_create_tkt_noperm(self):
        expected = Expected(
            parsed=[],
            status_int=400,
            status='400 No permission to create tickets in the queue \'___Admin\'',
            req_body=self.req_body,
            req_headers=self.req_headers_post,
        )
        self.assertPost(
            body='RT/3.8.10 200 Ok\n\n# Could not create ticket.\n# No permission to create tickets in the queue \'___Admin\'\n\n',
            expected=expected,
        )

    def test_read_tkt(self):
        expected = Expected(
            parsed=[[
                ('id', 'ticket/1'),
                ('Queue', 'General'),
                ('Owner', 'Nobody'),
                ('Creator', 'pyrtkit'),
                ('Subject', 'pyrt-create4'),
                ('Status', 'open'),
                ('Priority', '5'),
                ('InitialPriority', '0'),
                ('FinalPriority', '0'),
                ('Requestors', ''),
                ('Cc', ''),
                ('AdminCc', ''),
                ('Created', 'Sun Jul 03 10:48:57 2011'),
                ('Starts', 'Not set'),
                ('Started', 'Not set'),
                ('Due', 'Not set'),
                ('Resolved', 'Not set'),
                ('Told', 'Wed Jul 06 12:58:00 2011'),
                ('LastUpdated', 'Thu Jul 07 14:42:32 2011'),
                ('TimeEstimated', '0'),
                ('TimeWorked', '25 minutes'),
                ('TimeLeft', '0'),
            ]],
            status_int=200,
            status='200 Ok',
            req_body='',
            req_headers=self.req_headers_get,
        )
        self.assertGet(
            body='''RT/3.8.10 200 Ok

id: ticket/1
Queue: General
Owner: Nobody
Creator: pyrtkit
Subject: pyrt-create4
Status: open
Priority: 5
InitialPriority: 0
FinalPriority: 0
Requestors:
Cc:
AdminCc:
Created: Sun Jul 03 10:48:57 2011
Starts: Not set
Started: Not set
Due: Not set
Resolved: Not set
Told: Wed Jul 06 12:58:00 2011
LastUpdated: Thu Jul 07 14:42:32 2011
TimeEstimated: 0
TimeWorked: 25 minutes
TimeLeft: 0


''',
            expected=expected,
        )

    def test_read_tkt_notfound(self):
        expected = Expected(
            parsed=[],
            status_int=404,
            status='404 Ticket 1 does not exist',
            req_body='',
            req_headers=self.req_headers_get,
        )
        self.assertGet(
            body='RT/3.8.10 200 Ok\n\n# Ticket 1 does not exist.\n\n\n',
            expected=expected,
        )

    def test_read_tkt_credentials(self):
        expected = Expected(
            parsed=[],
            status_int=401,
            status='401 Credentials required',
            req_body='',
            req_headers=self.req_headers_get,
        )
        self.assertGet(
            body='RT/3.8.10 401 Credentials required\n',
            expected=expected,
        )

    def test_update_tkt_syntax_error(self):
        self.req_headers_post.update({'content-length': '16'})
        expected = Expected(
            parsed=[[('queue', 'You may not create requests in that queue.')]],
            status_int=409,
            status='409 Syntax Error',
            req_body='content=Queue: 3',
            req_headers=self.req_headers_post,
        )
        self.assertPost(
            body='RT/3.8.10 409 Syntax Error\n\n# queue: You may not create requests in that queue.\n\n',
            expected=expected,
            content={'content': {'Queue': 3, }}
        )

    def test_tkt_comment_with_attach(self):
        self.req_headers_post.update({
            'content-length': '760',
            'content-type': 'multipart/form-data; boundary=xXXxXXyYYzzz',
        })
        expected = Expected(
            parsed=[[]],
            status_int=200,
            status='200 Ok',
            req_body='--xXXxXXyYYzzz\r\nContent-Disposition: form-data; name="content"\r\nContent-Type: text/plain; charset=utf-8\r\nContent-Length: 77\r\n\r\nAction: comment\nText: Comment with attach\nAttachment: x1.txt, x2.txt, 1x1.gif\r\n--xXXxXXyYYzzz\r\nContent-Disposition: form-data; name="attachment_2"; filename="rtkit/tests/attach/x2.txt"\r\nContent-Type: text/plain\r\nContent-Length: 15\r\n\r\nHello World!\n2\n\r\n--xXXxXXyYYzzz\r\nContent-Disposition: form-data; name="attachment_1"; filename="rtkit/tests/attach/x1.txt"\r\nContent-Type: text/plain\r\nContent-Length: 15\r\n\r\nHello World!\n1\n\r\n--xXXxXXyYYzzz\r\nContent-Disposition: form-data; name="attachment_3"; filename="rtkit/tests/attach/1x1.gif"\r\nContent-Type: image/gif\r\nContent-Length: 35\r\n\r\nGIF87a\x01\x00\x01\x00\x80\x00\x00\xcc\xcc\xcc\x96\x96\x96,\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02D\x01\x00;\r\n--xXXxXXyYYzzz--\r\n',
            req_headers=self.req_headers_post,
        )
        self.assertPost(
            body='RT/3.8.10 200 Ok\n\n# Message recorded\n\n',
            expected=expected,
            content={
                'content': {
                    'Action': 'comment',
                    'Text': 'Comment with attach',
                    'Attachment': 'x1.txt, x2.txt, 1x1.gif',
                },
                'attachment_1': file('rtkit/tests/attach/x1.txt'),
                'attachment_2': file('rtkit/tests/attach/x2.txt'),
                'attachment_3': file('rtkit/tests/attach/1x1.gif'),
            }
        )

    def test_read_tkt_comment(self):
        expected = Expected(
            parsed=[[
                ('id', '2831'),
                ('Ticket', '216'),
                ('TimeTaken', '0'),
                ('Type', 'Create'),
                ('Field', ''),
                ('OldValue', ''),
                ('NewValue', ''),
                ('Data', ''),
                ('Description', 'Ticket created by john.foo'),
                ('Content', 'this is a\nmultiline\nticket'),
                ('Creator', 'john.foo'),
                ('Created', '2013-02-14 18:00:45'),
                ('Attachments', '\n1315: untitled (38b)')
            ]],
            status_int=200,
            status='200 Ok',
            req_body='',
            req_headers=self.req_headers_get,
        )
        self.assertGet(
            body='''RT/4.0.5-116-g591e06a 200 Ok

# 2/2 (id/2831/total)

id: 2831
Ticket: 216
TimeTaken: 0
Type: Create
Field:
OldValue:
NewValue:
Data:
Description: Ticket created by john.foo

Content: this is a
         multiline
         ticket


Creator: john.foo
Created: 2013-02-14 18:00:45

Attachments:
             1315: untitled (38b)
''',
            expected=expected,
        )
예제 #12
0
class TktTestCase(unittest.TestCase):
    def setUp(self):
        self.resource = RTResource('http://rtkit.test/', None, None,
                                   AbstractAuthenticator)
        self.content = {
            'content': {
                'Queue': 1,
                'Subject': 'New Ticket',
                'Text': 'My useless\ntext on\nthree lines.',
            }
        }
        self.req_body = 'content=Queue: 1\nText: My useless\n text on\n three lines.\nSubject: New Ticket'
        self.req_headers_get = {
            'connection': 'close',
            'user-agent': 'rtkit-ua',
            'host': 'rtkit.test',
            'accept': 'text/plain',
            'accept-encoding': 'identity',
        }
        self.req_headers_post = self.req_headers_get.copy()
        self.req_headers_post.update({
            'content-length':
            '76',
            'content-type':
            'application/x-www-form-urlencoded; charset=utf-8',
        })

    @httprettified
    def test_http_error(self):
        HTTPretty.register_uri(HTTPretty.GET,
                               'http://rtkit.test/:GET:',
                               status=404,
                               body='Not Found')
        response = self.resource.get(':GET:',
                                     headers={
                                         'User-Agent': 'rtkit-ua',
                                     })
        self.assertEqual(response.parsed, [[]])
        self.assertEqual(response.status_int, 500)
        self.assertEqual(response.status, 'Not Found')

    @httprettified
    def assertPost(self, body, expected, content=None):
        HTTPretty.register_uri(HTTPretty.POST,
                               'http://rtkit.test/:POST:',
                               body=body)
        response = self.resource.post(path=':POST:',
                                      payload=content or self.content,
                                      headers={
                                          'User-Agent': 'rtkit-ua',
                                      })
        self.assertEqual(response.parsed, expected.parsed)
        self.assertEqual(response.status_int, expected.status_int)
        self.assertEqual(response.status, expected.status)
        self.assertEqual(HTTPretty.last_request.method, HTTPretty.POST)
        self.assertEqual(HTTPretty.last_request.path, '/:POST:')
        self.assertEqual(HTTPretty.last_request.body, expected.req_body)
        self.assertEqual(dict(HTTPretty.last_request.headers),
                         expected.req_headers)

    @httprettified
    def assertGet(self, body, expected):
        HTTPretty.register_uri(HTTPretty.GET,
                               'http://rtkit.test/:GET:',
                               body=body)
        response = self.resource.get(path=':GET:',
                                     headers={
                                         'User-Agent': 'rtkit-ua',
                                     })
        self.assertEqual(response.parsed, expected.parsed)
        self.assertEqual(response.status_int, expected.status_int)
        self.assertEqual(response.status, expected.status)
        self.assertEqual(HTTPretty.last_request.method, HTTPretty.GET)
        self.assertEqual(HTTPretty.last_request.path, '/:GET:')
        self.assertEqual(HTTPretty.last_request.body, expected.req_body)
        self.assertEqual(dict(HTTPretty.last_request.headers),
                         expected.req_headers)

    def test_create_tkt(self):
        expected = Expected(
            parsed=[[('id', 'ticket/1')]],
            status_int=200,
            status='200 Ok',
            req_body=self.req_body,
            req_headers=self.req_headers_post,
        )
        self.assertPost(
            body='RT/3.8.10 200 Ok\n\n# Ticket 1 created.\n\n',
            expected=expected,
        )

    def test_create_tkt_noqueue(self):
        expected = Expected(
            parsed=[],
            status_int=400,
            status='400 Could not create ticket. Queue not set',
            req_body=self.req_body,
            req_headers=self.req_headers_post,
        )
        self.assertPost(
            body=
            'RT/3.8.10 200 Ok\n\n# Could not create ticket.\n# Could not create ticket. Queue not set\n\n',
            expected=expected,
        )

    def test_create_tkt_noperm(self):
        expected = Expected(
            parsed=[],
            status_int=400,
            status=
            '400 No permission to create tickets in the queue \'___Admin\'',
            req_body=self.req_body,
            req_headers=self.req_headers_post,
        )
        self.assertPost(
            body=
            'RT/3.8.10 200 Ok\n\n# Could not create ticket.\n# No permission to create tickets in the queue \'___Admin\'\n\n',
            expected=expected,
        )

    def test_read_tkt(self):
        expected = Expected(
            parsed=[[
                ('id', 'ticket/1'),
                ('Queue', 'General'),
                ('Owner', 'Nobody'),
                ('Creator', 'pyrtkit'),
                ('Subject', 'pyrt-create4'),
                ('Status', 'open'),
                ('Priority', '5'),
                ('InitialPriority', '0'),
                ('FinalPriority', '0'),
                ('Requestors', ''),
                ('Cc', ''),
                ('AdminCc', ''),
                ('Created', 'Sun Jul 03 10:48:57 2011'),
                ('Starts', 'Not set'),
                ('Started', 'Not set'),
                ('Due', 'Not set'),
                ('Resolved', 'Not set'),
                ('Told', 'Wed Jul 06 12:58:00 2011'),
                ('LastUpdated', 'Thu Jul 07 14:42:32 2011'),
                ('TimeEstimated', '0'),
                ('TimeWorked', '25 minutes'),
                ('TimeLeft', '0'),
            ]],
            status_int=200,
            status='200 Ok',
            req_body='',
            req_headers=self.req_headers_get,
        )
        self.assertGet(
            body='''RT/3.8.10 200 Ok

id: ticket/1
Queue: General
Owner: Nobody
Creator: pyrtkit
Subject: pyrt-create4
Status: open
Priority: 5
InitialPriority: 0
FinalPriority: 0
Requestors:
Cc:
AdminCc:
Created: Sun Jul 03 10:48:57 2011
Starts: Not set
Started: Not set
Due: Not set
Resolved: Not set
Told: Wed Jul 06 12:58:00 2011
LastUpdated: Thu Jul 07 14:42:32 2011
TimeEstimated: 0
TimeWorked: 25 minutes
TimeLeft: 0


''',
            expected=expected,
        )

    def test_read_tkt_notfound(self):
        expected = Expected(
            parsed=[],
            status_int=404,
            status='404 Ticket 1 does not exist',
            req_body='',
            req_headers=self.req_headers_get,
        )
        self.assertGet(
            body='RT/3.8.10 200 Ok\n\n# Ticket 1 does not exist.\n\n\n',
            expected=expected,
        )

    def test_read_tkt_credentials(self):
        expected = Expected(
            parsed=[],
            status_int=401,
            status='401 Credentials required',
            req_body='',
            req_headers=self.req_headers_get,
        )
        self.assertGet(
            body='RT/3.8.10 401 Credentials required\n',
            expected=expected,
        )

    def test_update_tkt_syntax_error(self):
        self.req_headers_post.update({'content-length': '16'})
        expected = Expected(
            parsed=[[('queue', 'You may not create requests in that queue.')]],
            status_int=409,
            status='409 Syntax Error',
            req_body='content=Queue: 3',
            req_headers=self.req_headers_post,
        )
        self.assertPost(
            body=
            'RT/3.8.10 409 Syntax Error\n\n# queue: You may not create requests in that queue.\n\n',
            expected=expected,
            content={'content': {
                'Queue': 3,
            }})

    def test_tkt_comment_with_attach(self):
        self.req_headers_post.update({
            'content-length':
            '760',
            'content-type':
            'multipart/form-data; boundary=xXXxXXyYYzzz',
        })
        expected = Expected(
            parsed=[[]],
            status_int=200,
            status='200 Ok',
            req_body=
            '--xXXxXXyYYzzz\r\nContent-Disposition: form-data; name="content"\r\nContent-Type: text/plain; charset=utf-8\r\nContent-Length: 77\r\n\r\nAction: comment\nText: Comment with attach\nAttachment: x1.txt, x2.txt, 1x1.gif\r\n--xXXxXXyYYzzz\r\nContent-Disposition: form-data; name="attachment_2"; filename="rtkit/tests/attach/x2.txt"\r\nContent-Type: text/plain\r\nContent-Length: 15\r\n\r\nHello World!\n2\n\r\n--xXXxXXyYYzzz\r\nContent-Disposition: form-data; name="attachment_1"; filename="rtkit/tests/attach/x1.txt"\r\nContent-Type: text/plain\r\nContent-Length: 15\r\n\r\nHello World!\n1\n\r\n--xXXxXXyYYzzz\r\nContent-Disposition: form-data; name="attachment_3"; filename="rtkit/tests/attach/1x1.gif"\r\nContent-Type: image/gif\r\nContent-Length: 35\r\n\r\nGIF87a\x01\x00\x01\x00\x80\x00\x00\xcc\xcc\xcc\x96\x96\x96,\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02D\x01\x00;\r\n--xXXxXXyYYzzz--\r\n',
            req_headers=self.req_headers_post,
        )
        self.assertPost(body='RT/3.8.10 200 Ok\n\n# Message recorded\n\n',
                        expected=expected,
                        content={
                            'content': {
                                'Action': 'comment',
                                'Text': 'Comment with attach',
                                'Attachment': 'x1.txt, x2.txt, 1x1.gif',
                            },
                            'attachment_1': file('rtkit/tests/attach/x1.txt'),
                            'attachment_2': file('rtkit/tests/attach/x2.txt'),
                            'attachment_3': file('rtkit/tests/attach/1x1.gif'),
                        })

    def test_read_tkt_comment(self):
        expected = Expected(
            parsed=[[('id', '2831'), ('Ticket', '216'), ('TimeTaken', '0'),
                     ('Type', 'Create'), ('Field', ''), ('OldValue', ''),
                     ('NewValue', ''), ('Data', ''),
                     ('Description', 'Ticket created by john.foo'),
                     ('Content', 'this is a\nmultiline\nticket'),
                     ('Creator', 'john.foo'),
                     ('Created', '2013-02-14 18:00:45'),
                     ('Attachments', '\n1315: untitled (38b)')]],
            status_int=200,
            status='200 Ok',
            req_body='',
            req_headers=self.req_headers_get,
        )
        self.assertGet(
            body='''RT/4.0.5-116-g591e06a 200 Ok

# 2/2 (id/2831/total)

id: 2831
Ticket: 216
TimeTaken: 0
Type: Create
Field:
OldValue:
NewValue:
Data:
Description: Ticket created by john.foo

Content: this is a
         multiline
         ticket


Creator: john.foo
Created: 2013-02-14 18:00:45

Attachments:
             1315: untitled (38b)
''',
            expected=expected,
        )
예제 #13
0
파일: views.py 프로젝트: InsanePrawn/SaBoT
	def process_job(self):
		if not self.request.POST.has_key("text"):
			self.job_errors.append("invalid request: item 'text' missing.")
			return False

		sponsoring = self.get_sponsoring(self.kwargs["spk"])

		# check if invoice already exists
		if Invoice.objects.filter(sponsoring=sponsoring).count() > 0:
			invoice = sponsoring.invoice
		else:
			invoice = None
		if invoice is None:
			self.job_errors.append("There is no invoice for this sponsoring.")
			return False
		if not invoice.pdf:
			self.job_errors.append("There is no invoice PDF available for this sponsoring.")
			return False

		rt = RTResource(settings.RT_URL, settings.RT_USER, settings.RT_PW, BasicAuthenticator)
		# TODO: Refactor froscon specific parts to config
		data = {
			"content" : {
				"Queue" : settings.RT_QUEUE_INVOICE,
				"Owner" : self.request.user.username,
				"Subject" : "Rechnung Sponsoring {} {}".format(settings.CONFERENCE_NAME, date.today().year) if sponsoring.contact.contactPersonLanguage.startswith("de") else "Invoice Sponsoring {} {}".format(settings.CONFERENCE_NAME, date.today().year),
				"Requestor" : sponsoring.contact.contactPersonEmail,
			}
		}
		res = rt.post(path="ticket/new",payload=data)
		if res.status_int != 200:
			self.job_errors.append("RT Ticket creation failed with status code {}".format(res.status))
			return False


		tid = None
		for k,v in res.parsed[0]:
			if k == "id":
				tid = v
				break

		if tid is None:
			self.job_errors.append("RT answer contained no ticket id")
			return False

		# compile message
		resp_data = {
			"content" : {
				"Action" : "correspond",
				"Text" : self.request.POST["text"].encode("utf8")
			}
		}
		resp_data["attachment_1"] = file(sponsoring.invoice.pdf.path)
		resp_data["content"]["Attachment"] = "{}.pdf".format(sponsoring.invoice.invoiceNumber)

		res = rt.post(path=(tid + "/comment"),payload=resp_data)
		if res.status_int != 200:
			self.job_errors.append("RT Correspondance failed")
			return False

		invoice.rtTicketRef = int(tid.lstrip("ticket/"))
		invoice.save()
		return True
예제 #14
0
파일: views.py 프로젝트: InsanePrawn/SaBoT
	def form_valid(self, form):
		# initialize rt connection
		rt = RTResource(settings.RT_URL, settings.RT_USER, settings.RT_PW, BasicAuthenticator)

		results = []
		for contact in form.cleaned_data["recipients"]:
			result = {}
			result["contact"] = contact

			# now compose the mail and send it as rt answer
			tmpl = contact.template
			ctx_dict = { "rcpt" : contact }
			message = render_to_string(tmpl.templateName, ctx_dict)
			# create response
			resp_data = {
				"content" : {
					"Action" : "correspond",
					"Text" : message.encode("utf8"),
					"Status" : "stalled",
				}
			}
			# handle attachments
			if len(tmpl.attachments.all()) > 0:
				attId = 1
				names = []
				for att in tmpl.attachments.all():
					names.append(att.name)
					resp_data["attachment_{0}".format(attId)] = file(settings.ATTACHMENTS_ROOT + att.filepath)
					attId = attId + 1

				resp_data["content"]["Attachment"] = ", ".join(names)

			# post it to rt

			# create a matching ticket
			data = {
				"content" : {
					"Queue" : settings.RT_QUEUE,
					"Owner" : settings.RT_TICKET_OWNER,
					"Subject" : contact.template.mailSubject,
					"Requestor" : (contact.contactPersonEmail if len(contact.contactPersonEmail) > 0 else contact.contactEMail),
				}
			}
			res = rt.post(path="ticket/new",payload=data)
			if res.status_int != 200:
				result["status"] = "failed"
				result["info"] = res.status
				results.append(result)
				continue

			tpath = None
			tid = None
			for k,v in res.parsed[0]:
				if k == "id":
					tpath = v
					break

			if tpath is None or tpath.find("/") < 0:
				result["status"] = "failed"
				result["info"] = "Answer contained no ticket id"
				results.append(result)
				continue
			else:
				tid = int(tpath.split("/")[1])

			res = rt.post(path=(tpath + "/comment"),payload=resp_data)
			if res.status_int != 200:
				result["status"] = "failed"
				result["info"] = repr(res.parded)
				results.append(result)
				continue

			result["status"] = "ok"
			results.append(result)
			contact.lastMailed = datetime.date.today()
			contact.rtTicketId = tid
			contact.save()


		self.template_name = self.success_template_name
		return self.render_to_response(self.get_context_data(results=results))
    def create_rt_from_pr(self,
            sender,
            subject,
            body,
            queue,
            gh_repo_full_name,
            gh_pr):
        full_rt_url = str(self.get_request_tracker_url()) + '/REST/1.0/'
        rt_sender = self.get_rt_sender(self.rt_use_generic_sender,
                self.rt_generic_sender,
                sender,
                self.rt_sender_email_domain)
        resource = RTResource(full_rt_url,
                self.rt_username,
                self.rt_password,
                CookieAuthenticator)

        content = {
            'content': {
                'id': 'ticket/new',
                'Queue': queue,
                'Subject' : subject,
                'Requestor': rt_sender,
                'CF-X-Hub-PR': gh_pr,
                'CF-X-Hub-Repo': gh_repo_full_name,
                'Text' : body.replace('\n', '\n '),
            }
        }

        response = None
        try:
            response = resource.post(path='ticket/new', payload=content,)
        except RTResourceError as e:
            error_msg = str(e.response.status_int) + '\n'
            error_msg += str(e.response.status) + '\n'
            error_msg += str(e.response.parsed) + '\n'
            log.error(error_msg)
            raise ValueError(error_msg)

        if response.status_int != 200:
            error_msg = 'HTTP status ' + str(response.status_int) + ' when attempting to contact ' + str(full_rt_url) + '\n'
            error_msg += str(response.status) + '\n'
            error_msg += str(response.parsed) + '\n'
            log.error(error_msg)
            raise ValueError(error_msg)

        # RT returns a 200 (indicating the ticket was created) yet something
        # else went wrong. Sometimes related to the custom field name being
        # nonexistent or the RT user not having enough permission to read/set
        # this field value.
        # Note that response.parsed is a nested list of tuples,
        # e.g. [[('id', 'ticket/587034')]]
        try:
            _tup = response.parsed[0][0]
            rt_ticket_number = _tup[1].replace('ticket/','')
            log.info('Successfully created RT "' + str(subject) + '" from PR initiated by ' + str(rt_sender))
            log.info('URL: ' + str(self.get_request_tracker_url()) + '/Ticket/Display.html?id=' + str(rt_ticket_number))
            log.info(response.parsed)
            return rt_ticket_number
        except IndexError, e:
            error_msg = 'Something went wrong when attempting to create the RT!\n'
            error_msg += 'Received: ' + str(response.body) + '\n'
            log.error(error_msg)
            raise ValueError(error_msg)
예제 #16
0
		'Subject': trigger_name,
		'Text': desc,
		'Priority': priorities[severity],
		'CF.{Hosts}': ','.join(hosts),
		'CF.{Items}': ','.join(items),
		'CF.{Trigger}': trigger_name
	}
}

print(event_url)
links = {
	'content': {
		'RefersTo': '{}'.format(event_url)
	}
}

rt = RTResource(api_url, 'root', 'password', CookieAuthenticator)
ticket = rt.post(path='ticket/new', payload=ticket_content,)
(label,ticket_id) = ticket.parsed[0][0]
refers = rt.post(path=ticket_id + '/links', payload=links,)

event_id = re.findall(r'eventid=(\d+)', event_url)[0]

ticket_url = rt_url + 'Ticket/Display.html?id=' + ticket_id.split('/')[1]
print(ticket_url)
zh = ZabbixAPI('http://localhost/zabbix')
zh.login(user='******', password='******')
ack_message = 'Ticket created.\n' + ticket_url
zh.event.acknowledge(eventids=event_id, message=ack_message)
 
예제 #17
0
logger = logging.getLogger('rtkit')
filecsv = raw_input("Please enter name of CSV file: ")
user = getpass.getuser()
passwd = getpass.getpass()
resource = RTResource('http://localhost/REST/1.0/', user , passwd , CookieAuthenticator)
with open(filecsv) as csvfile:
    readCSV = csv.reader(csvfile, delimiter=',')
    for row in readCSV:
	content = {
        	'content': {
                	'Queue': ('%s' % row[0]),
                	'Subject': ('%s' % row[1]),
                	'Text': ('%s' % row[2]),
			'Requestors': ('%s' % row[3]),
                	'Cc': ('%s' % row[4]),
                	'AdminCc' : ('%s' % row[5]), 
                        'Owner': ('%s' % row[6]),
                	'Starts': ('%s' % row[7]),
                	'Due': ('%s' % row[8]), 
			'CF.{Jira Request}': ('%s' % row[9]),
        	}
	}

	try:
		response = resource.post(path='ticket/new', payload=content,)
		logger.info(response.parsed)
	except RTResourceError as e:
		logger.error(e.response.status_int)
	 	logger.error(e.response.status)
		logger.error(e.response.parsed)
subject = "%s (%s)" % (subject, asn_out)
content = {
    'content': {
        'queue': queue,
        'requestor': emails,
        'subject': urllib.quote(subject),
        'text': body,
    }
}

if debug:
    sys.exit(42)

try:
    response = resource.post(
        path='ticket/new',
        payload=content,
    )
    logger.info(response.parsed)
    for t in response.parsed:
        ticketid = t[0][1]
    print "Ticket created: %s" % ticketid
except RTResourceError as e:
    logger.error(e.response.status_int)
    logger.error(e.response.status)
    logger.error(e.response.parsed)

#update ticket link
content = {
    'content': {
        'memberof': incident,
    }
예제 #19
0
    def process_job(self):
        if not self.request.POST.has_key("text"):
            self.job_errors.append("invalid request: item 'text' missing.")
            return False

        sponsoring = self.get_sponsoring(self.kwargs["spk"])

        # check if invoice already exists
        if Invoice.objects.filter(sponsoring=sponsoring).count() > 0:
            invoice = sponsoring.invoice
        else:
            invoice = None
        if invoice is None:
            self.job_errors.append("There is no invoice for this sponsoring.")
            return False
        if not invoice.pdf:
            self.job_errors.append(
                "There is no invoice PDF available for this sponsoring.")
            return False

        rt = RTResource(settings.RT_URL, settings.RT_USER, settings.RT_PW,
                        BasicAuthenticator)
        # TODO: Refactor froscon specific parts to config
        if sponsoring.contact.contactPersonLanguage.startswith("de"):
            subject = "Rechnung Partner-Paket {} {}".format(
                settings.CONFERENCE_NAME,
                date.today().year)
        else:
            subject = "Invoice Partnership {} {}".format(
                settings.CONFERENCE_NAME,
                date.today().year)
        data = {
            "content": {
                "Queue": settings.RT_QUEUE_INVOICE,
                "Owner": self.request.user.username,
                "Subject": subject,
                "Requestor": sponsoring.contact.contactPersonEmail,
            }
        }
        res = rt.post(path="ticket/new", payload=data)
        if res.status_int != 200:
            self.job_errors.append(
                "RT Ticket creation failed with status code {}".format(
                    res.status))
            return False

        tid = None
        for k, v in res.parsed[0]:
            if k == "id":
                tid = v
                break

        if tid is None:
            self.job_errors.append("RT answer contained no ticket id")
            return False

        # compile message
        resp_data = {
            "content": {
                "Action": "correspond",
                "Text": self.request.POST["text"].encode("utf8")
            }
        }
        resp_data["attachment_1"] = file(sponsoring.invoice.pdf.path)
        resp_data["content"]["Attachment"] = "{}.pdf".format(
            sponsoring.invoice.invoiceNumber)

        res = rt.post(path=(tid + "/comment"), payload=resp_data)
        if res.status_int != 200:
            self.job_errors.append("RT Correspondance failed")
            return False

        invoice.rtTicketRef = int(tid.lstrip("ticket/"))
        invoice.save()
        return True