Sisyphus repository
Last update: 1 october 2023 | SRPMs: 18631 | Visits: 37420681
en ru br
ALT Linux repos
S:0.6-alt2
5.0: 0.5-alt1
4.1: 0.4-alt1.M41.1

Group :: System/Configuration/Other
RPM: alterator-groups

 Main   Changelog   Spec   Patches   Sources   Download   Gear   Bugs and FR  Repocop 

alterator-groups-0.5/000075500000000000000000000000001121077064100146655ustar00rootroot00000000000000alterator-groups-0.5/Makefile000064400000000000000000000003751121077064100163320ustar00rootroot00000000000000NAME=groups
DESCRIPTION=alterator module for system groups administration

include /usr/share/alterator/build/module.mak

all:
install: install-module install-data

install-data:
install -d $(sysconfdir)/alterator
cp -a groups $(sysconfdir)/alterator
alterator-groups-0.5/applications/000075500000000000000000000000001121077064100173535ustar00rootroot00000000000000alterator-groups-0.5/applications/groups.desktop000064400000000000000000000004211121077064100222620ustar00rootroot00000000000000[Desktop Entry]
Type=Application
Categories=X-Alterator-Users
Icon=groups
Terminal=false
X-Alterator-URI=/groups
X-Alterator-Weight=20
X-Alterator-Help=groups
Name=Local groups
Name[ru]=Локальные группы
Name[uk]=Групи
Name[pt_BR]=Grupos
Name[es]=Grupos
alterator-groups-0.5/backend3/000075500000000000000000000000001121077064100163375ustar00rootroot00000000000000alterator-groups-0.5/backend3/groups000075500000000000000000000134501121077064100176070ustar00rootroot00000000000000#!/bin/sh

alterator_api_version=1
. alterator-sh-functions

# unset this to disable debug
DEBUG=1

# directory with desktop-files
DESKTOPDIR=/etc/alterator/groups

# get min and max gids from /etc/login.defs
get_minmax_gid(){
awk '/^GID_MIN/{gid_min=$2};
/^GID_MAX/{gid_max=$2};
/^UID_MIN/{uid_min=$2};
/^UID_MAX/{uid_max=$2};
END{print gid_min, gid_max, uid_min, uid_max}'\
< /etc/login.defs
}
LOGIN_DEFS_DATA=$(get_minmax_gid)
GID_MIN=$(echo $LOGIN_DEFS_DATA | cut -f1 -d' ')
GID_MAX=$(echo $LOGIN_DEFS_DATA | cut -f2 -d' ')
UID_MIN=$(echo $LOGIN_DEFS_DATA | cut -f3 -d' ')
UID_MAX=$(echo $LOGIN_DEFS_DATA | cut -f4 -d' ')

##############################################################################

gid_of(){
[ -n "$1" ] || return
echo $(getent group $1 | cut -f3 -d:)
}

uid_of(){
[ -n "$1" ] || return
echo $(getent passwd $1 | cut -f3 -d:)
}

# is group with gid $1 a system group
# (gid < GID_MIN or gid > GID_MAX)
test_gid_system(){
[ -n "$1" ] || return
echo $(( ($1<$GID_MIN) || ($1>$GID_MAX)))
}
test_group_system(){
[ -n $1 ] || return
test_gid_system $(gid_of $1)
}

# is group with gid $1 a primary group?
test_gid_primary(){
[ -n "$1" ] || return
getent passwd | cut -f4 -d: | grep $1 > /dev/null
echo $?
}
test_group_primary(){
[ -n $1 ] || return
test_gid_primary $(gid_of $1)
}

# same tests for users
test_uid_system(){
[ -n "$1" ] || return
echo $(( ($1<$UID_MIN) || ($1>$UID_MAX)))
}
test_user_system(){
[ -n $1 ] || return
test_uid_system $(uid_of $1)
}


##############################################################################

skip_empty=""
skip_system=""
skip_primary="#t"

# list system groups (according to $skip_* settings)
on_list(){
write_debug "list groups\n"
local IFS=:
[ "$skip_empty" = "#t" ] && write_debug "skipping empty groups\n"
[ "$skip_system" = "#t" ] && write_debug "skipping system groups\n"
[ "$skip_primary" = "#t" ] && write_debug "skipping primary groups\n"
getent group | sort |
while read name password gid users; do
[ "${name#_}" = "$name" ] &&\
[ "$skip_empty" != "#t" -o -n "$users" ] &&\
[ "$skip_system" != "#t" -o "$(test_gid_system $gid)" = 0 ] &&\
[ "$skip_primary" != "#t" -o "$(test_gid_primary $gid)" = 1 ] &&\
write_enum_item "$name"
done
return 0
}

