# encoding: ascii
# api: powershell
# title: Get-Excuse
# description: Suffering from Monday morning due to server failure. Maybe an excuse should be automatically added to mails sent from members of my team.
# version: 0.1
# type: function
# license: CC0
# function: Get-Excuse
# x-poshcode-id: 2380
# x-archived: 2010-11-30T16:38:00
#
# Excuses courtesy of Jeff Ballard.
#
Function Get-Excuse {
  <#
    .Synopsis
      Retrieves a BOFH excuse from Jeff Ballard's website (http://jeffballard.us/).
    .Description
      Uses System.Net.WebRequest to retrieve page content as a string from the predefined URL. By default,
      Get-Excuse uses the system defined Proxy Server. Alternate proxy settings can be defined using the
      optional parameters.
    .Parameter ProxyServer
      A proxy server for this connection, in the format http://proxyserver:port.
    .Parameter Credential
      Alternate credentials to use for the proxy server.
    .Example
      Get-Excuse -Proxy "http://1.2.3.4:8080"
      Request an excuse using the specified proxy server.
  #>

  [CmdLetBinding()]
  Param(
    [ValidatePattern("https?://.+")]
    [Uri]$ProxyServer,

    [Management.Automation.PsCredential]$Credential
  )

  $WebRequest = [Net.WebRequest]::Create("http://pages.cs.wisc.edu/~ballard/bofh/bofhserver.pl")
  
  # If a proxy is defined, overwrite the system defined proxy server

  If ($ProxyServer) {
    $WebProxy = New-Object Net.WebProxy
    $WebProxy.Address = $ProxyServer

    # If credentials are specified

    If ($Credential) {
      $WebProxy.Credentials = $Credential.GetNetworkCredential()
    }
  }

  $Response = $WebRequest.GetResponse()
  If ($Response.StatusCode -eq "OK") {

    $ResponseStream = New-Object IO.StreamReader($Response.GetResponseStream(), "UTF8")
    $Page = $ResponseStream.ReadToEnd()

    $Page -Match '(?<=(<br><font size = "\+2">)).+' | Out-Null
    Return $Matches[0]
  }
  $Response.Close()

  Return ""
}

$Excuse = Get-Excuse
If ($Excuse) {
  $Predicate = Get-TransportRulePredicate FromMemberOf
  $Predicate.Addresses = Get-DistributionGroup "address@domain.com"

  $Action = Get-TransportRuleAction SetHeader
  $Action.MessageHeader = "X-BOFH-Excuse"
  $Action.HeaderValue = $Excuse

  New-TransportRule -Name "BOFH Excuse" -Actions $Action -Comments "Includes the excuse of the day in an email header" `
    -Conditions $Predicate -Enabled $True -WhatIf
}
