trying out stuff

This commit is contained in:
j3d1 2016-02-23 20:51:11 +01:00
parent 507cfe2140
commit e494a7db91
6 changed files with 87 additions and 76 deletions

View file

@ -44,10 +44,10 @@ bool Filter::pass(const Packet p) const {
bool Filter::operator<(const Filter f) const { bool Filter::operator<(const Filter f) const {
if (this->oc != f.oc) if (this->oc != f.oc)
return this->oc < f.oc; return this->oc > f.oc;
if (this->switchMac != f.switchMac) if (this->switchMac != f.switchMac)
return this->switchMac < f.switchMac; return this->switchMac > f.switchMac;
if (this->tokenId < f.tokenId) if (this->tokenId != f.tokenId)
return this->tokenId < f.tokenId; return this->tokenId > f.tokenId;
return false; return false;
} }

View file

@ -31,50 +31,47 @@ int Program::run(vector<string> arg) {
std::map<std::string, std::string> ll; std::map<std::string, std::string> ll;
std::cmatch sm; std::cmatch sm;
std::string cmd = arg[optind++]; std::string cmd = arg[optind++];
io_service->reset();
sock->clear();
switch (caseArg(cmd.c_str())) { switch (caseArg(cmd.c_str())) {
case caseArg("reboot"): case caseArg("reboot"):
if (!reboot()) if (reboot())
return 0; return 1;
break; break;
case caseArg("reset"): case caseArg("reset"):
if (!reset()) if (!reset())
return 0; return 0;
break; break;
case caseArg("save"): case caseArg("save"):
if (!save()) if (save())
return 0; return 1;
fprintf(stderr, "Not yet implemented.\n");
return 1;
break; break;
case caseArg("restore"): case caseArg("restore"):
if (!restore()) if (restore())
return 0; return 1;
fprintf(stderr, "Not yet implemented.\n");
return 1;
break; break;
case caseArg("flash"): case caseArg("flash"):
if (!flash()) if (flash())
return 0; return 1;
fprintf(stderr, "Not yet implemented.\n");
return 1;
break; break;
case caseArg("list"): case caseArg("list"):
if (!list()) if (list())
return 0; return 1;
break; break;
case caseArg("sniff"): case caseArg("sniff"):
if (!sniff()) if (sniff())
return 0; return 1;
break; break;
case caseArg("encode"): case caseArg("encode"):
if (optind < arg.size()) { if (optind < arg.size()) {
std::string s(arg[optind]); std::string s(arg[optind]);
optind++; optind++;
if (encode(s)) if (!encode(s))
return 0; return 1;
} else { } else {
fprintf(stderr, "Argument expected after encode\n"); fprintf(stderr, "Argument expected after encode\n");
return 1; return 1;
@ -95,10 +92,8 @@ int Program::run(vector<string> arg) {
} }
optind++; optind++;
} }
if (!setProperty(ll)) if (setProperty(ll))
return 0; return 1;
fprintf(stderr, "Not yet implemented.\n");
return 1;
break; break;
case caseArg("get"): case caseArg("get"):
while (optind < arg.size()) { while (optind < arg.size()) {
@ -115,14 +110,15 @@ int Program::run(vector<string> arg) {
} }
optind++; optind++;
} }
if (!getProperty(vect)) if (getProperty(vect))
return 0; return 1;
break; break;
default: default:
printf("Unknown command: %s\n", cmd.c_str()); printf("Unknown command: %s\n", cmd.c_str());
return 1; return 1;
} }
io_service->run();
return 0;
} }
int printHeader(Packet p) { int printHeader(Packet p) {
@ -199,15 +195,18 @@ int Program::list() {
cout <<"Received Payload:\n"<<a.getBody()<<"\n"; cout <<"Received Payload:\n"<<a.getBody()<<"\n";
} else { } else {
datasets d =a.getPayload(); datasets d =a.getPayload();
Switch sw = Switch();
sw.parse(d); int b = a.getSwitchMac().hash();
if (devices.empty()||devices.find(b) == devices.end())
devices.insert(pair<int,Switch>(b,Switch()));
devices[a.getSwitchMac().hash()].parse(d);
devices[a.getSwitchMac().hash()].print();
File f; File f;
f.write(sw.toString()); f.write(devices[a.getSwitchMac().hash()].toString());
sw.print();
} }
return 0; return 0;
}); });
io_service->run();
} catch (exception& e) { } catch (exception& e) {
cerr << "Exception: " << e.what() << "\n"; cerr << "Exception: " << e.what() << "\n";
} }
@ -217,17 +216,12 @@ int Program::list() {
int Program::sniff() { int Program::sniff() {
printf("Listening:\n"); printf("Listening:\n");
try { try {
boost::asio::io_service io_service; sock->listen([](Packet p) {
Socket s(io_service);
s.setHostIp(host.getIp());
s.init(DST_PORT, SRC_PORT);
s.listen([](Packet p) {
cout << p.opCodeToString() << "\n"; cout << p.opCodeToString() << "\n";
printHeader(p); printHeader(p);
printPacket(p); printPacket(p);
return 0; return 0;
}); });
io_service.run();
} catch (exception& e) { } catch (exception& e) {
cerr << "Exception: " << e.what() << "\n"; cerr << "Exception: " << e.what() << "\n";
} }
@ -284,7 +278,6 @@ int Program::setProperty(map<string, string> prop) {
return 0; return 0;
}); });
io_service->run();
} catch (exception& e) { } catch (exception& e) {
cerr << "Exception: " << e.what() << "\n"; cerr << "Exception: " << e.what() << "\n";
} }
@ -314,7 +307,6 @@ int Program::getProperty(vector<string> prop) {
return 0; return 0;
}); });
io_service->run();
} catch (exception& e) { } catch (exception& e) {
cerr << "Exception: " << e.what() << "\n"; cerr << "Exception: " << e.what() << "\n";
} }
@ -347,17 +339,17 @@ int Program::reboot() {
discover( discover(
[this](Packet a) { [this](Packet a) {
datasets d =a.getPayload(); datasets d =a.getPayload();
Switch sw = Switch(); int b = a.getSwitchMac().hash();
sw.parse(d); if (devices.empty()||devices.find(b) == devices.end())
cout <<sw.settings.hostname<<"\t"; devices.insert(pair<int,Switch>(b,Switch()));
devices[a.getSwitchMac().hash()].parse(d);
datasets t = { {SND_PING, 0, {}}}; datasets t = { {SND_PING, 0, {}}};
get(a, t, [this](Packet a) { get(a, t, [this](Packet a) {
datasets d =a.getPayload(); datasets d =a.getPayload();
Switch sw = Switch(); cout <<devices[a.getSwitchMac().hash()].settings.hostname<<"\t";
sw.parse(d); devices[a.getSwitchMac().hash()].parse(d);
datasets t = { {REBOOT, 1, {options.flags.PERMANENT?(byte)1:(byte)0}}}; datasets t = { {REBOOT, 1, {options.flags.PERMANENT?(byte)1:(byte)0}}};
set(a,t,[this](Packet a) { set(a,t,[this](Packet a) {
if( a.getOpCode()==Packet::CONFIRM)
cout<< "rebooting now.\n"; cout<< "rebooting now.\n";
return 0; return 0;
}); });
@ -365,7 +357,6 @@ int Program::reboot() {
}); });
return 0; return 0;
}); });
io_service->run();
} catch (exception& e) { } catch (exception& e) {
cerr << "Exception: " << e.what() << "\n"; cerr << "Exception: " << e.what() << "\n";
} }
@ -394,33 +385,33 @@ int Program::reset() {
}); });
return 0; return 0;
}); });
io_service->run();
} catch (exception& e) { } catch (exception& e) {
cerr << "Exception: " << e.what() << "\n"; cerr << "Exception: " << e.what() << "\n";
} }
return 0; return 0;
} }
int Program::discover(function<int(Packet)> c) { int Program::discover(Listener c) {
Packet p = Packet(Packet::DISCOVERY); Packet p = Packet(Packet::DISCOVERY);
p.setHostMac(host.getMac()); p.setHostMac(host.getMac());
p.setPayload( { }); p.setPayload( { });
sock->listen(c,Filter(Packet::REPLY)); sock->listen(c, Filter(Packet::REPLY));
sock->send(p); sock->send(p);
return 0; return 0;
} }
int Program::get(Packet l, datasets t, function<int(Packet)> c) { int Program::get(Packet l, datasets t, Listener c) {
Packet p = Packet(Packet::GET); Packet p = Packet(Packet::GET);
p.setSwitchMac(l.getSwitchMac()); p.setSwitchMac(l.getSwitchMac());
p.setHostMac(host.getMac()); p.setHostMac(host.getMac());
p.setPayload(t); p.setPayload(t);
sock->listen(c,Filter(Packet::REPLY)); //cout << "listen REPLY from "<<l.getSwitchMac()<<endl;
sock->listen(c, Filter(Packet::REPLY).mac(l.getSwitchMac()));
sock->send(p); sock->send(p);
return 0; return 0;
} }
int Program::set(Packet l, datasets t, function<int(Packet)> c) { int Program::set(Packet l, datasets t, Listener c) {
Packet p = Packet(Packet::SET); Packet p = Packet(Packet::SET);
p.setSwitchMac(l.getSwitchMac()); p.setSwitchMac(l.getSwitchMac());
p.setTokenId(l.getTokenId()); p.setTokenId(l.getTokenId());
@ -430,7 +421,8 @@ int Program::set(Packet l, datasets t, function<int(Packet)> c) {
datasets ld = { { LOGIN_USER, (short) (n.size()), n }, { LOGIN_PASSWORD, datasets ld = { { LOGIN_USER, (short) (n.size()), n }, { LOGIN_PASSWORD,
(short) (w.size()), w } }; (short) (w.size()), w } };
p.setPayload(ld + t); p.setPayload(ld + t);
sock->listen(c,Filter(Packet::CONFIRM)); //cout << "listen CONFIRM from "<<l.getSwitchMac()<<endl;
sock->listen(c, Filter(Packet::CONFIRM).mac(l.getSwitchMac()));
sock->send(p); sock->send(p);
return 0; return 0;
} }

View file

@ -9,38 +9,42 @@
#define PROGRAM_H_ #define PROGRAM_H_
#include <memory> #include <memory>
#include <vector>
#include "Types.h" #include "Types.h"
#include "Host.h" #include "Host.h"
#include "Switch.h"
#include "Socket.h" #include "Socket.h"
class Program { class Program {
private: private:
std::shared_ptr<boost::asio::io_service> io_service; std::shared_ptr<boost::asio::io_service> io_service;
std::shared_ptr<Socket> sock; std::shared_ptr<Socket> sock;
Host host = Host(); Host host = Host();
int get(Packet,datasets,std::function<int(Packet)>); std::map<int, Switch> devices;
int set(Packet,datasets,std::function<int(Packet)>); int get(Packet, datasets, std::function<int(Packet)>);
int set(Packet, datasets, std::function<int(Packet)>);
int discover(std::function<int(Packet)>); int discover(std::function<int(Packet)>);
public: public:
Program() {} Program() {
void init(); }
void init();
int run(std::vector<std::string>); int run(std::vector<std::string>);
std::function<int()> callback = []() { std::function<int()> callback = []() {
return 0; return 0;
}; };
int list(); int list();
int sniff(); int sniff();
int encode(std::string); int encode(std::string);
int getProperty(std::vector<std::string>); int getProperty(std::vector<std::string>);
int setProperty(std::map<std::string,std::string>); int setProperty(std::map<std::string, std::string>);
int save(); int save();
int restore(); int restore();
int flash(); int flash();
int reboot(); int reboot();
int reset(); int reset();
std::string input; std::string input;
}; };
#endif /* PROGRAM_H_ */ #endif /* PROGRAM_H_ */

View file

@ -16,6 +16,8 @@
#include "Host.h" #include "Host.h"
#include "Types.h" #include "Types.h"
using namespace std;
Socket::Socket(boost::asio::io_service& io_service) : Socket::Socket(boost::asio::io_service& io_service) :
send_socket_(io_service), receive_socket_(io_service), timer(io_service) { send_socket_(io_service), receive_socket_(io_service), timer(io_service) {
} }
@ -57,6 +59,10 @@ void Socket::setHostIp(ipAddr ip) {
local_ip = ip; local_ip = ip;
} }
void Socket::clear(){
callback.clear();
}
void Socket::listen(Listener l, Filter f) { void Socket::listen(Listener l, Filter f) {
if (callback.find(f) == callback.end()) { if (callback.find(f) == callback.end()) {
callback.insert(ListenerPair(f, l)); callback.insert(ListenerPair(f, l));

View file

@ -27,6 +27,7 @@ public:
Socket(boost::asio::io_service&); Socket(boost::asio::io_service&);
virtual ~Socket(); virtual ~Socket();
void init(short, short); void init(short, short);
void clear();
void send(Packet); void send(Packet);
void setHostIp(ipAddr); void setHostIp(ipAddr);
void listen(Listener l, Filter f = Filter()); void listen(Listener l, Filter f = Filter());

View file

@ -51,6 +51,14 @@ public:
} }
} }
int hash() {
int ret=0;
for (unsigned i = 0; i < 6; i++) {
ret = (ret*33) ^ (*this)[i];
}
return ret;
}
bool operator==(const macAddr &A) { bool operator==(const macAddr &A) {
for (unsigned i = 0; i < 6; i++) { for (unsigned i = 0; i < 6; i++) {
if(A[i]!=(*this)[i])return false; if(A[i]!=(*this)[i])return false;