zendeath 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE +18 -0
- data/README.md +30 -0
- data/bin/zendeath +3 -0
- data/lib/commands.rb +138 -0
- data/lib/zendeath.rb +55 -0
- metadata +50 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 2b4a4219b3e41a6d6909d0d51a3111522430c95f
|
4
|
+
data.tar.gz: 9c7e4ac11893c29aaf97688f66b25cbff1469a53
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 5d85b1a84b7d88406ac286568a294a8a2a538eb8f117d31a08d00f60f24d2f13ce00d9ef8c44421cdba68689fbf429a43ba6ea07da33ad54486e6edfa5dfc5f6
|
7
|
+
data.tar.gz: b67f96b206898114b52df03df34df00e4d2f31a66ef6cc6a6576371838a31ceba1463378eb7612175fbfb2d0ad62de36b905ae6db22a859152724b516686d07f
|
data/LICENSE
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
Copyright © 2013 Zachary Alex Stern <zacharyalexstern@gmail.com>
|
2
|
+
This work is free. You can redistribute it and/or modify it under the
|
3
|
+
terms of the Do What The Fuck You Want To Public License, Version 2,
|
4
|
+
as published by Sam Hocevar. See below for more details.
|
5
|
+
|
6
|
+
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
7
|
+
Version 2, December 2004
|
8
|
+
|
9
|
+
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
|
10
|
+
|
11
|
+
Everyone is permitted to copy and distribute verbatim or modified
|
12
|
+
copies of this license document, and changing it is allowed as long
|
13
|
+
as the name is changed.
|
14
|
+
|
15
|
+
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
16
|
+
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
17
|
+
|
18
|
+
0. You just DO WHAT THE FUCK YOU WANT TO.
|
data/README.md
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# Zendeath
|
2
|
+
|
3
|
+
An open source command-line client for Zendesk.
|
4
|
+
|
5
|
+
Primarly created as a learning experience.
|
6
|
+
|
7
|
+
Copy `.zendeath.yaml.example` to `~/.zendeath.yaml` and fill in relevant
|
8
|
+
details.
|
9
|
+
|
10
|
+
Current commands include:
|
11
|
+
|
12
|
+
* me - Shows what Zendesk knows about the current user.
|
13
|
+
* localinfo - Shows config data.
|
14
|
+
* alltickets - Shows total number of tickets, plus number of unsolved
|
15
|
+
tickets.
|
16
|
+
* myworking - Shows your current working tickets + some data.
|
17
|
+
* showticket - Show ticket info + comments.
|
18
|
+
|
19
|
+
Currently has no external dependencies for real functionality, but
|
20
|
+
requires pry because I'm lazy and it's a work in progress.
|
21
|
+
|
22
|
+
No tests because I don't know how to write tests yet.
|
23
|
+
|
24
|
+
|
25
|
+
#### todo
|
26
|
+
|
27
|
+
- [ ] showticket should give requester name
|
28
|
+
- [ ] showticket should left/right justify for requester/agent
|
29
|
+
- [ ] Ability to post updates to tickets
|
30
|
+
- [ ] Ability to change status of tickets
|
data/bin/zendeath
ADDED
data/lib/commands.rb
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
class Commands
|
2
|
+
def initialize(baseurl, username, password)
|
3
|
+
@uri = URI.parse("https://#{baseurl}/")
|
4
|
+
@username = username
|
5
|
+
@password = password
|
6
|
+
@uri.path = '/api/v2/users/me.json'
|
7
|
+
@current_user_info = JSON.parse(makerequest)
|
8
|
+
end
|
9
|
+
|
10
|
+
def localinfo
|
11
|
+
puts @uri
|
12
|
+
puts @username
|
13
|
+
puts @password
|
14
|
+
end
|
15
|
+
|
16
|
+
def makerequest(type='Get', body='')
|
17
|
+
@http = Net::HTTP.new(@uri.host, @uri.port)
|
18
|
+
@http.use_ssl = true
|
19
|
+
@http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
20
|
+
|
21
|
+
if type == 'Get'
|
22
|
+
@request = Net::HTTP::Get.new(@uri.request_uri)
|
23
|
+
elsif type == 'Put'
|
24
|
+
@request = Net::HTTP::Put.new(@uri.request_uri)
|
25
|
+
@reqest.body = body
|
26
|
+
else
|
27
|
+
raise ArgumentError.new('Unrecognized HTTP request type.')
|
28
|
+
end
|
29
|
+
|
30
|
+
@request.basic_auth(@username, @password)
|
31
|
+
return @response = @http.request(@request).body
|
32
|
+
end
|
33
|
+
|
34
|
+
def get_this_user(userid)
|
35
|
+
@uri.path = "/api/v2/users/#{userid}.json"
|
36
|
+
@uri.query = ''
|
37
|
+
return JSON.parse(makerequest)['user']
|
38
|
+
end
|
39
|
+
|
40
|
+
def me
|
41
|
+
def userelement(field)
|
42
|
+
@current_user_info['user'][field]
|
43
|
+
end
|
44
|
+
|
45
|
+
user_name = userelement('name')
|
46
|
+
user_email = userelement('email')
|
47
|
+
user_role = userelement('role')
|
48
|
+
user_created = userelement('created_at')
|
49
|
+
user_last_login = userelement('last_login_at')
|
50
|
+
user_time_zone = userelement('time_zone')
|
51
|
+
|
52
|
+
puts "Name: #{user_name}"
|
53
|
+
puts "Email: #{user_email}"
|
54
|
+
puts "Role: #{user_role}"
|
55
|
+
puts "Created: #{user_created}"
|
56
|
+
puts "Last Login: #{user_last_login}"
|
57
|
+
puts "Time Zone: #{user_time_zone}"
|
58
|
+
end
|
59
|
+
|
60
|
+
def alltickets
|
61
|
+
@uri.path = '/api/v2/tickets.json'
|
62
|
+
@response = JSON.parse(makerequest)
|
63
|
+
alltickets = @response['tickets']
|
64
|
+
|
65
|
+
pagecount = 1
|
66
|
+
|
67
|
+
while @response['next_page'] != nil
|
68
|
+
pagecount += 1
|
69
|
+
@uri.query = 'page=' + pagecount.to_s
|
70
|
+
@response = JSON.parse(makerequest)
|
71
|
+
alltickets.concat(@response['tickets'])
|
72
|
+
end
|
73
|
+
|
74
|
+
unsolved_tickets = alltickets.reject { |element| element['status'] == 'closed' }
|
75
|
+
|
76
|
+
puts "Total Tickets: #{alltickets.length.to_s}"
|
77
|
+
puts "Unsolved Tickets: #{unsolved_tickets.length.to_s}"
|
78
|
+
end
|
79
|
+
|
80
|
+
def myworking
|
81
|
+
@uri.path = '/api/v2/search.json'
|
82
|
+
@uri.query = URI.encode("query=status<solved+assignee:#{@username}+type:ticket")
|
83
|
+
@my_working_tickets = JSON.parse(makerequest)['results']
|
84
|
+
|
85
|
+
@my_working_tickets.each do |ticket|
|
86
|
+
requester = get_this_user(ticket['requester_id'])['name']
|
87
|
+
puts ticket['id'].to_s + ': ' + ticket['subject']
|
88
|
+
puts "Requester: #{requester}"
|
89
|
+
puts 'Status: ' + ticket['status']
|
90
|
+
puts ''
|
91
|
+
end
|
92
|
+
puts "Total Working Tickets: #{@my_working_tickets.length}"
|
93
|
+
end
|
94
|
+
|
95
|
+
def ticketinfo(ticketid)
|
96
|
+
@uri.path = "/api/v2/tickets/#{ticketid.to_s}.json"
|
97
|
+
JSON.parse(makerequest)
|
98
|
+
end
|
99
|
+
|
100
|
+
def ticketcomments(ticketid)
|
101
|
+
@uri.path = "/api/v2/tickets/#{ticketid.to_s}/comments.json"
|
102
|
+
JSON.parse(makerequest)
|
103
|
+
end
|
104
|
+
|
105
|
+
def showticket(ticketid)
|
106
|
+
info = ticketinfo(ticketid)
|
107
|
+
comments = ticketcomments(ticketid)
|
108
|
+
|
109
|
+
puts "Ticket ID: #{info['ticket']['id']}"
|
110
|
+
puts "Status: #{info['ticket']['status']}"
|
111
|
+
puts "Last Updated: #{info['ticket']['updated_at']}"
|
112
|
+
puts "Subject: #{info['ticket']['subject']}"
|
113
|
+
puts ""
|
114
|
+
comments['comments'].reverse.each do |comment|
|
115
|
+
puts "Timestamp: #{comment['created_at']}"
|
116
|
+
puts "Comment: #{comment['body']}"
|
117
|
+
puts "########################"
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def updateticket(ticketid, comment, status='open', is_public='true')
|
122
|
+
# https://support.puppetlabs.com/api/v2/tickets/3717.json
|
123
|
+
@uri.path = "/api/v2/tickets/#{ticketid.to_s}.json"
|
124
|
+
unless status == ('pending' || 'open' || 'on-hold' || 'solved')
|
125
|
+
raise ArgumentError.new('Valid ticket status is pending, on-hold, open, or solved.')
|
126
|
+
end
|
127
|
+
updatearray = {
|
128
|
+
'ticket' => {
|
129
|
+
'comment' => { 'body' => comment, 'public' => is_public },
|
130
|
+
'status' => status
|
131
|
+
}
|
132
|
+
}
|
133
|
+
updatearray_json = updatearray.to_json
|
134
|
+
response = makerequest('Put', updatearray_json)
|
135
|
+
end
|
136
|
+
|
137
|
+
|
138
|
+
end
|
data/lib/zendeath.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#$LOAD_PATH << File.dirname(__FILE__)
|
3
|
+
|
4
|
+
module Zendeath
|
5
|
+
require 'net/http'
|
6
|
+
require 'net/https'
|
7
|
+
require 'yaml'
|
8
|
+
require 'json'
|
9
|
+
require 'commands'
|
10
|
+
|
11
|
+
configdata = YAML.load_file(ENV['HOME'] + '/.zendeath.yaml')
|
12
|
+
baseurl = configdata[:baseurl]
|
13
|
+
username = configdata[:username]
|
14
|
+
password = configdata[:password]
|
15
|
+
|
16
|
+
command = Commands.new(baseurl, username, password)
|
17
|
+
|
18
|
+
case ARGV[0]
|
19
|
+
when 'localinfo'
|
20
|
+
command.localinfo
|
21
|
+
when 'me'
|
22
|
+
command.me
|
23
|
+
when 'alltickets'
|
24
|
+
command.alltickets
|
25
|
+
when 'myworking'
|
26
|
+
command.myworking
|
27
|
+
when 'ticketinfo'
|
28
|
+
command.ticketinfo(ARGV[1])
|
29
|
+
when 'ticketcomments'
|
30
|
+
command.ticketcomments(ARGV[1])
|
31
|
+
when 'update'
|
32
|
+
# def updateticket(ticketid, comment, status='open', is_public='true')
|
33
|
+
|
34
|
+
command.updateticket(ARGV[1])
|
35
|
+
when 'showticket'
|
36
|
+
unless ARGV.length == 2
|
37
|
+
raise ArgumentError.new('showticket requires a ticket number')
|
38
|
+
end
|
39
|
+
command.showticket(ARGV[1])
|
40
|
+
else
|
41
|
+
puts 'Error!
|
42
|
+
Current commands include:
|
43
|
+
- localinfo
|
44
|
+
- me
|
45
|
+
- alltickets
|
46
|
+
- myworking
|
47
|
+
- ticketinfo <ticketid> - Not useful on its own.
|
48
|
+
- ticketcomments <ticketid> - Not useful on its own.
|
49
|
+
- showticket <ticketid>
|
50
|
+
- update <ticketid> <comment> [status] [public]
|
51
|
+
|
52
|
+
<param> - required param
|
53
|
+
[param] - optional param'
|
54
|
+
end
|
55
|
+
end
|
metadata
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: zendeath
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Zachary Alex Stern
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-12-10 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Zendeath is a command line client for Zendesk, primarily focused on Puppet
|
14
|
+
Labs' use case, but may be made more generic in the future.
|
15
|
+
email: zacharyalexstern@gmail.com
|
16
|
+
executables:
|
17
|
+
- zendeath
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- lib/commands.rb
|
22
|
+
- lib/zendeath.rb
|
23
|
+
- bin/zendeath
|
24
|
+
- LICENSE
|
25
|
+
- README.md
|
26
|
+
homepage: https://github.com/zacharyalexstern/zendeath
|
27
|
+
licenses:
|
28
|
+
- WTFPL
|
29
|
+
metadata: {}
|
30
|
+
post_install_message:
|
31
|
+
rdoc_options: []
|
32
|
+
require_paths:
|
33
|
+
- lib
|
34
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
35
|
+
requirements:
|
36
|
+
- - '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
requirements: []
|
45
|
+
rubyforge_project:
|
46
|
+
rubygems_version: 2.0.3
|
47
|
+
signing_key:
|
48
|
+
specification_version: 4
|
49
|
+
summary: Command Line Zendeath
|
50
|
+
test_files: []
|