diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..090a1f0
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+.idea
+.DS_Store
diff --git a/Web-Security-Monitored.iml b/Web-Security-Monitored.iml
new file mode 100644
index 0000000..4621f72
--- /dev/null
+++ b/Web-Security-Monitored.iml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/commons-logging-1.1.1.jar b/lib/commons-logging-1.1.1.jar
new file mode 100755
index 0000000..8758a96
Binary files /dev/null and b/lib/commons-logging-1.1.1.jar differ
diff --git a/lib/httpclient-4.5.1.jar b/lib/httpclient-4.5.1.jar
new file mode 100755
index 0000000..b9c0c1c
Binary files /dev/null and b/lib/httpclient-4.5.1.jar differ
diff --git a/lib/httpcore-4.4.4.jar b/lib/httpcore-4.4.4.jar
new file mode 100755
index 0000000..ac4a877
Binary files /dev/null and b/lib/httpcore-4.4.4.jar differ
diff --git a/out/artifacts/Web_Security_Monitored_jar/Web-Security-Monitored.jar b/out/artifacts/Web_Security_Monitored_jar/Web-Security-Monitored.jar
new file mode 100644
index 0000000..a84a361
Binary files /dev/null and b/out/artifacts/Web_Security_Monitored_jar/Web-Security-Monitored.jar differ
diff --git a/out/production/Web-Security-Monitored/META-INF/MANIFEST.MF b/out/production/Web-Security-Monitored/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..37cb1bf
--- /dev/null
+++ b/out/production/Web-Security-Monitored/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Main-Class: com.superl.Main
+
diff --git a/out/production/Web-Security-Monitored/com/superl/ChuanglanSMS.class b/out/production/Web-Security-Monitored/com/superl/ChuanglanSMS.class
new file mode 100644
index 0000000..456a70e
Binary files /dev/null and b/out/production/Web-Security-Monitored/com/superl/ChuanglanSMS.class differ
diff --git a/out/production/Web-Security-Monitored/com/superl/Main.class b/out/production/Web-Security-Monitored/com/superl/Main.class
new file mode 100644
index 0000000..c6874b1
Binary files /dev/null and b/out/production/Web-Security-Monitored/com/superl/Main.class differ
diff --git a/out/production/Web-Security-Monitored/com/superl/MyService.class b/out/production/Web-Security-Monitored/com/superl/MyService.class
new file mode 100644
index 0000000..48a0135
Binary files /dev/null and b/out/production/Web-Security-Monitored/com/superl/MyService.class differ
diff --git a/out/production/Web-Security-Monitored/com/superl/ReadWriteFile.class b/out/production/Web-Security-Monitored/com/superl/ReadWriteFile.class
new file mode 100644
index 0000000..7861cd2
Binary files /dev/null and b/out/production/Web-Security-Monitored/com/superl/ReadWriteFile.class differ
diff --git a/src/META-INF/MANIFEST.MF b/src/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..37cb1bf
--- /dev/null
+++ b/src/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Main-Class: com.superl.Main
+
diff --git a/src/com/superl/ChuanglanSMS.java b/src/com/superl/ChuanglanSMS.java
new file mode 100644
index 0000000..f594d0b
--- /dev/null
+++ b/src/com/superl/ChuanglanSMS.java
@@ -0,0 +1,132 @@
+package com.superl;
+
+
+/**
+ * @Package com.superl
+ * @Description 创蓝短信接口
+ * @Author superl www.superl.org
+ * @Date 2017/4/11 下午5:59
+ * @Version V1.0
+ */
+
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+
+public class ChuanglanSMS {
+ private CloseableHttpClient client;
+ private String account;
+ private String password;
+ private static final String SEND_URL="http://222.73.117.138:7891/mt";
+ private static final String QUERY_URL="http://222.73.117.138:7891/bi";
+ private static final String INTERNATIONAL_URL="http://222.73.117.140:8044/mt";
+
+ public ChuanglanSMS(String account,String password){
+ this.account = account;
+ this.password = password;
+ client = HttpClients.createDefault();
+ //System.out.println(account);
+ }
+
+ public CloseableHttpResponse sendMessage(String phone, String content) {
+ String encodedContent = null;
+ try {
+ encodedContent = URLEncoder.encode(content, "utf-8");
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ return null;
+ }
+ StringBuffer strBuf = new StringBuffer(SEND_URL);
+ strBuf.append("?un=").append(account);
+ strBuf.append("&pw=").append(password);
+ strBuf.append("&da=").append(phone);
+ strBuf.append("&sm=").append(encodedContent);
+ strBuf.append("&dc=15&rd=1&rf=2&tf=3");
+ HttpGet get = new HttpGet( strBuf.toString() );
+
+ try {
+ return client.execute(get);
+ } catch (ClientProtocolException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public CloseableHttpResponse queryBalance() {
+ StringBuffer strBuf = new StringBuffer(QUERY_URL);
+ strBuf.append("?un=").append(account);
+ strBuf.append("&pw=").append(password);
+ strBuf.append("&rf=2");
+ HttpGet get = new HttpGet( strBuf.toString() );
+
+ try {
+ return client.execute(get);
+ } catch (ClientProtocolException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public CloseableHttpResponse sendInternationalMessage(String phone, String content) {
+ String encodedContent = null;
+ try {
+ encodedContent = URLEncoder.encode(content, "utf-8");
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ return null;
+ }
+ StringBuffer strBuf = new StringBuffer(INTERNATIONAL_URL);
+ strBuf.append("?un=").append(account);
+ strBuf.append("&pw=").append(password);
+ strBuf.append("&da=").append(phone);
+ strBuf.append("&sm=").append(encodedContent);
+ strBuf.append("&dc=15&rd=1&rf=2&tf=3");
+ HttpGet get = new HttpGet( strBuf.toString() );
+
+ try {
+ return client.execute(get);
+ } catch (ClientProtocolException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public void close() {
+ if(client != null){
+ try {
+ client.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public String getAccount() {
+ return account;
+ }
+
+ public void setAccount(String account) {
+ this.account = account;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+}
diff --git a/src/com/superl/Main.java b/src/com/superl/Main.java
new file mode 100644
index 0000000..5e662ac
--- /dev/null
+++ b/src/com/superl/Main.java
@@ -0,0 +1,30 @@
+package com.superl;
+import java.io.IOException;
+
+public class Main {
+
+ public static void main(String[] args) throws IOException, InterruptedException{
+ System.err.println("start MyWatcherService ...");
+
+ /*
+ ChuanglanSMS client = new ChuanglanSMS("xxxxx","xxxxx");
+ CloseableHttpResponse response = null;
+ try {
+ //发送短信
+ response = client.sendMessage("181xxxxxxxx","验证码为xxxxxxxx");
+ if(response != null && response.getStatusLine().getStatusCode()==200){
+ System.out.println(EntityUtils.toString(response.getEntity()));
+ }
+ } catch (ParseException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ client.close();
+ */
+
+ MyService myWatcherService = new MyService();
+ myWatcherService.initialize();
+ myWatcherService.doMonitor();
+ }
+}
diff --git a/src/com/superl/MyService.java b/src/com/superl/MyService.java
new file mode 100644
index 0000000..e68fd3d
--- /dev/null
+++ b/src/com/superl/MyService.java
@@ -0,0 +1,312 @@
+package com.superl;
+
+/**
+ * @author superl www.superl.org
+ * @version V1.0
+ * @Package com.superl
+ * @Description 监控功能
+ * @date 2017/4/11 下午6:07
+ */
+
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.util.EntityUtils;
+import org.apache.http.ParseException;
+import java.io.*;
+import java.nio.file.*;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.Properties;
+
+import static java.nio.file.StandardWatchEventKinds.*;
+
+public class MyService {
+
+ private WatchService watchService = null;
+
+ private String filePrefix;
+ private String monitoredPath;
+ private Boolean checkPrefix;
+ private Boolean monitoredDir;
+ private Boolean monitoredMD;
+ private String ruledoutDir;
+ private String mobileNum;
+ private String userName;
+ private String passWord;
+
+ private String smsContent;
+ private String eventMethod;
+
+ public void initialize() throws IOException{
+
+ Properties prop = new Properties();
+ InputStream inputStream = new FileInputStream("config.properties");
+ BufferedReader bf = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
+ prop.load(bf);
+ inputStream.close(); // 关闭流
+
+ /*
+ InputStream in = new BufferedInputStream(new FileInputStream("config.properties"));
+ Properties prop = new Properties();
+ prop.load(in);
+ */
+
+ filePrefix = prop.getProperty("file_prefix");
+ monitoredPath = prop.getProperty("monitored_path");
+ checkPrefix = new Boolean(prop.getProperty("check_prefix"));
+ monitoredDir = new Boolean(prop.getProperty("monitored_directory"));
+ monitoredMD = new Boolean(prop.getProperty("monitored_move_delete"));
+ ruledoutDir = prop.getProperty("ruledout_dir");
+ mobileNum = prop.getProperty("mobile");
+ userName = prop.getProperty("username");
+ passWord = prop.getProperty("password");
+ //System.out.println(ruledoutDir); 测试是否中文乱码
+
+ watchService = FileSystems.getDefault().newWatchService();
+ Paths.get(monitoredPath).register(watchService, ENTRY_CREATE,ENTRY_DELETE,ENTRY_MODIFY);
+
+ File file = new File(monitoredPath);
+ LinkedList fList = new LinkedList();
+ fList.addLast(file);
+ while (fList.size() > 0 ) {
+ File f = fList.removeFirst();
+ if(f.listFiles() == null)
+ continue;
+ for(File file2 : f.listFiles()){
+ if (file2.isDirectory()){//下一级目录
+ fList.addLast(file2);
+ //依次注册子目录
+ Paths.get(file2.getAbsolutePath()).register(watchService
+ , StandardWatchEventKinds.ENTRY_CREATE
+ , StandardWatchEventKinds.ENTRY_MODIFY
+ , StandardWatchEventKinds.ENTRY_DELETE);
+ }
+ }
+ }
+ }
+
+ public void doMonitor() throws InterruptedException,IOException{
+ final Properties PROPERTIES = new Properties(System.getProperties());
+ String separator = PROPERTIES.getProperty("file.separator");
+
+ while(true){
+ try {
+ WatchKey key = watchService.take();
+ for(WatchEvent> event : key.pollEvents()){
+ WatchEvent.Kind kind = event.kind();
+
+ if(kind == OVERFLOW){
+ //事件可能lost or discarded
+ continue;
+ }
+
+ WatchEvent e = (WatchEvent)event;
+ //获取路径
+ Path path = (Path) key.watchable();
+ //获取分隔符号
+ String fullpath = path.toString()+separator;
+ //获取文件名
+ Path fileName = e.context();
+ //拼接文件名称和路径
+ String filepath = fullpath+fileName;
+ //获取文件后缀
+ String prefix = fileName.toString().substring(fileName.toString().lastIndexOf(".")+1);
+
+ File theFile = new File(filepath);
+
+
+
+ //判断是文件还是目录
+ if(theFile.isFile()){
+ //判断是否是白名单目录
+ String[] ruledoutDirArray = ruledoutDir.split(",");
+ Boolean haveStr = false;
+ if(ruledoutDirArray!=null||ruledoutDirArray.length!=0){
+ haveStr = Arrays.asList(ruledoutDirArray).contains(path.toString());
+ }else{
+ haveStr = false;
+ }
+ if(!haveStr){
+ if(checkPrefix){
+ if(prefix.equals(filePrefix)){
+ if(kind.toString().equals("ENTRY_CREATE")){
+ eventMethod = "被新建";
+ }else if (kind.toString().equals("ENTRY_MODIFY")){
+ eventMethod = "被修改";
+ }else{
+ eventMethod = "被操作";
+ }
+ SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
+ smsContent = "文件:"+filepath+eventMethod+",时间:"+df.format(new Date());
+
+ //输出提示信息
+ System.out.println(smsContent);
+
+ //发送提示信息到手机短信
+ ChuanglanSMS client = new ChuanglanSMS(userName,passWord);
+ CloseableHttpResponse response = null;
+ try {
+ response = client.sendMessage(mobileNum,smsContent);
+ if(response != null && response.getStatusLine().getStatusCode()==200){
+ System.out.println(EntityUtils.toString(response.getEntity()));
+ System.out.println("短信发送成功,内容为:"+smsContent);
+ }
+ }catch (ParseException p1) {
+ System.out.println("短信发送成失败");
+ p1.printStackTrace();
+ }catch (IOException i1) {
+ System.out.println("短信发送成失败");
+ i1.printStackTrace();
+ }
+ client.close();
+
+ }
+ }else{
+ if(kind.toString().equals("ENTRY_CREATE")){
+ eventMethod = "被新建";
+ }else if (kind.toString().equals("ENTRY_MODIFY")){
+ eventMethod = "被修改";
+ }else{
+ eventMethod = "被操作";
+ }
+ SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
+ smsContent = "文件:"+filepath+eventMethod+",时间:"+df.format(new Date());
+
+ //输出提示信息
+ System.out.println(smsContent);
+
+ //发送提示信息到手机短信
+ ChuanglanSMS client = new ChuanglanSMS(userName,passWord);
+ CloseableHttpResponse response = null;
+ try {
+ response = client.sendMessage(mobileNum,smsContent);
+ if(response != null && response.getStatusLine().getStatusCode()==200){
+ System.out.println(EntityUtils.toString(response.getEntity()));
+ System.out.println("短信发送成功,内容为:"+smsContent);
+ }
+ }catch (ParseException p1) {
+ System.out.println("短信发送成失败");
+ p1.printStackTrace();
+ }catch (IOException i1) {
+ System.out.println("短信发送成失败");
+ i1.printStackTrace();
+ }
+ client.close();
+
+ }
+ }else{
+ //不监控白名单目录
+ }
+ }else if(theFile.isDirectory()){
+ //System.out.println("这是目录类型");
+
+ //判断是否是白名单目录
+ String[] ruledoutDirArray = ruledoutDir.split("||");
+ Boolean haveStr;
+ if(ruledoutDirArray!=null||ruledoutDirArray.length!=0){
+ haveStr = Arrays.asList(ruledoutDirArray).contains(fullpath);
+ }else{
+ haveStr = false;
+ }
+ if(!haveStr){
+ if(monitoredDir){
+ if(kind.toString().equals("ENTRY_CREATE")){
+ eventMethod = "被新建";
+ }else if (kind.toString().equals("ENTRY_MODIFY")){
+ eventMethod = "被修改";
+ }else{
+ eventMethod = "被操作";
+ }
+ SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
+ smsContent = "文件:"+filepath+eventMethod+",时间:"+df.format(new Date());
+
+ //输出提示信息
+ System.out.println(smsContent);
+
+ //发送提示信息到手机短信
+ ChuanglanSMS client = new ChuanglanSMS(userName,passWord);
+ CloseableHttpResponse response = null;
+ try {
+ response = client.sendMessage(mobileNum,smsContent);
+ if(response != null && response.getStatusLine().getStatusCode()==200){
+ System.out.println(EntityUtils.toString(response.getEntity()));
+ System.out.println("短信发送成功,内容为:"+smsContent);
+ }
+ }catch (ParseException p1) {
+ System.out.println("短信发送成失败");
+ p1.printStackTrace();
+ }catch (IOException i1) {
+ System.out.println("短信发送成失败");
+ i1.printStackTrace();
+ }
+ client.close();
+ }else{
+ //不监控目录类型
+ }
+ }
+ }else{
+ //文件被删除,被移动
+
+ //判断是否是白名单目录
+ String[] ruledoutDirArray = ruledoutDir.split("||");
+ Boolean haveStr;
+ if(ruledoutDirArray!=null||ruledoutDirArray.length!=0){
+ haveStr = Arrays.asList(ruledoutDirArray).contains(fullpath);
+ }else{
+ haveStr = false;
+ }
+
+ if(!haveStr){
+ if(monitoredMD){
+ if(checkPrefix){
+ if(prefix.equals(filePrefix)){
+ if(kind.toString().equals("ENTRY_CREATE")){
+ eventMethod = "新建操作";
+ }else if (kind.toString().equals("ENTRY_MODIFY")){
+ eventMethod = "修改操作";
+ }else{
+ eventMethod = "其他操作";
+ }
+ SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
+ smsContent = "文件:"+filepath+" 发生了"+eventMethod+" 操作时间:"+df.format(new Date());
+
+ System.out.println(smsContent);
+
+ ReadWriteFile myfile = new ReadWriteFile();
+ myfile.creatTxtFile();
+ myfile.writeTxtFile(smsContent);
+ }
+ }else{
+ //System.out.printf("Event %s has happened,which fileName is %s%n",kind,filepath);
+ if(kind.toString().equals("ENTRY_CREATE")){
+ eventMethod = "新建操作";
+ }else if (kind.toString().equals("ENTRY_MODIFY")){
+ eventMethod = "修改操作";
+ }else{
+ eventMethod = "其他操作";
+ }
+ SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
+ smsContent = "文件:"+filepath+" 发生了"+eventMethod+" 操作时间:"+df.format(new Date());
+
+ System.out.println(smsContent);
+
+ ReadWriteFile myfile = new ReadWriteFile();
+ myfile.creatTxtFile();
+ myfile.writeTxtFile(smsContent);
+ }
+ }else{
+ //配置文件设置了不监控文件被删除和移动操作
+ }
+ }
+ }
+ }
+ if(!key.reset()){
+ break;
+ }
+ } catch (InterruptedException e) {
+ System.out.println("InterruptedException: " + e.getMessage());
+ }
+ }
+ }
+}
diff --git a/src/com/superl/ReadWriteFile.java b/src/com/superl/ReadWriteFile.java
new file mode 100644
index 0000000..0a631ed
--- /dev/null
+++ b/src/com/superl/ReadWriteFile.java
@@ -0,0 +1,127 @@
+package com.superl;
+
+/**
+ * @author superl www.superl.org
+ * @version V1.0
+ * @Package com.superl
+ * @Description 读写文件操作类
+ * @date 2017/4/11 下午6:09
+ */
+
+import java.io.*;
+
+public class ReadWriteFile {
+
+ public static BufferedReader bufread;
+ //指定文件路径和名称
+ private static String path = "log.txt";
+ private static File filename = new File(path);
+ private static String readStr ="";
+
+
+ /**
+ * 创建文本文件.
+ * @throws IOException
+ *
+ */
+ public static void creatTxtFile() throws IOException{
+ if (!filename.exists()) {
+ filename.createNewFile();
+ //System.err.println(filename + "已创建!");
+ }
+ }
+
+ /**
+ * 读取文本文件.
+ *
+ */
+ public static String readTxtFile(){
+ String read;
+ FileReader fileread;
+ try {
+ fileread = new FileReader(filename);
+ bufread = new BufferedReader(fileread);
+ try {
+ while ((read = bufread.readLine()) != null) {
+ readStr = readStr + read+ "\r\n";
+ }
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ } catch (FileNotFoundException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ //System.out.println("文件内容是:"+ "\r\n" + readStr);
+ return readStr;
+ }
+
+ /**
+ * 写文件
+ */
+ public static void writeTxtFile(String newStr) throws IOException{
+ //先读取原有文件内容,然后进行写入操作
+ String filein = newStr + "\r\n" + readStr + "\r\n";
+ RandomAccessFile mm = null;
+ try {
+ mm = new RandomAccessFile(filename, "rw");
+ mm.writeBytes(filein);
+ } catch (IOException e1) {
+ // TODO 自动生成 catch 块
+ e1.printStackTrace();
+ } finally {
+ if (mm != null) {
+ try {
+ mm.close();
+ } catch (IOException e2) {
+ // TODO 自动生成 catch 块
+ e2.printStackTrace();
+ }
+ }
+ }
+ }
+
+ /**
+ * 将文件中指定内容的第一行替换为其它内容.
+ *
+ * @param oldStr 查找内容
+ * @param replaceStr 替换内容
+ */
+ public static void replaceTxtByStr(String oldStr,String replaceStr) {
+ String temp = "";
+ try {
+ File file = new File(path);
+ FileInputStream fis = new FileInputStream(file);
+ InputStreamReader isr = new InputStreamReader(fis);
+ BufferedReader br = new BufferedReader(isr);
+ StringBuffer buf = new StringBuffer();
+
+ // 保存该行前面的内容
+ for (int j = 1; (temp = br.readLine()) != null
+ && !temp.equals(oldStr); j++) {
+ buf = buf.append(temp);
+ buf = buf.append(System.getProperty("line.separator"));
+ }
+
+ // 将内容插入
+ buf = buf.append(replaceStr);
+
+ // 保存该行后面的内容
+ while ((temp = br.readLine()) != null) {
+ buf = buf.append(System.getProperty("line.separator"));
+ buf = buf.append(temp);
+ }
+
+ br.close();
+ FileOutputStream fos = new FileOutputStream(file);
+ PrintWriter pw = new PrintWriter(fos);
+ pw.write(buf.toString().toCharArray());
+ pw.flush();
+ pw.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+}