diff options
Diffstat (limited to 'contrib/utils/pwd2pine')
-rwxr-xr-x | contrib/utils/pwd2pine | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/contrib/utils/pwd2pine b/contrib/utils/pwd2pine new file mode 100755 index 00000000..49b3de65 --- /dev/null +++ b/contrib/utils/pwd2pine @@ -0,0 +1,73 @@ +#!/usr/local/bin/perl +# +# passwd2pine - translate passwd to pine addressbook +# +# Author: Paul J Murphy <pjm@dcs.ed.ac.uk> +# +# The fullname field will end up falling into one of the following cases: +# +# Last, First - A person +# }group: fullname - A non-person (determined by group or uid/gid < 1024) +# ~user: fullname - A non-person (determined by username or fullname) +# +# This allows the output to be sorted by fullname, with administrative +# accounts left to last (ie the real people come first). +# +# The comment field will contain the groupname of the user, followed by +# anything from the gecos field which seems to be a comment and not part +# of the name. + +### Start of configurable stuff + +$domain = "dcs.ed.ac.uk"; + +# Regular expression for groups which don't contain people +# Case is significant. +# The expression must match the entire groupname string. +$non_people_groups = "local|misc|aliens|cs_dept|\\d*"; + +# Regular expression for users which are not people +# Case is significant. +# The expression must match the entire username string. +$non_people_users = ".*\\d.*"; + +# Regular expression for words within a fullname which signify a non-person +# Case is not significant. +# The expression must match an entire word within the gecos fullname. +$non_people_names = "account|admin|user|system|crew|test|dummy|\ +unit|department|student|project|.*\\d.*"; + +### End of configurable stuff + +while(<>) { + chop; + ($user, $passwd, $uid, $gid, $gecos, $homedir, $shell) = split(/:/, $_, 7); + unless ($gr_name = getgrgid($gid)) { + $gr_name = $gid; + } + + $nickname = $user; + + $fullname = $gecos; + $fullname =~ s/,.*//g; # Reduce gecos to fullname + $fullname =~ s/[._]/ /g; # Translate alternate name separators to space + if ($uid < 1024 || + $gid < 1024 || + $gr_name =~ /^($non_people_groups)$/o) { + $fullname = "}$gr_name: $fullname"; + } elsif ($user =~ /^($non_people_users)$/o || + $fullname =~ /\b($non_people_names)\b/io) { + $fullname = "~$user: $fullname"; + } elsif (($firstname, $lastname, $gecos_comment) = + ($fullname =~ /^(.*)[._ ]([^._ \d(][^._ \d]+)( *\(.*)?$/)) { + $fullname = "$lastname, $firstname"; + } + + $address = "$user\@$domain"; + +# $fcc = ""; + + $comment = "$gr_name$gecos_comment"; + + print "$nickname\t$fullname\t$address\t$fcc\t$comment\n"; +} |