Listing files modified on a certain day

You can retrieve a list of files that were last modified yesterday in a wide variety of ways with scripting languages. The “find” command would probably be the simplest method in Linux by using the mtime option like so:

#find -maxdepth 1 -mtime +1 -mtime -2

The find command is disabled however in Cloud Sites for performance reasons, so an alternative must be found. Here is one example of a line that can be run in a .sh file that can also give a list of files modified yesterday.

ls -l --time-style='+%F' /mnt/stor15-wc2-dfw1/123456/backups/ | awk '{print $6,$7}' | grep "`date --date='1 day ago' '+%F'`" | awk '{print $2}'

The directory path must be replaced by your full server side path before using this command.

This command can be run through a cron job within a .sh file in the same manner that unzip commands are run through a .sh file in this article:
http://cloudsites.rackspacecloud.com/index.php/Use_cron_to_extract_and_compress_%28zip_%26_unzip%29

This bash one liner will first list the contents of a directory putting the time in the %F format (consult documentation on the date command), cuts out all columns save for the date and filename, only displays those lines with yesterday’s date within them, and then displays just the filename column. The output of this command will be a list of filenames, one per line, of files within this directory that were modified within the last day which can then be processed using an xargs command or piped into a while loop like so:

ls -l --time-style='+%F' /full/path/backups/ | awk '{print $6,$7}' | grep "`date --date='1 day ago' '+%F'`" | awk '{print $2}' | while read line; do rm /full/path/$line; done

More information on modifying the day to check for using the date command can be found here:
http://ss64.com/bash/date.html

No Comments Posted in Uncategorized
Unzipping files through php

The following script will unzip all files within the current directory and then print its results to the browser. To unzip a file, upload your .zip files and then upload this php file to the same directory and then visit this page in your browser. You could for example save this file as unzip.php and then upload it through FTP to /www.donotexec.com/web/content/ and then run it by visiting http://www.donotexec.com/unzip.php in your browser.

Happy coding!

1
2
3
4
<?php
$output = shell_exec('ls | grep .zip$ | while read line; do unzip `pwd`/$line; done 2>&1');
echo "<pre>$output</pre".">";
?>
No Comments Posted in php
Tagged , , ,
Allow or Deny by IP in IIS Cloud Sites

The steps:
Add the following entry into your web.config file and then place a SecurityHttpModule.cs file within a folder named App_Code with the code given. Replace 127.0.0.1 with the IP address that you would like to allow for your domain.
Any questions? Feel free to ask! But be sure to be specific so I can tell your comment is not spam!

My Sources:
Original code from:

The following used to aid in implementation:

WARNINGS:
This code works on my sites, however you may not be able to implement this on your own site. I am not responsible for any damages or data loss that may result in implementing this code. As always, whenever changing the configuration or modifying code on a site, test the code in a staging environment first and back up all data including any databases before implementing.

Applying this code to an entire site will cause compute cycles to rise significantly as every http request will rely on c# code to be run even for static files such as txt, html, and css. For this reason I would recommend not using this on a site that receives a considerable number of hits and to isolate protected content within its own subdomain. Consider carefully if static files, especially those served by the Media Accelerator, would need to run through this screening process and if not, host them on a separate site to reduce the compute cycles consumed.

Add to Web.Config:

1
2
3
4
5
6
7
8
<?xml version="1.0"?>
<configuration>
    <system.webServer>
        <modules>
            <add name="SecurityHttpModule" type="SecurityHttpModule"/>
        </modules>
    </system.webServer>
</configuration>

Save in App_Code\SecurityHttpModule.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
///
/// HTTP module to restrict access by IP address
/// From http://www.codeproject.com/KB/aspnet/http-module-ip-security.aspx
/// Modified with:
///  http://msdn.microsoft.com/en-us/ms227673.aspx
///  http://www.geekpedia.com/KB84_The-name-Request-does-not-exist-in-the-current-context.html
///  http://cloudsites.rackspacecloud.com/index.php/How_do_I_deny_certain_IP_addresses_from_accessing_my_site%3F
///
using System;
using System.Web;
public class SecurityHttpModule: IHttpModule
{
 public SecurityHttpModule() { }
    public void Init(HttpApplication context)
    {
        context.BeginRequest += new EventHandler(Application_BeginRequest);
    }
    private void Application_BeginRequest(object source, EventArgs e)
    {
        HttpContext context = ((HttpApplication)source).Context;
        string ipAddress =  System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_CLUSTER_CLIENT_IP"];
		string path = ((HttpApplication)source).Request.Path;
		string ext = path.Substring(path.Length-3, 3).ToLower();
        if (!IsValidIpAddress(ipAddress) &amp;&amp; ext != "jpg" &amp;&amp; ext != "gif" &amp;&amp; ext != "png" &amp;&amp; ext != "mp3" &amp;&amp; ext != "wav" &amp;&amp; ext != "wma" &amp;&amp; ext != "swf")
        {
            context.Response.StatusCode = 403;  // (Forbidden)
	}
    }
    private bool IsValidIpAddress(string ipAddress)
    {
        return (ipAddress == "127.0.0.1");
    }
    public void Dispose() { /* clean up */ }
}
No Comments Posted in ASP.NET
Tagged , ,
Changing default FTP permissions in Cloud Sites

