Here is a set of Mac logon scripts I wrote for a Windows/AD environment. There are a set of plist files that launch perl scripts and different stages. The logon scripts are local and self-update from the sysvol directory.
edu.fitsuny.mac_logon_init.plist
Label edu.fitsuny.edu.mac_system_logon ProgramArguments /etc/etsscripts/mac_logon_init.pl RunAtLoad
edu.fitsuny.mac_user_logon.plist
Label edu.fitsuny.mac_user_logon ProgramArguments /etc/etsscripts/mac_user_logon.pl RunAtLoad
mac_system_logon.pl
#!/usr/bin/perl -l #Please make your function a sub and then call it. #FYI: an error here will break the entire script open (LOG, '>>/tmp/logon_system.txt'); print LOG "Running System Hook V1.0 \n"; #remember with admitmac the username might be @fitsuny.edu $username = $ARGV[0]; #updates the loader.pl just in case we make changes there. updateloader(); sub updateloader { system('smbclient //fit-c108-01/netlogon Password -U mac_logon -c \'get \\Macintosh\\installer\\mac_logon_init.pl /etc/etsscripts/mac_logon_init.pl\''); if ($? != 0) { #try dc 1 system('smbclient //fit-c108-02/netlogon Password -U mac_logon -c \'get \\Macintosh\\installer\\mac_logon_init.pl /etc/etsscripts/mac_logon_init.pl\''); if ($? != 0) {# failed again print error print LOG 'SYSTEM: Cannot download loader.pl script\n'; } chmod(0755,'/etc/etsscripts/mac_logon_init.pl'); } }
#!/usr/bin/perl -l #Please make your process a sub and then call it. #FYI: an error here will break the entire script #This runs at user the user profie is in ~/ || mkdir() does not understand ~/ # open (LOG, '>/tmp/logon_user.txt'); print LOG "Running User Hook V1.0 \n"; #remember with admitmac the username might be @fitsuny.edu my $username = $ENV{'USER'}; my $profiledir = $ENV{'HOME'}; if ( $username =~ m/[@]/ ) { my @tmpusername = split(/@/,$username); $username = $tmpusername[0]; } print LOG "USER: username " . $username . "\n"; #system test script, an example of giving the user a GUI popup box from a perl script #system('osascript -l AppleScript -e \'tell Application "Finder" to display dialog "Call Frank"\''); #get Prirole once $usertype = get_prirole(); print LOG "USER: using prirole " . $usertype . "\n"; disable_dsstore(); mount_winfs(); #emgmesg(); #their profile is in Users which means they are not using admit mac if ($profiledir =~ m/\/Users\//) { mount_stanNDrive(); } sub disable_dsstore { #this will disable .DS_STORE on network volumes #This will stop some weird bugs system('defaults write com.apple.desktopservices DSDontWriteNetworkStores true'); } sub mount_stanNDrive { use Net::LDAP; $ldap = Net::LDAP->new ('fit-c108-01') or die "$@"; $ad = $ldap->bind('cn=ldapsearch,ou=fitusers,dc=fitsuny,dc=edu', password => 'password); $ad = $ldap->search (base => 'ou=FitUsers,dc=fitsuny,dc=edu', filter => "(&(cn=" . $username . "))", attrs => ['homeDirectory'], ); $ad->code && die $ad->error; $winHomeDir = $ad->entry->get_value('homeDirectory'); $ad = $ldap->unbind; $winHomeDir =~ s/\\\\/smb:\/\//; $winHomeDir =~ s/\\/\//g; $osascript = qq[mount volume "$winHomeDir"]; system( "osascript -e '$osascript'"); } sub mount_winfs { #check to make sure mount exists #check pri-role to see what server they are on my $pilot_user = shift; my $servershare; $servershare = 'fs-c108-03/student_home$/' if ifmember($username,'students') ; $servershare = 'fs-c108-04/faculty_home$/' if ifmember($username,'faculty') ; return unless $servershare; # Don't attempt mount if no Y: drive for user my $winfs_path = '//' . $servershare . $username; $mntfolder = $ENV{'HOME'} . '/Desktop/' . $username . '_CAMPUSFILES'; print LOG $servershare . "\n"; print LOG $mntfolder . "\n"; system('mkdir ' . $mntfolder); system('mount_smbfs -o nobrowse ' . $winfs_path . ' ' . $mntfolder); #get list of mounts $mountlist = `mount`; if ($mountlist =~ m/CAMPUSFILES/ix) {# Successful mount } else {# Match attempt failed system('rm -dfr ' . $mntfolder); } } sub get_prirole { my $ldapsearch = qq[ldapsearch -h ldap.fitsuny.edu -b "dc=fitsuny,dc=edu" -LLL -x "(uid=$username)" fitprirole]; my $usertype = `$ldapsearch`; $usertype =~ s/^.*fitprirole:\s+(.*)$/$1/s; return $usertype; } sub ifmember { #does not do nested groups. $_username = shift; $_group = shift; use Net::LDAP; $ldap = Net::LDAP->new ('fit-c108-01') or die "$@"; $ad = $ldap->bind('cn=ldapsearch,ou=fitusers,dc=fitsuny,dc=edu', password => 'password'); $ad = $ldap->search (base =>'ou=FiTUsers,dc=fitsuny,dc=edu', filter => "(&(cn=" . $_username . ")(memberof=cn=" . $_group . ",ou=fitgroups,dc=fitsuny,dc=edu))", #attrs => ['memberOf'], ); $ad->code && $ad->error; return $ad->count(); } sub emgmesg { $message = "LOGIN TO MyFIT TO REGISTER FOR EMERGENCY MESSAGE NOTIFICATIONS Get timely announcements in the event of a campus emergency or a weather-related closure of the college via text message, email, or voicemail. Would you like to sign up now?"; #icons Types (stop, note, caution) $icon = 'note'; #button types (ok, yesno) $buttons = 'yesno'; #action $action = 'http://myfit.fitnyc.edu'; if($icon eq 'stop') { $ic = '0'; } elsif($icon eq 'note') { $ic = '1'; } elsif($icon eq 'caution') { $ic = '2'; } if($buttons eq 'ok') { $bu = '{"OK"}'; } elsif($buttons eq 'yesno') { $bu = '{"YES","NO"}'; } #mac way $result = `/usr/bin/osascript <<-EOF tell application "System Events" activate display dialog "$message" buttons $bu with icon $ic end tell EOF`; chomp($result); if (($buttons eq 'yesno') && ($result eq 'button returned:YES')) { system('open ' . $action); } }