# read group $in_name
on_read(){
write_debug "read data for group $in_name\n"
local IFS=:
getent group "$in_name" | (
read name password gid users
if [ -f "$DESKTOPDIR/$name.desktop" ]; then
write_string_param label "$(alterator-dump-desktop -v lang="$in_language" -v out="Name" "$DESKTOPDIR/$name.desktop")"
write_string_param comment "$(alterator-dump-desktop -v lang="$in_language" -v out="Comment" "$DESKTOPDIR/$name.desktop")"
fi
write_string_param name "$name"
write_string_param gid "$gid"
write_string_param users "$(echo $users | sed "s/,/\n/g")"
write_string_param label "$label"
write_bool_param protected "$(test_group_system "$name" || test_group_primary "$name")"
)
return 0
}

# create group
on_new(){
write_debug "adding group $in_name\n"

if [ -z "$in_name" ]; then
write_error "`_ "Can't add group with empty name"`" #'
return 1
fi

local ans=$(groupadd "$in_name" 2>&1)
if [ -n "$ans" ]; then
write_error "`_ "Can't add group"`: ${ans##*:}" #'
return 1
fi
return 0
}

# delete group
on_delete(){
write_debug "deleting group $in_name\n"
if [ -z "$in_name" ]; then
write_error "`_ "Can't delete group with empty name"`" #'
return 1
fi
local ans=$(groupdel "$in_name" 2>&1)
if [ -n "$ans" ]; then
write_error "`_ "Can't delete group"`: ${ans##*:}" #'
return 1
fi
return 0
}

# modify users in group
on_write(){
# get old user list
local IFS=:

# users on input can be separated by newline, spaces, commas
local new_users=$(echo "$in_users" | tr "\n " ",," | sed 's/,,*/,/g')
write_debug "change users in group $in_name: $users -> $new_users\n"

if [ -z "$in_name" ]; then
write_error "`_ "Can't modify group with empty name"`" #'
return 1
fi

getent group "$in_name" | (
read name password gid users;

local IFS=','

# remove old users
for ou in $users; do
local eq=
for nu in $new_users; do
[ "$nu" == "$ou" ] && eq=1
done
[ -z "$eq" ] && user_del_from_gr "$ou" "$in_name"
done

# add new users
for nu in $new_users; do
local eq=
for ou in $users; do
[ "$nu" == "$ou" ] && eq=1
done
[ -z "$eq" ] && user_add_to_gr "$nu" "$in_name"
done
)
}

user_add_to_gr(){
write_debug "add user $1 to $2\n"
local mygroups=$2
local IFS=' '
local ans=
for g in $(id -nG $1); do mygroups="$mygroups,$g"; done
ans=$(usermod -G $mygroups $1 2>&1) ||\
write_error "`_ "Can't add user"` $1 `_ "to group"` $2: ${ans##*:}" #'
}

user_del_from_gr(){
write_debug "remove user $1 from $2\n"
local mygroups=
local IFS=' '
local ans=
for g in $(id -nG $1); do
[ "$g" != "$2" ] && mygroups="${mygroups:+$mygroups,}$g";
done
ans=$(usermod -G $mygroups $1 2>&1) ||\
write_error "`_ "Can't remove user"` $1 `_ "from group"` $2: ${ans##*:}" #'
}

on_set_skippings(){
write_debug "set skip_empty=$in_skip_empty skip_system=$in_skip_system skip_primary=$in_skip_primary\n"
skip_empty=$in_skip_empty;
skip_system=$in_skip_system;
skip_primary=$in_skip_primary;
}

##############################################################################
##### Message loop
##############################################################################

on_message() {
case "$in_action" in
list) on_list ;;
read) on_read ;;
write) on_write ;;
new) on_new ;;
delete) on_delete ;;
set_skippings) on_set_skippings ;;
esac
}

message_loop
alterator-groups-0.5/groups/000075500000000000000000000000001121077064100162045ustar00rootroot00000000000000alterator-groups-0.5/groups/audio.desktop000064400000000000000000000001561121077064100207020ustar00rootroot00000000000000[Desktop Entry]
Name=Access to audio devices
Name[ru]=Доступ к звуковым устройствам
alterator-groups-0.5/groups/cdrom.desktop000064400000000000000000000001031121077064100206750ustar00rootroot00000000000000[Desktop Entry]
Name=CD-ROM access
Name[ru]=Доступ к CD-ROM
alterator-groups-0.5/groups/cdwriter.desktop000064400000000000000000000001341121077064100214200ustar00rootroot00000000000000[Desktop Entry]
Name=CD writer access
Name[ru]=Доступ к записи CD-дисков
alterator-groups-0.5/groups/floppy.desktop000064400000000000000000000001561121077064100211120ustar00rootroot00000000000000[Desktop Entry]
Name=Floppy disk access
Name[ru]=Доступ к гибким магнитным дискам
alterator-groups-0.5/groups/scanner.desktop000064400000000000000000000001221121077064100212230ustar00rootroot00000000000000[Desktop Entry]
Name=Access to scanners
Name[ru]=Доступ к сканерам
alterator-groups-0.5/groups/wheel.desktop000064400000000000000000000001441121077064100207020ustar00rootroot00000000000000[Desktop Entry]
Name=System administrators
Name[ru]=Системные администраторы
alterator-groups-0.5/ui/000075500000000000000000000000001121077064100153025ustar00rootroot00000000000000alterator-groups-0.5/ui/groups/000075500000000000000000000000001121077064100166215ustar00rootroot00000000000000alterator-groups-0.5/ui/groups/index.html000064400000000000000000000032551121077064100206230ustar00rootroot00000000000000<html wf="card-index">
<head>
<script src="/design/scripts/submit.js"/>
<script src="/design/scripts/select.js"/>
<script>
effectShow("card-index-delete", "protected", false);
</script>
</head>
<body>

