blob: 51134383af7924b203e5d26afa8bf01e794b1a3f (
plain) (
tree)
|
|
/*
* Purger (c) 2006 Eugenio Favalli
* License: GPL, v2 or later
*/
import java.io.*;
import java.text.*;
import java.util.*;
public class Purger {
public static void main(String[] args) {
if (args.length != 2) {
System.err.println(
"Usage: java Purger <folder> <date>\n" +
" - folder: is the path to account.txt and athena.txt files.\n" +
" - date: accounts created before this date will be purged (dd/mm/yy or yyyy-mm-dd).");
return;
}
int accounts = 0;
int characters = 0;
int deletedCharacters = 0;
Set<String> activeAccounts = new HashSet<String>();
File folder = new File(args[0]);
// Do some sanity checking
if (!folder.exists()) {
System.err.println("Folder does not exist!");
return;
}
if (!folder.isDirectory()) {
System.err.println("Folder is not a folder!");
return;
}
File oldAccount = new File(folder, "account.txt");
File oldAthena = new File(folder, "athena.txt");
File newAccount = new File(folder, "account.txt.new");
File newAthena = new File(folder, "athena.txt.new");
DateFormat dateFormat;
Date purgeDate = null;
for (String format : new String[] {"dd/MM/yy", "yyyy-MM-dd"}) {
dateFormat = new SimpleDateFormat(format);
try {
purgeDate = dateFormat.parse(args[1]);
break;
} catch (ParseException e) {}
}
if (purgeDate == null) {
System.err.println("ERROR: Date format not recognized.");
return;
}
System.out.printf("Removing accounts unused since %tF\n", purgeDate);
String line;
// Remove accounts
try {
FileInputStream fin = new FileInputStream(oldAccount);
BufferedReader input = new BufferedReader(
new InputStreamReader(fin));
FileOutputStream fout = new FileOutputStream(newAccount);
PrintStream output = new PrintStream(fout);
while ((line = input.readLine()) != null) {
boolean copy = false;
String[] fields = line.split("\t");
// Check if we're reading a comment or the last line
if (line.substring(0, 2).equals("//") || fields[1].charAt(0) == '%') {
copy = true;
}
else {
// Server accounts should not be purged
if (fields[4].equals("S")) {
copy = true;
} else {
accounts++;
dateFormat = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = dateFormat.parse(fields[3]);
if (date.after(purgeDate)) {
activeAccounts.add(fields[0]);
copy = true;
}
else
{
System.out.println("Removing " + fields[1]);
}
}
catch (ParseException e) {
// Ignore accounts that haven't been used yet
if (fields[3].equals("-")) {
activeAccounts.add(fields[0]);
copy = true;
}
else {
System.err.println("ERROR: Wrong date format in account.txt. (" + accounts + ": " + line + ")");
System.out.println("Removing " + fields[1]);
}
}
catch (Exception e) {
e.printStackTrace();
return;
}
}
}
if (copy) {
try {
output.println(line);
}
catch (Exception e) {
System.err.println("ERROR: Unable to write file.");
}
}
}
input.close();
output.close();
}
catch (FileNotFoundException e ) {
System.err.println("ERROR: file " + oldAccount.getAbsolutePath() + " not found.");
return;
}
catch (Exception e) {
System.err.println("ERROR: unable to process account.txt");
e.printStackTrace();
return;
}
System.out.println("Removed " + (accounts - activeAccounts.size()) + "/" + accounts + " accounts.");
// Remove characters
try {
FileInputStream fin = new FileInputStream(oldAthena);
BufferedReader input = new BufferedReader(
new InputStreamReader(fin));
FileOutputStream fout = new FileOutputStream(newAthena);
PrintStream output = new PrintStream(fout);
while ((line = input.readLine()) != null) {
boolean copy = false;
String[] fields = line.split("\t");
// Check if we're reading a comment or the last line
if (line.substring(0, 2).equals("//")
|| fields[1].charAt(0) == '%') {
copy = true;
}
else {
characters++;
String id = fields[1].substring(0, fields[1].indexOf(','));
if (activeAccounts.contains(id)) {
copy = true;
}
else {
deletedCharacters++;
}
}
if (copy) {
output.println(line);
}
}
input.close();
output.close();
}
catch (FileNotFoundException e ) {
System.err.println("ERROR: file " + oldAthena.getAbsolutePath() + " not found.");
return;
}
catch (Exception e) {
System.err.println("ERROR: unable to process athena.txt");
e.printStackTrace();
return;
}
System.out.println(
"Removed " + deletedCharacters + "/"
+ characters + " characters.");
}
}
|