#!/usr/bin/env guile !# ;;;Создан: Сб 10 июл 2010 19:29:10 ;;;Изменён: Вс 21 июл 2010 01:40:25 ;;; ;;; Скрипт составления команды UNIX Shell для добавления пользователя в группы. ;;; Группы добавляются к уже имеющимся. ;;; ;;; (c) 2010, Maxim Lihachev, ;;; ;;Стандартные группы для пользователей (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))