├── whoshere-logo.png
├── dbconfig.php
├── whoshere.service
├── DBMaintenance.php
├── cron
├── assetinfo.php
├── run.py
├── CheckAlerts.php
├── configpage.php
├── README.md
├── my.cnf
├── index.php
├── INSTALL.sh
└── MySQLSchema.sql
/whoshere-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/curtbraz/WhosHere/HEAD/whoshere-logo.png
--------------------------------------------------------------------------------
/dbconfig.php:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/whoshere.service:
--------------------------------------------------------------------------------
1 | [Unit]
2 | Description=Who's Here?!
3 | After=multi-user.target
4 |
5 | [Service]
6 | Type=idle
7 | ExecStart=/usr/bin/python CHANGEME/run.py
8 | Restart=always
9 |
10 | [Install]
11 | WantedBy=multi-user.target
12 |
--------------------------------------------------------------------------------
/DBMaintenance.php:
--------------------------------------------------------------------------------
1 | connect_error) {
9 | die("Connection failed: " . $conn->connect_error);
10 | }
11 |
12 | // OPTIMIZES MyISAM log TABLE
13 | $sql = "OPTIMIZE TABLE log;";
14 |
15 | $result = $conn->query($sql);
16 |
17 | $conn->close();
18 |
19 |
20 |
21 | // Create connection
22 | $conn = new mysqli($servername, $username, $password, $dbname);
23 | // Check connection
24 | if ($conn->connect_error) {
25 | die("Connection failed: " . $conn->connect_error);
26 | }
27 |
28 | // OPTIMIZES MyISAM assets TABLE
29 | $sql = "OPTIMIZE TABLE assets;";
30 |
31 | $result = $conn->query($sql);
32 |
33 | $conn->close();
34 |
35 | ?>
36 |
37 |
--------------------------------------------------------------------------------
/cron:
--------------------------------------------------------------------------------
1 | # WhosHere SCRIPTS BELOW
2 | # SCRIPTS BELOW ARE FOR SENDING ALERTS EVERY 5 SECONDS
3 | * * * * * php /home/pi/WhosHere/CheckAlerts.php
4 | * * * * * sleep 5; php /home/pi/WhosHere/CheckAlerts.php
5 | * * * * * sleep 10; php /home/pi/WhosHere/CheckAlerts.php
6 | * * * * * sleep 15; php /home/pi/WhosHere/CheckAlerts.php
7 | * * * * * sleep 20; php /home/pi/WhosHere/CheckAlerts.php
8 | * * * * * sleep 25; php /home/pi/WhosHere/CheckAlerts.php
9 | * * * * * sleep 30; php /home/pi/WhosHere/CheckAlerts.php
10 | * * * * * sleep 35; php /home/pi/WhosHere/CheckAlerts.php
11 | * * * * * sleep 40; php /home/pi/WhosHere/CheckAlerts.php
12 | * * * * * sleep 45; php /home/pi/WhosHere/CheckAlerts.php
13 | * * * * * sleep 50; php /home/pi/WhosHere/CheckAlerts.php
14 | * * * * * sleep 55; php /home/pi/WhosHere/CheckAlerts.php
15 |
16 | # SCRIPT BELOW PERFORMS DATABASE MAINTENANCE EVERY DAY @ 3
17 | 0 3 * * * php /home/pi/WhosHere/DBMaintenance.php
18 |
19 |
--------------------------------------------------------------------------------
/assetinfo.php:
--------------------------------------------------------------------------------
1 |
2 |
3 | Who's Here?!
4 |
5 |
6 |
30 |
31 |
32 |
33 |
34 | 
35 | SSID Requests Listed Below for This Asset
36 |
37 |
38 | | SSID |
39 |
40 | connect_error) {
52 | die("Connection failed: " . $conn->connect_error);
53 | }
54 |
55 | $MAC = mysqli_real_escape_string($conn, $MAC);
56 |
57 | $sql = "SELECT * FROM SSIDs WHERE MAC = '$MAC';";
58 |
59 | $result = $conn->query($sql);
60 |
61 | if ($result->num_rows > 0) {
62 | // output data of each row
63 | while($row = $result->fetch_assoc()) {
64 |
65 | //var_dump($row);
66 |
67 | $SSID = $row["SSID"];
68 |
69 | $SSID=htmlspecialchars($SSID);
70 |
71 | if($SSID != ""){
72 | ?>
73 |
74 | |
75 |
76 | close();
83 | ?>
84 |
85 |
86 |
87 |
88 |
89 |
90 |
--------------------------------------------------------------------------------
/run.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/python
2 | #Server Connection to MySQL:
3 |
4 | import pymysql.cursors
5 | import re
6 |
7 | conn = pymysql.connect(host= "localhost",
8 | user="whoshere",
9 | passwd="PASSWORD_GOES_HERE",
10 | db="WhosHere")
11 | x = conn.cursor()
12 |
13 |
14 | ## SETS UP YOUR WLAN FOR MONITOR MODE. YOU MAY NEED TO CHANGE TO THE OUTPUT OF "iw list" FOR YOUR DEVICE THAT SUPPORTS MONITOR MODE!!
15 |
16 | import subprocess
17 | MonMode1 = subprocess.Popen(['sudo','iw','phy','phy1','interface','add','mon0','type','monitor'],stdout=subprocess.PIPE)
18 | MonMode2 = subprocess.Popen(['sudo','ifconfig','mon0','up'],stdout=subprocess.PIPE)
19 |
20 | ## CALLS TSHARK AND FILTERS FOR PROBE REQUESTS
21 | ## /usr/bin/tshark -i mon0 -Y 'wlan.fc.type_subtype eq 4' -l
22 | ## /usr/bin/tshark -l -i mon0 -Y 'wlan.fc.type_subtype eq 4' -T fields -e wlan.sa -e radiotap.dbm_antsignal -e wlan_mgt.ssid
23 | proc = subprocess.Popen(['/usr/bin/tshark','-l','-i','mon0','-Y','wlan.fc.type_subtype eq 4','-T','fields','-e','wlan.sa_resolved','-e','radiotap.dbm_antsignal','-e','wlan.ssid'],stdout=subprocess.PIPE)
24 | #proc = subprocess.Popen(['/usr/bin/tshark','-i','mon0','-Y','wlan.fc.type_subtype eq 4','-l'],stdout=subprocess.PIPE)
25 | #while True:
26 | # line = proc.stdout.readline()
27 | for line in iter(proc.stdout.readline, ""):
28 |
29 |
30 | # if "Probe Request" in line:
31 | if "da:a1:19" not in line:
32 | ##linepostart=line.index(".") + 10
33 | #lineposend=line.index("\x09")
34 | #MAC=line[0:lineposend]
35 |
36 | line = line.rstrip("\n")
37 | values = line.split("\t")
38 |
39 | MAC=values[0]
40 | AP=values[2]
41 | DB=values[1]
42 |
43 | print values
44 |
45 | #print line
46 | #print MAC
47 |
48 | ## DUMPS MAC ADDRESSES FOR DEVICES INTO MySQL TABLE IN REAL-TIME VIA STDOUT
49 |
50 | try:
51 | x.execute("""CALL InsertMac(%s,%s,%s)""",(MAC,DB,AP))
52 | conn.commit()
53 | except:
54 | conn.rollback()
55 |
56 | conn.close()
57 |
--------------------------------------------------------------------------------
/CheckAlerts.php:
--------------------------------------------------------------------------------
1 | connect_error) {
11 | die("Connection failed: " . $conn->connect_error);
12 | }
13 |
14 | // ADDS NEW ASSETS NOT PREVIOUSLY SEEN
15 | $sql = "CALL AddAssets();";
16 |
17 | $result = $conn->query($sql);
18 |
19 |
20 | // UPDATES LastSeen FOR ALL ASSETS
21 | $sql = "CALL UpdateAssetsLastSeen();";
22 |
23 | $result = $conn->query($sql);
24 |
25 |
26 | // LOOKS FOR RECENT PROBES FOR ASSETS THAT HAVE A NOTIFICATION FLAG SET
27 | $sql = "CALL NotificationLogic();";
28 |
29 | $result = $conn->query($sql);
30 |
31 |
32 | if ($result->num_rows > 0) {
33 | // output data of each row
34 | while($row = $result->fetch_assoc()) {
35 |
36 | $LastSeen = date('h:i:s A', strtotime($row["LastSeen"]));
37 |
38 | // SEND NOTIFICATION TO SLACK
39 | $cmd = "curl -X POST -H 'Content-type: application/json' --data '{\"value1\" : \"".$row["Nickname"]."\", \"value2\" : \"".$LastSeen."\", \"value3\" : \"".$row["SignalStrength"]."\"}' ".$webhook;
40 |
41 | echo $cmd."/r/n";
42 |
43 | // UPDATES LastSeen FOR THIS ASSET
44 | // Create connection
45 | $conn2 = new mysqli($servername, $username, $password, $dbname);
46 | // Check connection
47 | if ($conn2->connect_error) {
48 | die("Connection failed: " . $conn2->connect_error);
49 | }
50 |
51 | $sql1 = "CALL UpdateSingleAsset('".$row["MAC"]."');";
52 |
53 | $result1 = $conn2->query($sql1);
54 |
55 | $conn2->close();
56 |
57 | exec($cmd);
58 |
59 | }
60 | }
61 |
62 | $conn->close();
63 |
64 | // Create connection
65 | $conn = new mysqli($servername, $username, $password, $dbname);
66 | // Check connection
67 | if ($conn->connect_error) {
68 | die("Connection failed: " . $conn->connect_error);
69 | }
70 |
71 | // TRUNCATES LOG TABLE FOR PERFORMANCE REASONS
72 | $sql = "CALL PurgeLogs();";
73 |
74 | $result = $conn->query($sql);
75 |
76 | $conn->close();
77 | ?>
78 |
--------------------------------------------------------------------------------
/configpage.php:
--------------------------------------------------------------------------------
1 |
2 |
3 | Who's Here?!
4 |
5 |
6 |
30 |
31 |
32 |
33 |
34 | 
35 | Modifying Parameters Below Apply Globally
36 |
37 |
38 | | Name | Value | Update |
39 |
40 | connect_error) {
51 | die("Connection failed: " . $conn->connect_error);
52 | }
53 |
54 |
55 |
56 | if(isset($_REQUEST["Value"])){
57 |
58 | $sql2 = "UPDATE config SET Value = '$Value' WHERE Name = '$Name';";
59 |
60 | $result2 = $conn->query($sql2);
61 |
62 | }
63 |
64 | $sql = "SELECT * FROM config;";
65 |
66 | $result = $conn->query($sql);
67 |
68 |
69 | if ($result->num_rows > 0) {
70 | // output data of each row
71 | while($row = $result->fetch_assoc()) {
72 |
73 | //var_dump($row);
74 |
75 | $Name = $row["Name"];
76 | $Value = $row["Value"];
77 |
78 | $Value=htmlspecialchars($Value);
79 | $Name=htmlspecialchars($Name);
80 |
81 | if($Name == "DefaultNotifyTreshold"){
82 |
83 | $sql3 = "ALTER TABLE assets MODIFY COLUMN DBTreshold INT NOT NULL DEFAULT '$Value';";
84 | $result3 = $conn->query($sql3);
85 |
86 | }
87 |
88 | ?>
89 | |
99 |
100 |
101 |
102 |
103 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # WhosHere
2 | Notifies You of Chosen People in Your Vicinity via Their Wifi Probe Requests From an Simple Web GUI. IFTTT Integration Allows for Endless Automation Features (Change Lights When Someone Arrives, Open Garage Door Automatically, Receive and SMS Message..)
3 |
4 | # Description
5 | The script is named after my dogs, because they proactively alert me before the doorbell rings. I used to like to get them going crazy by saying, "Who's Here?!". They cause a lot of noise when someone arrives, whether it's the pizza guy or a friend/family member coming over to visit. It's not so fun now that I'm a dad because it wakes my sleeping baby up and that's no bueno for me. I created this script to passively look for cell phone probe requests and alert me if certain visitors are in the area by sending an IFTTT SMS/Android push notification to my phone. I typically get the alert before the visitor gets out of their vehicle thanks to a 9 dB antenna connected to a wifi dongle running on my Raspberry Pi.
6 |
7 | The management is made simple due to an HTML web table that reads the database and allows you to give friendly nicknames to MAC addresses. There are also first and last seen timestamps that help you determine who someone is that visits, name them appropriately, and enable a notification checkbox to get real-time alerts next time they get close. I've recently added configuration options for alerting on new devices, alerting on signal strengh (per device), and lookups for unique SSIDs requested per MAC for easier identification.
8 |
9 | UPDATE: This project was first created before MAC Address Randomization was introduced on Android and iOS devices. Even still, this works for tracking 90% of the devices out there. In the next release, I want to introduce sending an RTS frame to bypass this so that tracking can work 100% of the time. However, this script still works well in it's current state as a proximity alarm that you can arm and disarm.
10 |
11 | # Requirements
12 | 1) A PC or Raspberry Pi running a Debian OS
13 |
14 | 2) A WiFi dongle or card that supports monitor mode
15 |
16 |
17 | # Instructions
18 | 1) Install WiFi card/adapter
19 |
20 | 2) Clone Repo Locally (git clone https://github.com/curtbraz/WhosHere)
21 |
22 | 3) Create an IFTTT Incoming Webhook Named "WhosHere" for SMS/Slack/Push Notifications!
23 |
24 | 4) chmod +x and run INSTALL.sh
25 |
26 | 5) Visit http://[ip]/WhosHere/ in a browser and enjoy!
27 |
28 |
29 | # Other Thoughts
30 | Performance is great on my Raspberry Pi 3. I haven't tested the install script on Ubuntu yet, but it should work just the same. The new install script will set everything up for you, including configs and credentials.
31 |
32 | If you have errors, you may have a wireless adapter installed that does not support monitor mode or you simply may not have the correct drivers installed.
33 |
34 | I'd like to create an app for rooted mobile OS's to make this mobile for when you're on the go, all reporting to a centralized database where users can share information about MAC addresses. Imagine driving up to the parking lot of a building and knowing if and who was inside! I also think it would be neat to hook into other IFTTT applets for home automation to do things like turn on lights when you're approaching or interface with my garage door script, thermostat, or speakers. Enjoy and please let me know if you have any questions or feedback!
35 |
36 |
37 | 
38 |
39 | 
40 |
41 | 
42 |
43 | 
44 |
--------------------------------------------------------------------------------
/my.cnf:
--------------------------------------------------------------------------------
1 | #
2 | # The MySQL database server configuration file.
3 | #
4 | # You can copy this to one of:
5 | # - "/etc/mysql/my.cnf" to set global options,
6 | # - "~/.my.cnf" to set user-specific options.
7 | #
8 | # One can use all long options that the program supports.
9 | # Run program with --help to get a list of available options and with
10 | # --print-defaults to see which it would actually understand and use.
11 | #
12 | # For explanations see
13 | # http://dev.mysql.com/doc/mysql/en/server-system-variables.html
14 |
15 | # This will be passed to all mysql clients
16 | # It has been reported that passwords should be enclosed with ticks/quotes
17 | # escpecially if they contain "#" chars...
18 | # Remember to edit /etc/mysql/debian.cnf when changing the socket location.
19 | [client]
20 | port = 3306
21 | socket = /var/run/mysqld/mysqld.sock
22 |
23 | # Here is entries for some specific programs
24 | # The following values assume you have at least 32M ram
25 |
26 | # This was formally known as [safe_mysqld]. Both versions are currently parsed.
27 | [mysqld_safe]
28 | socket = /var/run/mysqld/mysqld.sock
29 | nice = 0
30 |
31 | [mysqld]
32 | #
33 | # * Basic Settings
34 | #
35 | user = mysql
36 | pid-file = /var/run/mysqld/mysqld.pid
37 | socket = /var/run/mysqld/mysqld.sock
38 | port = 3306
39 | basedir = /usr
40 | datadir = /var/lib/mysql
41 | tmpdir = /tmp
42 | lc-messages-dir = /usr/share/mysql
43 | skip-external-locking
44 | #
45 | # Instead of skip-networking the default is now to listen only on
46 | # localhost which is more compatible and is not less secure.
47 | bind-address = 127.0.0.1
48 | #
49 | # * Fine Tuning
50 | #
51 | key_buffer = 16M
52 | max_allowed_packet = 16M
53 | thread_stack = 192K
54 | thread_cache_size = 8
55 | # This replaces the startup script and checks MyISAM tables if needed
56 | # the first time they are touched
57 | myisam-recover = BACKUP
58 | #max_connections = 100
59 | #table_cache = 64
60 | #thread_concurrency = 10
61 | #
62 | # * Query Cache Configuration
63 | #
64 | query_cache_limit = 1M
65 | query_cache_size = 16M
66 | #
67 | # * Logging and Replication
68 | #
69 | # Both location gets rotated by the cronjob.
70 | # Be aware that this log type is a performance killer.
71 | # As of 5.1 you can enable the log at runtime!
72 | #general_log_file = /var/log/mysql/mysql.log
73 | #general_log = 1
74 | #
75 | # Error log - should be very few entries.
76 | #
77 | log_error = /var/log/mysql/error.log
78 | #
79 | # Here you can see queries with especially long duration
80 | #slow_query_log_file = /var/log/mysql/mysql-slow.log
81 | #slow_query_log = 1
82 | #long_query_time = 2
83 | #log_queries_not_using_indexes
84 | #
85 | # The following can be used as easy to replay backup logs or for replication.
86 | # note: if you are setting up a replication slave, see README.Debian about
87 | # other settings you may need to change.
88 | #server-id = 1
89 | #log_bin = /var/log/mysql/mysql-bin.log
90 | expire_logs_days = 10
91 | max_binlog_size = 100M
92 | #binlog_do_db = include_database_name
93 | #binlog_ignore_db = include_database_name
94 | #
95 | # * InnoDB
96 | #
97 | # InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
98 | # Read the manual for more InnoDB related options. There are many!
99 | #
100 | # * Security Features
101 | #
102 | # Read the manual, too, if you want chroot!
103 | # chroot = /var/lib/mysql/
104 | #
105 | # For generating SSL certificates I recommend the OpenSSL GUI "tinyca".
106 | #
107 | # ssl-ca=/etc/mysql/cacert.pem
108 | # ssl-cert=/etc/mysql/server-cert.pem
109 | # ssl-key=/etc/mysql/server-key.pem
110 |
111 |
112 |
113 | [mysqldump]
114 | quick
115 | quote-names
116 | max_allowed_packet = 16M
117 |
118 | [mysql]
119 | #no-auto-rehash # faster start of mysql but no tab completition
120 |
121 | [isamchk]
122 | key_buffer = 16M
123 |
124 | #
125 | # * IMPORTANT: Additional settings that can override those from this file!
126 | # The files must end with '.cnf', otherwise they'll be ignored.
127 | #
128 | !includedir /etc/mysql/conf.d/
129 |
130 | skip-innodb
131 |
--------------------------------------------------------------------------------
/index.php:
--------------------------------------------------------------------------------
1 |
2 |
3 | Who's Here?!
4 |
5 |
6 |
30 |
31 |
32 |
33 |
34 | 
35 | You Can Modify Names and Enable Notifications for Assets Below:
36 |
37 | Options
38 |
39 |
40 | The Collector Service is NOT Running!
(run \"sudo systemctl start whoshere.service\" or \"python run.py\" if that fails)
";
45 | }
46 | else
47 | {echo "(The Collector Service is Running)
";}
48 | ?>
49 |
50 | | Name | Times Seen | First Seen | Last Seen | Strength | Notify Treshold | Update |
51 |
52 | connect_error) {
68 | die("Connection failed: " . $conn->connect_error);
69 | }
70 |
71 | $Nickname = mysqli_real_escape_string($conn, $Nickname);
72 | $DBTreshold = mysqli_real_escape_string($conn, $DBTreshold);
73 | $Notify = mysqli_real_escape_string($conn, $Notify);
74 | $asset = mysqli_real_escape_string($conn, $asset);
75 |
76 | if(isset($asset)){
77 | $sql = "CALL UpdateAssets('$Nickname','$Notify','$asset','$DBTreshold');";
78 |
79 | $result = $conn->query($sql);
80 | }
81 |
82 | if($ShowMore == "Yes"){
83 | $sql = "CALL ViewAllAssets();";
84 | } else {
85 | $sql = "CALL QuickViewAssets();";
86 | }
87 |
88 | $result = $conn->query($sql);
89 |
90 | if ($result->num_rows > 0) {
91 | // output data of each row
92 | while($row = $result->fetch_assoc()) {
93 |
94 | //var_dump($row);
95 |
96 | $Nickname = $row["Nickname"];
97 | $DBTreshold = $row["DBTreshold"];
98 | $Notify = $row["Notify"];
99 | $MAC = $row["MAC"];
100 | $TimesSeen = $row["TimesSeen"];
101 | $FirstSeen = $row["FirstSeen"];
102 | $LastSeen = $row["LastSeen"];
103 | $SignalStrength = $row["SignalStrength"];
104 | $SSIDs = $row["SSIDs"];
105 | if($FirstSeen == "0000-00-00 00:00:00"){$FirstSeen = "";}
106 |
107 | $FirstSeen = date('m/d/Y h:i:s A', strtotime($FirstSeen));
108 | $LastSeen = date('m/d/Y h:i:s A', strtotime($LastSeen));
109 |
110 | $Nickname=htmlspecialchars($Nickname);
111 | $DBTreshold=htmlspecialchars($DBTreshold);
112 | $Notify=htmlspecialchars($Notify);
113 | $MAC=htmlspecialchars($MAC);
114 | $TimesSeen=htmlspecialchars($TimesSeen);
115 | $FirstSeen=htmlspecialchars($FirstSeen);
116 | $LastSeen=htmlspecialchars($LastSeen);
117 |
118 | ?>
119 |
120 |
121 | close();
126 | ?>
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
--------------------------------------------------------------------------------
/INSTALL.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | ## WELCOME LANGUAGE
4 |
5 | if [ "$(id -u)" != "0" ]; then
6 | echo "This script must be run as root" 1>&2
7 | exit 1
8 | fi
9 |
10 | echo "Initiating Install..";
11 |
12 | sleep 2;
13 |
14 |
15 | ## UPDATES AND INSTALLS REQUIRED PACKAGES FROM DEBIAN BASED DISTROS
16 |
17 | echo "Updating Repositories..";
18 |
19 | sleep 2;
20 |
21 | sudo apt-get update;
22 |
23 | echo "Installing Required Packages.. You Will Have to Create a Database Password if Installing MySQL For the First Time..";
24 |
25 | sleep 2;
26 |
27 | sudo apt-get install apache2 php mariadb-client mariadb-server php-mysql python-mysqldb tshark python3-pymysql python-pip -y;
28 |
29 | sudo pip install pymysql;
30 |
31 |
32 | ## SETS UP MONITORING WLAN INTERFACE
33 |
34 | echo "Setting Up wlan Interface.. If you Haven't Already, Plug in Your WiFi Adapter Now and Hit Enter to Continue: ";
35 |
36 | sed -i -e 's/disable_lua = false/disable_lua = true/g' /usr/share/wireshark/init.lua;
37 |
38 | read Wait;
39 |
40 | Interfaces=`iw dev |grep "Interface" |cut -d " " -f 2 |grep -v "mon0"`
41 | InterfaceCount=`iw dev |grep "Interface" |grep -v "mon0" | wc -l`
42 |
43 | if [ $InterfaceCount -gt 1 ]
44 | then
45 | echo "Which interface would you like to set up? The following wlan interfaces were detected: "$Interfaces
46 | read SelectedInterface
47 | fi
48 |
49 | if [ $InterfaceCount -eq 1 ]
50 | then
51 | SelectedInterface=`iw dev |grep "Interface" |cut -d " " -f 2 |grep -v "mon0"`
52 | fi
53 |
54 | if [ $InterfaceCount -eq 0 ]
55 | then
56 | echo "No wireless adapters were detected! Please ensure the wireless adapter is set up and re-run the Install script."
57 | exit 1
58 | fi
59 |
60 | if [ `iw dev |grep "Interface" |cut -d " " -f 2 |grep "mon0" | wc -l` -gt 0 ]
61 | then
62 | MonInterface=`iw dev |grep "Interface" |cut -d " " -f 2 |grep "mon0"`
63 | iw dev $MonInterface del
64 | fi
65 |
66 | echo "Using Interface "$SelectedInterface"..";
67 |
68 | sleep 2;
69 |
70 | PhyDev="`iw dev |grep "$SelectedInterface" -B 1 |grep phy | sed 's/#//g'`"
71 |
72 | PhyDevMonitorCheck="`iw "$PhyDev" info |grep monitor | wc -l`"
73 |
74 | if [ $PhyDevMonitorCheck -eq 0 ]
75 | then
76 | echo "Error! "$SelectedInterface" does not support monitor mode. Is it possible the proper drivers are not installed for this Distribution or your wireless card simply does not support monitor mode?"
77 | exit 1
78 | fi
79 |
80 |
81 | sed -i -e 's/PHY_DEVICE_HERE/'$PhyDev'/g' run.py;
82 |
83 |
84 |
85 |
86 | ## CONFIGURE CREDENTIALS
87 |
88 | echo "Please enter your MySQL password..";
89 |
90 | read MySQLPassword;
91 |
92 | sed -i -e 's/PASSWORD_GOES_HERE/'$MySQLPassword'/g' run.py;
93 |
94 | sed -i -e 's/PASSWORD_GOES_HERE/'$MySQLPassword'/g' dbconfig.php;
95 |
96 | echo "This script uses IFTTT.com (If Then Then That) Incoming Webhooks for Slack/SMS/etc Notifications/Automation";
97 |
98 | echo "What is your IFTTT.com Webhook URL? (Should look like https://maker.ifttt.com/trigger/WhosHere/with/key/IFTTT_WEBHOOK_GOES_HERE)"
99 |
100 | read webhook
101 |
102 | sed -i -e "s~IFTTT_WEBHOOK_GOES_HERE~$webhook~g" CheckAlerts.php;
103 |
104 | ## SETS UP APACHE AND COPIES PHP WEB FILES
105 |
106 | echo "Setting Up the Web Server..";
107 |
108 | sleep 2;
109 |
110 | sudo service apache2 restart;
111 |
112 | DIRECTORY='/var/www/html/'
113 |
114 | if [ -d "$DIRECTORY" ]; then
115 |
116 | mkdir /var/www/html/WhosHere/;
117 |
118 | cp *.php /var/www/html/WhosHere/ && cp whoshere-logo.png /var/www/html/WhosHere/;
119 |
120 | fi
121 |
122 | if [ ! -d "$DIRECTORY" ]; then
123 |
124 | mkdir /var/www/WhosHere/;
125 |
126 | cp *.php /var/www/WhosHere/ && cp whoshere-logo.png /var/www/WhosHere/;
127 |
128 | sed -i -e 's/html\///g' cron;
129 |
130 | fi
131 |
132 | ## MODIFIES MYSQL CONFIGURATION SETTINGS FOR LOWER PERFORMANCE MACHINES (Raspberry Pi)
133 |
134 | echo "Configuring MySQL Server and WhosHere Database..";
135 |
136 | sleep 2;
137 |
138 | sudo cp my.cnf /etc/mysql/ && sudo service mysql restart;
139 |
140 |
141 | ## IMPORTS MySQL SCHEMA AND STORED PROCEDURES
142 |
143 | mysql -u root -p$MySQLPassword -h localhost < MySQLSchema.sql;
144 | mysql -u root -p$MySQLPassword -e "CREATE USER 'whoshere' IDENTIFIED BY '$MySQLPassword';"
145 | mysql -u root -p$MySQLPassword -e "GRANT ALL PRIVILEGES ON *.* TO 'whoshere' WITH GRANT OPTION;"
146 | mysql -u root -p$MySQLPassword -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '$MySQLPassword';"
147 | mysql -u root -p$MySQLPassword -e "FLUSH PRIVILEGES;"
148 |
149 | ## SETS UP CRON JOBS
150 |
151 | echo "Setting up Scheduled Cron Jobs and Autostart Background Services..";
152 |
153 | sleep 2;
154 |
155 | crontab -l >> cron;
156 |
157 | sudo crontab cron;
158 |
159 |
160 | ## INSTALLS SYSTEMD SERVICE
161 |
162 | Path=`pwd`
163 |
164 | sed -i -e "s~CHANGEME~$Path~g" whoshere.service;
165 |
166 | sudo cp whoshere.service /lib/systemd/system/whoshere.service;
167 |
168 | sudo systemctl daemon-reload
169 |
170 | sudo systemctl enable whoshere.service
171 |
172 | sudo systemctl start whoshere.service
173 |
174 |
175 | ## YOU'RE DONE!
176 |
177 | echo "Installation Complete! Visit \"http://localhost/WhosHere\" to Begin!";
178 |
--------------------------------------------------------------------------------
/MySQLSchema.sql:
--------------------------------------------------------------------------------
1 | CREATE DATABASE IF NOT EXISTS `WhosHere` /*!40100 DEFAULT CHARACTER SET latin1 */;
2 | USE `WhosHere`;
3 | -- MySQL dump 10.13 Distrib 5.7.17, for Win64 (x86_64)
4 | --
5 | -- Host: localhost Database: WhosHere
6 | -- ------------------------------------------------------
7 | -- Server version 5.5.5-10.1.23-MariaDB-9+deb9u1
8 |
9 | /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
10 | /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
11 | /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
12 | /*!40101 SET NAMES utf8 */;
13 | /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
14 | /*!40103 SET TIME_ZONE='+00:00' */;
15 | /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
16 | /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
17 | /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
18 | /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
19 |
20 | --
21 | -- Table structure for table `SSIDs`
22 | --
23 |
24 | DROP TABLE IF EXISTS `SSIDs`;
25 | /*!40101 SET @saved_cs_client = @@character_set_client */;
26 | /*!40101 SET character_set_client = utf8 */;
27 | CREATE TABLE `SSIDs` (
28 | `MAC` varchar(1000) DEFAULT NULL,
29 | `SSID` varchar(1000) DEFAULT NULL
30 | ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
31 | /*!40101 SET character_set_client = @saved_cs_client */;
32 |
33 | --
34 | -- Table structure for table `assets`
35 | --
36 |
37 | DROP TABLE IF EXISTS `assets`;
38 | /*!40101 SET @saved_cs_client = @@character_set_client */;
39 | /*!40101 SET character_set_client = utf8 */;
40 | CREATE TABLE `assets` (
41 | `MAC` varchar(50) DEFAULT NULL,
42 | `Nickname` varchar(100) DEFAULT NULL,
43 | `Notify` tinyint(1) NOT NULL DEFAULT '0',
44 | `FirstSeen` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
45 | `LastSeen` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
46 | `TimesSeen` int(11) NOT NULL DEFAULT '0',
47 | `MinutesSince` int(11) NOT NULL DEFAULT '0',
48 | `SignalStrength` varchar(45) DEFAULT NULL,
49 | `DBTreshold` int(11) NOT NULL DEFAULT '-65',
50 | `NotifiedRecently` tinyint(1) NOT NULL DEFAULT '0'
51 | ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
52 | /*!40101 SET character_set_client = @saved_cs_client */;
53 |
54 | --
55 | -- Table structure for table `config`
56 | --
57 |
58 | DROP TABLE IF EXISTS `config`;
59 | /*!40101 SET @saved_cs_client = @@character_set_client */;
60 | /*!40101 SET character_set_client = utf8 */;
61 | CREATE TABLE `config` (
62 | `Name` varchar(100) DEFAULT NULL,
63 | `Value` varchar(100) DEFAULT NULL
64 | ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
65 | /*!40101 SET character_set_client = @saved_cs_client */;
66 |
67 | --
68 | -- Dumping data for table `config`
69 | --
70 |
71 | LOCK TABLES `config` WRITE;
72 | /*!40000 ALTER TABLE `config` DISABLE KEYS */;
73 | INSERT INTO `config` VALUES ('NotifyNewlyDiscovered','true'),('DefaultNotifyTreshold','-100');
74 | /*!40000 ALTER TABLE `config` ENABLE KEYS */;
75 | UNLOCK TABLES;
76 | /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
77 |
78 | /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
79 | /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
80 | /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
81 | /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
82 | /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
83 | /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
84 | /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
85 |
86 | --
87 | -- Table structure for table `log`
88 | --
89 |
90 | DROP TABLE IF EXISTS `log`;
91 | /*!40101 SET @saved_cs_client = @@character_set_client */;
92 | /*!40101 SET character_set_client = utf8 */;
93 | CREATE TABLE `log` (
94 | `MAC` varchar(50) DEFAULT NULL,
95 | `seen` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
96 | `decibel` varchar(45) DEFAULT NULL,
97 | `SSID` varchar(45) DEFAULT NULL
98 | ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
99 | /*!40101 SET character_set_client = @saved_cs_client */;
100 | /*!50003 SET @saved_cs_client = @@character_set_client */ ;
101 | /*!50003 SET @saved_cs_results = @@character_set_results */ ;
102 | /*!50003 SET @saved_col_connection = @@collation_connection */ ;
103 | /*!50003 SET character_set_client = utf8 */ ;
104 | /*!50003 SET character_set_results = utf8 */ ;
105 | /*!50003 SET collation_connection = utf8_general_ci */ ;
106 | /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
107 | /*!50003 SET sql_mode = 'NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
108 | DELIMITER ;;
109 | /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER SignalStrengthTrigger AFTER INSERT ON log
110 | FOR EACH ROW
111 | UPDATE assets
112 | SET SignalStrength = NEW.decibel
113 | WHERE MAC = NEW.MAC */;;
114 | DELIMITER ;
115 | /*!50003 SET sql_mode = @saved_sql_mode */ ;
116 | /*!50003 SET character_set_client = @saved_cs_client */ ;
117 | /*!50003 SET character_set_results = @saved_cs_results */ ;
118 | /*!50003 SET collation_connection = @saved_col_connection */ ;
119 |
120 | --
121 | -- Dumping events for database 'WhosHere'
122 | --
123 |
124 | --
125 | -- Dumping routines for database 'WhosHere'
126 | --
127 | /*!50003 DROP PROCEDURE IF EXISTS `AddAssets` */;
128 | /*!50003 SET @saved_cs_client = @@character_set_client */ ;
129 | /*!50003 SET @saved_cs_results = @@character_set_results */ ;
130 | /*!50003 SET @saved_col_connection = @@collation_connection */ ;
131 | /*!50003 SET character_set_client = utf8 */ ;
132 | /*!50003 SET character_set_results = utf8 */ ;
133 | /*!50003 SET collation_connection = utf8_general_ci */ ;
134 | /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
135 | /*!50003 SET sql_mode = 'NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
136 | DELIMITER ;;
137 | CREATE DEFINER=`root`@`localhost` PROCEDURE `AddAssets`()
138 | BEGIN
139 | INSERT INTO assets(Mac,Nickname,FirstSeen,SignalStrength) SELECT lg.Mac,lg.Mac,MIN(lg.seen),lg.decibel AS FirstSeen FROM log lg LEFT JOIN assets ass ON ass.Mac = lg.Mac WHERE ass.Mac IS NULL GROUP BY lg.Mac;
140 | END ;;
141 | DELIMITER ;
142 | /*!50003 SET sql_mode = @saved_sql_mode */ ;
143 | /*!50003 SET character_set_client = @saved_cs_client */ ;
144 | /*!50003 SET character_set_results = @saved_cs_results */ ;
145 | /*!50003 SET collation_connection = @saved_col_connection */ ;
146 | /*!50003 DROP PROCEDURE IF EXISTS `InsertMac` */;
147 | /*!50003 SET @saved_cs_client = @@character_set_client */ ;
148 | /*!50003 SET @saved_cs_results = @@character_set_results */ ;
149 | /*!50003 SET @saved_col_connection = @@collation_connection */ ;
150 | /*!50003 SET character_set_client = utf8 */ ;
151 | /*!50003 SET character_set_results = utf8 */ ;
152 | /*!50003 SET collation_connection = utf8_general_ci */ ;
153 | /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
154 | /*!50003 SET sql_mode = 'NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
155 | DELIMITER ;;
156 | CREATE DEFINER=`root`@`localhost` PROCEDURE `InsertMac`(IN NewMac VARCHAR(100), IN NewDB VARCHAR(100), IN NewSSID VARCHAR(100))
157 | BEGIN
158 | INSERT INTO log(MAC, decibel, SSID) VALUES(NewMac, NewDB, NewSSID);
159 |
160 | IF NOT EXISTS (SELECT * FROM SSIDs WHERE MAC = NewMac AND SSID = NewSSID) THEN
161 |
162 | INSERT INTO SSIDs (MAC, SSID) VALUES(NewMac, NewSSID);
163 |
164 | END IF;
165 |
166 | END ;;
167 | DELIMITER ;
168 | /*!50003 SET sql_mode = @saved_sql_mode */ ;
169 | /*!50003 SET character_set_client = @saved_cs_client */ ;
170 | /*!50003 SET character_set_results = @saved_cs_results */ ;
171 | /*!50003 SET collation_connection = @saved_col_connection */ ;
172 | /*!50003 DROP PROCEDURE IF EXISTS `NotificationLogic` */;
173 | /*!50003 SET @saved_cs_client = @@character_set_client */ ;
174 | /*!50003 SET @saved_cs_results = @@character_set_results */ ;
175 | /*!50003 SET @saved_col_connection = @@collation_connection */ ;
176 | /*!50003 SET character_set_client = utf8 */ ;
177 | /*!50003 SET character_set_results = utf8 */ ;
178 | /*!50003 SET collation_connection = utf8_general_ci */ ;
179 | /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
180 | /*!50003 SET sql_mode = 'NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
181 | DELIMITER ;;
182 | CREATE DEFINER=`root`@`localhost` PROCEDURE `NotificationLogic`()
183 | BEGIN
184 |
185 | IF EXISTS (SELECT DISTINCT Nickname,LastSeen,MAC,SignalStrength FROM assets ass WHERE Notify = 1 AND LastSeen > DATE_SUB(now(), INTERVAL 5 MINUTE) AND MinutesSince > 60 AND SignalStrength >= DBTreshold AND NotifiedRecently = 0) THEN
186 | SELECT DISTINCT Nickname,LastSeen,MAC,SignalStrength FROM assets ass WHERE Notify = 1 AND LastSeen > DATE_SUB(now(), INTERVAL 5 MINUTE) AND MinutesSince > 60 AND SignalStrength >= DBTreshold AND NotifiedRecently = 0;
187 | UPDATE assets SET NotifiedRecently = 1 WHERE Notify = 1 AND LastSeen > DATE_SUB(now(), INTERVAL 5 MINUTE) AND MinutesSince > 60 AND SignalStrength >= DBTreshold AND NotifiedRecently = 0;
188 | END IF;
189 |
190 | IF EXISTS (SELECT * FROM config WHERE Name = 'NotifyNewlyDiscovered' AND Value = 'true') THEN
191 | SELECT DISTINCT Nickname,LastSeen,MAC,SignalStrength FROM assets ass WHERE FirstSeen > DATE_SUB(now(), INTERVAL 5 MINUTE) AND SignalStrength >= DBTreshold AND NotifiedRecently = 0;
192 | UPDATE assets SET NotifiedRecently = 1 WHERE FirstSeen > DATE_SUB(now(), INTERVAL 5 MINUTE) AND SignalStrength >= DBTreshold AND NotifiedRecently = 0;
193 | END IF;
194 |
195 | END ;;
196 | DELIMITER ;
197 | /*!50003 SET sql_mode = @saved_sql_mode */ ;
198 | /*!50003 SET character_set_client = @saved_cs_client */ ;
199 | /*!50003 SET character_set_results = @saved_cs_results */ ;
200 | /*!50003 SET collation_connection = @saved_col_connection */ ;
201 | /*!50003 DROP PROCEDURE IF EXISTS `PurgeLogs` */;
202 | /*!50003 SET @saved_cs_client = @@character_set_client */ ;
203 | /*!50003 SET @saved_cs_results = @@character_set_results */ ;
204 | /*!50003 SET @saved_col_connection = @@collation_connection */ ;
205 | /*!50003 SET character_set_client = utf8 */ ;
206 | /*!50003 SET character_set_results = utf8 */ ;
207 | /*!50003 SET collation_connection = utf8_general_ci */ ;
208 | /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
209 | /*!50003 SET sql_mode = 'NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
210 | DELIMITER ;;
211 | CREATE DEFINER=`root`@`localhost` PROCEDURE `PurgeLogs`()
212 | BEGIN
213 | TRUNCATE TABLE log;
214 | END ;;
215 | DELIMITER ;
216 | /*!50003 SET sql_mode = @saved_sql_mode */ ;
217 | /*!50003 SET character_set_client = @saved_cs_client */ ;
218 | /*!50003 SET character_set_results = @saved_cs_results */ ;
219 | /*!50003 SET collation_connection = @saved_col_connection */ ;
220 | /*!50003 DROP PROCEDURE IF EXISTS `QuickViewAssets` */;
221 | /*!50003 SET @saved_cs_client = @@character_set_client */ ;
222 | /*!50003 SET @saved_cs_results = @@character_set_results */ ;
223 | /*!50003 SET @saved_col_connection = @@collation_connection */ ;
224 | /*!50003 SET character_set_client = utf8 */ ;
225 | /*!50003 SET character_set_results = utf8 */ ;
226 | /*!50003 SET collation_connection = utf8_general_ci */ ;
227 | /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
228 | /*!50003 SET sql_mode = 'NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
229 | DELIMITER ;;
230 | CREATE DEFINER=`root`@`localhost` PROCEDURE `QuickViewAssets`()
231 | BEGIN
232 | SELECT ass.*,iq.SSIDs FROM assets ass
233 | LEFT JOIN (SELECT COUNT(SSID) as SSIDs,MAC FROM SSIDs WHERE SSID != "" GROUP BY MAC) iq on iq.MAC = ass.MAC
234 | ORDER BY ass.LastSeen DESC,ass.TimesSeen DESC LIMIT 50;
235 | END ;;
236 | DELIMITER ;
237 | /*!50003 SET sql_mode = @saved_sql_mode */ ;
238 | /*!50003 SET character_set_client = @saved_cs_client */ ;
239 | /*!50003 SET character_set_results = @saved_cs_results */ ;
240 | /*!50003 SET collation_connection = @saved_col_connection */ ;
241 | /*!50003 DROP PROCEDURE IF EXISTS `UpdateAssets` */;
242 | /*!50003 SET @saved_cs_client = @@character_set_client */ ;
243 | /*!50003 SET @saved_cs_results = @@character_set_results */ ;
244 | /*!50003 SET @saved_col_connection = @@collation_connection */ ;
245 | /*!50003 SET character_set_client = utf8 */ ;
246 | /*!50003 SET character_set_results = utf8 */ ;
247 | /*!50003 SET collation_connection = utf8_general_ci */ ;
248 | /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
249 | /*!50003 SET sql_mode = 'NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
250 | DELIMITER ;;
251 | CREATE DEFINER=`root`@`localhost` PROCEDURE `UpdateAssets`(IN name VARCHAR(100), IN flag boolean, IN asset VARCHAR(100), IN signaltreshold INT)
252 | BEGIN
253 | UPDATE assets SET Nickname = name, Notify = flag, DBTreshold = signaltreshold WHERE MAC = asset;
254 | END ;;
255 | DELIMITER ;
256 | /*!50003 SET sql_mode = @saved_sql_mode */ ;
257 | /*!50003 SET character_set_client = @saved_cs_client */ ;
258 | /*!50003 SET character_set_results = @saved_cs_results */ ;
259 | /*!50003 SET collation_connection = @saved_col_connection */ ;
260 | /*!50003 DROP PROCEDURE IF EXISTS `UpdateAssetsLastSeen` */;
261 | /*!50003 SET @saved_cs_client = @@character_set_client */ ;
262 | /*!50003 SET @saved_cs_results = @@character_set_results */ ;
263 | /*!50003 SET @saved_col_connection = @@collation_connection */ ;
264 | /*!50003 SET character_set_client = utf8 */ ;
265 | /*!50003 SET character_set_results = utf8 */ ;
266 | /*!50003 SET collation_connection = utf8_general_ci */ ;
267 | /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
268 | /*!50003 SET sql_mode = 'NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
269 | DELIMITER ;;
270 | CREATE DEFINER=`root`@`localhost` PROCEDURE `UpdateAssetsLastSeen`()
271 | BEGIN
272 | UPDATE assets AS ass
273 | INNER JOIN (SELECT ass.MAC,MAX(lg.seen) AS LastSeen,TIMESTAMPDIFF(MINUTE,MAX(lg.seen),ass.LastSeen) * -1 AS MinutesSince, COUNT(ass.MAC) AS TimesSeen
274 | FROM assets ass
275 | INNER JOIN log lg
276 | on ass.MAC = lg.MAC
277 | GROUP BY ass.MAC) AS iq ON iq.MAC = ass.MAC
278 | SET ass.LastSeen = iq.LastSeen,
279 | ass.MinutesSince = iq.MinutesSince,
280 | ass.TimesSeen = ass.TimesSeen + iq.TimesSeen;
281 | END ;;
282 | DELIMITER ;
283 | /*!50003 SET sql_mode = @saved_sql_mode */ ;
284 | /*!50003 SET character_set_client = @saved_cs_client */ ;
285 | /*!50003 SET character_set_results = @saved_cs_results */ ;
286 | /*!50003 SET collation_connection = @saved_col_connection */ ;
287 | /*!50003 DROP PROCEDURE IF EXISTS `UpdateSingleAsset` */;
288 | /*!50003 SET @saved_cs_client = @@character_set_client */ ;
289 | /*!50003 SET @saved_cs_results = @@character_set_results */ ;
290 | /*!50003 SET @saved_col_connection = @@collation_connection */ ;
291 | /*!50003 SET character_set_client = utf8 */ ;
292 | /*!50003 SET character_set_results = utf8 */ ;
293 | /*!50003 SET collation_connection = utf8_general_ci */ ;
294 | /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
295 | /*!50003 SET sql_mode = 'NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
296 | DELIMITER ;;
297 | CREATE DEFINER=`root`@`localhost` PROCEDURE `UpdateSingleAsset`(IN inMAC VARCHAR(100))
298 | BEGIN
299 | UPDATE assets SET NotifiedRecently = 0 WHERE LastSeen < DATE_SUB(now(), INTERVAL 60 MINUTE);
300 | UPDATE assets SET LastSeen = NOW(),MinutesSince = 0 WHERE MAC = inMAC;
301 | END ;;
302 | DELIMITER ;
303 | /*!50003 SET sql_mode = @saved_sql_mode */ ;
304 | /*!50003 SET character_set_client = @saved_cs_client */ ;
305 | /*!50003 SET character_set_results = @saved_cs_results */ ;
306 | /*!50003 SET collation_connection = @saved_col_connection */ ;
307 | /*!50003 DROP PROCEDURE IF EXISTS `ViewAllAssets` */;
308 | /*!50003 SET @saved_cs_client = @@character_set_client */ ;
309 | /*!50003 SET @saved_cs_results = @@character_set_results */ ;
310 | /*!50003 SET @saved_col_connection = @@collation_connection */ ;
311 | /*!50003 SET character_set_client = utf8 */ ;
312 | /*!50003 SET character_set_results = utf8 */ ;
313 | /*!50003 SET collation_connection = utf8_general_ci */ ;
314 | /*!50003 SET @saved_sql_mode = @@sql_mode */ ;
315 | /*!50003 SET sql_mode = 'NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
316 | DELIMITER ;;
317 | CREATE DEFINER=`root`@`localhost` PROCEDURE `ViewAllAssets`()
318 | BEGIN
319 | SELECT ass.*,iq.SSIDs FROM assets ass
320 | LEFT JOIN (SELECT COUNT(SSID) as SSIDs,MAC FROM SSIDs WHERE SSID != "" GROUP BY MAC) iq on iq.MAC = ass.MAC
321 | ORDER BY ass.LastSeen DESC,ass.TimesSeen;
322 | END ;;
323 | DELIMITER ;
324 | /*!50003 SET sql_mode = @saved_sql_mode */ ;
325 | /*!50003 SET character_set_client = @saved_cs_client */ ;
326 | /*!50003 SET character_set_results = @saved_cs_results */ ;
327 | /*!50003 SET collation_connection = @saved_col_connection */ ;
328 | /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
329 |
330 | /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
331 | /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
332 | /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
333 | /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
334 | /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
335 | /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
336 | /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
337 |
338 | -- Dump completed on 2017-12-19 23:28:06
339 |
--------------------------------------------------------------------------------