Setting the default permissions for newly uploaded files is often useful as a convenience, especially when having multiple FTP users within the same site as if all files are owned by the same user, a recursive chmod can be used on the content folder. To allow all FTP users for your site to be able to modify all files, group write permissions would need to be added to these files after they are uploaded. This can usually be done after uploading by right-clicking on the file and selecting that write permissions be added. Some FTP clients can have this chmod operation automated though so that any file that is uploaded is automatically given the permissions that you desire.
Within WinSCP this option can be found under Preferences menu->Preferences… button->Transfer menu under the Set permissions option of the Upload options section as can be seen here.  The option in particular that we are concerned with is W under Group.  For more on file permissions on Cloud Sites, check out this article in the Knowledge Base.

WinSCP default permissions section

In order to avoid most difficulties with using several FTP users, I would suggest limiting an FTP user to one directory and then only using this one FTP user within this directory.

No Comments Posted in FTP
Tagged , ,
Sample ASP.NET code that works in Cloud Sites

Uploading the following 3 files will result in a bare bones ASP.NET site that functions within Rackspace Cloud Sites. It would be possible to trim these down further, especially the web.config, however this is what I came up with through Visual Studio with minimal editing to the resultant files.

web.config:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?xml version=”1.0″?>
<configuration>
<appSettings/>
<connectionStrings/>
<system.web>
<compilation debug=”true” strict=”true” explicit=”true” />
<pages>
<namespaces>
<clear />
<add namespace=”System” />
<add namespace=”System.Collections” />
<add namespace=”System.Collections.Specialized” />
<add namespace=”System.Configuration” />
<add namespace=”System.Text” />
<add namespace=”System.Text.RegularExpressions” />
<add namespace=”System.Web” />
<add namespace=”System.Web.Caching” />
<add namespace=”System.Web.SessionState” />
<add namespace=”System.Web.Security” />
<add namespace=”System.Web.Profile” />
<add namespace=”System.Web.UI” />
<add namespace=”System.Web.UI.WebControls” />
<add namespace=”System.Web.UI.WebControls.WebParts” />
<add namespace=”System.Web.UI.HtmlControls” />
</namespaces>
</pages>
<authentication mode=”Windows” />
<customErrors mode=”Off”/>
</system.web>
</configuration>

Testing.aspx:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<%@ Page Language="VB" AutoEventWireup="False" CodeFile="Testing.aspx.vb" Inherits="Testing" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
	<title>Testing</title>
</head>
<body>
	<form id="form1" runat="server">
		<div>
			<asp:Label id="lbl1" runat="server" Text="Hello World"/>
		</div>
	</form>
</body>
</html>

Testing.aspx.vb:

1
2
3
4
5
6
7
8
9
10
11
12
'Option Explicit On
'Option Strict On
 
Imports System
Imports System.Web
Imports System.Web.UI
Partial Public Class Testing
	Inherits System.Web.UI.Page
	Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
		lbl1.Text="Hi World!"
	End Sub
End Class
No Comments Posted in ASP.NET
Tagged , ,
Sorting files by datestamp in Bash

You would think there were a function in Linux already that would do this.  The following command will sort all files in a directory and all subdirectories for the past 14 days by datestamp.

bash$ find . -mtime -14 -type f | while read line; do echo -n `ls -l --time-style='+%s %F %T' "$line" | awk '{print $6,$7,$8}'`; echo " $line"; done | sort | cut -d ' ' -f 1 --complement
No Comments Posted in bash, Security
Tagged , ,
Securing WordPress on a shared host

The following articles contain details on securing your WordPress installation on a shared hosting service, specifically Rackspace Cloud Sites.  This post will change as more resources are compiled:

On a shared hosting service running suexec, there should be no reason to have global permissions on a php site:

Backup, Backup, Backup!  Just 2 of many possible backup scripts.

If the unfortunate does occur, these three links contain information on recovering. Due to the possibility of backdoors being injected within your sites though, the safest option would be to restore from one of your backups. You do keep backups, right?

No Comments Posted in Security
Tagged , ,
Simple Bash Loop Constructs

Many times it is useful to write an ad-hoc program within bash to accomplish a task. Most of an ad-hoc script is composed of text formatting as well as a loop to get things running. The most useful loop structure that I find in my experience is a do while loop as follows:

bash$ ls | while read line; do cat $line; done >out.txt

As can be seen from this command line, most of the heavy lifting is performed within the while loop.  This while loop will perform the given command on each line that is input into the construct and your bash command can further redirect its output to a file or a command that follows.  You may notice this construct in many of the bash one-liners that I post here in the future.  xargs can usually be used to perform repeated tasks as well, however I find that this chain of commands is more flexible.

No Comments Posted in bash
Tagged ,