logstash-input-trello 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,748 @@
1
+ # encoding: utf-8
2
+
3
+ require 'uri'
4
+ require 'net/http'
5
+ require 'json'
6
+ require 'set'
7
+
8
+ module TrelloUtils
9
+ class TrelloClient
10
+ attr_reader(:host, :port, :organizations, :key, :token, :board_ids,
11
+ :parameters, :filters, :fields, :entities)
12
+
13
+ def initialize(kwargs={
14
+ organizations: [], # an array of organizations from which to derive board ids
15
+ key: nil, # oauth key
16
+ token: nil, # oauth secret
17
+ board_ids: [],
18
+ fields: PARAM_DEFAULT_FIELDS,
19
+ filters: {},
20
+ port: 443 # trello REST port
21
+ })
22
+
23
+ @organizations = kwargs[:organizations]
24
+ @key = kwargs[:key]
25
+ @token = kwargs[:token]
26
+ @board_ids = kwargs[:board_ids]
27
+ @fields = kwargs[:fields]
28
+ @filters = kwargs[:filters]
29
+ @port = kwargs[:port]
30
+
31
+ # get board ids if none are provided
32
+ if @board_ids.empty?
33
+ board_filter = "all"
34
+ if @filters.has_key?("boards")
35
+ if not @filters["boards"].empty?
36
+ board_filter = array_to_uri( @filters["boards"] )
37
+ end
38
+ end
39
+ @board_ids = get_board_ids(@board_ids, board_filter)
40
+ end
41
+
42
+ # create entities hash from select fields in fields
43
+ entities = {}
44
+ @fields.each do |field|
45
+ if ALL_ENTITIES.include?(field)
46
+ state = ALL_ENTITIES[field]
47
+ if state == "false"
48
+ entities[field] = "true"
49
+ elsif state == "none"
50
+ if field == "boardStars"
51
+ entities[field] = "mine"
52
+ else
53
+ entities[field] = "all"
54
+ end
55
+ end
56
+ end
57
+ end
58
+
59
+ # mutate entities hash according to filters
60
+ @filters.each do |key, val|
61
+ if entities.include?(key)
62
+ if val != "none"
63
+ entities[key] = array_to_uri(filters[val])
64
+ end
65
+ end
66
+ end
67
+
68
+ # create fields hash
69
+ @fields = Set.new(@fields)
70
+ new_fields = ALL_FIELDS.clone
71
+ new_fields.to_a.each do |key, val|
72
+ temp = @fields.intersection(val).to_a
73
+ new_fields[key] = array_to_uri(temp)
74
+ end
75
+ @fields = new_fields
76
+
77
+ # merge fields and entities into params
78
+ params = new_fields.merge(entities)
79
+
80
+ # switch out board_fields with fields
81
+ params["fields"] = params["board_fields"]
82
+ params.delete("board_fields")
83
+
84
+ @parameters = params
85
+ end
86
+ # --------------------------------------------------------------------------
87
+
88
+ private
89
+ def array_to_uri(item)
90
+ if item.empty?
91
+ return ""
92
+ else
93
+ return item.join(",")
94
+ end
95
+ end
96
+
97
+ # get board ids
98
+ private
99
+ def get_board_ids(board_ids, board_filter)
100
+ if not board_ids.empty?
101
+ return board_ids
102
+ else
103
+ board_ids = Set.new()
104
+ @organizations.each do |org|
105
+ uri = "/1/organizations/#{org}/boards/#{board_filter}?"
106
+ uri += URI.encode_www_form({key: @key, token: @token})
107
+ response = issue_request(uri)
108
+ response.each do |item|
109
+ board_ids.add(item["shortLink"])
110
+ end
111
+ end
112
+ return board_ids.to_a
113
+ end
114
+ end
115
+
116
+ # construct uri
117
+ public
118
+ def get_uri(board_id, actions_since)
119
+ uri = "/1/boards/#{board_id}?"
120
+ args = {
121
+ "actions_format" => "list",
122
+ "actions_since" => actions_since,
123
+ "actions_limit" => "1000",
124
+ "labels_limit" => "1000",
125
+ "key" => @key,
126
+ "token" => @token
127
+ }
128
+ uri += URI.encode_www_form(@parameters.merge(args))
129
+ return uri
130
+ end
131
+
132
+ public
133
+ def issue_request(uri)
134
+ response = Net::HTTP.new("api.trello.com", @port)
135
+ response.use_ssl = true
136
+ response = response.request_get(uri, {"Connection" => "close"})
137
+ code = response.code.to_i()
138
+ if 199 < code and code < 300
139
+ return JSON.load(response.body)
140
+ else
141
+ @logger.warn("HTTP request error: ", + response)
142
+ raise RuntimeError, "HTTP request failed with code #{code}: #{response}"
143
+ end
144
+ end
145
+ end
146
+ # ------------------------------------------------------------------------------
147
+
148
+
149
+ ALL_FIELDS = {
150
+ "actions" => [
151
+ "addAttachmentToCard",
152
+ "addChecklistToCard",
153
+ "addMemberToBoard",
154
+ "addMemberToCard",
155
+ "addMemberToOrganization",
156
+ "addToOrganizationBoard",
157
+ "commentCard",
158
+ "convertToCardFromCheckItem",
159
+ "copyBoard",
160
+ "copyCard",
161
+ "copyCommentCard",
162
+ "createBoard",
163
+ "createCard",
164
+ "createList",
165
+ "createOrganization",
166
+ "deleteAttachmentFromCard",
167
+ "deleteBoardInvitation",
168
+ "deleteCard",
169
+ "deleteOrganizationInvitation",
170
+ "disablePowerUp",
171
+ "emailCard",
172
+ "enablePowerUp",
173
+ "makeAdminOfBoard",
174
+ "makeNormalMemberOfBoard",
175
+ "makeNormalMemberOfOrganization",
176
+ "makeObserverOfBoard",
177
+ "memberJoinedTrello",
178
+ "moveCardFromBoard",
179
+ "moveCardToBoard",
180
+ "moveListFromBoard",
181
+ "moveListToBoard",
182
+ "removeChecklistFromCard",
183
+ "removeFromOrganizationBoard",
184
+ "removeMemberFromCard",
185
+ "unconfirmedBoardInvitation",
186
+ "unconfirmedOrganizationInvitation",
187
+ "updateBoard",
188
+ "updateCard",
189
+ "updateCard:closed",
190
+ "updateCard:desc",
191
+ "updateCard:idList",
192
+ "updateCard:name",
193
+ "updateCheckItemStateOnCard",
194
+ "updateChecklist",
195
+ "updateList",
196
+ "updateList:closed",
197
+ "updateList:name",
198
+ "updateMember",
199
+ "updateOrganization"
200
+ ],
201
+
202
+ "action_fields" => [
203
+ "data",
204
+ "date",
205
+ "idMemberCreator",
206
+ "type"
207
+ ],
208
+
209
+ "action_member_fields" => [
210
+ "avatarHash",
211
+ "bio",
212
+ "bioData",
213
+ "confirmed",
214
+ "fullName",
215
+ "idPremOrgsAdmin",
216
+ "initials",
217
+ "memberType",
218
+ "products",
219
+ "status",
220
+ "url",
221
+ "username"
222
+ ],
223
+
224
+ "action_memberCreator_fields" => [
225
+ "avatarHash",
226
+ "bio",
227
+ "bioData",
228
+ "confirmed",
229
+ "fullName",
230
+ "idPremOrgsAdmin",
231
+ "initials",
232
+ "memberType",
233
+ "products",
234
+ "status",
235
+ "url",
236
+ "username"
237
+ ],
238
+
239
+ "card_fields" => [
240
+ "badges",
241
+ "checkItemStates",
242
+ "closed",
243
+ "dateLastActivity",
244
+ "desc",
245
+ "descData",
246
+ "due",
247
+ "email",
248
+ "idAttachmentCover",
249
+ "idBoard",
250
+ "idChecklists",
251
+ "idLabels",
252
+ "idList",
253
+ "idMembers",
254
+ "idMembersVoted",
255
+ "idShort",
256
+ "labels",
257
+ "manualCoverAttachment",
258
+ "name",
259
+ "pos",
260
+ "shortLink",
261
+ "shortUrl",
262
+ "subscribed",
263
+ "url"
264
+ ],
265
+
266
+ "card_attachment_fields" => [
267
+ "bytes",
268
+ "date",
269
+ "edgeColor",
270
+ "idMember",
271
+ "isUpload",
272
+ "mimeType",
273
+ "name",
274
+ "previews",
275
+ "url"
276
+ ],
277
+
278
+ "label_fields" => [
279
+ "color",
280
+ "idBoard",
281
+ "name",
282
+ "uses"
283
+ ],
284
+
285
+ "list_fields" => [
286
+ "closed",
287
+ "idBoard",
288
+ "name",
289
+ "pos",
290
+ "subscribed"
291
+ ],
292
+
293
+ "memberships" => [
294
+ "active",
295
+ "admin",
296
+ "deactivated",
297
+ "me",
298
+ "normal"
299
+ ],
300
+
301
+ "memberships_member_fields" => [
302
+ "avatarHash",
303
+ "bio",
304
+ "bioData",
305
+ "confirmed",
306
+ "fullName",
307
+ "idPremOrgsAdmin",
308
+ "initials",
309
+ "memberType",
310
+ "products",
311
+ "status",
312
+ "url",
313
+ "username"
314
+ ],
315
+
316
+ "member_fields" => [
317
+ "avatarHash",
318
+ "bio",
319
+ "bioData",
320
+ "confirmed",
321
+ "fullName",
322
+ "idPremOrgsAdmin",
323
+ "initials",
324
+ "memberType",
325
+ "products",
326
+ "status",
327
+ "url",
328
+ "username"
329
+ ],
330
+
331
+ "membersInvited_fields" => [
332
+ "avatarHash",
333
+ "bio",
334
+ "bioData",
335
+ "confirmed",
336
+ "fullName",
337
+ "idPremOrgsAdmin",
338
+ "initials",
339
+ "memberType",
340
+ "products",
341
+ "status",
342
+ "url",
343
+ "username"
344
+ ],
345
+
346
+ "checklist_fields" => [
347
+ "idBoard",
348
+ "idCard",
349
+ "name",
350
+ "pos"
351
+ ],
352
+
353
+ "organization_fields" => [
354
+ "billableMemberCount",
355
+ "desc",
356
+ "descData",
357
+ "displayName",
358
+ "idBoards",
359
+ "invitations",
360
+ "invited",
361
+ "logoHash",
362
+ "memberships",
363
+ "name",
364
+ "powerUps",
365
+ "prefs",
366
+ "premiumFeatures",
367
+ "products",
368
+ "url",
369
+ "website"
370
+ ],
371
+
372
+ "organization_memberships" => [
373
+ "active",
374
+ "admin",
375
+ "deactivated",
376
+ "me",
377
+ "normal"
378
+ ],
379
+
380
+ "board_fields" => [
381
+ "closed",
382
+ "dateLastActivity",
383
+ "dateLastView",
384
+ "desc",
385
+ "descData",
386
+ "idOrganization",
387
+ "invitations",
388
+ "invited",
389
+ "labelNames",
390
+ "memberships",
391
+ "name",
392
+ "pinned",
393
+ "powerUps",
394
+ "prefs",
395
+ "shortLink",
396
+ "shortUrl",
397
+ "starred",
398
+ "subscribed",
399
+ "url"
400
+ ]
401
+ }
402
+
403
+ ALL_ENTITIES = {
404
+ "actions_entities" => "false",
405
+ "action_member" => "false",
406
+ "action_memberCreator" => "false",
407
+ "card_stickers" => "false",
408
+ "memberships_member" => "false",
409
+ "organization" => "false",
410
+ "myPrefs" => "false",
411
+ "card_attachments" => "false",
412
+ "cards" => "none",
413
+ "card_checklists" => "none",
414
+ "boardStars" => "none",
415
+ "labels" => "none",
416
+ "lists" => "none",
417
+ "members" => "none",
418
+ "membersInvited" => "none",
419
+ "checklists" => "none"
420
+ }
421
+
422
+ ALL_FILTERS = {
423
+ "cards" => [
424
+ "open",
425
+ "closed",
426
+ "visible"
427
+ ],
428
+
429
+ "lists" => [
430
+ "open",
431
+ "closed"
432
+
433
+ ],
434
+
435
+ "members" => [
436
+ "admins",
437
+ "normal",
438
+ "owners"
439
+ ],
440
+
441
+ "membersInvited" => [
442
+ "admins",
443
+ "normal",
444
+ "owners"
445
+ ],
446
+
447
+ "boards" => [
448
+ "closed",
449
+ "members",
450
+ "open",
451
+ "organization",
452
+ "pinned",
453
+ "public",
454
+ "starred",
455
+ "unpinned"
456
+ ]
457
+ }
458
+
459
+ PARAM_ALL_FIELDS = [
460
+ "actions_entities",
461
+ "action_member",
462
+ "action_memberCreator",
463
+ "card_stickers",
464
+ "memberships_member",
465
+ "organization",
466
+ "myPrefs",
467
+ "card_attachments",
468
+ "cards",
469
+ "card_checklists",
470
+ "boardStars",
471
+ "labels",
472
+ "lists",
473
+ "members",
474
+ "membersInvited",
475
+ "checklists",
476
+ "active",
477
+ "addAttachmentToCard",
478
+ "addChecklistToCard",
479
+ "addMemberToBoard",
480
+ "addMemberToCard",
481
+ "addMemberToOrganization",
482
+ "addToOrganizationBoard",
483
+ "admin",
484
+ "admins",
485
+ "avatarHash",
486
+ "badges",
487
+ "billableMemberCount",
488
+ "bio",
489
+ "bioData",
490
+ "bytes",
491
+ "checkItemStates",
492
+ "closed",
493
+ "color",
494
+ "commentCard",
495
+ "confirmed",
496
+ "convertToCardFromCheckItem",
497
+ "copyBoard",
498
+ "copyCard",
499
+ "copyCommentCard",
500
+ "count",
501
+ "createBoard",
502
+ "createCard",
503
+ "createList",
504
+ "createOrganization",
505
+ "data",
506
+ "date",
507
+ "dateLastActivity",
508
+ "dateLastView",
509
+ "deactivated",
510
+ "deleteAttachmentFromCard",
511
+ "deleteBoardInvitation",
512
+ "deleteCard",
513
+ "deleteOrganizationInvitation",
514
+ "desc",
515
+ "descData",
516
+ "disablePowerUp",
517
+ "displayName",
518
+ "due",
519
+ "edgeColor",
520
+ "email",
521
+ "emailCard",
522
+ "enablePowerUp",
523
+ "fullName",
524
+ "idAttachmentCover",
525
+ "idBoard",
526
+ "idBoards",
527
+ "idCard",
528
+ "idChecklists",
529
+ "idLabels",
530
+ "idList",
531
+ "idMember",
532
+ "idMemberCreator",
533
+ "idMembers",
534
+ "idMembersVoted",
535
+ "idOrganization",
536
+ "idPremOrgsAdmin",
537
+ "idShort",
538
+ "initials",
539
+ "invitations",
540
+ "invited",
541
+ "isUpload",
542
+ "labelNames",
543
+ "labels",
544
+ "list",
545
+ "logoHash",
546
+ "makeAdminOfBoard",
547
+ "makeNormalMemberOfBoard",
548
+ "makeNormalMemberOfOrganization",
549
+ "makeObserverOfBoard",
550
+ "manualCoverAttachment",
551
+ "me",
552
+ "memberJoinedTrello",
553
+ "memberType",
554
+ "memberships",
555
+ "mimeType",
556
+ "mine",
557
+ "minimal",
558
+ "moveCardFromBoard",
559
+ "moveCardToBoard",
560
+ "moveListFromBoard",
561
+ "moveListToBoard",
562
+ "name",
563
+ "normal",
564
+ "open",
565
+ "owners",
566
+ "pinned",
567
+ "pos",
568
+ "powerUps",
569
+ "prefs",
570
+ "premiumFeatures",
571
+ "previews",
572
+ "products",
573
+ "removeChecklistFromCard",
574
+ "removeFromOrganizationBoard",
575
+ "removeMemberFromCard",
576
+ "shortLink",
577
+ "shortUrl",
578
+ "starred",
579
+ "status",
580
+ "subscribed",
581
+ "type",
582
+ "unconfirmedBoardInvitation",
583
+ "unconfirmedOrganizationInvitation",
584
+ "updateBoard",
585
+ "updateCard",
586
+ "updateCard:closed",
587
+ "updateCard:desc",
588
+ "updateCard:idList",
589
+ "updateCard:name",
590
+ "updateCheckItemStateOnCard",
591
+ "updateChecklist",
592
+ "updateList",
593
+ "updateList:closed",
594
+ "updateList:name",
595
+ "updateMember",
596
+ "updateOrganization",
597
+ "url",
598
+ "username",
599
+ "uses",
600
+ "visible",
601
+ "website"
602
+ ]
603
+
604
+ PARAM_DEFAULT_FIELDS = [
605
+ # "actions_entities",
606
+ "action_member",
607
+ "action_memberCreator",
608
+ # "card_stickers",
609
+ # "memberships_member",
610
+ # "organization",
611
+ # "myPrefs",
612
+ # "card_attachments",
613
+ "cards",
614
+ "card_checklists",
615
+ # "boardStars",
616
+ "labels",
617
+ "lists",
618
+ "members",
619
+ # "membersInvited",
620
+ "checklists",
621
+ "active",
622
+ "addAttachmentToCard",
623
+ "addChecklistToCard",
624
+ "addMemberToBoard",
625
+ "addMemberToCard",
626
+ "addMemberToOrganization",
627
+ "addToOrganizationBoard",
628
+ "admin",
629
+ "admins",
630
+ # "avatarHash",
631
+ # "badges",
632
+ "billableMemberCount",
633
+ "bio",
634
+ # "bioData",
635
+ "bytes",
636
+ "checkItemStates",
637
+ "closed",
638
+ "color",
639
+ "commentCard",
640
+ # "confirmed",
641
+ "convertToCardFromCheckItem",
642
+ "copyBoard",
643
+ "copyCard",
644
+ "copyCommentCard",
645
+ "count",
646
+ "createBoard",
647
+ "createCard",
648
+ "createList",
649
+ "createOrganization",
650
+ "data",
651
+ "date",
652
+ "dateLastActivity",
653
+ "dateLastView",
654
+ "deactivated",
655
+ "deleteAttachmentFromCard",
656
+ "deleteBoardInvitation",
657
+ "deleteCard",
658
+ "deleteOrganizationInvitation",
659
+ "desc",
660
+ # "descData",
661
+ "disablePowerUp",
662
+ "displayName",
663
+ "due",
664
+ # "edgeColor",
665
+ # "email",
666
+ # "emailCard",
667
+ # "enablePowerUp",
668
+ "fullName",
669
+ # "idAttachmentCover",
670
+ "idBoard",
671
+ "idBoards",
672
+ "idCard",
673
+ "idChecklists",
674
+ "idLabels",
675
+ "idList",
676
+ "idMember",
677
+ "idMemberCreator",
678
+ "idMembers",
679
+ "idMembersVoted",
680
+ "idOrganization",
681
+ # "idPremOrgsAdmin",
682
+ # "idShort",
683
+ # "initials",
684
+ # "invitations",
685
+ # "invited",
686
+ "isUpload",
687
+ "labelNames",
688
+ "labels",
689
+ "list",
690
+ # "logoHash",
691
+ "makeAdminOfBoard",
692
+ "makeNormalMemberOfBoard",
693
+ "makeNormalMemberOfOrganization",
694
+ "makeObserverOfBoard",
695
+ "manualCoverAttachment",
696
+ "me",
697
+ "memberJoinedTrello",
698
+ # "memberType",
699
+ # "memberships",
700
+ # "mimeType",
701
+ "mine",
702
+ "minimal",
703
+ "moveCardFromBoard",
704
+ "moveCardToBoard",
705
+ "moveListFromBoard",
706
+ "moveListToBoard",
707
+ "name",
708
+ "normal",
709
+ "open",
710
+ "owners",
711
+ # "pinned",
712
+ "pos",
713
+ # "powerUps",
714
+ # "prefs",
715
+ "premiumFeatures",
716
+ "previews",
717
+ # "products",
718
+ "removeChecklistFromCard",
719
+ "removeFromOrganizationBoard",
720
+ "removeMemberFromCard",
721
+ "shortLink",
722
+ # "shortUrl",
723
+ # "starred",
724
+ "status",
725
+ # "subscribed",
726
+ "type",
727
+ "unconfirmedBoardInvitation",
728
+ "unconfirmedOrganizationInvitation",
729
+ "updateBoard",
730
+ "updateCard",
731
+ "updateCard:closed",
732
+ "updateCard:desc",
733
+ "updateCard:idList",
734
+ "updateCard:name",
735
+ "updateCheckItemStateOnCard",
736
+ "updateChecklist",
737
+ "updateList",
738
+ "updateList:closed",
739
+ "updateList:name",
740
+ "updateMember",
741
+ "updateOrganization",
742
+ # "url",
743
+ "username",
744
+ "uses",
745
+ "visible",
746
+ "website"
747
+ ]
748
+ end