You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
49 lines
2.0 KiB
49 lines
2.0 KiB
#!/usr/bin/env guile |
|
!# |
|
|
|
;;;Создан: Сб 10 июл 2010 19:29:10 |
|
;;;Изменён: Вс 21 июл 2010 01:40:25 |
|
|
|
;;; |
|
;;; Скрипт составления команды UNIX Shell для добавления пользователя в группы. |
|
;;; Группы добавляются к уже имеющимся. |
|
;;; |
|
;;; (c) 2010, Maxim Lihachev, <envrm@yandex.ru> |
|
;;; |
|
|
|
;;Стандартные группы для пользователей |
|
(define default-groups (list "plugdev" "audio" "video" "cdrom" "scanner" "users")) |
|
|
|
;;Получение первого элемента вектора |
|
(define (vector-car vector) (vector-ref vector 0)) |
|
|
|
;;Получение списка существующих групп |
|
(define (get-all-groups) |
|
(do ( (group (getgr) (getgr)) |
|
(groups '() (append groups (list group)))) |
|
((not (vector? group)) groups))) |
|
|
|
;;Получение списка групп, в которые входит данный пользователь |
|
(define (get-old-groups user groups) |
|
(map vector-car (filter (lambda (g) (member user (group:mem g))) groups))) |
|
|
|
;;Получение списка групп, в которые должен входить пользователь |
|
(define (get-new-groups groups) |
|
(filter (lambda (x) (not (member x groups))) default-groups)) |
|
|
|
;;Создание команды оболочки для добавления пользователя в группы |
|
(define (make-command user groups) |
|
(format #f "usermod -G ~A ~A\n" (string-join groups ",") user)) |
|
|
|
;;;----------------------------------------------------------------------------- |
|
;;Формирование команд оболочки |
|
(let* ( (all-groups (get-all-groups)) |
|
(users (if (< 1 (length (command-line))) |
|
(cdr (command-line)) |
|
(list (cuserid)))) |
|
(get-command (lambda (user) |
|
(let* ( (oldg (get-old-groups user all-groups)) |
|
(newg (get-new-groups oldg))) |
|
(display (make-command user (append oldg newg))))))) |
|
(for-each get-command users)) |
|
|
|
|