Command plugin and viewer for id(1)
This commit is contained in:
parent
57b621a51c
commit
4fce440abc
|
@ -1,5 +1,145 @@
|
||||||
(define key-return 10)
|
(define key-return 10)
|
||||||
|
|
||||||
|
(define-record-type id-output :id-output
|
||||||
|
(make-id-output uid name gid group groups)
|
||||||
|
id-output?
|
||||||
|
(uid id-output-uid)
|
||||||
|
(name id-output-name)
|
||||||
|
(gid id-output-gid)
|
||||||
|
(group id-output-group)
|
||||||
|
(groups id-output-groups))
|
||||||
|
|
||||||
|
(define id-regexp
|
||||||
|
(rx
|
||||||
|
(: "uid=" (submatch (+ digit))
|
||||||
|
"(" (submatch (+ alphabetic))
|
||||||
|
") gid=" (submatch (+ digit))
|
||||||
|
"(" (submatch (+ alphabetic))
|
||||||
|
") groups=" (submatch (* any)))))
|
||||||
|
|
||||||
|
(define (parse-group-list s)
|
||||||
|
(let ((gid-or-gid/name
|
||||||
|
(rx (| (submatch (+ digit))
|
||||||
|
(: (submatch (+ digit))
|
||||||
|
"("
|
||||||
|
(submatch (+ alphabetic))
|
||||||
|
")")))))
|
||||||
|
(regexp-fold
|
||||||
|
gid-or-gid/name
|
||||||
|
(lambda (start match l)
|
||||||
|
(cond ((match:substring match 1)
|
||||||
|
=> (lambda (gid)
|
||||||
|
(cons gid l)))
|
||||||
|
(else
|
||||||
|
(cons (cons (match:substring match 2)
|
||||||
|
(match:substring match 3))
|
||||||
|
l))))
|
||||||
|
'() s)))
|
||||||
|
|
||||||
|
(define (id command args)
|
||||||
|
;; TODO parse command line arguments
|
||||||
|
(let* ((maybe-username (if (null? args)
|
||||||
|
'()
|
||||||
|
args))
|
||||||
|
(out (run/string (id ,@ maybe-username)))
|
||||||
|
(match (regexp-search id-regexp out)))
|
||||||
|
(if match
|
||||||
|
(make-id-output
|
||||||
|
(match:substring match 1)
|
||||||
|
(match:substring match 2)
|
||||||
|
(match:substring match 3)
|
||||||
|
(match:substring match 4)
|
||||||
|
(parse-group-list (match:substring match 5)))
|
||||||
|
'cannot-parse)))
|
||||||
|
|
||||||
|
(register-plugin!
|
||||||
|
(make-command-plugin
|
||||||
|
"id"
|
||||||
|
#f
|
||||||
|
id))
|
||||||
|
|
||||||
|
(define (make-id-output-select-list ido num-lines)
|
||||||
|
(make-select-list
|
||||||
|
`(,(make-unmarked-element
|
||||||
|
(cons 'user
|
||||||
|
(string->number
|
||||||
|
(id-output-uid ido)))
|
||||||
|
#t
|
||||||
|
(string-append "UID: " (id-output-uid ido)))
|
||||||
|
,(make-unmarked-element
|
||||||
|
(cons 'user (id-output-name ido))
|
||||||
|
#t
|
||||||
|
(string-append "Name: " (id-output-name ido)))
|
||||||
|
,(make-unmarked-element
|
||||||
|
(cons 'group
|
||||||
|
(string->number
|
||||||
|
(id-output-gid ido)))
|
||||||
|
#t
|
||||||
|
(string-append "GID: " (id-output-gid ido)))
|
||||||
|
,(make-unmarked-element
|
||||||
|
(cons 'group
|
||||||
|
(id-output-group ido))
|
||||||
|
#t
|
||||||
|
(string-append "GID: " (id-output-group ido)))
|
||||||
|
,(make-unmarked-element
|
||||||
|
'text
|
||||||
|
#f
|
||||||
|
"Groups:")
|
||||||
|
,@(map (lambda (group)
|
||||||
|
(let ((gid (if (pair? group)
|
||||||
|
(car group)
|
||||||
|
group))
|
||||||
|
(gname (if (pair? group)
|
||||||
|
(cdr group)
|
||||||
|
"")))
|
||||||
|
(make-unmarked-element
|
||||||
|
(cons 'group (string->number gid))
|
||||||
|
#t
|
||||||
|
(string-append " " gid " " gname))))
|
||||||
|
(id-output-groups ido)))
|
||||||
|
num-lines))
|
||||||
|
|
||||||
|
(define (make-id-output-browser ido buffer)
|
||||||
|
(let ((ido ido)
|
||||||
|
(buffer buffer)
|
||||||
|
(selection-list
|
||||||
|
(make-id-output-select-list
|
||||||
|
ido
|
||||||
|
(result-buffer-num-lines buffer))))
|
||||||
|
(lambda (message)
|
||||||
|
(case message
|
||||||
|
((paint)
|
||||||
|
(lambda (self . args)
|
||||||
|
(apply paint-selection-list
|
||||||
|
selection-list args)))
|
||||||
|
((key-press)
|
||||||
|
(lambda (self key control-x-pressed?)
|
||||||
|
(cond
|
||||||
|
((= key key-return)
|
||||||
|
(let ((selected
|
||||||
|
(select-list-selected-entry selection-list)))
|
||||||
|
(cond
|
||||||
|
((and (pair? selected)
|
||||||
|
(eq? (car selected) 'user))
|
||||||
|
(make-user-info-browser
|
||||||
|
(user-info (cdr selected)) buffer))
|
||||||
|
((and (pair? selected)
|
||||||
|
(eq? (car selected) 'group))
|
||||||
|
(make-group-info-browser
|
||||||
|
(group-info (cdr selected)) buffer))
|
||||||
|
(else self))))
|
||||||
|
(else
|
||||||
|
(set! selection-list
|
||||||
|
(select-list-handle-key-press
|
||||||
|
selection-list key))
|
||||||
|
self))))
|
||||||
|
(else
|
||||||
|
(error "unknown message in make-id-output-browser"
|
||||||
|
message))))))
|
||||||
|
|
||||||
|
(register-plugin!
|
||||||
|
(make-view-plugin make-id-output-browser id-output?))
|
||||||
|
|
||||||
(define (make-gi-select-list gi num-lines)
|
(define (make-gi-select-list gi num-lines)
|
||||||
(make-select-list
|
(make-select-list
|
||||||
`(,(make-unmarked-element 'name
|
`(,(make-unmarked-element 'name
|
||||||
|
|
Loading…
Reference in New Issue