Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 79 additions & 0 deletions db.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
from sqlalchemy import create_engine
from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey
from sqlalchemy.orm import mapper
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Wlans(Base):
__tablename__ = 'wlanstb'
id = Column(Integer, primary_key=True)
name = Column(String)
wlan = Column(String(30), nullable=False, unique=True)
ssid = Column(String)
password = Column(String)

def __init__(self, name, wlan, ssid, password):
self.name = name
self.wlan = wlan
self.ssid = ssid
self.password = password
def __repr__(self):
return "%s,%s,%s,%s" % (self.name, self.wlan, self.ssid, self.password)
#def showall(self):
#for instance in session.query(self).order_by(self.id):
#print(instance)

engine = create_engine('sqlite:///wlans.db', echo=True)
Session = sessionmaker(bind=engine)
Base.metadata.create_all(engine)

def add_wlan(name, wlan, ssid, password):
session = Session()
try:
new_wlan=Wlans(name,wlan,ssid,password)
session.add(new_wlan)
session.commit()
session.flush()
except:
print("Oops! That was no valid wlan. Try again...")
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тут, по-хорошему, можно поймать исключение, связанное с дубликатом уникального поля и делать update.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Интересный стиль. Вместо того что использовать if будем провоцировать ошибки)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


def update_wlan(name,wlan,ssid,password):
session = Session()
session.query(Wlans).filter(Wlans.wlan == wlan).update({Wlans.name: name, Wlans.ssid: ssid, Wlans.password: password})
session.commit()
session.flush()

def check_wlan(name,wlan,ssid,password):
session = Session()
new_wlan=Wlans(name,wlan,ssid,password)
if len(new_wlan.wlan)>=8 and session.query(Wlans.wlan).filter(Wlans.wlan == new_wlan.wlan).all():
session.flush()
update_wlan(name,wlan,ssid,password)
elif len(new_wlan.wlan)>=8:
session.flush()
add_wlan(name, wlan, ssid, password)

def del_wlan(name):
session = Session()
session.query(Wlans).filter(Wlans.name == name).delete()
session.commit()
session.flush()


'''
add_wlan("1","2","3","4")
session = Session()
print session.query(Wlans).all()
if len("12345678") >= 8 and session.query(Wlans.wlan).filter(Wlans.wlan == "2").all():
print True
else:
print False
session.flush()
'''

#check_wlan("4","2","3","5")
#print session.query(Wlans).filter(Wlans.wlan == "2").update({Wlans.name: "hui"}, synchronize_session=False)
#del_wlan("Solo-1")
#print session.query(Wlans).all()
31 changes: 22 additions & 9 deletions resources.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
from flask_restful import Resource, Api, reqparse
from platform import machine, processor, system
from netifaces import interfaces
from os import system as system_call
from netifaces import interfaces
from platform import machine, system
import json
import psutil
import time
import db
from db import *
import wifi
from docker import from_env
from flask_restful import Resource, Api, reqparse
from application import app
import psutil, time, json, wifi

API_PREFIX = '/api/v1'

Expand Down Expand Up @@ -39,10 +44,11 @@ def post(self):
)

if 'wlan' in params:
with open('/etc/dronelinks.csv', 'a') as links:
links.write('{0},{1},{2},{3}\n'.format(params['name'],params['wlan'],params['ssid'],params['password']))
wifi.spawn(params['name'],params['wlan'],params['ssid'],params['password'])
check_wlan(params['name'],params['wlan'],params['ssid'],params['password'])
#with open('/etc/dronelinks.csv', 'a') as links:
#links.write('{0},{1},{2},{3}\n'.format(params['name'],params['wlan'],params['ssid'],params['password']))

wifi.spawn(params['name'],params['wlan'],params['ssid'],params['password'])
return {'containers': {
container.name: {
'status': container.status,
Expand All @@ -63,18 +69,22 @@ def get(self, name):
}}}

def delete(self, name):
print(del_wlan(name))
try:
c = from_env().containers.get(name)
c.remove(force=True)

if name+'-net' in from_env().networks.list():
n = from_env().networks.get(name+'-net')
n.remove()

system_call("reboot")

except:
return {'success': False}

return {'success': True}



def post(self, name):
args = self.parser.parse_args()
c = from_env().containers.get(name)
Expand All @@ -101,6 +111,9 @@ def get(self):
'mem': psutil.virtual_memory().percent
}}}




api = Api(app)
api.add_resource(Containers, API_PREFIX+'/containers')
api.add_resource(Container, API_PREFIX+'/containers/<name>')
Expand Down
2 changes: 2 additions & 0 deletions webui.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/bin/sh
cd /home/pi/drone-employee-connect && . venv/bin/activate && PORT=80 python serve.py
16 changes: 11 additions & 5 deletions wifi.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
#!/usr/bin/env python
from os import system as system_call
from docker import from_env
from db import *

def spawn(name, wlan, ssid, password):
if password == '':
password = '12345678'
c = from_env().containers.get(name)
iwcall ='PHY="phy"`iw dev {0} info | grep wi | grep -Eo ".{{1}}$"`; iw phy $PHY set netns {1}'.format(wlan, c.attrs['State']['Pid'])
wpacall = 'sh -c "wpa_passphrase {0} {1} > /tmp/wpa.conf"'.format(ssid, password)
Expand All @@ -15,10 +18,13 @@ def spawn(name, wlan, ssid, password):
import time
time.sleep(30)
if __name__ == '__main__':
links = [x[:-1].split(',') for x in open('/etc/dronelinks.csv', 'r')]

for name, wlan, ssid, password in links:
#links = [x[:-1].split(',') for x in open('/etc/dronelinks.csv', 'r')]
#for name, wlan, ssid, password in links:
session = Session()
for instance in session.query(Wlans):
try:
spawn(name, wlan, ssid, password)
print(instance)
spawn(instance.name, instance.wlan, instance.ssid, instance.password)
except:
print('broken ' + name)
print('broken ' + instance.name)
session.flush()
Binary file added wlans.db
Binary file not shown.