The Gateway

A information about a key piece of software for the early days of the Ruby community.
  • 12

    DEC
    2006

    news_to_mail.rb

    [Note: You need to know what the Gateway is before reading this article.]

    The second half of the Ruby Gateway runs as a cron job every five minutes and is expected to move all new newsgroup messages from the NNTP host to the Ruby Talk mailing list. The cron invocation is simply:

    ruby /path/to/gateway/bin/news_to_mail.rb /path/to/news_to_mail.log
    

    This side of the Gateway is not piped any messages and exit codes from it are not monitored. It needs to tend its own affairs.

    The Code

    Here's the source:

    GATEWAY_DIR  = File.join(File.dirname(__FILE__), "..").freeze
    DATA_DIR     = File.join(GATEWAY_DIR, "data").freeze
    LAST_ID_FILE = File.join(DATA_DIR, "last_news_id.txt").freeze
    PID_FILE     = File.join(DATA_DIR, "pid.txt").freeze
    
    $LOAD_PATH << File.join(GATEWAY_DIR, "config") << File.join(GATEWAY_DIR, "lib")
    
    # ...
    

    The script begins by locating the root directory of the Gateway source and the data sub directory, building constants for two external files it will interact with, and adjusting the $LOAD_PATH so that it can require needed resources.

    Read more…

  • 5

    DEC
    2006

    mail_to_news.rb

    [Note: You need to know what the Gateway is before reading this article.]

    There are two halves to the Ruby Gateway. One half runs as a qmail filter for an email address on the Ruby Talk mailing list. Every message sent to that address is piped through this filter with a shell script like:

    ruby /path/to/gateway/bin/mail_to_news.rb /path/to/mail_to_news.log
    

    The email is piped to the filter via the standard input and the code is expected to handle the message by posting it to comp.lang.ruby or choosing to ignore it. If the filter exits normally, qmail considers the matter handled. A non-zero exit code will cause the filter to be called with that same message again later.

    The Code

    Let's dive right into the source of this half of the Gateway:

    GATEWAY_DIR = File.join(File.dirname(__FILE__), "..").freeze
    
    $LOAD_PATH << File.join(GATEWAY_DIR, "config") << File.join(GATEWAY_DIR, "lib")
    
    # ...
    

    The code above just sets things up so this script can require some other files in the project normally. Here are those requires:

    Read more…

  • 4

    DEC
    2006

    Hacking the Gateway

    [Update: The Ruby Gateway was retired in June of 2011. Our community simply grew past the point were we needed to combine the various groups, in my opinion.]

    Though I rewrote the current Gateway and I handle the maintenance, it really belongs to the Ruby community. Because of that, I'm going to release the two primary source files on this blog for all to view and critique. This may have value to those who want to know how the Gateway works, those who would like to implement similar technologies, and those who would like to purpose changes to the Gateway code.

    I do welcome purposed changes to the Gateway, but let's set some ground rules for the right way to make suggestions:

    • I will show the important elements of the Gateway code and do my best to explain it as I go. In return, please take the time to read what I write about the code and try to understand how it works. Poorly developed change requests increase my maintenance time with the Gateway, which all comes out of my free time, so please be considerate.
    • You purpose changes to the Gateway by commenting on the code articles. This is intended to be a public discussion with all of us working together. Don't email me or Ruby Talk ideas, I'm monitoring the comments here.
    • Show code in your requests. I don't want to throw the Gateway in a publicly accessible Subversion repository and start taking patches for several reasons. If you want a change, convince me to implement it. The best way to do that is to throw around some code showing me how we would build your request and how it would make the Gateway better.
    • I am thinking about some elements of the Gateway you are not, like the fact that I run this code on a server provided by my work where security is a consideration and the level of maintenance a change will inflict on me. I ask only that you keep this in mind as we debate changes. In return, I will be as open minded to improvements as possible.
    • Gateway changes will not happen overnight. (See note about free time above.) Please be patient.
  • 1

    DEC
    2006

    What is the Ruby Talk Gateway?

    [Update: The Ruby Gateway was retired in June of 2011. Our community simply grew past the point were we needed to combine the various groups, in my opinion.]

    The Ruby community makes use of both email and Usenet communication, in addition to other resources. The primary mailing list is Ruby Talk and the primary Usenet group is comp.lang.ruby. These two services are joined by the Ruby Gateway.

    In 2001 The Pragmatic Programmers wrote the initial version of the Ruby Gateway to ferry messages back and forth between these two resources. Emails sent to Ruby Talk are posted as Usenet messages and Usenet posts are forwarded to Ruby Talk by the Gateway. The Gateway has had a few guardians and code changes since then, but the functionality remains the same.

    I'm am the current caretaker of the Ruby Gateway. Highgroove Studios generously provides hosting for it and I monitor the system for problems. I also wrote the current version of the Gateway.

    You are free to report Gateway problems for me to look into. Before you do though, please read the following notes:

    Read more…