--- loncom/CrGrant.pl 2004/07/06 11:05:45 1.3 +++ loncom/CrGrant.pl 2004/07/09 09:11:48 1.4 @@ -2,7 +2,7 @@ # The LearningOnline Network # CrGrant.pl - Grant a loncapa SSL certificate. # -# $Id: CrGrant.pl,v 1.3 2004/07/06 11:05:45 foxr Exp $ +# $Id: CrGrant.pl,v 1.4 2004/07/09 09:11:48 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -88,6 +88,7 @@ my $ssl_command = "/usr/bin/openssl "; my $loncapa_cert_dir; # Name of target cert dir (from config) my $loncapa_hostcert_name; # Name of host's signed cert file (config) my $loncapa_cacert_name; # Name of the CA's certificate file (config) +my $return_address; # Email return address. # Items I just need to know: @@ -99,7 +100,7 @@ my $loncapa_apache_group = 'www'; # Name # Debug/log support -my $DEBUG=1; +my $DEBUG=0; sub Debug { my $msg = shift; @@ -183,7 +184,16 @@ sub ReadConfig { else { die "LonCAPA configuration error: Can't read lonnetCertificateAuthority variable"; } + # Get the email address of the certificate manager: + # this is the email return address: + if($perlvarref->{SSLEmail}) { + $return_address = $perlvarref->{SSLEmail}; + Debug("Return address will be $return_address"); + } + else { + die "LonCAPA configuration error can't read SSLEmail configuration item"; + } } @@ -315,6 +325,8 @@ sub CreateCertificate { # # Implicit Outputs: # A file named CertInstall.sh +# Return +# Name of the file we created. # sub CreateInstallScript { open INSTALLER,">CertInstall.sh"; @@ -378,8 +390,8 @@ install -m \$MODE -o \$HTTPDUID -g \$HTT echo done -# rm -f \$CACERT -# rm -f \$HOSTCERT +rm -f \$CACERT +rm -f \$HOSTCERT # Do they want to restart loncapa: # @@ -393,23 +405,105 @@ echo /etc/init.d/loncontrol restart echo read -p "Restart loncapa now [yN]?" yesno -if [ "{\$yesno:0:1}" = "Y" ] +if [ "\${yesno:0:1}" = "Y" -o "\${yesno:0:1}" = "y" ] then /etc/init.d/loncontrol restart fi BASH_TRAILER close INSTALLER; -} + return "CertInstall.sh"; +} +# +# Create a mime Email that consists of a cover letter of installation +# instructions and an attachment that is the installation script. +# Parameters: +# script - The name of the script that will be attached +# to the email. +# send_address - Where the mail will be sent. +# Returns: +# The MIME::Entity handle of the script. +# sub CreateEmail { - return "Dummy message"; # Stub. + Debug("Creating Email"); + my ($installer_file, $send_address) = @_; + + # The top level mime entity is the mail headers and the + # cover letter: + + my $mime_message = MIME::Entity->build(Type => "multipart/mixed", + From => $return_address, + To => $send_address, + Subject =>"LonCAPA certificates"); + if(!$mime_message) { + die "Unable to create top level MIME Message"; + } + + $mime_message->attach(Data =>[" This email contains your lonCAPA SSL certificates. These\n", + "certificates allow your system to interact with the world wide\n", + "cluster of LonCAPA systems, and allow you to access and share\n", + "public resources for courses you host.\n\n", + " The certificates are shipped as a self installing shell script\n", + "To install these certificates:\n\n", + "1. Extract the attachment to this email message\n", + "2. Save the attachment where it can be recovered in case you need\n", + " to re-install these certificates later on for some reason\n", + "3. As root execute the certificate request file: + . $installer_file\n", + " (Note: If you used a Windows based email program to extract the\n", + " this file and then tranferred it to your unix lonCAPA system you \n", + " Will probably need to convert the file first e.g.: \n", + " dos2unix $installer_file\n", + " . $installer_file\n", + " The installer file will install the certificates and ask you\n", + " if you want to restart the LonCAPA system. You must restart the\n", + " LonCAPA system for it to use the new certificates.\n\n", + " Thank you for choosing LonCAPA for your course delivery needs,\n", + " The LonCAPA team.\n"]); + + Debug("Main message body created"); + + + # Attach the certificate intaller: + + $mime_message->attach(Type => "text/plain", + Path => $installer_file); + Debug("Installer attached"); + + return $mime_message; + } +# +# Sends a mime message to an email address. +# Parameters: +# message - A MIME::Entity containing the message. +# Implicit inputs: +# Mail is sent via /usr/lib/sendmail -t -oi -oem" +# This should work on all systems with a properly configured +# sendmail or compatible mail transfer agent. sub SendEmail { - my ($EmailAddress, $Message) = @_; + my ($message) = @_; + + Debug("Mailing"); + + open MAILPIPE, "| /usr/lib/sendmail -t -oi -oem" or + die "Failed to open pipe to sendmail: $!"; + + $message->print(\*MAILPIPE); + Debug("Submitted to sendmail"); + close MAILPIPE; +} +# +# Cleanup destroys the certificate file and its installer. +# +# +sub Cleanup { + my ($installer) = @_; + unlink($installer); + unlink("hostcertificate.pem"); } -sub Cleanup {} # Program entry point @@ -435,9 +529,9 @@ if(!defined $email_address) { exit -1; } -&CreateInstallScript; -my $Message = &CreateEmail; -&SendEmail($email_address, $Message); -&Cleanup; +my $script_name = &CreateInstallScript; +my $Message = &CreateEmail($script_name, $email_address); +&SendEmail($Message); +&Cleanup($script_name); # POD documentation.