001: /*
002: * This file is part of DrFTPD, Distributed FTP Daemon.
003: *
004: * DrFTPD is free software; you can redistribute it and/or modify
005: * it under the terms of the GNU General Public License as published by
006: * the Free Software Foundation; either version 2 of the License, or
007: * (at your option) any later version.
008: *
009: * DrFTPD is distributed in the hope that it will be useful,
010: * but WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
012: * GNU General Public License for more details.
013: *
014: * You should have received a copy of the GNU General Public License
015: * along with DrFTPD; if not, write to the Free Software
016: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017: */
018: package org.drftpd.plugins;
019:
020: import net.sf.drftpd.event.Event;
021: import net.sf.drftpd.event.FtpListener;
022: import net.sf.drftpd.event.TransferEvent;
023:
024: import org.drftpd.Checksum;
025: import org.drftpd.commands.UserManagement;
026: import org.drftpd.master.ConnectionManager;
027:
028: import java.io.FileNotFoundException;
029: import java.io.IOException;
030:
031: /**
032: * Inspired by glftpd's post_check script.
033: *
034: * Docs shamelessly stolen from glftpd.docs:
035: *
036: * The following environment variables can be used by external scripts:
037: *<pre>
038: * $USER Username.
039: * $TAGLINE User tagline.
040: * $GROUP User group.
041: * $RATIO User ratio.
042: * $SPEED Speed in K/s. This is exported after every upload/download.
043: * $SPEEDBPS Speed in B/s (DrFTPD specific)
044: * $HOST User's ident@ip (Dr specific: ident not included yet)
045: * $SECTION The name of the section user is currently in
046: * </pre>
047: *
048: * The post_check script receives 3 parameters from glftpd:
049: * <ul>
050: *<li>$1 - the virtual path name of file uploaded
051: *<li>$2 - the virtual directory path the file was uploaded to
052: *<li>$3 - the CRC code of that file (if calc_crc was enabled, or 000000 otherwise)
053: *<li>$4 - the size of the file (DrFTPD specific)
054: *</ul>
055: *
056: * @author mog
057: * @version $Id: Exec.java 936 2005-01-31 22:25:52Z mog $
058: */
059: public class Exec extends FtpListener {
060:
061: public void actionPerformed(Event event) {
062: if (!(event instanceof TransferEvent)
063: || !event.getCommand().equals("STOR")) {
064: return;
065: }
066:
067: TransferEvent uevent = (TransferEvent) event;
068: String[] env = {
069: "USER=" + uevent.getUser().getName(),
070: "TAGLINE="
071: + uevent
072: .getUser()
073: .getKeyedMap()
074: .getObjectString(UserManagement.TAGLINE),
075: "GROUP=" + uevent.getUser().getGroup(),
076: "RATIO="
077: + uevent.getUser().getKeyedMap()
078: .getObjectFloat(UserManagement.RATIO),
079: "SPEED="
080: + (uevent.getDirectory().getXferspeed() / 1000),
081: "SPEEDBPS=" + (uevent.getDirectory().getXferspeed()),
082: "HOST=@" + uevent.getConn().getClientAddress(),
083:
084: "SECTION="
085: + getGlobalContext()
086: .getSectionManager()
087: .lookup(uevent.getDirectory().getPath()) };
088: String[] cmd;
089:
090: try {
091: cmd = new String[] {
092: "/path/to/executeable",
093: uevent.getDirectory().getPath(),
094: uevent.getDirectory().getParent(),
095: Checksum.formatChecksum(uevent.getDirectory()
096: .getCheckSumCached()),
097: "" + uevent.getDirectory().length() };
098: } catch (FileNotFoundException e) {
099: throw new RuntimeException("No parent dir for file", e);
100: }
101:
102: try {
103: Runtime.getRuntime().exec(cmd, env);
104: } catch (IOException e) {
105: throw new RuntimeException(
106: "Error executing external script", e);
107: }
108: }
109:
110: public void unload() {
111: }
112:
113: }
|