wfstatus 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e14146abcef202bb5477e0877a457e23156c8c01
4
+ data.tar.gz: 009c1a6f256ec5bd85e363bc542dac54e88e929f
5
+ SHA512:
6
+ metadata.gz: 585fd9625d69e4d6048909169b1fe376f6bb7e0cf6636e2ecfdb7bf0856a6aa754488070aebf45073ba63ac8a0056ab52ebf0ebf1e0eabfb6d80588e56dc1307
7
+ data.tar.gz: 790092e81020c3c9cbb835b2c6bd72d8ff8c91a837a2dfa223207b6e91c98d47c333c5f0e188ee677776beba0cf5f8cb853ed22c047c83b2dc040e1d24351b1a
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in wfstatus.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 dow
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,56 @@
1
+ # Wfstatus
2
+
3
+ This gem is designed to help developers who are responsible for managing applications on multiple Webfaction servers. The Webfaction Status Blog is an excellent resource, but requires a developer to remember the names of all servers for which she is responsible. This gem allows the developer to specify a hash of servers of interest keyed to site names or other information in a YAML config file. When the gem executes, it selects recent posts from the status blog which mention any of the configured servers and emails the developer with the information.
4
+
5
+ ## Installation
6
+
7
+ $ gem install wfstatus
8
+
9
+ ## Sample config.yml
10
+
11
+ ~~~
12
+ # the webfaction status blog url
13
+ blog_url: http://statusblog.webfaction.com
14
+
15
+ # server name: a description of your sites hosted at the server
16
+ servers:
17
+ web313: 'wibble.com, myclient.com'
18
+ web369: 'pigsinhelicopters.com'
19
+ web344: 'bigclient.com (main server)'
20
+ web406: 'bigclient.com (server 2)'
21
+
22
+ # smtp email settings
23
+ smtp:
24
+ address: smtp.webfaction.com
25
+ port: 587
26
+ domain: mydomain.com
27
+ user_name: myusername
28
+ password: mypassword
29
+ authentication: plain
30
+ enable_starttls_auto: true
31
+
32
+ # mail settings
33
+ mail:
34
+ from: myusername@mydomain.com
35
+ to: me@gmail.com
36
+ subject: Webfaction status Update
37
+
38
+ # your time zone offset
39
+ utc_offset: -08:00
40
+ ~~~
41
+
42
+ ## Usage
43
+
44
+ $ wfstatus config.yml
45
+
46
+ ## Todo
47
+
48
+ Add some options to allow the user to prevent multiple emails about the same post.
49
+
50
+ ## Contributing
51
+
52
+ 1. Fork it
53
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
54
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
55
+ 4. Push to the branch (`git push origin my-new-feature`)
56
+ 5. Create new Pull Request
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'yaml'
4
+ require 'wfstatus'
5
+
6
+ include Wfstatus
7
+
8
+ raise "Usage: ruby -Ilib ./bin/wfstatus config.yml" unless ARGV.length == 1
9
+ config = YAML.load_file(ARGV[0])
10
+ Wfstatus::Wfstatus.process(config)
@@ -0,0 +1,44 @@
1
+ require "wfstatus/version"
2
+ require "wfstatus/parser.rb"
3
+ require "wfstatus/builder.rb"
4
+ require 'mail'
5
+ require 'open-uri'
6
+
7
+ module Wfstatus
8
+
9
+ class Wfstatus
10
+
11
+ def self.process(config)
12
+
13
+ options = {
14
+ address: config['smtp']['address'],
15
+ port: config['smtp']['port'],
16
+ domain: config['smtp']['domain'],
17
+ user_name: config['smtp']['user_name'],
18
+ password: config['smtp']['password'],
19
+ authentication: config['smtp']['authentication'],
20
+ enable_starttls_auto: config['smtp']['enable_starttls_auto']
21
+ }
22
+ url = config['blog_url']
23
+ puts url
24
+ parser = Parser.new( open(url), config )
25
+ builder = Builder.new(config, parser.messages)
26
+ return unless builder.relevant_messages.count > 0
27
+
28
+ Mail.defaults do
29
+ delivery_method :smtp, options
30
+ end
31
+
32
+ mail = Mail.new do
33
+ from config['mail']['from']
34
+ to config['mail']['to']
35
+ subject config['mail']['subject']
36
+ body builder.content
37
+ end
38
+
39
+ puts mail.to_s
40
+ mail.deliver!
41
+
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,19 @@
1
+ require 'wfstatus/wfmessage'
2
+
3
+ class Wfstatus::Builder
4
+ attr_reader :config, :messages
5
+ def initialize(config, messages)
6
+ @config = config
7
+ @messages = messages
8
+ end
9
+
10
+ def relevant_messages
11
+ @relevant_messages ||= @messages.select { |m| m.relevant? }
12
+ end
13
+
14
+ def content
15
+ relevant_messages.join("\n")
16
+ end
17
+
18
+ end
19
+
@@ -0,0 +1,33 @@
1
+ require 'nokogiri'
2
+ require 'wfstatus/wfmessage'
3
+
4
+ class Wfstatus::Parser
5
+ attr_reader :html, :page
6
+ def initialize(html, config)
7
+ @html = html
8
+ @config = config
9
+ @page = Nokogiri::HTML(@html)
10
+ end
11
+
12
+ def messages
13
+ @messages ||= parse
14
+ end
15
+
16
+ def parse
17
+ messages = []
18
+ posts.each do |p|
19
+ posted = p.at_css('div.entry-date abbr').attributes['title']
20
+ message = p.at_css('div.entry-content').text
21
+ title_link = p.at_css('.entry-title a')
22
+ url = title_link.attributes['href']
23
+ title = title_link.text
24
+ messages << Wfmessage.new(posted, title, message, url, @config)
25
+ end
26
+ messages
27
+ end
28
+
29
+ def posts
30
+ @posts ||= @page.css('div.post')
31
+ end
32
+
33
+ end
@@ -0,0 +1,3 @@
1
+ module Wfstatus
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,37 @@
1
+ class Wfstatus::Wfmessage
2
+
3
+ attr_reader :posted, :title, :message, :url
4
+
5
+ def initialize(posted, title, message, url, config)
6
+ @posted = DateTime.strptime(posted)
7
+ @title = title
8
+ @message = message
9
+ @url = url
10
+ @config = config
11
+ end
12
+
13
+ def servers
14
+ @servers ||= find_servers(@title) | find_servers(@message)
15
+ end
16
+
17
+ def find_servers(str)
18
+ str.to_enum(:scan, /web\d+/i).map { Regexp.last_match.to_s.downcase }
19
+ end
20
+
21
+ def relevant?
22
+ servers.detect { |s| @config['servers'].keys.include?(s) }
23
+ end
24
+
25
+ def server_info
26
+ @config['servers'].values_at(*servers).compact.join(", ")
27
+ end
28
+
29
+ def to_s
30
+ ["SERVER INFO: #{server_info}\n" , posted_str, @title, @message, @url].join("\n") + "\n\n"
31
+ end
32
+
33
+ def posted_str
34
+ @posted.to_time.localtime(@config['utc_offset']).strftime("%l:%M:%S %p %A, %b %d %Y %z")
35
+ end
36
+
37
+ end
@@ -0,0 +1,76 @@
1
+ # require 'debugger'
2
+ require 'spec_helper'
3
+ require 'wfstatus/builder'
4
+ require 'wfstatus/wfmessage'
5
+
6
+ include Wfstatus
7
+
8
+ describe "Builder" do
9
+ before :each do
10
+ @config = {
11
+ 'servers' => {"web309" => "wibble.com", "web444" => "microsoft.com", "web103" => "campers.net"},
12
+ 'utc_offset' => '-08:00'
13
+ }
14
+ @message1 = Wfmessage.new(
15
+ "2013-08-25T16:42:14+0000",
16
+ "Intermittent delays on web321 and web103",
17
+ "Network issues are causing intermittent delays on the following servers: web321 and web103",
18
+ "http://messageblog.webfaction.com/2013/08/25/intermittent-delays-on-august-25th/",
19
+ @config
20
+ )
21
+ @message2 = Wfmessage.new(
22
+ "2013-08-25T16:42:14+0000",
23
+ "Intermittent delays on web321 and web143",
24
+ "Network issues are causing intermittent delays on the following web321 and web143",
25
+ "http://messageblog.webfaction.com/2013/08/25/intermittent-delays-on-august-25th/",
26
+ @config
27
+ )
28
+ @message3 = Wfmessage.new(
29
+ "2013-08-25T16:42:14+0000",
30
+ "Intermittent delays on web321, web444 and web103",
31
+ "Network issues are causing intermittent delays on the following servers: web321, web444 and web103",
32
+ "http://messageblog.webfaction.com/2013/08/25/intermittent-delays-on-august-25th/",
33
+ @config
34
+ )
35
+
36
+ @messages = [@message1, @message2, @message3]
37
+ @builder = Builder.new(@config, @messages)
38
+
39
+ end
40
+
41
+ it "should have remember the messages and config" do
42
+ @builder.config.should eql(@config)
43
+ @builder.messages.should eql(@messages)
44
+ end
45
+
46
+ describe "#relevant_messages" do
47
+ it "should return messages only for servers specified in the configuration" do
48
+ @builder.relevant_messages.count.should eql(2)
49
+ end
50
+ end
51
+
52
+ describe "#content" do
53
+ it "should generate the content for an email" do
54
+ @builder.content.should eql(
55
+ <<-STR
56
+ SERVER INFO: campers.net
57
+
58
+ 8:42:14 AM Sunday, Aug 25 2013 -0800
59
+ Intermittent delays on web321 and web103
60
+ Network issues are causing intermittent delays on the following servers: web321 and web103
61
+ http://messageblog.webfaction.com/2013/08/25/intermittent-delays-on-august-25th/
62
+
63
+
64
+ SERVER INFO: microsoft.com, campers.net
65
+
66
+ 8:42:14 AM Sunday, Aug 25 2013 -0800
67
+ Intermittent delays on web321, web444 and web103
68
+ Network issues are causing intermittent delays on the following servers: web321, web444 and web103
69
+ http://messageblog.webfaction.com/2013/08/25/intermittent-delays-on-august-25th/
70
+
71
+ STR
72
+ )
73
+ end
74
+ end
75
+ end
76
+
@@ -0,0 +1,28 @@
1
+ # the webfaction status blog url
2
+ blog_url: http://statusblog.webfaction.com
3
+
4
+ # server name: a description of your sites hosted at the server
5
+ servers:
6
+ web313: 'wibble.com, myclient.com'
7
+ web369: 'pigsinhelicopters.com'
8
+ web344: 'bigclient.com (main server)'
9
+ web406: 'bigclient.com (server 2)'
10
+
11
+ # smtp email settings
12
+ smtp:
13
+ address: smtp.webfaction.com
14
+ port: 587
15
+ domain: mydomain.com
16
+ user_name: myusername
17
+ password: mypassword
18
+ authentication: plain
19
+ enable_starttls_auto: true
20
+
21
+ # mail settings
22
+ mail:
23
+ from: myusername@mydomain.com
24
+ to: me@gmail.com
25
+ subject: Webfaction status Update
26
+
27
+ # your time zone offset
28
+ utc_offset: -08:00
@@ -0,0 +1,30 @@
1
+ # the webfaction message blog url
2
+ blog_url: http://messageblog.webfaction.com
3
+
4
+ # server name: <any description you like>
5
+ servers:
6
+ web313: dowdrake.com
7
+ web369: opsmailer.com
8
+ web344: optomec.com main server
9
+ web406: optomec.com server 2
10
+ web309: speedvagen-orders.com
11
+ web342: ahi-upkeep.com
12
+
13
+ # smtp email settings
14
+ smtp:
15
+ address: smtp.webfaction.com
16
+ port: 587
17
+ domain: ahi-upkeep.com
18
+ user_name: ahiupkeep
19
+ password: j0kerm@n
20
+ authentication: plain
21
+ enable_starttls_auto: true
22
+
23
+ # mail settings
24
+ mail:
25
+ from: ahiupkeep@ahi-upkeep.com
26
+ to: dowdrake@msn.com
27
+ subject: Webfaction message Update
28
+
29
+ # your time zone offset
30
+ utc_offset: -08:00
@@ -0,0 +1,576 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
+ <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
3
+ <!--
4
+ generated in 0.256 seconds
5
+ 38701 bytes batcached for 300 seconds
6
+ -->
7
+ <head profile="http://gmpg.org/xfn/11">
8
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
9
+ <title> WebFaction Status Blog</title>
10
+
11
+ <link rel="pingback" href="http://statusblog.webfaction.com/xmlrpc.php" />
12
+ <link rel="start" href="http://statusblog.webfaction.com/" title="WebFaction Status Blog" />
13
+ <link rel="stylesheet" type="text/css" media="all" href="http://s0.wp.com/wp-content/themes/pub/sandbox/skins/2c-l.css?m=1158640643g" title="Sandbox" />
14
+ <meta name='robots' content='noindex,nofollow' />
15
+ <script src='http://r-login.wordpress.com/remote-login.php?action=js&amp;host=statusblog.webfaction.com&amp;id=4987698&amp;t=1377479228&amp;back=statusblog.webfaction.com%2F' type="text/javascript"></script>
16
+ <script type="text/javascript">
17
+ /* <![CDATA[ */
18
+ if ( 'function' === typeof WPRemoteLogin ) {
19
+ document.cookie = "wordpress_test_cookie=test; path=/";
20
+ if ( document.cookie.match( /(;|^)\s*wordpress_test_cookie\=/ ) ) {
21
+ WPRemoteLogin();
22
+ }
23
+ }
24
+ /* ]]> */
25
+ </script>
26
+ <link rel="alternate" type="application/rss+xml" title="WebFaction Status Blog &raquo; Feed" href="http://statusblog.webfaction.com/feed/" />
27
+ <link rel="alternate" type="application/rss+xml" title="WebFaction Status Blog &raquo; Comments Feed" href="http://statusblog.webfaction.com/comments/feed/" />
28
+ <script type="text/javascript">
29
+ /* <![CDATA[ */
30
+ function addLoadEvent(func){var oldonload=window.onload;if(typeof window.onload!='function'){window.onload=func;}else{window.onload=function(){oldonload();func();}}}
31
+ /* ]]> */
32
+ </script>
33
+ <link rel='stylesheet' id='all-css-0' href='http://s2.wp.com/_static/??-eJxlzsEOwiAQBNAfEtcGtSfjt1C6UtqFJe4S0r+3erFJj5O8yQy0YjxnxayQqilUQ8wCFBcUmFGL84v5pbMXOcGOD8ThX+AQcOSq5sVE3KDFMaAeSruNwrJpcvENoivhweqEaXsxXSEQD46+4Jkene37i7W3ezd/ANfwRes=' type='text/css' media='all' />
34
+ <script type='text/javascript'>
35
+ /* <![CDATA[ */
36
+ var LoggedOutFollow = {"invalid_email":"Your subscription did not succeed, please try again with a valid email address."};
37
+ /* ]]> */
38
+ </script>
39
+ <script type='text/javascript' src='http://s2.wp.com/_static/??-eJyFjVsKAjEMRTdkp/jA4oe4lnlkSmqb1Ka16OqtoKAozFdCcu49ukY1MmWgrJ3owAN6UEUg9bbdFNLMnZOVbhzS6MsE8gTdpUC6vcYioALa1GfoAtIb/rBGlhxApCn/fL9VSFeEuog5yLEfzyqB4P2ndfBsVfTFIoluu4WJS1Yze89VV5ws5JY5heN6a8xmbw5m5x49qG/C'></script>
40
+ <link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://webfaction.wordpress.com/xmlrpc.php?rsd" />
41
+ <link rel="wlwmanifest" type="application/wlwmanifest+xml" href="http://webfaction.wordpress.com/wp-includes/wlwmanifest.xml" />
42
+ <meta name="generator" content="WordPress.com" />
43
+ <link rel='shortlink' href='http://wp.me/kVwK' />
44
+
45
+ <!-- Jetpack Open Graph Tags -->
46
+ <meta property="og:type" content="blog" />
47
+ <meta property="og:title" content="WebFaction Status Blog" />
48
+ <meta property="og:url" content="http://statusblog.webfaction.com/" />
49
+ <meta property="og:site_name" content="WebFaction Status Blog" />
50
+ <meta property="og:image" content="http://1.gravatar.com/blavatar/ba79f216381b64617bc3f60e949d06ca?s=200" />
51
+ <meta name="twitter:site" content="@wordpressdotcom" />
52
+ <link rel="shortcut icon" type="image/x-icon" href="http://0.gravatar.com/blavatar/2cfba9aabc6bd72bac687d30c2412511?s=16" sizes="16x16" />
53
+ <link rel="icon" type="image/x-icon" href="http://0.gravatar.com/blavatar/2cfba9aabc6bd72bac687d30c2412511?s=16" sizes="16x16" />
54
+ <link rel="apple-touch-icon-precomposed" href="http://1.gravatar.com/blavatar/ba79f216381b64617bc3f60e949d06ca?s=114" />
55
+ <link rel='openid.server' href='http://webfaction.wordpress.com/?openidserver=1' />
56
+ <link rel='openid.delegate' href='http://webfaction.wordpress.com/' />
57
+ <link rel="search" type="application/opensearchdescription+xml" href="http://statusblog.webfaction.com/osd.xml" title="WebFaction Status Blog" />
58
+ <link rel="search" type="application/opensearchdescription+xml" href="http://wordpress.com/opensearch.xml" title="WordPress.com" />
59
+ <style>
60
+ /* <![CDATA[ */
61
+ /* Block: reblog */
62
+
63
+ .reblog-from img { margin: 0 10px 0 0; vertical-align: middle; padding: 0; border: 0; }
64
+ .reblogger-note img.avatar { float: left; padding: 0; border: 0; }
65
+ .reblogger-note-content { margin: 0 0 20px; }
66
+ .reblog-post .wpcom-enhanced-excerpt-content { border-left: 3px solid #eee; padding-left: 15px; }
67
+ .reblog-post ul.thumb-list { display: block; list-style: none; margin: 2px 0; padding: 0; clear: both; }
68
+ .reblog-post ul.thumb-list li { display: inline; margin: 0; padding: 0 1px; border: 0; }
69
+ .reblog-post ul.thumb-list li a { margin: 0; padding: 0; border: 0; }
70
+ .reblog-post ul.thumb-list li img { margin: 0; padding: 0; border: 0; }
71
+
72
+ .reblog-post .wpcom-enhanced-excerpt { clear: both; }
73
+
74
+ .reblog-post .wpcom-enhanced-excerpt address,
75
+ .reblog-post .wpcom-enhanced-excerpt li,
76
+ .reblog-post .wpcom-enhanced-excerpt h1,
77
+ .reblog-post .wpcom-enhanced-excerpt h2,
78
+ .reblog-post .wpcom-enhanced-excerpt h3,
79
+ .reblog-post .wpcom-enhanced-excerpt h4,
80
+ .reblog-post .wpcom-enhanced-excerpt h5,
81
+ .reblog-post .wpcom-enhanced-excerpt h6,
82
+ .reblog-post .wpcom-enhanced-excerpt p { font-size: 100% !important; }
83
+
84
+ .reblog-post .wpcom-enhanced-excerpt blockquote,
85
+ .reblog-post .wpcom-enhanced-excerpt pre,
86
+ .reblog-post .wpcom-enhanced-excerpt code,
87
+ .reblog-post .wpcom-enhanced-excerpt q { font-size: 98% !important; }
88
+
89
+
90
+ /* ]]> */
91
+ </style>
92
+ <meta name="application-name" content="WebFaction Status Blog" /><meta name="msapplication-window" content="width=device-width;height=device-height" /><meta name="msapplication-task" content="name=Subscribe;action-uri=http://statusblog.webfaction.com/feed/;icon-uri=http://0.gravatar.com/blavatar/2cfba9aabc6bd72bac687d30c2412511?s=16" /><meta name="msapplication-task" content="name=Sign up for a free blog;action-uri=http://wordpress.com/signup/;icon-uri=http://s2.wp.com/i/favicon.ico" /><meta name="msapplication-task" content="name=WordPress.com Support;action-uri=http://support.wordpress.com/;icon-uri=http://s2.wp.com/i/favicon.ico" /><meta name="msapplication-task" content="name=WordPress.com Forums;action-uri=http://forums.wordpress.com/;icon-uri=http://s2.wp.com/i/favicon.ico" /><meta name="title" content="WebFaction Status Blog on WordPress.com" />
93
+ <meta name="description" content="" />
94
+ <style id="syntaxhighlighteranchor"></style>
95
+ <link rel="stylesheet" id="custom-css-css" type="text/css" href="http://statusblog.webfaction.com/?custom-css=1&#038;csblog=kVwK&#038;cscache=6&#038;csrev=14" />
96
+
97
+ </head>
98
+
99
+ <body class="wordpress y2013 m08 d26 h01 home typekit-enabled mp6 highlander-enabled highlander-light">
100
+
101
+ <div id="wrapper">
102
+ <div id="header">
103
+ <h1 id="blog-title"><a href="http://statusblog.webfaction.com/" title="WebFaction Status Blog">WebFaction Status Blog</a></h1>
104
+ <div id="blog-description"></div>
105
+ </div><!-- #header -->
106
+
107
+
108
+
109
+ <div id="container">
110
+ <div id="content" class="hfeed">
111
+
112
+ <div id="nav-above" class="navigation">
113
+ <div class="nav-previous"><a href="http://statusblog.webfaction.com/page/2/" >&laquo; Older posts</a></div>
114
+ <div class="nav-next"></div>
115
+ </div>
116
+
117
+
118
+ <div id="post-3575" class="post-3575 post type-post status-publish format-standard hentry category-downtime p1 publish author-dddjl y2013 m08 d25 h04">
119
+ <h2 class="entry-title"><a href="http://statusblog.webfaction.com/2013/08/25/chassis-swap-on-web364-on-monday-august-26th/" title="Permanent link to Chassis swap on web364 on Monday, August&nbsp;26th" rel="bookmark">Chassis swap on web364 on Monday, August&nbsp;26th</a></h2>
120
+ <div class="entry-date"><abbr class="published" title="2013-08-25T16:42:14+0000">August 25, 2013 &#8211; 16:42 UTC</abbr></div>
121
+ <div class="entry-content">
122
+ <p>web364 will be taken down on Monday, August 26th for a routine chassis swap between 6am-11am UTC. Expected downtime is less 30 minutes.</p>
123
+ <div id="jp-post-flair" class="sharedaddy sd-like-enabled"></div>
124
+ </div>
125
+ <div class="entry-meta">
126
+ <span class="entry-author author vcard">By <a class="url fn" href="http://statusblog.webfaction.com/author/dddjl/" title="View all posts by David L.">David L.</a></span>
127
+ <span class="metasep">|</span>
128
+ <span class="entry-category">Posted in <a href="http://statusblog.webfaction.com/category/downtime/" title="View all posts in Downtime" rel="category tag">Downtime</a></span>
129
+ <span class="metasep">|</span>
130
+ <span class="entry-commentlink"><span>Comments Off</span></span>
131
+ </div>
132
+ </div><!-- .post -->
133
+
134
+
135
+
136
+ <div id="post-3630" class="post-3630 post type-post status-publish format-standard hentry category-downtime tag-downtime tag-web364 p2 publish author-wfpeter y2013 m08 d25 h02 alt">
137
+ <h2 class="entry-title"><a href="http://statusblog.webfaction.com/2013/08/25/web364-down/" title="Permanent link to [Fixed] Web364&nbsp;down" rel="bookmark">[Fixed] Web364&nbsp;down</a></h2>
138
+ <div class="entry-date"><abbr class="published" title="2013-08-25T14:16:33+0000">August 25, 2013 &#8211; 14:16 UTC</abbr></div>
139
+ <div class="entry-content">
140
+ <p>Web364 has suddenly gone down and we are currently working to bring it back online ASAP.</p>
141
+ <p>2013-08-25 16:53 UTC: Web364 is back and operating normally.</p>
142
+ <div id="jp-post-flair" class="sharedaddy sd-like-enabled"></div>
143
+ </div>
144
+ <div class="entry-meta">
145
+ <span class="entry-author author vcard">By <a class="url fn" href="http://statusblog.webfaction.com/author/wfpeter/" title="View all posts by webfaction">webfaction</a></span>
146
+ <span class="metasep">|</span>
147
+ <span class="entry-category">Posted in <a href="http://statusblog.webfaction.com/category/downtime/" title="View all posts in Downtime" rel="category tag">Downtime</a></span>
148
+ <span class="metasep">|</span> <span class="tag-links">Tags: <a href="http://statusblog.webfaction.com/tag/downtime/" rel="tag">Downtime</a>, <a href="http://statusblog.webfaction.com/tag/web364/" rel="tag">web364</a></span> <span class="metasep">|</span>
149
+ <span class="entry-commentlink"><span>Comments Off</span></span>
150
+ </div>
151
+ </div><!-- .post -->
152
+
153
+
154
+
155
+ <div id="post-3627" class="post-3627 post type-post status-publish format-standard hentry category-downtime category-problems tag-web226 p3 publish author-webfactionneeravk y2013 m08 d25 h09">
156
+ <h2 class="entry-title"><a href="http://statusblog.webfaction.com/2013/08/25/emergency-maintenance-on-web226-3/" title="Permanent link to [Done] Emergency maintenance on&nbsp;Web226" rel="bookmark">[Done] Emergency maintenance on&nbsp;Web226</a></h2>
157
+ <div class="entry-date"><abbr class="published" title="2013-08-25T09:41:18+0000">August 25, 2013 &#8211; 09:41 UTC</abbr></div>
158
+ <div class="entry-content">
159
+ <p>Filesystem on Web226 had gone read-only so we have booted it into rescue now to run a full filesystem check.</p>
160
+ <p>We will update this post as the check progresses.</p>
161
+ <p>[Aug 25 10:14] The check is done and the server is back and OK now.</p>
162
+ <div id="jp-post-flair" class="sharedaddy sd-like-enabled"></div>
163
+ </div>
164
+ <div class="entry-meta">
165
+ <span class="entry-author author vcard">By <a class="url fn" href="http://statusblog.webfaction.com/author/webfactionneeravk/" title="View all posts by webfactionneeravk">webfactionneeravk</a></span>
166
+ <span class="metasep">|</span>
167
+ <span class="entry-category">Posted in <a href="http://statusblog.webfaction.com/category/downtime/" title="View all posts in Downtime" rel="category tag">Downtime</a>, <a href="http://statusblog.webfaction.com/category/problems/" title="View all posts in Problems" rel="category tag">Problems</a></span>
168
+ <span class="metasep">|</span> <span class="tag-links">Tags: <a href="http://statusblog.webfaction.com/tag/web226/" rel="tag">web226</a></span> <span class="metasep">|</span>
169
+ <span class="entry-commentlink"><span>Comments Off</span></span>
170
+ </div>
171
+ </div><!-- .post -->
172
+
173
+
174
+
175
+ <div id="post-3620" class="post-3620 post type-post status-publish format-standard hentry category-downtime p4 publish author-webfaction y2013 m08 d24 h05 alt">
176
+ <h2 class="entry-title"><a href="http://statusblog.webfaction.com/2013/08/24/intermittent-network-routing-issues-affecting-several-servers/" title="Permanent link to [Fixed] Intermittent network routing issues affecting several&nbsp;servers" rel="bookmark">[Fixed] Intermittent network routing issues affecting several&nbsp;servers</a></h2>
177
+ <div class="entry-date"><abbr class="published" title="2013-08-24T17:24:32+0000">August 24, 2013 &#8211; 17:24 UTC</abbr></div>
178
+ <div class="entry-content">
179
+ <p>Several of our servers are currently experiencing intermittent network routing issues. Affected servers may include:<br />
180
+ Web34, Web42, Web48, Web83, Web91, Web95, Web99, Web102, Web105, Web143, Web148, Web151, Web155, Web162, Web182, Web243</p>
181
+ <p>We&#8217;re working to resolve this issue and will update this post when we have more information.</p>
182
+ <p>2013-08-24 17:45 UTC: The problem has been identified as a rack switch that failed and has gone offline.</p>
183
+ <p>2013-08-24 18:05 UTC: The problem was an issue with an upstream network carrier and has been resolved.</p>
184
+ <div id="jp-post-flair" class="sharedaddy sd-like-enabled"></div>
185
+ </div>
186
+ <div class="entry-meta">
187
+ <span class="entry-author author vcard">By <a class="url fn" href="http://statusblog.webfaction.com/author/webfaction/" title="View all posts by webfaction">webfaction</a></span>
188
+ <span class="metasep">|</span>
189
+ <span class="entry-category">Posted in <a href="http://statusblog.webfaction.com/category/downtime/" title="View all posts in Downtime" rel="category tag">Downtime</a></span>
190
+ <span class="metasep">|</span>
191
+ <span class="entry-commentlink"><span>Comments Off</span></span>
192
+ </div>
193
+ </div><!-- .post -->
194
+
195
+
196
+
197
+ <div id="post-3616" class="post-3616 post type-post status-publish format-standard hentry category-downtime category-problems p5 publish author-wfsean y2013 m08 d22 h08">
198
+ <h2 class="entry-title"><a href="http://statusblog.webfaction.com/2013/08/22/control-panel-and-api-offline/" title="Permanent link to [Fixed] Control panel and API&nbsp;offline" rel="bookmark">[Fixed] Control panel and API&nbsp;offline</a></h2>
199
+ <div class="entry-date"><abbr class="published" title="2013-08-22T20:25:15+0000">August 22, 2013 &#8211; 20:25 UTC</abbr></div>
200
+ <div class="entry-content">
201
+ <p>Our control panel and API server is currently offline. We&#8217;re working to restore service and will update this post as soon as we have more information.</p>
202
+ <p>2013-08-22 21:35 UTC &#8211; The control panel and API are back online.</p>
203
+ <div id="jp-post-flair" class="sharedaddy sd-like-enabled"></div>
204
+ </div>
205
+ <div class="entry-meta">
206
+ <span class="entry-author author vcard">By <a class="url fn" href="http://statusblog.webfaction.com/author/wfsean/" title="View all posts by wfsean">wfsean</a></span>
207
+ <span class="metasep">|</span>
208
+ <span class="entry-category">Posted in <a href="http://statusblog.webfaction.com/category/downtime/" title="View all posts in Downtime" rel="category tag">Downtime</a>, <a href="http://statusblog.webfaction.com/category/problems/" title="View all posts in Problems" rel="category tag">Problems</a></span>
209
+ <span class="metasep">|</span>
210
+ <span class="entry-commentlink"><span>Comments Off</span></span>
211
+ </div>
212
+ </div><!-- .post -->
213
+
214
+
215
+
216
+ <div id="post-3611" class="post-3611 post type-post status-publish format-standard hentry category-downtime tag-downtime tag-web313 p6 publish author-webfaction y2013 m08 d15 h08 alt">
217
+ <h2 class="entry-title"><a href="http://statusblog.webfaction.com/2013/08/15/web313-down-2/" title="Permanent link to [Done]Web313&nbsp;down" rel="bookmark">[Done]Web313&nbsp;down</a></h2>
218
+ <div class="entry-date"><abbr class="published" title="2013-08-15T08:57:04+0000">August 15, 2013 &#8211; 08:57 UTC</abbr></div>
219
+ <div class="entry-content">
220
+ <p>Web313 has gone down and we are working urgently to bring it back online ASAP.</p>
221
+ <p>&#8212;</p>
222
+ <p>09:34:17 Aug 15 2013 UTC: Web313 is back and operating normally.</p>
223
+ <div id="jp-post-flair" class="sharedaddy sd-like-enabled"></div>
224
+ </div>
225
+ <div class="entry-meta">
226
+ <span class="entry-author author vcard">By <a class="url fn" href="http://statusblog.webfaction.com/author/webfaction/" title="View all posts by webfaction">webfaction</a></span>
227
+ <span class="metasep">|</span>
228
+ <span class="entry-category">Posted in <a href="http://statusblog.webfaction.com/category/downtime/" title="View all posts in Downtime" rel="category tag">Downtime</a></span>
229
+ <span class="metasep">|</span> <span class="tag-links">Tags: <a href="http://statusblog.webfaction.com/tag/downtime/" rel="tag">Downtime</a>, <a href="http://statusblog.webfaction.com/tag/web313/" rel="tag">web313</a></span> <span class="metasep">|</span>
230
+ <span class="entry-commentlink"><span>Comments Off</span></span>
231
+ </div>
232
+ </div><!-- .post -->
233
+
234
+
235
+
236
+ <div id="post-3607" class="post-3607 post type-post status-publish format-standard hentry category-downtime p7 publish author-klyntonj y2013 m08 d10 h11">
237
+ <h2 class="entry-title"><a href="http://statusblog.webfaction.com/2013/08/10/emergency-maintenance-on-web329/" title="Permanent link to [Done]Emergency maintenance on&nbsp;Web329." rel="bookmark">[Done]Emergency maintenance on&nbsp;Web329.</a></h2>
238
+ <div class="entry-date"><abbr class="published" title="2013-08-10T23:24:18+0000">August 10, 2013 &#8211; 23:24 UTC</abbr></div>
239
+ <div class="entry-content">
240
+ <p>The file system on Web329 has gone read only. We&#8217;ve taken the machine offline and we are starting a file system check. We&#8217;ll update this post as we have more information.</p>
241
+ <p>2013-08-11 00:26 UTC: The file system check has finished and the server is now back online and operational.</p>
242
+ <div id="jp-post-flair" class="sharedaddy sd-like-enabled"></div>
243
+ </div>
244
+ <div class="entry-meta">
245
+ <span class="entry-author author vcard">By <a class="url fn" href="http://statusblog.webfaction.com/author/klyntonj/" title="View all posts by klyntonj">klyntonj</a></span>
246
+ <span class="metasep">|</span>
247
+ <span class="entry-category">Posted in <a href="http://statusblog.webfaction.com/category/downtime/" title="View all posts in Downtime" rel="category tag">Downtime</a></span>
248
+ <span class="metasep">|</span>
249
+ <span class="entry-commentlink"><span>Comments Off</span></span>
250
+ </div>
251
+ </div><!-- .post -->
252
+
253
+
254
+
255
+ <div id="post-3600" class="post-3600 post type-post status-publish format-standard hentry category-downtime p8 publish author-wfpeter y2013 m08 d10 h11 alt">
256
+ <h2 class="entry-title"><a href="http://statusblog.webfaction.com/2013/08/10/emergency-maintenance-on-web247/" title="Permanent link to [Done] Emergency maintenance on&nbsp;Web247" rel="bookmark">[Done] Emergency maintenance on&nbsp;Web247</a></h2>
257
+ <div class="entry-date"><abbr class="published" title="2013-08-10T11:07:18+0000">August 10, 2013 &#8211; 11:07 UTC</abbr></div>
258
+ <div class="entry-content">
259
+ <p>Web247 filesystem is showing inconsistencies. We’re taking the server down to run a fsck. We’ll update this post as the maintenance progresses.</p>
260
+ <p>2013-08-10 11:59 UTC: The fsck first pass is complete, second pass underway.<br />
261
+ 2013-08-10 12:34 UTC: Second pass at 60%.<br />
262
+ 2013-08-10 13:48 UTC: Second pass complete, scan 1C is underway.<br />
263
+ 2013-08-10 14:46 UTC: Fsck completed and the server is back at operational status.</p>
264
+ <div id="jp-post-flair" class="sharedaddy sd-like-enabled"></div>
265
+ </div>
266
+ <div class="entry-meta">
267
+ <span class="entry-author author vcard">By <a class="url fn" href="http://statusblog.webfaction.com/author/wfpeter/" title="View all posts by webfaction">webfaction</a></span>
268
+ <span class="metasep">|</span>
269
+ <span class="entry-category">Posted in <a href="http://statusblog.webfaction.com/category/downtime/" title="View all posts in Downtime" rel="category tag">Downtime</a></span>
270
+ <span class="metasep">|</span>
271
+ <span class="entry-commentlink"><span>Comments Off</span></span>
272
+ </div>
273
+ </div><!-- .post -->
274
+
275
+
276
+
277
+ <div id="post-3593" class="post-3593 post type-post status-publish format-standard hentry category-downtime p9 publish author-webfaction y2013 m08 d06 h02">
278
+ <h2 class="entry-title"><a href="http://statusblog.webfaction.com/2013/08/06/emergency-maintenance-on-web226-2/" title="Permanent link to [Done] Emergency maintenance on&nbsp;Web226" rel="bookmark">[Done] Emergency maintenance on&nbsp;Web226</a></h2>
279
+ <div class="entry-date"><abbr class="published" title="2013-08-06T14:19:48+0000">August 6, 2013 &#8211; 14:19 UTC</abbr></div>
280
+ <div class="entry-content">
281
+ <p>Web226′s filesytem went read-only. We’re currently taking the server down to run a fsck. We will update this post as maintenance progresses.</p>
282
+ <p>2013-08-06 15:23 UTC: We are still running fsck on the server.<br />
283
+ 2013-08-06 15:43 UTC: The fsck first pass is complete, second pass underway.<br />
284
+ 2013-08-06 16:40 UTC: Fsck completed and the server is back at operational status</p>
285
+ <div id="jp-post-flair" class="sharedaddy sd-like-enabled"></div>
286
+ </div>
287
+ <div class="entry-meta">
288
+ <span class="entry-author author vcard">By <a class="url fn" href="http://statusblog.webfaction.com/author/webfaction/" title="View all posts by webfaction">webfaction</a></span>
289
+ <span class="metasep">|</span>
290
+ <span class="entry-category">Posted in <a href="http://statusblog.webfaction.com/category/downtime/" title="View all posts in Downtime" rel="category tag">Downtime</a></span>
291
+ <span class="metasep">|</span>
292
+ <span class="entry-commentlink"><span>Comments Off</span></span>
293
+ </div>
294
+ </div><!-- .post -->
295
+
296
+
297
+
298
+ <div id="post-3588" class="post-3588 post type-post status-publish format-standard hentry category-downtime p10 publish author-webfactiongianlucar y2013 m08 d05 h02 alt">
299
+ <h2 class="entry-title"><a href="http://statusblog.webfaction.com/2013/08/05/emergency-maintenance-on-web400-july-5th-2013/" title="Permanent link to [Done]Emergency maintenance on Web400, August 5th,&nbsp;2013." rel="bookmark">[Done]Emergency maintenance on Web400, August 5th,&nbsp;2013.</a></h2>
300
+ <div class="entry-date"><abbr class="published" title="2013-08-05T14:15:22+0000">August 5, 2013 &#8211; 14:15 UTC</abbr></div>
301
+ <div class="entry-content">
302
+ <p>Web400 filesystem went read only. We&#8217;re currently taking down the server to run a fsck. We will update this post as maintenance progresses.</p>
303
+ <p>2013-08-05 14:35 UTC Fsck completed and the server is back at operational status</p>
304
+ <div id="jp-post-flair" class="sharedaddy sd-like-enabled"></div>
305
+ </div>
306
+ <div class="entry-meta">
307
+ <span class="entry-author author vcard">By <a class="url fn" href="http://statusblog.webfaction.com/author/webfactiongianlucar/" title="View all posts by webfactiongianlucar">webfactiongianlucar</a></span>
308
+ <span class="metasep">|</span>
309
+ <span class="entry-category">Posted in <a href="http://statusblog.webfaction.com/category/downtime/" title="View all posts in Downtime" rel="category tag">Downtime</a></span>
310
+ <span class="metasep">|</span>
311
+ <span class="entry-commentlink"><span>Comments Off</span></span>
312
+ </div>
313
+ </div><!-- .post -->
314
+
315
+
316
+
317
+ <div id="nav-below" class="navigation">
318
+ <div class="nav-previous"><a href="http://statusblog.webfaction.com/page/2/" >&laquo; Older posts</a></div>
319
+ <div class="nav-next"></div>
320
+ </div>
321
+
322
+ </div><!-- #content .hfeed -->
323
+ </div><!-- #container -->
324
+
325
+ <div id="primary" class="sidebar">
326
+ <ul>
327
+ <li class="pagenav"><h3>Pages</h3><ul><li class="page_item page-item-2"><a href="http://statusblog.webfaction.com/about/">About</a></li>
328
+ </ul></li>
329
+ <li class="category-links">
330
+ <h3>Categories</h3>
331
+ <ul>
332
+ <li class="cat-item cat-item-56228"><a href="http://statusblog.webfaction.com/category/downtime/" title="View all posts filed under Downtime">Downtime</a>
333
+ </li>
334
+ <li class="cat-item cat-item-54"><a href="http://statusblog.webfaction.com/category/general/" title="View all posts filed under General">General</a>
335
+ </li>
336
+ <li class="cat-item cat-item-6615"><a href="http://statusblog.webfaction.com/category/problems/" title="View all posts filed under Problems">Problems</a>
337
+ </li>
338
+ <li class="cat-item cat-item-5753895"><a href="http://statusblog.webfaction.com/category/scheduled-downtime/" title="View all posts filed under Scheduled downtime">Scheduled downtime</a>
339
+ </li>
340
+ <li class="cat-item cat-item-736642"><a href="http://statusblog.webfaction.com/category/service-change/" title="View all posts filed under Service change">Service change</a>
341
+ </li>
342
+
343
+ </ul>
344
+ </li>
345
+ <li class="archive-links">
346
+ <h3>Archives</h3>
347
+ <ul>
348
+ <li><a href='http://statusblog.webfaction.com/2013/08/' title='August 2013'>August 2013</a></li>
349
+ <li><a href='http://statusblog.webfaction.com/2013/07/' title='July 2013'>July 2013</a></li>
350
+ <li><a href='http://statusblog.webfaction.com/2013/06/' title='June 2013'>June 2013</a></li>
351
+ <li><a href='http://statusblog.webfaction.com/2013/05/' title='May 2013'>May 2013</a></li>
352
+ <li><a href='http://statusblog.webfaction.com/2013/04/' title='April 2013'>April 2013</a></li>
353
+ <li><a href='http://statusblog.webfaction.com/2013/03/' title='March 2013'>March 2013</a></li>
354
+ <li><a href='http://statusblog.webfaction.com/2013/02/' title='February 2013'>February 2013</a></li>
355
+ <li><a href='http://statusblog.webfaction.com/2013/01/' title='January 2013'>January 2013</a></li>
356
+ <li><a href='http://statusblog.webfaction.com/2012/12/' title='December 2012'>December 2012</a></li>
357
+ <li><a href='http://statusblog.webfaction.com/2012/11/' title='November 2012'>November 2012</a></li>
358
+ <li><a href='http://statusblog.webfaction.com/2012/10/' title='October 2012'>October 2012</a></li>
359
+ <li><a href='http://statusblog.webfaction.com/2012/09/' title='September 2012'>September 2012</a></li>
360
+ <li><a href='http://statusblog.webfaction.com/2012/08/' title='August 2012'>August 2012</a></li>
361
+ <li><a href='http://statusblog.webfaction.com/2012/07/' title='July 2012'>July 2012</a></li>
362
+ <li><a href='http://statusblog.webfaction.com/2012/06/' title='June 2012'>June 2012</a></li>
363
+ <li><a href='http://statusblog.webfaction.com/2012/05/' title='May 2012'>May 2012</a></li>
364
+ <li><a href='http://statusblog.webfaction.com/2012/04/' title='April 2012'>April 2012</a></li>
365
+ <li><a href='http://statusblog.webfaction.com/2012/03/' title='March 2012'>March 2012</a></li>
366
+ <li><a href='http://statusblog.webfaction.com/2012/02/' title='February 2012'>February 2012</a></li>
367
+ <li><a href='http://statusblog.webfaction.com/2012/01/' title='January 2012'>January 2012</a></li>
368
+ <li><a href='http://statusblog.webfaction.com/2011/12/' title='December 2011'>December 2011</a></li>
369
+ <li><a href='http://statusblog.webfaction.com/2011/11/' title='November 2011'>November 2011</a></li>
370
+ <li><a href='http://statusblog.webfaction.com/2011/10/' title='October 2011'>October 2011</a></li>
371
+ <li><a href='http://statusblog.webfaction.com/2011/09/' title='September 2011'>September 2011</a></li>
372
+ <li><a href='http://statusblog.webfaction.com/2011/08/' title='August 2011'>August 2011</a></li>
373
+ <li><a href='http://statusblog.webfaction.com/2011/07/' title='July 2011'>July 2011</a></li>
374
+ <li><a href='http://statusblog.webfaction.com/2011/06/' title='June 2011'>June 2011</a></li>
375
+ <li><a href='http://statusblog.webfaction.com/2011/05/' title='May 2011'>May 2011</a></li>
376
+ <li><a href='http://statusblog.webfaction.com/2011/04/' title='April 2011'>April 2011</a></li>
377
+ <li><a href='http://statusblog.webfaction.com/2011/03/' title='March 2011'>March 2011</a></li>
378
+ <li><a href='http://statusblog.webfaction.com/2011/02/' title='February 2011'>February 2011</a></li>
379
+ <li><a href='http://statusblog.webfaction.com/2011/01/' title='January 2011'>January 2011</a></li>
380
+ <li><a href='http://statusblog.webfaction.com/2010/12/' title='December 2010'>December 2010</a></li>
381
+ <li><a href='http://statusblog.webfaction.com/2010/11/' title='November 2010'>November 2010</a></li>
382
+ <li><a href='http://statusblog.webfaction.com/2010/10/' title='October 2010'>October 2010</a></li>
383
+ <li><a href='http://statusblog.webfaction.com/2010/09/' title='September 2010'>September 2010</a></li>
384
+ <li><a href='http://statusblog.webfaction.com/2010/08/' title='August 2010'>August 2010</a></li>
385
+ <li><a href='http://statusblog.webfaction.com/2010/07/' title='July 2010'>July 2010</a></li>
386
+ <li><a href='http://statusblog.webfaction.com/2010/06/' title='June 2010'>June 2010</a></li>
387
+ <li><a href='http://statusblog.webfaction.com/2010/05/' title='May 2010'>May 2010</a></li>
388
+ <li><a href='http://statusblog.webfaction.com/2010/04/' title='April 2010'>April 2010</a></li>
389
+ <li><a href='http://statusblog.webfaction.com/2010/03/' title='March 2010'>March 2010</a></li>
390
+ <li><a href='http://statusblog.webfaction.com/2010/02/' title='February 2010'>February 2010</a></li>
391
+ <li><a href='http://statusblog.webfaction.com/2010/01/' title='January 2010'>January 2010</a></li>
392
+ <li><a href='http://statusblog.webfaction.com/2009/12/' title='December 2009'>December 2009</a></li>
393
+ <li><a href='http://statusblog.webfaction.com/2009/11/' title='November 2009'>November 2009</a></li>
394
+ <li><a href='http://statusblog.webfaction.com/2009/10/' title='October 2009'>October 2009</a></li>
395
+ <li><a href='http://statusblog.webfaction.com/2009/09/' title='September 2009'>September 2009</a></li>
396
+ <li><a href='http://statusblog.webfaction.com/2009/08/' title='August 2009'>August 2009</a></li>
397
+ <li><a href='http://statusblog.webfaction.com/2009/07/' title='July 2009'>July 2009</a></li>
398
+ <li><a href='http://statusblog.webfaction.com/2009/06/' title='June 2009'>June 2009</a></li>
399
+ <li><a href='http://statusblog.webfaction.com/2009/05/' title='May 2009'>May 2009</a></li>
400
+ <li><a href='http://statusblog.webfaction.com/2009/04/' title='April 2009'>April 2009</a></li>
401
+ <li><a href='http://statusblog.webfaction.com/2009/03/' title='March 2009'>March 2009</a></li>
402
+ <li><a href='http://statusblog.webfaction.com/2009/02/' title='February 2009'>February 2009</a></li>
403
+ <li><a href='http://statusblog.webfaction.com/2006/08/' title='August 2006'>August 2006</a></li>
404
+
405
+ </ul>
406
+ </li>
407
+ </ul>
408
+ </div><!-- #primary .sidebar -->
409
+
410
+ <div id="secondary" class="sidebar">
411
+ <ul>
412
+ <li class="blog-search">
413
+ <h3><label for="s">Search</label></h3>
414
+ <form id="searchform" method="get" action="http://statusblog.webfaction.com/">
415
+ <div>
416
+ <input id="s" name="s" type="text" value="" size="10" />
417
+ <input id="searchsubmit" name="searchsubmit" type="submit" value="Find &raquo;" />
418
+ </div>
419
+ </form>
420
+ </li>
421
+ <li id="linkcat-1356" class="linkcat"><h3>Blogroll</h3>
422
+ <ul class='xoxo blogroll'>
423
+ <li><a href="http://wordpress.com/">WordPress.com</a></li>
424
+ <li><a href="http://wordpress.org/">WordPress.org</a></li>
425
+
426
+ </ul>
427
+ </li>
428
+
429
+ <li class="feed-links">
430
+ <h3>RSS Feeds</h3>
431
+ <ul>
432
+ <li><a href="http://statusblog.webfaction.com/feed/" title="WebFaction Status Blog RSS 2.0 Feed" rel="alternate" type="application/rss+xml">All posts</a></li>
433
+ <li><a href="http://statusblog.webfaction.com/comments/feed/" title="WebFaction Status Blog Comments RSS 2.0 Feed" rel="alternate" type="application/rss+xml">All comments</a></li>
434
+ </ul>
435
+ </li>
436
+ <li class="meta-links">
437
+ <h3>Meta</h3>
438
+ <ul>
439
+ <li><a href="http://wordpress.com/signup/?ref=wplogin">Register</a></li> <li><a href="http://webfaction.wordpress.com/wp-login.php">Log in</a></li>
440
+ </ul>
441
+ </li>
442
+ </ul>
443
+ </div><!-- #secondary .sidebar -->
444
+ <div id="footer">
445
+ <span id="generator-link"><a href="http://wordpress.com/?ref=footer" rel="generator">Blog at WordPress.com</a>.</span>
446
+ <span class="metasep">|</span>
447
+ <span id="theme-link">Theme: <a href="http://www.plaintxt.org/themes/sandbox/" rel="designer">Sandbox 0.6.1</a>.</span>
448
+ </div><!-- #footer -->
449
+
450
+ </div><!-- #wrapper -->
451
+
452
+
453
+ <script type="text/javascript">
454
+ var _qevents = _qevents || [], wpcomQuantcastData = {"qacct":"p-18-mFEk4J448M","labels":",language.en,type.wpcom"};
455
+ function wpcomQuantcastPixel( labels, options ) {
456
+ var i, defaults = wpcomQuantcastData, data = { event: 'ajax' };
457
+
458
+ labels = labels || '';
459
+ options = options || {};
460
+
461
+ if ( typeof labels != 'string' )
462
+ options = labels;
463
+
464
+ for ( i in defaults ) {
465
+ data[i] = defaults[i];
466
+ }
467
+
468
+ for ( i in options ) {
469
+ data[i] = options[i];
470
+ }
471
+
472
+ if ( data.labels ) {
473
+ data.labels += ',' + labels;
474
+ } else {
475
+ data.labels = labels;
476
+ }
477
+
478
+ _qevents.push( data );
479
+ };
480
+ (function() {var elem = document.createElement('script');elem.src = (document.location.protocol == "https:" ? "https://secure" : "http://edge") + ".quantserve.com/quant.js";elem.async = true;elem.type = "text/javascript";var scpt = document.getElementsByTagName('script')[0];scpt.parentNode.insertBefore(elem, scpt); })();
481
+ _qevents.push( wpcomQuantcastData );
482
+ </script>
483
+ <noscript><div style="display: none;"><img src="//pixel.quantserve.com/pixel/p-18-mFEk4J448M.gif?labels=%2Clanguage.en%2Ctype.wpcom" height="1" width="1" alt="" /></div></noscript>
484
+
485
+ <script type='text/javascript' src='//0.gravatar.com/js/gprofiles.js?ver=201335ac'></script>
486
+ <script type='text/javascript'>
487
+ /* <![CDATA[ */
488
+ var WPGroHo = {"my_hash":""};
489
+ /* ]]> */
490
+ </script>
491
+ <script type='text/javascript' src='http://s0.wp.com/wp-content/mu-plugins/gravatar-hovercards/wpgroho.js?m=1351637563g'></script>
492
+ <script>jQuery(document).ready(function($){ Gravatar.profile_cb = function( h, d ) { WPGroHo.syncProfileData( h, d ); }; Gravatar.my_hash = WPGroHo.my_hash; Gravatar.init( 'body', '#wp-admin-bar-my-account' ); });</script> <div style="display:none">
493
+ </div>
494
+
495
+ <div id="bit" class="loggedout-follow-normal">
496
+ <a class="bsub" href="javascript:void(0)"><span id='bsub-text'>Follow</span></a>
497
+ <div id="bitsubscribe">
498
+
499
+ <h3><label for="loggedout-follow-field">Follow &ldquo;WebFaction Status Blog&rdquo;</label></h3>
500
+
501
+ <form action="https://subscribe.wordpress.com" method="post" accept-charset="utf-8" id="loggedout-follow">
502
+ <p>Get every new post delivered to your Inbox.</p>
503
+
504
+ <p id="loggedout-follow-error" style="display: none;"></p>
505
+
506
+ <p class="bit-follow-count">Join 696 other followers</p>
507
+ <p><input type="email" name="email" style="width: 95%; padding: 1px 2px" value="Enter your email address" onfocus='this.value=(this.value=="Enter your email address") ? "" : this.value;' onblur='this.value=(this.value=="") ? "Enter email address" : this.value;' id="loggedout-follow-field"/></p>
508
+
509
+ <input type="hidden" name="action" value="subscribe"/>
510
+ <input type="hidden" name="blog_id" value="4987698"/>
511
+ <input type="hidden" name="source" value="http://statusblog.webfaction.com/"/>
512
+ <input type="hidden" name="sub-type" value="loggedout-follow"/>
513
+
514
+ <input type="hidden" id="_wpnonce" name="_wpnonce" value="1ecf36cdcb" /><input type="hidden" name="_wp_http_referer" value="/" />
515
+ <p id='bsub-subscribe-button'><input type="submit" value="Sign me up" /></p>
516
+ </form>
517
+ <div id='bsub-credit'><a href="http://wordpress.com/signup/?ref=lof">Powered by WordPress.com</a></div>
518
+ </div><!-- #bitsubscribe -->
519
+ </div><!-- #bit -->
520
+ <script type='text/javascript' src='http://s1.wp.com/wp-content/js/devicepx.js?m=1373391538g'></script>
521
+ <script type="text/javascript">
522
+ // <![CDATA[
523
+ (function() {
524
+ try{
525
+ if ( window.external &&'msIsSiteMode' in window.external) {
526
+ if (window.external.msIsSiteMode()) {
527
+ var jl = document.createElement('script');
528
+ jl.type='text/javascript';
529
+ jl.async=true;
530
+ jl.src='/wp-content/plugins/ie-sitemode/custom-jumplist.php';
531
+ var s = document.getElementsByTagName('script')[0];
532
+ s.parentNode.insertBefore(jl, s);
533
+ }
534
+ }
535
+ }catch(e){}
536
+ })();
537
+ // ]]>
538
+ </script><script src="http://s.stats.wordpress.com/w.js?21" type="text/javascript"></script>
539
+ <script type="text/javascript">
540
+ st_go({'blog':'4987698','v':'wpcom','tz':'0','user_id':'0','subd':'webfaction'});
541
+ ex_go({'crypt':'UE40eW5QN0p8M2Y/RE1oV0pFNEwueXFaVXlyMGwvVG9bYmZXaDJ1Nmx+ankzUUUvVlg4OF92Y0gwNXlOMVYwc1FKb3pmcFJbN3dUWmc5WldXR0Z+Vy8rJXJxdzR+ZE4saTV6V2NLTU84Q1piZHc0a2h5ZEd0cGc0aUlDMmZBSnZdM2V8Nk53RkFRLzQ0TEpEaHh8P3BJUDlYb2hFS3JjdHViJUxwY2U3OEdwblEtemJbdUZRVUVML0MmfHx0WWVHYklmSnFvWDF+Q3RHTWwyNFl5LHE9aW5NfFBDPXV3QXRGP25ddlhCRi5oRHZMeGZMbms3Y35RUEswa0Fpa0dnVHQyfkNGayZdY0NYT2ssdjRPX3x1TGhmXyxhQlIz'});
542
+ addLoadEvent(function(){linktracker_init('4987698',0);});
543
+ </script>
544
+ <noscript><img src="http://stats.wordpress.com/b.gif?v=noscript" style="height:0px;width:0px;overflow:hidden" alt="" /></noscript>
545
+ <script type="text/javascript">
546
+ // Trigger Quantcast pixel for each Infinite Scroll post load
547
+ if ( 'function' === typeof( jQuery ) ) {
548
+ jQuery( document.body ).on( 'post-load', function() {
549
+ if ( 'function' === typeof( wpcomQuantcastPixel ) )
550
+ wpcomQuantcastPixel();
551
+ } );
552
+ }
553
+ </script>
554
+ <script>
555
+ if ( 'object' === typeof wpcom_mobile_user_agent_info ) {
556
+
557
+ wpcom_mobile_user_agent_info.init();
558
+ var mobileStatsQueryString = "";
559
+
560
+ if( false !== wpcom_mobile_user_agent_info.matchedPlatformName )
561
+ mobileStatsQueryString += "&x_" + 'mobile_platforms' + '=' + wpcom_mobile_user_agent_info.matchedPlatformName;
562
+
563
+ if( false !== wpcom_mobile_user_agent_info.matchedUserAgentName )
564
+ mobileStatsQueryString += "&x_" + 'mobile_devices' + '=' + wpcom_mobile_user_agent_info.matchedUserAgentName;
565
+
566
+ if( wpcom_mobile_user_agent_info.isIPad() )
567
+ mobileStatsQueryString += "&x_" + 'ipad_views' + '=' + 'views';
568
+
569
+ if( "" != mobileStatsQueryString ) {
570
+ new Image().src = document.location.protocol + '//stats.wordpress.com/g.gif?v=wpcom-no-pv' + mobileStatsQueryString + '&baba=' + Math.random();
571
+ }
572
+
573
+ }
574
+ </script>
575
+ </body>
576
+ </html>
@@ -0,0 +1,39 @@
1
+ require 'nokogiri'
2
+ require 'wfstatus/parser'
3
+
4
+ include Wfstatus
5
+
6
+ describe "parser" do
7
+
8
+ before :each do
9
+ @html = IO.read(File.expand_path("fixtures/sample.htm",File.dirname(__FILE__)))
10
+ @config = {}
11
+ @parser = Parser.new(@html, @config)
12
+ end
13
+
14
+ it "should remember the html string" do
15
+ @parser.html.should eql(@html)
16
+ end
17
+
18
+ it "should have a nokogiri page" do
19
+ @parser.page.class.should eql(Nokogiri::HTML::Document)
20
+ end
21
+
22
+ describe "#posts" do
23
+ before :each do
24
+ @posts = @parser.posts
25
+ end
26
+
27
+ it "should find some posts" do
28
+ @posts.count.should eql(10)
29
+ end
30
+ end
31
+
32
+ describe "#messages" do
33
+ it "should populate an array of Wfmessage objects for each post" do
34
+ @parser.messages.count.should eql(10)
35
+ end
36
+
37
+ end
38
+
39
+ end
@@ -0,0 +1 @@
1
+ require 'rspec'
@@ -0,0 +1,48 @@
1
+ require 'date'
2
+ require 'wfstatus/wfmessage'
3
+
4
+ include Wfstatus
5
+
6
+ describe "wfmessage" do
7
+ before :each do
8
+ @posted_str = "2013-08-25T16:42:14+0000"
9
+ @title = "Intermittent delays on web321, web103"
10
+ @message = "Network issues are causing intermittent delays on the following servers: web103 and web444"
11
+ @url = "http://messageblog.webfaction.com/2013/08/25/intermittent-delays-on-august-25th/"
12
+ @config = {
13
+ 'servers' => {"web309" => "wibble.com", "web444" => "microsoft.com", "web103" => "campers.net"},
14
+ 'utc_offset' => '-08:00'
15
+ }
16
+ @wfmessage = Wfmessage.new(@posted_str, @title, @message, @url, @config)
17
+ end
18
+
19
+ it "should hold on to the data" do
20
+ @wfmessage.posted.should eql(DateTime.strptime(@posted_str))
21
+ @wfmessage.title.should eql(@title)
22
+ @wfmessage.message.should eql(@message)
23
+ @wfmessage.url.should eql(@url)
24
+ end
25
+
26
+ it "should get the servers from the title and message" do
27
+ @wfmessage.servers.count.should eql(3)
28
+ %w(web321 web103 web444).each do|svr|
29
+ @wfmessage.servers.include?(svr).should be_true()
30
+ end
31
+ end
32
+
33
+ describe "#to_s" do
34
+ it "should combine the posted string, title, message and url" do
35
+ @wfmessage.to_s.should eql(
36
+ <<-STR
37
+ SERVER INFO: campers.net, microsoft.com
38
+
39
+ 8:42:14 AM Sunday, Aug 25 2013 -0800
40
+ Intermittent delays on web321, web103
41
+ Network issues are causing intermittent delays on the following servers: web103 and web444
42
+ http://messageblog.webfaction.com/2013/08/25/intermittent-delays-on-august-25th/
43
+
44
+ STR
45
+ )
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'wfstatus/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "wfstatus"
8
+ spec.version = Wfstatus::VERSION
9
+ spec.author = "Dow Drake"
10
+ spec.email = "dowdrake@msn.com"
11
+ spec.homepage = "https://github.com/ddrake/wfstatus"
12
+ spec.description = %q{Webfaction server status tool}
13
+ spec.executables = "wfstatus"
14
+ spec.summary = %q{Retrieves Webfaction Status Blog posts mentioning your servers and emails you with the results.}
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files`.split($/)
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+
24
+ spec.add_dependency "nokogiri"
25
+ spec.add_dependency "mail"
26
+
27
+ end
metadata ADDED
@@ -0,0 +1,127 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: wfstatus
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Dow Drake
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-08-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: nokogiri
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: mail
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: Webfaction server status tool
70
+ email: dowdrake@msn.com
71
+ executables:
72
+ - wfstatus
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - .gitignore
77
+ - Gemfile
78
+ - LICENSE.txt
79
+ - README.md
80
+ - Rakefile
81
+ - bin/wfstatus
82
+ - lib/wfstatus.rb
83
+ - lib/wfstatus/builder.rb
84
+ - lib/wfstatus/parser.rb
85
+ - lib/wfstatus/version.rb
86
+ - lib/wfstatus/wfmessage.rb
87
+ - spec/builder_spec.rb
88
+ - spec/fixtures/config.yml
89
+ - spec/fixtures/config_dow.yml
90
+ - spec/fixtures/sample.htm
91
+ - spec/parser_spec.rb
92
+ - spec/spec_helper.rb
93
+ - spec/wfmessage_spec.rb
94
+ - wfstatus.gemspec
95
+ homepage: https://github.com/ddrake/wfstatus
96
+ licenses:
97
+ - MIT
98
+ metadata: {}
99
+ post_install_message:
100
+ rdoc_options: []
101
+ require_paths:
102
+ - lib
103
+ required_ruby_version: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - '>='
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ required_rubygems_version: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - '>='
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ requirements: []
114
+ rubyforge_project:
115
+ rubygems_version: 2.0.6
116
+ signing_key:
117
+ specification_version: 4
118
+ summary: Retrieves Webfaction Status Blog posts mentioning your servers and emails
119
+ you with the results.
120
+ test_files:
121
+ - spec/builder_spec.rb
122
+ - spec/fixtures/config.yml
123
+ - spec/fixtures/config_dow.yml
124
+ - spec/fixtures/sample.htm
125
+ - spec/parser_spec.rb
126
+ - spec/spec_helper.rb
127
+ - spec/wfmessage_spec.rb