forked from webmin/webmin
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathchangepass.pl
executable file
·85 lines (79 loc) · 2.17 KB
/
changepass.pl
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
#!/usr/local/bin/perl
# changepass.pl
# Script for the user to change their webmin password
# Check command line arguments
usage() if (@ARGV != 3);
($config, $user, $pass) = @ARGV;
if (!-d $config) {
print STDERR "The config directory $config does not exist\n";
exit 2;
}
if (!open(CONF, "$config/miniserv.conf")) {
print STDERR "Failed to open $config/miniserv.conf : $!\n";
print STDERR "Maybe $config is not the Webmin config directory.\n";
exit 3;
}
while(<CONF>) {
if (/^([^=]+)=(\S+)/) { $config{$1} = $2; }
}
close(CONF);
# Update the users file
if (!open(USERS, $config{'userfile'})) {
print STDERR "Failed to open Webmin users file $config{'userfile'} : $!\n";
exit 4;
}
while(<USERS>) {
s/\r|\n//g;
local @user = split(/:/, $_);
if (@user) {
$users{$user[0]} = \@user;
push(@users, $user[0]);
}
}
close(USERS);
$uinfo = $users{$user};
if (!defined($uinfo)) {
print STDERR "The Webmin user $user does not exist\n";
print STDERR "The users on your system are: ",join(" ", @users),"\n";
exit 5;
}
srand(time() ^ $$);
$salt = chr(int(rand(26))+65).chr(int(rand(26))+65);
$uinfo->[1] = crypt($pass, $salt);
$uinfo->[6] = time();
if (!open(USERS, "> $config{'userfile'}")) {
print STDERR "Failed to open Webmin users file $config{'userfile'} : $!\n";
exit 6;
}
foreach $v (values %users) {
print USERS join(":", @$v),"\n";
}
close(USERS);
print "Updated password of Webmin user $user\n";
# Send a signal to have miniserv reload it's config
if (open(PID, $config{'pidfile'})) {
$pid = <PID>;
$pid =~ s/\r|\n//;
close(PID);
if (!$pid) {
print STDERR "Webmin is not running - cannot refresh configuration\n";
}
elsif (!kill('USR1', $pid)) {
print STDERR "Failed to signal process $pid - cannot refresh configuration\n";
}
}
else {
print STDERR "Webmin is not running - cannot refresh configuration\n";
}
sub usage
{
print STDERR <<EOF;
usage: changepass.pl <config-dir> <login> <password>
This program allows you to change the password of a user in the Webmin
password file. For example, to change the password of the admin user
to foo, you would run:
changepass.pl /etc/webmin admin foo
This assumes that /etc/webmin is the Webmin configuration directory.
EOF
exit 1;
}