diff options
| author | schneefux <schneefux+commit@schneefux.xyz> | 2014-03-30 16:03:44 -0400 |
|---|---|---|
| committer | schneefux <schneefux+commit@schneefux.xyz> | 2014-03-30 16:03:44 -0400 |
| commit | d31fabf8cff5dae02e3fc759a4203bd374dddc99 (patch) | |
| tree | 888ec4e6d98154f862a3b9cd17a3394b657bc02e /boot | |
| parent | 4182b5e096e081158dddd4ad5d031af94fcc63de (diff) | |
| download | jasper-client-d31fabf8cff5dae02e3fc759a4203bd374dddc99.tar.gz jasper-client-d31fabf8cff5dae02e3fc759a4203bd374dddc99.zip | |
Initial commit
Diffstat (limited to 'boot')
| -rwxr-xr-x | boot/app/app.sh | 2 | ||||
| -rwxr-xr-x | boot/app/cgi-bin/index.cgi | 42 | ||||
| -rwxr-xr-x | boot/app/cgi-bin/wifi.py | 60 | ||||
| -rwxr-xr-x | boot/app/connecting-template.html | 24 | ||||
| -rwxr-xr-x | boot/app/index-template.html | 30 | ||||
| -rwxr-xr-x | boot/app/key-template.html | 33 | ||||
| -rwxr-xr-x | boot/app/pure-min.css | 16 | ||||
| -rwxr-xr-x | boot/app/styles.css | 64 | ||||
| -rwxr-xr-x | boot/boot.py | 89 | ||||
| -rwxr-xr-x | boot/boot.sh | 6 | ||||
| -rwxr-xr-x | boot/broadcast.txt | 11 | ||||
| -rw-r--r-- | boot/connect.txt | 10 | ||||
| -rwxr-xr-x | boot/listwifi.py | 18 | ||||
| -rw-r--r-- | boot/net.sh | 17 | ||||
| -rw-r--r-- | boot/networks.yml | 1 | ||||
| -rw-r--r-- | boot/say.wav | bin | 0 -> 151944 bytes | |||
| -rw-r--r-- | boot/vocabcompiler.py | 52 | ||||
| -rwxr-xr-x | boot/wifi.py | 60 |
18 files changed, 535 insertions, 0 deletions
diff --git a/boot/app/app.sh b/boot/app/app.sh new file mode 100755 index 0000000..cf7a383 --- /dev/null +++ b/boot/app/app.sh @@ -0,0 +1,2 @@ +cd /home/pi/jasper/boot/app/ +sudo python -m CGIHTTPServer 8000 & diff --git a/boot/app/cgi-bin/index.cgi b/boot/app/cgi-bin/index.cgi new file mode 100755 index 0000000..bcb85b5 --- /dev/null +++ b/boot/app/cgi-bin/index.cgi @@ -0,0 +1,42 @@ +#!/usr/bin/env python + +from wifi import * +import os +import cgi +import cgitb; cgitb.enable() # for troubleshooting + +# some housekeeping +print "Content-type: text/html" +print + +# get the form input +form = cgi.FieldStorage() +network = form.getvalue("network", "") +password = form.getvalue("password", "") + +# if not submitted yet, show them the network selection form +if not network: + + wifi = Wifi() + + networks = [x.replace("\n","") for x in wifi.access_points if x.replace("\n","") != "Jasper"] + select_code_split = ["<option value=\"%s\">%s</option>" % (network, network) for network in networks] + select_code = "".join(select_code_split) + + response = open("index-template.html","r").read().replace("{{ select_code }}", select_code) + print response + +# otherwise, show them the password form +elif not password: + response = open("key-template.html","r").read().replace("{{ network }}", cgi.escape(network)) + print response + +# in the final case, process the wifi password and network data +else: + # show the confirmation page + response = open("connecting-template.html","r").read() + print response + + # save the configuration + wifi = Wifi() + wifi.add_wifi(network, password)
\ No newline at end of file diff --git a/boot/app/cgi-bin/wifi.py b/boot/app/cgi-bin/wifi.py new file mode 100755 index 0000000..5cede72 --- /dev/null +++ b/boot/app/cgi-bin/wifi.py @@ -0,0 +1,60 @@ +import yaml +import os, subprocess + +class Wifi: + + access_points = [] + + def __init__(self): + + subprocess.call("iwlist wlan0 scan > temp.txt", shell = True) + output = open("temp.txt") + lines = output.readlines() + + for index, line in enumerate(lines): + + if "Address" in line: + + address = line[29:-1] + name = lines[index + 1].split("\"")[1] + self.access_points.append(name) + + self.access_points = list(set(self.access_points)) + + os.system("rm temp.txt") + + def add_wifi(self, SSID, KEY=""): + networks = yaml.safe_load(open("../networks.yml", "r")) + + # add new network to front of list + network = {"SSID": SSID, "KEY": KEY} + networks.insert(0, network) + + with open('../networks.yml', 'w') as outputFile: + output = yaml.dump(networks) + outputFile.write(output) + + def set_default_wifi(self, SSID, KEY=""): + + text = open("connect.txt", "r").read() + text = text.replace("{{ SSID }}", SSID) + text = text.replace("{{ KEY }}", KEY) + + outputFile = open("/etc/network/interfaces", "w") + outputFile.write(text) + outputFile.flush() + outputFile.close() + + subprocess.call(["sudo", "/etc/init.d/networking", "restart"]) + + def setup_adhoc(self): + + text = open("broadcast.txt", "r").read() + outputFile = open("/etc/network/interfaces","w") + outputFile.write(text) + outputFile.flush() + outputFile.close() + + subprocess.call(["sudo", "/etc/init.d/networking", "restart"]) + subprocess.call(['sudo', '/usr/sbin/dhcpd', '-q', '-cf', '/etc/dhcp/dhcpd.conf', '-pf', '/var/run/dhcpd.pid']) + subprocess.call(["sudo", "/etc/init.d/networking", "restart"]) diff --git a/boot/app/connecting-template.html b/boot/app/connecting-template.html new file mode 100755 index 0000000..f9d745c --- /dev/null +++ b/boot/app/connecting-template.html @@ -0,0 +1,24 @@ +<!doctype html> +<html lang="en"> + <head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Welcome to Jasper</title> + <link rel="stylesheet" type="text/css" href="http://fonts.googleapis.com/css?family=Open+Sans"> + <link rel="stylesheet" href="../pure-min.css"> + <link rel="stylesheet" href="../styles.css"> + </head> + <body> + <div class="centered"> + <center> + <h1>Great!</h1> + <h3> + Jasper is now attempting to connect with your wifi network and will speak after it has restarted. + + <br /><br /> + + You may now disconnect your laptop from the "Jasper" network. + </h3> + </center> + </body> +</html> diff --git a/boot/app/index-template.html b/boot/app/index-template.html new file mode 100755 index 0000000..e8ad45b --- /dev/null +++ b/boot/app/index-template.html @@ -0,0 +1,30 @@ +<!doctype html> +<html lang="en"> + <head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Welcome to Jasper</title> + <link rel="stylesheet" type="text/css" href="http://fonts.googleapis.com/css?family=Open+Sans"> + <link rel="stylesheet" href="../pure-min.css"> + <link rel="stylesheet" href="../styles.css"> + </head> + <body> + <div class="centered"> + <center> + <h1>Welcome to Jasper</h1> + <h3>Please select a wifi network</h3> + + <form target="index.cgi" method="POST"> + + <select name="network"> + {{ select_code }} + </select> + + <br /><br /> + + <button type="submit" class="pure-button pure-input-1 notice">Continue</button> + + </form> + </center> + </body> +</html> diff --git a/boot/app/key-template.html b/boot/app/key-template.html new file mode 100755 index 0000000..a1a076b --- /dev/null +++ b/boot/app/key-template.html @@ -0,0 +1,33 @@ +<!doctype html> +<html lang="en"> + <head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Welcome to Jasper</title> + <link rel="stylesheet" type="text/css" href="http://fonts.googleapis.com/css?family=Open+Sans"> + <link rel="stylesheet" href="../pure-min.css"> + <link rel="stylesheet" href="../styles.css"> + </head> + <body> + <div class="centered"> + <center> + <h2>{{ network }}</h2> + <h4>If the network requires one, please enter the password. Otherwise, leave it blank.</h4> + + <form target="index.cgi" method="POST"> + + <input id="password" name="password" type="password" tabindex="1"></input> + <input id="network" name="network" type="hidden" value="{{ network }}"></input> + + <br /><br /> + + <button type="submit" class="pure-button pure-input-1" tabindex="3">Back</button> <button type="submit" class="pure-button pure-input-1 notice" tabindex="2">Continue</button> + + </form> + </center> + + <script> + document.getElementById("password").focus(); + </script> + </body> +</html> diff --git a/boot/app/pure-min.css b/boot/app/pure-min.css new file mode 100755 index 0000000..5f0118d --- /dev/null +++ b/boot/app/pure-min.css @@ -0,0 +1,16 @@ +/*! +Pure v0.2.0 +Copyright 2013 Yahoo! Inc. All rights reserved. +Licensed under the BSD License. +https://github.com/yui/pure/blob/master/LICENSE.md +*/ +/*! +normalize.css v1.1.2 | MIT License | git.io/normalize +Copyright (c) Nicolas Gallagher and Jonathan Neal +*/ +/*! normalize.css v1.1.2 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-size:100%;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}html,button,input,select,textarea{font-family:sans-serif}body{margin:0}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{font-size:2em;margin:.67em 0}h2{font-size:1.5em;margin:.83em 0}h3{font-size:1.17em;margin:1em 0}h4{font-size:1em;margin:1.33em 0}h5{font-size:.83em;margin:1.67em 0}h6{font-size:.67em;margin:2.33em 0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:1em 40px}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}mark{background:#ff0;color:#000}p,pre{margin:1em 0}code,kbd,pre,samp{font-family:monospace,serif;_font-family:'courier new',monospace;font-size:1em}pre{white-space:pre;white-space:pre-wrap;word-wrap:break-word}q{quotes:none}q:before,q:after{content:'';content:none}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,menu,ol,ul{margin:1em 0}dd{margin:0 0 0 40px}menu,ol,ul{padding:0 0 0 40px}nav ul,nav ol{list-style:none;list-style-image:none}img{border:0;-ms-interpolation-mode:bicubic}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0;white-space:normal;*margin-left:-7px}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;*overflow:visible}button[disabled],html input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0;*height:13px;*width:13px}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0} +.pure-button{display:inline-block;*display:inline;zoom:1;line-height:normal;white-space:nowrap;vertical-align:baseline;text-align:center;cursor:pointer;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pure-button::-moz-focus-inner{padding:0;border:0}.pure-button{font-size:100%;*font-size:90%;*overflow:visible;padding:.5em 1.5em;color:#444;color:rgba(0,0,0,.8);*color:#444;border:1px solid #999;border:0 rgba(0,0,0,0);background-color:#E6E6E6;text-decoration:none;border-radius:2px;-webkit-font-smoothing:antialiased;-webkit-transition:.1s linear -webkit-box-shadow;-moz-transition:.1s linear -moz-box-shadow;-ms-transition:.1s linear box-shadow;-o-transition:.1s linear box-shadow;transition:.1s linear box-shadow}.pure-button-hover,.pure-button:hover,.pure-button:focus{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#1a000000', GradientType=0);background-image:-webkit-gradient(linear,0 0,0 100%,from(transparent),color-stop(40%,rgba(0,0,0,.05)),to(rgba(0,0,0,.1)));background-image:-webkit-linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1));background-image:-moz-linear-gradient(top,rgba(0,0,0,.05) 0,rgba(0,0,0,.1));background-image:-ms-linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1));background-image:-o-linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1));background-image:linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1))}.pure-button:focus{outline:0}.pure-button-active,.pure-button:active{box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 0 6px rgba(0,0,0,.2) inset}.pure-button[disabled],.pure-button-disabled,.pure-button-disabled:hover,.pure-button-disabled:focus,.pure-button-disabled:active{border:0;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);filter:alpha(opacity=40);-khtml-opacity:.4;-moz-opacity:.4;opacity:.4;cursor:not-allowed;box-shadow:none}.pure-button-hidden{display:none}.pure-button::-moz-focus-inner{padding:0;border:0}.pure-button-primary,.pure-button-selected,a.pure-button-primary,a.pure-button-selected{background-color:#0078e7;color:#fff} +.pure-form{margin:0}.pure-form fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}.pure-form legend{border:0;padding:0;white-space:normal;*margin-left:-7px}.pure-form button,.pure-form input,.pure-form select,.pure-form textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.pure-form button,.pure-form input{line-height:normal}.pure-form button,.pure-form input[type=button],.pure-form input[type=reset],.pure-form input[type=submit]{-webkit-appearance:button;cursor:pointer;*overflow:visible}.pure-form button[disabled],.pure-form input[disabled]{cursor:default}.pure-form input[type=checkbox],.pure-form input[type=radio]{box-sizing:border-box;padding:0;*height:13px;*width:13px}.pure-form input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}.pure-form input[type=search]::-webkit-search-cancel-button,.pure-form input[type=search]::-webkit-search-decoration{-webkit-appearance:none}.pure-form button::-moz-focus-inner,.pure-form input::-moz-focus-inner{border:0;padding:0}.pure-form textarea{overflow:auto;vertical-align:top}.pure-form input[type=text],.pure-form input[type=password],.pure-form input[type=email],.pure-form input[type=url],.pure-form input[type=date],.pure-form input[type=month],.pure-form input[type=time],.pure-form input[type=datetime],.pure-form input[type=datetime-local],.pure-form input[type=week],.pure-form input[type=number],.pure-form input[type=search],.pure-form input[type=tel],.pure-form input[type=color],.pure-form select,.pure-form textarea{padding:.5em .6em;display:inline-block;border:1px solid #ccc;font-size:.8em;box-shadow:inset 0 1px 3px #ddd;border-radius:4px;-webkit-transition:.3s linear border;-moz-transition:.3s linear border;-ms-transition:.3s linear border;-o-transition:.3s linear border;transition:.3s linear border;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-font-smoothing:antialiased}.pure-form input[type=text]:focus,.pure-form input[type=password]:focus,.pure-form input[type=email]:focus,.pure-form input[type=url]:focus,.pure-form input[type=date]:focus,.pure-form input[type=month]:focus,.pure-form input[type=time]:focus,.pure-form input[type=datetime]:focus,.pure-form input[type=datetime-local]:focus,.pure-form input[type=week]:focus,.pure-form input[type=number]:focus,.pure-form input[type=search]:focus,.pure-form input[type=tel]:focus,.pure-form input[type=color]:focus,.pure-form select:focus,.pure-form textarea:focus{outline:0;outline:thin dotted \9;border-color:#129FEA}.pure-form input[type=file]:focus,.pure-form input[type=radio]:focus,.pure-form input[type=checkbox]:focus{outline:thin dotted #333;outline:1px auto #129FEA}.pure-form .pure-checkbox,.pure-form .pure-radio{margin:.5em 0;display:block}.pure-form input[type=text][disabled],.pure-form input[type=password][disabled],.pure-form input[type=email][disabled],.pure-form input[type=url][disabled],.pure-form input[type=date][disabled],.pure-form input[type=month][disabled],.pure-form input[type=time][disabled],.pure-form input[type=datetime][disabled],.pure-form input[type=datetime-local][disabled],.pure-form input[type=week][disabled],.pure-form input[type=number][disabled],.pure-form input[type=search][disabled],.pure-form input[type=tel][disabled],.pure-form input[type=color][disabled],.pure-form select[disabled],.pure-form textarea[disabled],.pure-form input[readonly],.pure-form select[readonly],.pure-form textarea[readonly]{cursor:not-allowed;background-color:#eaeded;color:#cad2d3;border-color:transparent}.pure-form input:focus:invalid,.pure-form textarea:focus:invalid,.pure-form select:focus:invalid{color:#b94a48;border:1px solid #ee5f5b}.pure-form input:focus:invalid:focus,.pure-form textarea:focus:invalid:focus,.pure-form select:focus:invalid:focus{border-color:#e9322d}.pure-form input[type=file]:focus:invalid:focus,.pure-form input[type=radio]:focus:invalid:focus,.pure-form input[type=checkbox]:focus:invalid:focus{outline-color:#e9322d}.pure-form select{border:1px solid #ccc;background-color:#fff}.pure-form select[multiple]{height:auto}.pure-form label{margin:.5em 0 .2em;color:#999;font-size:90%}.pure-form fieldset{margin:0;padding:.35em 0 .75em;border:0}.pure-form legend{display:block;width:100%;padding:.3em 0;margin-bottom:.3em;font-size:125%;color:#333;border-bottom:1px solid #e5e5e5}.pure-form-stacked input[type=text],.pure-form-stacked input[type=password],.pure-form-stacked input[type=email],.pure-form-stacked input[type=url],.pure-form-stacked input[type=date],.pure-form-stacked input[type=month],.pure-form-stacked input[type=time],.pure-form-stacked input[type=datetime],.pure-form-stacked input[type=datetime-local],.pure-form-stacked input[type=week],.pure-form-stacked input[type=number],.pure-form-stacked input[type=search],.pure-form-stacked input[type=tel],.pure-form-stacked input[type=color],.pure-form-stacked select,.pure-form-stacked label{display:block}.pure-form-aligned input,.pure-form-aligned textarea,.pure-form-aligned select,.pure-form-aligned .pure-help-inline,.pure-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.pure-form-aligned .pure-control-group{margin-bottom:.5em}.pure-form-aligned .pure-control-group label{text-align:right;display:inline-block;vertical-align:middle;width:10em;margin:0 1em 0 0}.pure-form-aligned .pure-controls{margin:1.5em 0 0 10em}.pure-form .pure-input-rounded{border-radius:20px;padding-left:1em}.pure-form .pure-group fieldset{margin-bottom:10px}.pure-form .pure-group input{display:block;padding:10px;margin:0;border-radius:0;position:relative;top:-1px}.pure-form .pure-group input:focus{z-index:2}.pure-form .pure-group input:first-child{top:1px;border-radius:4px 4px 0 0}.pure-form .pure-group input:last-child{top:-2px;border-radius:0 0 4px 4px}.pure-form .pure-group button{margin:.35em 0}.pure-form .pure-input-1{width:100%}.pure-form .pure-input-2-3{width:66%}.pure-form .pure-input-1-2{width:50%}.pure-form .pure-input-1-3{width:33%}.pure-form .pure-input-1-4{width:25%}.pure-form .pure-help-inline,.pure-form-message-inline{display:inline-block;padding-left:.3em;color:#666;vertical-align:middle;font-size:90%}.pure-form-message{display:block;color:#666;font-size:90%}@media only screen and (max-width :480px){.pure-form button[type=submit]{margin:.7em 0 0}.pure-form input[type=text],.pure-form input[type=password],.pure-form input[type=email],.pure-form input[type=url],.pure-form input[type=date],.pure-form input[type=month],.pure-form input[type=time],.pure-form input[type=datetime],.pure-form input[type=datetime-local],.pure-form input[type=week],.pure-form input[type=number],.pure-form input[type=search],.pure-form input[type=tel],.pure-form input[type=color],.pure-form label{margin-bottom:.3em;display:block}.pure-group input[type=text],.pure-form input[type=password],.pure-form input[type=email],.pure-form input[type=url],.pure-form input[type=date],.pure-form input[type=month],.pure-form input[type=time],.pure-form input[type=datetime],.pure-form input[type=datetime-local],.pure-form input[type=week],.pure-form input[type=number],.pure-form input[type=search],.pure-form input[type=tel],.pure-form input[type=color]{margin-bottom:0}.pure-form-aligned .pure-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.pure-form-aligned .pure-controls{margin:1.5em 0 0}.pure-form .pure-help-inline,.pure-form-message-inline,.pure-form-message{display:block;font-size:80%;padding:.2em 0 .8em}} +.pure-g{letter-spacing:-.31em;*letter-spacing:normal;*word-spacing:-.43em;text-rendering:optimizespeed}.opera-only :-o-prefocus,.pure-g{word-spacing:-.43em}.pure-u{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-1,.pure-u-1-2,.pure-u-1-3,.pure-u-2-3,.pure-u-1-4,.pure-u-3-4,.pure-u-1-5,.pure-u-2-5,.pure-u-3-5,.pure-u-4-5,.pure-u-1-6,.pure-u-5-6,.pure-u-1-8,.pure-u-3-8,.pure-u-5-8,.pure-u-7-8,.pure-u-1-12,.pure-u-5-12,.pure-u-7-12,.pure-u-11-12,.pure-u-1-24,.pure-u-5-24,.pure-u-7-24,.pure-u-11-24,.pure-u-13-24,.pure-u-17-24,.pure-u-19-24,.pure-u-23-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-1{display:block}.pure-u-1-2{width:50%}.pure-u-1-3{width:33.33333%}.pure-u-2-3{width:66.66666%}.pure-u-1-4{width:25%}.pure-u-3-4{width:75%}.pure-u-1-5{width:20%}.pure-u-2-5{width:40%}.pure-u-3-5{width:60%}.pure-u-4-5{width:80%}.pure-u-1-6{width:16.656%}.pure-u-5-6{width:83.33%}.pure-u-1-8{width:12.5%}.pure-u-3-8{width:37.5%}.pure-u-5-8{width:62.5%}.pure-u-7-8{width:87.5%}.pure-u-1-12{width:8.3333%}.pure-u-5-12{width:41.6666%}.pure-u-7-12{width:58.3333%}.pure-u-11-12{width:91.6666%}.pure-u-1-24{width:4.1666%}.pure-u-5-24{width:20.8333%}.pure-u-7-24{width:29.1666%}.pure-u-11-24{width:45.8333%}.pure-u-13-24{width:54.1666%}.pure-u-17-24{width:70.8333%}.pure-u-19-24{width:79.1666%}.pure-u-23-24{width:95.8333%}.pure-g-r{letter-spacing:-.31em;*letter-spacing:normal;*word-spacing:-.43em}.opera-only :-o-prefocus,.pure-g-r{word-spacing:-.43em}.pure-g-r img{max-width:100%}@media (min-width:980px){.pure-visible-phone{display:none}.pure-visible-tablet{display:none}.pure-hidden-desktop{display:none}}@media (max-width:480px){.pure-g-r>.pure-u,.pure-g-r>[class *="pure-u-"]{width:100%}}@media (max-width:767px){.pure-g-r>.pure-u,.pure-g-r>[class *="pure-u-"]{width:100%}.pure-hidden-phone{display:none}.pure-visible-desktop{display:none}}@media (min-width:768px) and (max-width:979px){.pure-hidden-tablet{display:none}.pure-visible-desktop{display:none}} +.pure-menu ul{position:absolute;visibility:hidden}.pure-menu.pure-menu-open{visibility:visible;z-index:2;width:100%}.pure-menu ul{left:-10000px;list-style:none;margin:0;padding:0;top:-10000px;z-index:1}.pure-menu>ul{position:relative}.pure-menu-open>ul{left:0;top:0;visibility:visible}.pure-menu-open>ul:focus{outline:0}.pure-menu li{position:relative}.pure-menu a,.pure-menu .pure-menu-heading{display:block;color:inherit;line-height:1.5em;padding:5px 20px;text-decoration:none;white-space:nowrap}.pure-menu.pure-menu-horizontal>.pure-menu-heading{display:inline-block;*display:inline;zoom:1;margin:0;vertical-align:middle}.pure-menu.pure-menu-horizontal>ul{display:inline-block;*display:inline;zoom:1;vertical-align:middle;height:2.4em}.pure-menu li a{padding:5px 20px}.pure-menu-can-have-children>.pure-menu-label:after{content:'\25B8';float:right;font-family:'Lucida Grande','Lucida Sans Unicode','DejaVu Sans',sans-serif;margin-right:-20px;margin-top:-1px}.pure-menu-can-have-children>.pure-menu-label{padding-right:30px}.pure-menu-separator{background-color:#dfdfdf;display:block;height:1px;font-size:0;margin:7px 2px;overflow:hidden}.pure-menu-hidden{display:none}.pure-menu-fixed{position:fixed;top:0;left:0;width:100%}.pure-menu-horizontal li{display:inline-block;*display:inline;zoom:1;vertical-align:middle}.pure-menu-horizontal li li{display:block}.pure-menu-horizontal>.pure-menu-children>.pure-menu-can-have-children>.pure-menu-label:after{content:"\25BE"}.pure-menu-horizontal>.pure-menu-children>.pure-menu-can-have-children>.pure-menu-label{padding-right:30px}.pure-menu-horizontal li.pure-menu-separator{height:50%;width:1px;margin:0 7px}.pure-menu-horizontal li li.pure-menu-separator{height:1px;width:auto;margin:7px 2px}.pure-menu.pure-menu-open,.pure-menu.pure-menu-horizontal li .pure-menu-children{background:#fff;border:1px solid #b7b7b7}.pure-menu.pure-menu-horizontal,.pure-menu.pure-menu-horizontal .pure-menu-heading{border:0}.pure-menu a{border:1px solid transparent;border-left:0;border-right:0}.pure-menu a,.pure-menu .pure-menu-can-have-children>li:after{color:#777}.pure-menu .pure-menu-can-have-children>li:hover:after{color:#fff}.pure-menu .pure-menu-open{background:#dedede}.pure-menu li a:hover,.pure-menu li a:focus{background:#eee}.pure-menu li.pure-menu-disabled a:hover,.pure-menu li.pure-menu-disabled a:focus{background:#fff;color:#bfbfbf}.pure-menu .pure-menu-disabled>a{background-image:none;border-color:transparent;cursor:default}.pure-menu .pure-menu-disabled>a,.pure-menu .pure-menu-can-have-children.pure-menu-disabled>a:after{color:#bfbfbf}.pure-menu .pure-menu-heading{color:#565d64;text-transform:uppercase;font-size:90%;margin-top:.5em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:#dfdfdf}.pure-menu .pure-menu-selected a{color:#000}.pure-menu.pure-menu-open.pure-menu-fixed{border:0;border-bottom:1px solid #b7b7b7}.pure-paginator{list-style:none;margin:0;padding:0}.pure-paginator li{display:inline-block;*display:inline;zoom:1;margin:0 -.35em 0 0}.pure-paginator .pure-button{border-radius:0;padding:.8em 1.4em;vertical-align:top;height:1.1em}.pure-paginator .pure-button:focus{outline-style:none}.pure-paginator .prev,.pure-paginator .next{color:#C0C1C3;text-shadow:0 -1px 0 rgba(0,0,0,.45)}.pure-paginator .prev{border-radius:2px 0 0 2px}.pure-paginator .next{border-radius:0 2px 2px 0}@media (max-width:480px){.pure-menu-horizontal{width:100%}.pure-menu-children li{display:block;border-bottom:1px solid #000}} +.pure-table{border-collapse:collapse;border-spacing:0;empty-cells:show;border:1px solid #cbcbcb}.pure-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.pure-table td,.pure-table th{border-left:1px solid #cbcbcb;border-width:0 0 0 1px;font-size:inherit;margin:0;overflow:visible;padding:6px 12px}.pure-table td:first-child,.pure-table th:first-child{border-left-width:0}.pure-table thead{background:#e0e0e0;color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.pure-table td{background-color:transparent}.pure-table-odd td{background-color:#f2f2f2}.pure-table-striped tr:nth-child(2n-1) td{background-color:#f2f2f2}.pure-table-bordered td{border-bottom:1px solid #cbcbcb}.pure-table-bordered tbody>tr:last-child td,.pure-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.pure-table-horizontal td,.pure-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #cbcbcb}.pure-table-horizontal tbody>tr:last-child td{border-bottom-width:0}
\ No newline at end of file diff --git a/boot/app/styles.css b/boot/app/styles.css new file mode 100755 index 0000000..b6b3155 --- /dev/null +++ b/boot/app/styles.css @@ -0,0 +1,64 @@ +body { + margin: 0 auto; + line-height: 1.7em; + font-family:Open Sans; +} + +h1, h2, h3, h4 { + font-weight:300; + color: #888; +} + +.pure-button-success, +.pure-button-error, +.pure-button-warning, +.pure-button-secondary { + color: white; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); +} + +.pure-button-success { + background: rgb(28, 184, 65); /* this is a green */ +} + +.pure-button-error { + background: rgb(202, 60, 60); /* this is a maroon */ +} + +.pure-button-warning { + background: rgb(223, 117, 20); /* this is an orange */ +} + +.pure-button-secondary { + background: rgb(66, 184, 221); /* this is a light blue */ +} + + +#menu { + margin-left: -300px; + width: 300px; + position: fixed; + top: 0; + left: 300px; + bottom: 0; + z-index: 1000; + padding:20px; +} + +#main { + margin-left:80px; +} + +.centered{ + width:300px; + height:200px; + position:absolute; + left:50%; + top:50%; + margin:-100px 0 0 -150px; +} + +.notice { + background-color: #61B842; + color: white; +}
\ No newline at end of file diff --git a/boot/boot.py b/boot/boot.py new file mode 100755 index 0000000..658748a --- /dev/null +++ b/boot/boot.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python + +import os, json +import urllib2 +import subprocess +import yaml +from wifi import * + +import vocabcompiler + +def say(phrase, OPTIONS = " -vdefault+m3 -p 40 -s 160 --stdout > say.wav"): + + os.system("espeak " + json.dumps(phrase) + OPTIONS) + os.system("aplay -D hw:1,0 say.wav") + + + +# check if there is network connection +def configure(): + try: + + urllib2.urlopen("http://www.google.com").getcode() + + print "CONNECTED TO INTERNET" + print "COMPILING DICTIONARY" + vocabcompiler.compile() + + print "STARTING CLIENT PROGRAM" + + try: + os.system("/home/pi/jasper/client/start.sh &") + except: + os.system("/home/pi/jasper/backup/start.sh &") + finally: + return + + except: + + networks = yaml.safe_load(open("networks.yml", "r")) + + wifi = Wifi() + + for network in networks: + wifi.set_default_wifi(network['SSID'], network['KEY']) + say("Attempting to connect to network " + network['SSID']) + + try: + + urllib2.urlopen("http://www.google.com").getcode() + + print "CONNECTED TO INTERNET" + print "COMPILING DICTIONARY" + vocabcompiler.compile() + + print "STARTING CLIENT PROGRAM" + + try: + os.system("/home/pi/jasper/client/start.sh &") + except: + os.system("/home/pi/jasper/backup/start.sh &") + finally: + return + + except: + pass + + print "NOT CONNECTED TO INTERNET. RUNNING AD HOC NETWORK." + + wifi.setup_adhoc() + + os.system("sudo app/app.sh &") + say("Hello.... I could not connect to a wifi network... Please log in with your computer to help me") + + original = open("networks.yml",'r').readlines() + while True: + list = open("networks.yml",'r').readlines() + if list != original: + break + + say("Thank you for adding a wifi network. Just give me a few minutes to restart.") + os.system("sudo shutdown -r now") + +if __name__ == "__main__": + print "==========STARTING JASPER CLIENT==========" + print "==========================================" + print "COPYRIGHT 2013 SHUBHRO SAHA, CHARLIE MARSH" + print "==========================================" + say("Hello.... I am Jasper... Please wait one moment.") + configure() diff --git a/boot/boot.sh b/boot/boot.sh new file mode 100755 index 0000000..5ea1b3d --- /dev/null +++ b/boot/boot.sh @@ -0,0 +1,6 @@ +cd /home/pi/jasper/boot/ +LD_LIBRARY_PATH="/usr/local/lib" +export LD_LIBRARY_PATH +PATH=$PATH:/usr/local/lib/ +export PATH +python boot.py &
\ No newline at end of file diff --git a/boot/broadcast.txt b/boot/broadcast.txt new file mode 100755 index 0000000..36942c4 --- /dev/null +++ b/boot/broadcast.txt @@ -0,0 +1,11 @@ +auto lo +iface lo inet loopback +iface eth0 inet dhcp + +auto wlan0 +iface wlan0 inet static + address 192.168.1.1 + netmask 255.255.255.0 + wireless-channel 1 + wireless-essid Jasper + wireless-mode ad-hoc diff --git a/boot/connect.txt b/boot/connect.txt new file mode 100644 index 0000000..b30d831 --- /dev/null +++ b/boot/connect.txt @@ -0,0 +1,10 @@ +auto lo + +iface lo inet loopback +iface eth0 inet dhcp + +allow-hotplug wlan0 +auto wlan0 +iface wlan0 inet dhcp + wpa-ssid "{{ SSID }}" + wpa-psk "{{ KEY }}"
\ No newline at end of file diff --git a/boot/listwifi.py b/boot/listwifi.py new file mode 100755 index 0000000..5ee14de --- /dev/null +++ b/boot/listwifi.py @@ -0,0 +1,18 @@ +import os +import subprocess + +subprocess.call("iwlist wlan0 scan > temp.txt", shell = True) +output = open("temp.txt") + +lines = output.readlines() + +for index, line in enumerate(lines): + + if "Address" in line: + + address = line[29:-1] + name = lines[index + 1].split("\"")[1] + + print "%s is %s" % (address, name) + +os.system("rm temp.txt") diff --git a/boot/net.sh b/boot/net.sh new file mode 100644 index 0000000..a7bee21 --- /dev/null +++ b/boot/net.sh @@ -0,0 +1,17 @@ +sudo sysctl net.ipv4.ip_forward=1 + +sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 1.2.3.4:80 +sudo iptables -t nat -A POSTROUTING -j MASQUERADE +sudo /etc/init.d/networking restart + +#sudo iptables -A POSTROUTING -t nat -o wlan0 -j MASQUERADE + +#sudo iptables -t mangle -N internet + +#sudo iptables -t mangle -A PREROUTING -i wlan0 -p tcp -m tcp --dport 80 -j internet + +#sudo iptables -t mangle -A internet -j MARK --set-mark 99 + +#sudo iptables -t nat -A PREROUTING -i wlan0 -p tcp -m mark --mark 99 -m tcp --dport 80 -j DNAT --to-destination 192.168.3.1 + +#sudo /etc/init.d/networking restart diff --git a/boot/networks.yml b/boot/networks.yml new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/boot/networks.yml @@ -0,0 +1 @@ +[]
\ No newline at end of file diff --git a/boot/say.wav b/boot/say.wav Binary files differnew file mode 100644 index 0000000..d27c7dc --- /dev/null +++ b/boot/say.wav diff --git a/boot/vocabcompiler.py b/boot/vocabcompiler.py new file mode 100644 index 0000000..d5455d3 --- /dev/null +++ b/boot/vocabcompiler.py @@ -0,0 +1,52 @@ +""" + This iterates over all the WORDS variables in the modules and creates a dictionary that the client program will use +""" + +import os +import sys +import pkgutil + +lib_path = os.path.abspath('../client') +sys.path.append(lib_path) +import modules +import g2p + + +def compile(): + """ + Gets the words and creates the dictionary + """ + + m = dir(modules) + + words = [] + for module_name in m: + try: + eval("words.extend(modules.%s.WORDS)" % module_name) + except: + pass # module probably doesn't have the property + + words = list(set(words)) + + # for spotify module + words.extend(["MUSIC","SPOTIFY"]) + + # create the dictionary + pronounced = g2p.translateWords(words) + zipped = zip(words, pronounced) + lines = ["%s %s" % (x, y) for x, y in zipped] + + with open("../client/dictionary.dic", "w") as f: + f.write("\n".join(lines) + "\n") + + # create the language model + with open("../client/sentences.txt", "w") as f: + f.write("\n".join(words) + "\n") + f.write("<s> \n </s> \n") + f.close() + + # make language model + os.system( + "text2idngram -vocab ../client/sentences.txt < ../client/sentences.txt -idngram temp.idngram") + os.system( + "idngram2lm -idngram temp.idngram -vocab ../client/sentences.txt -arpa ../client/languagemodel.lm") diff --git a/boot/wifi.py b/boot/wifi.py new file mode 100755 index 0000000..7e2fa43 --- /dev/null +++ b/boot/wifi.py @@ -0,0 +1,60 @@ +import yaml +import os, subprocess + +class Wifi: + + access_points = [] + + def __init__(self): + + subprocess.call("iwlist wlan0 scan > temp.txt", shell = True) + output = open("temp.txt") + lines = output.readlines() + + for index, line in enumerate(lines): + + if "Address" in line: + + address = line[29:-1] + name = lines[index + 1].split("\"")[1] + self.access_points.append(name) + + self.access_points = list(set(self.access_points)) + + os.system("rm temp.txt") + + def add_wifi(self, SSID, KEY=""): + networks = yaml.safe_load(open("networks.yml", "r")) + + # add new network to front of list + network = {"SSID": SSID, "KEY": KEY} + networks.insert(0, network) + + with open('networks.yml', 'w') as outputFile: + output = yaml.dump(networks) + outputFile.write(output) + + def set_default_wifi(self, SSID, KEY=""): + + text = open("connect.txt", "r").read() + text = text.replace("{{ SSID }}", SSID) + text = text.replace("{{ KEY }}", KEY) + + outputFile = open("/etc/network/interfaces", "w") + outputFile.write(text) + outputFile.flush() + outputFile.close() + + subprocess.call(["sudo", "/etc/init.d/networking", "restart"]) + + def setup_adhoc(self): + + text = open("broadcast.txt", "r").read() + outputFile = open("/etc/network/interfaces","w") + outputFile.write(text) + outputFile.flush() + outputFile.close() + + subprocess.call(["sudo", "/etc/init.d/networking", "restart"]) + subprocess.call(['sudo', '/usr/sbin/dhcpd', '-q', '-cf', '/etc/dhcp/dhcpd.conf', '-pf', '/var/run/dhcpd.pid']) + subprocess.call(["sudo", "/etc/init.d/networking", "restart"])
\ No newline at end of file |
