File: niscript

package info (click to toggle)
postfix 2.3.8-2%2Betch1
  • links: PTS
  • area: main
  • in suites: etch
  • size: 15,744 kB
  • ctags: 11,426
  • sloc: ansic: 81,810; makefile: 10,743; sh: 7,874; perl: 2,468; awk: 41
file content (164 lines) | stat: -rwxr-xr-x 4,352 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
#!/usr/bin/perl

# niscript.pl by Gerben Wierda <gerben_wierda@rna.nl>

# This little script is an adaptation of the original niscript sh script by
# Joe Block <jpb@creol.ucf.edu>
# instead of using fixed uid/gid and thus not robust if you run it on a
# system where groups and/or users have been added, this script checks
# if the users/groups are there and if not creates them with free id's.

# 17 Jul 2002 GW: Fixed two bugs
# 1. Typo in createuser would always have uid 88 for postfix
# 2. Add to netinfo domain . instead of / so that it also works on systems
#    where the / domain is actually network-wide (not very useful to add
#    a postfix user to all systems in that netinfo domain...)

print <<_WARNING

This script massages your netinfo database.  This can severely break
your system.  If your netinfo database breaks, you get to keep the parts.

No Warranty. Really.

This script tries to create two groups (if they do not already exist):
- postfix
- maildrop
and tries to create a user (if it does not already exist)
- postfix
which is member of group postfix.

_WARNING
;

# The script starts to look at id 88 (both for user and group) and up to 65535
# It dies if no free id is found.

my $postfixgid = undef;
my $maildropgid = undef;
my $postfixuid = undef;

# First create

my @groups = readgroups();
foreach $group (@groups) {
	(my $groupname, undef, my $gid, undef) = split( ':', $group);
	if ($groupname eq 'postfix') {
		warn "You already have a postfix group (with gid $gid)\n";
		$postfixgid = $gid;
	}
	if ($groupname eq 'maildrop') {
		warn "You already have a maildrop group (with gid $gid)\n";
		$maildropgid = $gid;
	}
}

if (not defined $postfixgid) {
	$postfixgid = creategroup( 'postfix');
}

if (not defined $maildropgid) {
	$maildropgid = creategroup( 'maildrop');
}

my @users = readusers();
foreach $user (@users) {
	(my $username, undef, my $uid, undef) = split( ':', $user);
	if ($username eq 'postfix') {
		warn "You already have a postfix user (with uid $uid)\n";
		$postfixuid = $uid;
	}
}

if (not defined $postfixuid) {
	$postfixuid = createuser( 'postfix', '"Postfix User"',
				  '/usr/bin/false', '/etc/postfix',
				  $postfixgid);
	addusertogroup( 'postfix', 'postfix');
}

warn "\n";

sub creategroup
{
	my $name = shift;
	open( NIDUMP, "nidump group .|") or die "Cannot run nidump\n";
	my @groups=<NIDUMP>;
	close( NIDUMP);

	my $tryno;
	NEXTNO: for ($tryno = 88; $tryno <= 65535; $tryno++) {
		foreach my $group (@groups) {
			(my $groupname, undef, my $gid, undef) =
				split( ':', $group);
			next NEXTNO if $gid == $tryno;
		}
		last NEXTNO;
	}
	die "Cannot find free gid\n" if $tryno == 65536;
	warn "Will create $name as gid $tryno\n"; 
	system "niutil -create . /groups/$name";
	system "niutil -createprop . /groups/$name name $name";
	system "niutil -createprop . /groups/$name gid $tryno";
	system "niutil -createprop . /groups/$name passwd '*'";
	return $tryno;
}

sub addusertogroup
{
	my $user = shift;
	my $group = shift;
	system "niutil -appendprop . /groups/$group users $user";
}

sub readgroups
{
	open( NIDUMP, "nidump group .|") or die "Cannot run nidump\n";
	my @groups=<NIDUMP>;
	close( NIDUMP);
	return @groups;
}

sub readusers
{
	my @passwd;
	open( NIDUMP, "nidump passwd .|") or die "Cannot run nidump\n";
	@passwd=<NIDUMP>;
	close( NIDUMP);
	return @passwd;
}

sub createuser
{
	my $name = shift;
	my $realname = shift;
	my $shell = shift;
	my $home = shift;
	my $gid = shift;

	open( NIDUMP, "nidump passwd .|") or die "Cannot run nidump\n";
	my @passwds=<NIDUMP>;
	close( NIDUMP);

	my $tryno;
	NEXTNO: for ($tryno = 88; $tryno <= 65535; $tryno++) {
		foreach my $passwd (@passwds) {
			(my $passwdname, undef, my $uid, undef) =
				split( ':', $passwd);
			next NEXTNO if $uid == $tryno;
		}
		last NEXTNO;
	}
	die "Cannot find free uid\n" if $tryno == 65536;
	warn "Will create $name as uid $tryno\n"; 
	system "niutil -create . /users/$name";
	system "niutil -createprop . /users/$name realname $realname";
	system "niutil -createprop . /users/$name shell $shell";
	system "niutil -createprop . /users/$name uid $tryno";
	system "niutil -createprop . /users/$name gid $gid";
	system "niutil -createprop . /users/$name home $home";
	system "niutil -createprop . /users/$name _shadow_passwd";
	system "niutil -createprop . /users/$name passwd '*'";
	return $tryno;
}