« October 2009 | Main | December 2009 »

6 posts from November 2009

11/29/2009

Bling v0.5 Released - Now with Sitemap Pings!

This release of Bling introduces a new feature: Sitemap Pings. Five search engine services are included: Ask, Bing, Google, Moreover, and Yahoo!.  In addition to the groovy xmlrpc module that has been required for this script to work since it was first released, I've also included the HTTPBuilder module, which is used to send the sitemap pings to each search engine.

A new variable has been added to the script: sitemapURL.  You will need to replace the default text between the quotes with the fully-qualified path to your own site's sitemap.xml file.  You do not need to worry about url-encoding the URL path—bling does that for you.  For example, mine is located at http://blog.techstacks.com/sitemap.xml. The Wikipedia article I link to above contains background on Sitemaps or you can go directly to the sitemaps.org website to view the actual protocol.

No changes have been made to the services that bling sends xmlrpc pings to in this release.  A future release will probably end up removing some additional services that have been failing for me every time I run this tool. 

Source code is below.  The main bling page has been updated and this version has been posted to the download site.

#!/usr/bin/env groovy

import groovy.net.xmlrpc.*
import groovy.util.slurpersupport.GPathResult
import groovyx.net.http.HTTPBuilder
import static groovyx.net.http.Method.GET
import static groovyx.net.http.ContentType.URLENC

// You'll want to make this next section your own
def blogTitle = "YOUR_BLOG_TITLE_HERE"
def blogURL = "YOUR_BLOG_URL_HERE"
// New in Bling version 0.5:
// URL for Sitemap Pings
def sitemapURL = "YOUR_BLOG_SITEMAP_URL_HERE"

// Set up a map (hash) of popular rpc endpoints
// It is too bad for my syntax highlighter, but some of 
// the blogs containing periods in their names necessitated
// placing them in quotes.  

def trackbacks = [
  Google:'http://blogsearch.google.com/ping/RPC2',
  Weblogs:'http://rpc.weblogs.com/RPC2',
  FeedBurner:'http://ping.feedburner.com/',
  Moreover:'http://api.moreover.com/RPC2',
  Syndic8:'http://ping.syndic8.com/xmlrpc.php' ,
  BlogRolling:'http://rpc.blogrolling.com/pinger/',
  NewsGator:'http://services.newsgator.com/ngws/xmlrpcping.aspx',
  Bloglines:'http://www.bloglines.com/ping',
  'Blo.gs':'http://ping.blo.gs/',
  BlogCatalog:'http://rpc.blogcatalog.com/',
  PubSub:'http://xping.pubsub.com/ping/',
  'MyBlog.jp':'http://ping.myblog.jp/',
  Goo:'http://blog.goo.ne.jp/XMLRPC',
  BlogPeople:'http://www.blogpeople.net/servlet/weblogUpdates',
  Twingly:'http://rpc.twingly.com/',
  Spinn3r:'http://rpc.spinn3r.com/open/RPC2',
  PostRank:'http://api.postrank.com/v2/ping',
  WasaLive:'http://www.wasalive.com/ping/',
  BlogBuzzMachine:'http://rpc.blogbuzzmachine.com/RPC2',
  IceRocket:'http://rpc.icerocket.com:10080/',
  FeedBlitz:'http://www.feedblitz.com/f/f.fbz?XmlPing'
  ]

def searchengines = [
  Ask:'http://submissions.ask.com/ping?sitemap=',
  Bing:'http://www.bing.com/webmaster/ping.aspx?siteMap=',
  Google:'http://www.google.com/webmasters/tools/ping?sitemap=',
  Yahoo:'http://search.yahooapis.com/SiteExplorerService/V1/updateNotification?appid=Bling&url=',
  Moreover:'http://api.moreover.com/ping?u='
  ]

// Set up canned responses to make the outputted responses nicer.
// Previously, the output used the literal response from the endpoint
// which did not look all that nice in a terminal window.
def weal = "Thanks for the ping!"
def woe = "PING ATTEMPT FAILED."

// Here is the section responsible for iterating through each ping
// url in the trackbacks map.

println "====XMLRPC PING RESULTS===="

trackbacks.each {
  try{
    def url = it.value
    def proxy = new XMLRPCServerProxy(url)
    response = proxy.weblogUpdates.ping(blogTitle, blogURL)
      response.data instanceof GPathResult

    if (!response.flerror)
        println "  ${it.key}".padRight(25) + "${weal}"
      else
        println "  ${it.key}".padRight(25) + "${woe}"

    }catch(ConnectException ex) {
      println "  ${it.key}".padRight(25) + "${woe}"     
    }catch(IOException ex){
      println "  ${it.key}".padRight(25) + "${woe}"
    }
}
println "==========================="
println "\n"
println "====SITEMAP PING RESULTS==="

searchengines.each {
    def url = it.value + sitemapURL
    def http = new HTTPBuilder( url )
      http.request( GET, URLENC ) { req ->
        headers.'User-Agent' = 'Bling/0.5'
        headers.'Referer' = 'http://blog.techstacks.com/bling.html'

      response.success = { resp, html ->
        println " ${it.key}".padRight(25) + "${weal}"
      }
      response.failure = { resp, html ->
        println " ${it.key}".padRight(25) + "${woe}"
      }
  }
}

println "==========================="

11/27/2009

Groovy 1.6.6 is Out

Groovy version 1.6.6 is out, ( and version 1.7 has hit release candidate status today as well).  The release notes for 1.6.6 list 36 bug fixes, 10 improvements and 1 new feature.  Here is an overview of enhancements in this release and you can download directly from the codehaus site.

11/25/2009

New HOWTO: Disable HTTP Methods in Tomcat

I've just published a new HOWTO article on my companion site for those who want to know (or are being made to learn how to do it by some security guy) how to disable access to methods within Tomcat. In Apache, it's really easy but doing it in Tomcat requires looking through the java servlet specification and learning about security constraints. The HOWTO provides a very high level overview of what a security constraint is and provides a couple of basic examples. Please let me know what you think!

HOWTO: Disable HTTP Methods in Tomcat

Incidentally, this works in JBoss, too, as well as any Java Servlet specification-compliant container