├── 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 | 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 |
SSID
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 | 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 | 90 | 91 | close(); 96 | ?> 97 | 98 |
NameValueUpdate
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 |

whoshere-screenshot

38 | 39 |

whoshere-screenshot

40 | 41 |

whoshere-screenshot

42 | 43 |

whoshere-screenshot

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 | 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 |
NameTimes SeenFirst SeenLast SeenStrengthNotify TresholdUpdate
= 1){?>>
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 | --------------------------------------------------------------------------------