<table><tr>
<td colspan="2">
<form method="POST">
<input type="hidden" name="card-index-mode" value="new"/>
<span translate="_" name="name">New group:</span>
<input type="text" class="text" name="name"/>
<input type="submit" name="card-index-apply-main" value="Create" class="btn"/>
</form>
<hr/>
</td>
</tr><tr>
<td>
<form method="POST" id="ajax-select" class="selector-chooser">
<select name="name" size="12"/><br/>
<input type="submit" name="select" value="Select" class="btn"/>
</form>
</td>
<td>
<form method="POST" class="selector-data">
<div class="selector-name"/>
<table class="form-table">
<tr>
<td><span translate="_" align="right">System name:</span></td>
<td><b><span class="alterator-label" name="name"/></b></td>
</tr>
<tr>
<td><span translate="_" align="right">Description:</span></td>
<td><b><span class="alterator-label" name="label"/></b></td>
</tr>
<tr>
<td valign="top"><span translate="_" align="right">Users:</span></td>
<td><textarea cols="20" rows="8" name="users"/></td>
</tr>
</table>
<input type="checkbox" name="protected" style="visibility:hidden"/>
<input type="submit" name="card-index-apply" value="Apply" class="btn"/>
<input type="reset" value="Reset" class="btn"/>
<input type="submit" name="card-index-delete" value="Delete" class="btn"/>
</form>
</td>
</tr></table>
</body>
</html>
alterator-groups-0.5/ui/groups/index.scm000064400000000000000000000057651121077064100204510ustar00rootroot00000000000000(document:surround "/std/frame")

(define (apply-to-backend)
(woo-catch/message (thunk
(woo-write "/groups/"
'name (or (selector-id value) "")
'users (users-id text)
))))

(define (reset-from-backend)
(woo-catch/message (thunk
(let* ((data (woo-read-first "/groups/"
'name (if (= 0 (selector-id count)) "" (selector-id value))))
(name (woo-get-option data 'name ""))
(label (woo-get-option data 'label ""))
(users (woo-get-option data 'users ""))
(prot (woo-get-option data 'protected #t)) )
(name-id text (string-append "<b>" name "</b>"))
(label-id text (string-append "<b>" label "</b>"))
(users-id text users)
(delete-btn visibility (not prot))
))))

(define (reset-list)
(selector-id (enumref "/groups/"))
(if (> (selector-id count) 0) (selector-id current 0))
(reset-from-backend)
)

(define (reset-skippings)
(format #t "reset skippings~%" )
(woo-catch/message (thunk
(woo-try "set_skippings" "/groups/"
'skip_empty (skip-empty-id value)
'skip_system (skip-system-id value)
'skip_primary (skip-primary-id value)
)))
(reset-list)
)


(define (group-del)
(woo-catch/message (thunk
(woo-try "delete" "/groups" 'name (selector-id value))))
(reset-list)
)

(define (group-add)
(if (woo-catch/message (thunk
(woo-try "new" "/groups" 'name (new-id value))))
(begin
(skip-empty-id value #f)
(reset-skippings)
(selector-id value (new-id value))
(new-id value "")
(reset-from-backend)
)))

;;;

(gridbox columns "10;80;10"

(spacer)
(gridbox columns "0;100;0"
(label text (_ "New group:" ))
(document:id new-id (edit))
(button text (_ "Create") (when clicked (group-add))) )
(spacer)

(spacer)
(gridbox columns "40;60"

(document:id selector-id (listbox
(when selected (reset-from-backend))))

(groupbox text ""
(gridbox columns "0;100"
(label text (_ "System name:") align "right")
(document:id name-id (label text "" text-wrap #t))
(label text (_ "Description:") align "right")
(document:id label-id (label text "" text-wrap #t))

(label text (_ "Users:") align "right;top")
(document:id users-id (textbox))
(spacer)
)

(gridbox columns "33;33;33"
(button text (_ "Apply") (when clicked (apply-to-backend) (reset-from-backend)))
(button text (_ "Reset") (when clicked (reset-from-backend)))
(document:id delete-btn (button text (_ "Delete") (when clicked (group-del))))
)
)

(gridbox columns "100"
(document:id skip-system-id (checkbox (_ "Skip system groups")
value #f (when toggled (reset-skippings))))
(document:id skip-primary-id (checkbox (_ "Skip primary groups")
value #t (when toggled (reset-skippings))))
(document:id skip-empty-id (checkbox (_ "Skip empty groups")
value #f (when toggled (reset-skippings)))))

)
(spacer)
)


(document:root (when loaded (reset-list)))
 
design & coding: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
current maintainer: Michael Shigorin