interactive shell wip
This commit is contained in:
parent
59796d600b
commit
5b7014737a
13 changed files with 261 additions and 177 deletions
3
Makefile
3
Makefile
|
@ -15,8 +15,7 @@ $(BUILDDIR):
|
||||||
|
|
||||||
|
|
||||||
$(TARGET): $(OBJECTS)
|
$(TARGET): $(OBJECTS)
|
||||||
$(CC) $^ -o $(BUILDDIR)/$@ -lboost_filesystem -lboost_system
|
$(CC) $^ -o $(BUILDDIR)/$@ -lboost_filesystem -lboost_system -lreadline -lboost_program_options
|
||||||
#-lboost_program_options
|
|
||||||
|
|
||||||
$(OBJECTS): $(BUILDDIR)/%.o : $(SOURCEDIR)/%.cpp
|
$(OBJECTS): $(BUILDDIR)/%.o : $(SOURCEDIR)/%.cpp
|
||||||
$(CC) $(CFLAGS) $< -o $@
|
$(CC) $(CFLAGS) $< -o $@
|
||||||
|
|
|
@ -7,7 +7,14 @@
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
#include<boost/program_options/parsers.hpp>
|
||||||
|
#include<readline/readline.h>
|
||||||
|
#include<readline/history.h>
|
||||||
|
|
||||||
|
#include "Program.h"
|
||||||
#include "Interactive.h"
|
#include "Interactive.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
@ -21,12 +28,28 @@ Interactive::~Interactive() {
|
||||||
// TODO Auto-generated destructor stub
|
// TODO Auto-generated destructor stub
|
||||||
}
|
}
|
||||||
|
|
||||||
int Interactive::run() {
|
int Interactive::loop() {
|
||||||
string cmd;
|
string cmd;
|
||||||
while(cmd.compare("quit")){
|
vector<string> v;
|
||||||
cout<< "smrtlink>" << flush;
|
//vector<char const*> vc;
|
||||||
cin >> cmd;
|
//const char** argv;
|
||||||
cout << cmd <<endl;;
|
//int argc;
|
||||||
|
|
||||||
|
Program p = Program();
|
||||||
|
p.init();
|
||||||
|
|
||||||
|
while (cmd.compare("quit")) {
|
||||||
|
cmd = readline("smrtlink> ");
|
||||||
|
add_history(cmd.c_str());
|
||||||
|
v = boost::program_options::split_unix(cmd);
|
||||||
|
|
||||||
|
//vc = vector<char const*>(v.size());
|
||||||
|
//std::transform(begin(v), end(v), begin(vc), [](std::string const &s) { return s.c_str(); });
|
||||||
|
//argv = &vc[0];
|
||||||
|
//argc = v.size();
|
||||||
|
|
||||||
|
p.run(v);
|
||||||
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@ class Interactive {
|
||||||
public:
|
public:
|
||||||
Interactive();
|
Interactive();
|
||||||
virtual ~Interactive();
|
virtual ~Interactive();
|
||||||
int run();
|
int loop();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* INTERACTIVE_H_ */
|
#endif /* INTERACTIVE_H_ */
|
||||||
|
|
|
@ -158,8 +158,8 @@ std::string Packet::opCodeToString() {
|
||||||
return "SET";
|
return "SET";
|
||||||
case CONFIRM:
|
case CONFIRM:
|
||||||
return "CONFIRM";
|
return "CONFIRM";
|
||||||
case RETURN:
|
case REPLY:
|
||||||
return "RETURN";
|
return "REPLY";
|
||||||
default:
|
default:
|
||||||
return "NONE";
|
return "NONE";
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,7 @@ static short sequenceId=0;
|
||||||
class Packet
|
class Packet
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
enum OpCode {DISCOVERY, GET, RETURN, SET, CONFIRM, NONE};
|
enum OpCode {DISCOVERY, GET, REPLY, SET, CONFIRM, NONE};
|
||||||
Packet(OpCode);
|
Packet(OpCode);
|
||||||
static void encode(bytes&);
|
static void encode(bytes&);
|
||||||
bytes getBytes();
|
bytes getBytes();
|
||||||
|
|
150
src/Program.cpp
150
src/Program.cpp
|
@ -6,6 +6,9 @@
|
||||||
*/
|
*/
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <regex>
|
||||||
|
#include <string>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
#include "Constant.h"
|
#include "Constant.h"
|
||||||
#include "Program.h"
|
#include "Program.h"
|
||||||
|
@ -14,11 +17,117 @@
|
||||||
#include "Socket.h"
|
#include "Socket.h"
|
||||||
#include "Switch.h"
|
#include "Switch.h"
|
||||||
#include "Packet.h"
|
#include "Packet.h"
|
||||||
|
#include "Types.h"
|
||||||
#include "lookup.h"
|
#include "lookup.h"
|
||||||
#include "table.h"
|
#include "table.h"
|
||||||
|
|
||||||
|
using namespace smrtlink;
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
int Program::run(vector<string> arg) {
|
||||||
|
int optind = 0;
|
||||||
|
std::vector<std::string> vect;
|
||||||
|
std::map<std::string, std::string> ll;
|
||||||
|
std::cmatch sm;
|
||||||
|
std::string cmd = arg[optind++];
|
||||||
|
switch (caseArg(cmd.c_str())) {
|
||||||
|
case caseArg("reboot"):
|
||||||
|
if (!reboot())
|
||||||
|
return 0;
|
||||||
|
fprintf(stderr, "Not yet implemented.\n");
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
case caseArg("reset"):
|
||||||
|
if (!reset())
|
||||||
|
return 0;
|
||||||
|
fprintf(stderr, "Not yet implemented.\n");
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
case caseArg("save"):
|
||||||
|
if (!save())
|
||||||
|
return 0;
|
||||||
|
fprintf(stderr, "Not yet implemented.\n");
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
case caseArg("restore"):
|
||||||
|
if (!restore())
|
||||||
|
return 0;
|
||||||
|
fprintf(stderr, "Not yet implemented.\n");
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
case caseArg("flash"):
|
||||||
|
if (!flash())
|
||||||
|
return 0;
|
||||||
|
fprintf(stderr, "Not yet implemented.\n");
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case caseArg("list"):
|
||||||
|
if (!list())
|
||||||
|
return 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case caseArg("sniff"):
|
||||||
|
if (!sniff())
|
||||||
|
return 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case caseArg("encode"):
|
||||||
|
if (optind < arg.size()) {
|
||||||
|
std::string s(arg[optind]);
|
||||||
|
optind++;
|
||||||
|
if (encode(s))
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "Argument expected after encode\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case caseArg("set"):
|
||||||
|
while (optind < arg.size()) {
|
||||||
|
if (regex_match(arg[optind].c_str(), sm,
|
||||||
|
std::regex("^([a-z]+)=(.*)$"))) {
|
||||||
|
if (!snd_lookup.exists(sm[1]) && !rcv_lookup.exists(sm[1])) {
|
||||||
|
cerr << "Unknown argument " << arg[optind] << endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
ll.insert(std::pair<std::string, std::string>(sm[1], sm[2]));
|
||||||
|
} else {
|
||||||
|
cerr << "Invalid Syntax " << arg[optind] << endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
optind++;
|
||||||
|
}
|
||||||
|
if (!setProperty(ll))
|
||||||
|
return 0;
|
||||||
|
fprintf(stderr, "Not yet implemented.\n");
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
case caseArg("get"):
|
||||||
|
while (optind < arg.size()) {
|
||||||
|
if (regex_match(arg[optind].c_str(), sm,
|
||||||
|
std::regex("^([a-z]+)$"))) {
|
||||||
|
if (!snd_lookup.exists(sm[1]) && !rcv_lookup.exists(sm[1])) {
|
||||||
|
cerr << "Unknown argument " << arg[optind] << endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
vect.push_back(sm[1]);
|
||||||
|
} else {
|
||||||
|
cerr << "Invalid argument " << arg[optind] << endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
optind++;
|
||||||
|
}
|
||||||
|
if (!getProperty(vect))
|
||||||
|
return 0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printf("Unknown command: %s\n", cmd.c_str());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
int printHeader(Packet p) {
|
int printHeader(Packet p) {
|
||||||
if (options.flags.HEADER) {
|
if (options.flags.HEADER) {
|
||||||
if (options.flags.HEX) {
|
if (options.flags.HEX) {
|
||||||
|
@ -240,26 +349,27 @@ int Program::flash() {
|
||||||
|
|
||||||
int Program::reboot() {
|
int Program::reboot() {
|
||||||
try {
|
try {
|
||||||
discover([this](Packet a) {
|
discover(
|
||||||
datasets d =a.getPayload();
|
[this](Packet a) {
|
||||||
Switch sw = Switch();
|
datasets d =a.getPayload();
|
||||||
sw.parse(d);
|
Switch sw = Switch();
|
||||||
cout <<sw.settings.hostname<<"\t";
|
sw.parse(d);
|
||||||
datasets t = { {SND_PING, 0, {}}};
|
cout <<sw.settings.hostname<<"\t";
|
||||||
get(a, t, [this](Packet a) {
|
datasets t = { {SND_PING, 0, {}}};
|
||||||
datasets d =a.getPayload();
|
get(a, t, [this](Packet a) {
|
||||||
Switch sw = Switch();
|
datasets d =a.getPayload();
|
||||||
sw.parse(d);
|
Switch sw = Switch();
|
||||||
datasets t = { {REBOOT, 1, {options.flags.PERMANENT?(byte)1:(byte)0}}};
|
sw.parse(d);
|
||||||
set(a,t,[this](Packet a) {
|
datasets t = { {REBOOT, 1, {options.flags.PERMANENT?(byte)1:(byte)0}}};
|
||||||
if( a.getOpCode()==Packet::CONFIRM)
|
set(a,t,[this](Packet a) {
|
||||||
cout<< "rebooting now.\n";
|
if( a.getOpCode()==Packet::CONFIRM)
|
||||||
return 0;
|
cout<< "rebooting now.\n";
|
||||||
});
|
return 0;
|
||||||
return 0;
|
});
|
||||||
});
|
return 0;
|
||||||
return 0;
|
});
|
||||||
});
|
return 0;
|
||||||
|
});
|
||||||
io_service->run();
|
io_service->run();
|
||||||
} catch (exception& e) {
|
} catch (exception& e) {
|
||||||
cerr << "Exception: " << e.what() << "\n";
|
cerr << "Exception: " << e.what() << "\n";
|
||||||
|
|
|
@ -28,6 +28,8 @@ public:
|
||||||
sock = std::make_shared<Socket>(*io_service);
|
sock = std::make_shared<Socket>(*io_service);
|
||||||
}
|
}
|
||||||
void init();
|
void init();
|
||||||
|
int run(std::vector<std::string>);
|
||||||
|
|
||||||
int list();
|
int list();
|
||||||
int sniff();
|
int sniff();
|
||||||
int encode(std::string);
|
int encode(std::string);
|
||||||
|
|
|
@ -13,12 +13,15 @@
|
||||||
#include "Host.h"
|
#include "Host.h"
|
||||||
#include "Types.h"
|
#include "Types.h"
|
||||||
|
|
||||||
|
#define SEND_F 1
|
||||||
|
#define RECEIVE_F 2
|
||||||
|
|
||||||
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) {
|
||||||
}
|
}
|
||||||
//, resolver( io_service)
|
//, resolver( io_service)
|
||||||
void Socket::init(short dst_port, short src_port) {
|
void Socket::init(short dst_port, short src_port) {
|
||||||
if (initialized)
|
if (initialized == 3)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (options.flags.REVERSE) {
|
if (options.flags.REVERSE) {
|
||||||
|
@ -27,7 +30,7 @@ void Socket::init(short dst_port, short src_port) {
|
||||||
src_port = p;
|
src_port = p;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options.debug_level>=1)
|
if (options.debug_level >= 1)
|
||||||
std::cout << "Local IP:\t" << local_ip << "\n";
|
std::cout << "Local IP:\t" << local_ip << "\n";
|
||||||
|
|
||||||
wildcard_endpoint_ = boost::asio::ip::udp::endpoint(
|
wildcard_endpoint_ = boost::asio::ip::udp::endpoint(
|
||||||
|
@ -38,29 +41,7 @@ void Socket::init(short dst_port, short src_port) {
|
||||||
boost::asio::ip::address_v4::from_string("255.255.255.255"),
|
boost::asio::ip::address_v4::from_string("255.255.255.255"),
|
||||||
dst_port);
|
dst_port);
|
||||||
|
|
||||||
send_socket_.open(boost::asio::ip::udp::v4());
|
initialized = 3;
|
||||||
send_socket_.set_option(boost::asio::socket_base::broadcast(true));
|
|
||||||
send_socket_.set_option(boost::asio::socket_base::reuse_address(true));
|
|
||||||
send_socket_.bind(local_endpoint_);
|
|
||||||
|
|
||||||
receive_socket_.open(boost::asio::ip::udp::v4());
|
|
||||||
receive_socket_.set_option(boost::asio::socket_base::broadcast(true));
|
|
||||||
receive_socket_.set_option(boost::asio::socket_base::reuse_address(true));
|
|
||||||
receive_socket_.bind(wildcard_endpoint_);
|
|
||||||
|
|
||||||
if (options.timeout != 0) {
|
|
||||||
timer.expires_from_now(
|
|
||||||
boost::posix_time::milliseconds(options.timeout));
|
|
||||||
timer.async_wait([this](const boost::system::error_code& error)
|
|
||||||
{
|
|
||||||
if (!error)
|
|
||||||
{
|
|
||||||
receive_socket_.close();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
initialized = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Socket::setHostIp(ipAddr ip) {
|
void Socket::setHostIp(ipAddr ip) {
|
||||||
|
@ -68,6 +49,12 @@ void Socket::setHostIp(ipAddr ip) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Socket::send(Packet p) {
|
void Socket::send(Packet p) {
|
||||||
|
if (!send_socket_.is_open() || !(initialized&SEND_F)) {
|
||||||
|
send_socket_.open(boost::asio::ip::udp::v4());
|
||||||
|
send_socket_.set_option(boost::asio::socket_base::broadcast(true));
|
||||||
|
send_socket_.set_option(boost::asio::socket_base::reuse_address(true));
|
||||||
|
send_socket_.bind(local_endpoint_);
|
||||||
|
}
|
||||||
bytes data = p.getBytes();
|
bytes data = p.getBytes();
|
||||||
p.encode(data);
|
p.encode(data);
|
||||||
unsigned char * a = &data[0];
|
unsigned char * a = &data[0];
|
||||||
|
@ -80,6 +67,25 @@ void Socket::send(Packet p) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Socket::listen() {
|
void Socket::listen() {
|
||||||
|
if (!receive_socket_.is_open() || !(initialized & RECEIVE_F)) {
|
||||||
|
receive_socket_.open(boost::asio::ip::udp::v4());
|
||||||
|
receive_socket_.set_option(boost::asio::socket_base::broadcast(true));
|
||||||
|
receive_socket_.set_option(
|
||||||
|
boost::asio::socket_base::reuse_address(true));
|
||||||
|
receive_socket_.bind(wildcard_endpoint_);
|
||||||
|
}
|
||||||
|
if (options.timeout != 0) {
|
||||||
|
timer.expires_from_now(
|
||||||
|
boost::posix_time::milliseconds(options.timeout));
|
||||||
|
timer.async_wait([this](const boost::system::error_code& error)
|
||||||
|
{
|
||||||
|
if (!error)
|
||||||
|
{
|
||||||
|
receive_socket_.close();
|
||||||
|
initialized&=~RECEIVE_F;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
data.resize(MAX_LENGTH);
|
data.resize(MAX_LENGTH);
|
||||||
receive_socket_.async_receive_from(boost::asio::buffer(data, MAX_LENGTH),
|
receive_socket_.async_receive_from(boost::asio::buffer(data, MAX_LENGTH),
|
||||||
remote_endpoint_,
|
remote_endpoint_,
|
||||||
|
@ -92,7 +98,7 @@ void Socket::listen() {
|
||||||
data.resize(bytes_recvd);
|
data.resize(bytes_recvd);
|
||||||
Packet p = Packet(Packet::NONE);
|
Packet p = Packet(Packet::NONE);
|
||||||
p.encode(data);
|
p.encode(data);
|
||||||
// std::cout << "err" << p.getErrorCode() <<std::endl;
|
// std::cout << "err" << p.getErrorCode() <<std::endl;
|
||||||
p.parse(data);
|
p.parse(data);
|
||||||
//std::cout << "err" << p.getErrorCode() <<std::endl;
|
//std::cout << "err" << p.getErrorCode() <<std::endl;
|
||||||
if(!callback(p)) {
|
if(!callback(p)) {
|
||||||
|
|
31
src/Switch-Cmd.cpp
Normal file
31
src/Switch-Cmd.cpp
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
/*
|
||||||
|
* Switch.cpp
|
||||||
|
*
|
||||||
|
* Created on: 29.09.2015
|
||||||
|
* Author: jdi
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include "Types.h"
|
||||||
|
#include "Switch.h"
|
||||||
|
#include "Constant.h"
|
||||||
|
#include "table.h"
|
||||||
|
|
||||||
|
using namespace smrtlink;
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
int Switch::set(pair<string, string> str) {
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string Switch::get(std::string str) {
|
||||||
|
std::string ret;
|
||||||
|
switch (caseArg(str.c_str())) {
|
||||||
|
case caseArg("ip"):
|
||||||
|
ret = "0.0.0.0";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
|
@ -65,9 +65,13 @@ public:
|
||||||
int parse(datasets);
|
int parse(datasets);
|
||||||
int parse(dataset);
|
int parse(dataset);
|
||||||
int parse(std::string);
|
int parse(std::string);
|
||||||
int print();
|
int set(std::pair<std::string,std::string>);
|
||||||
|
|
||||||
|
std::string get(std::string);
|
||||||
std::string toString();
|
std::string toString();
|
||||||
|
|
||||||
|
int print();
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
std::string type;
|
std::string type;
|
||||||
std::string hardware_version;
|
std::string hardware_version;
|
||||||
|
|
11
src/Types.h
11
src/Types.h
|
@ -95,6 +95,14 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
namespace smrtlink {
|
||||||
|
|
||||||
|
constexpr unsigned int caseArg(const char* str, int h = 0) {
|
||||||
|
return !str[h] ? 5381 : (caseArg(str, h + 1) * 33) ^ str[h];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
std::vector<T> operator+(const std::vector<T> &A, const std::vector<T> &B) {
|
std::vector<T> operator+(const std::vector<T> &A, const std::vector<T> &B) {
|
||||||
std::vector<T> AB;
|
std::vector<T> AB;
|
||||||
|
@ -117,6 +125,7 @@ struct Options {
|
||||||
bool JSON;
|
bool JSON;
|
||||||
bool PLAIN;
|
bool PLAIN;
|
||||||
bool REVERSE;
|
bool REVERSE;
|
||||||
|
|
||||||
bool HEADER;
|
bool HEADER;
|
||||||
bool PERMANENT;
|
bool PERMANENT;
|
||||||
bool WAIT;
|
bool WAIT;
|
||||||
|
@ -128,7 +137,7 @@ struct Options {
|
||||||
std::string file;
|
std::string file;
|
||||||
int debug_level = 0;
|
int debug_level = 0;
|
||||||
int verbosity = 0;
|
int verbosity = 0;
|
||||||
long timeout = 180U;
|
long timeout = 250U;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* TYPES_H_ */
|
#endif /* TYPES_H_ */
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
LOOKUP_SET(TYPE,type, 1, STRING) //+string
|
LOOKUP_SET(type, TYPE, STRING) //+string
|
||||||
|
LOOKUP_SET(mac, MAC, HEX) //+byte[6]
|
||||||
|
LOOKUP_SET(firmware,FIRMWARE_VERSION, STRING)
|
||||||
|
LOOKUP_SET(hardware,HARDWARE_VERSION, STRING)
|
||||||
|
|
||||||
|
|
||||||
LOOKUP_SET(HOSTNAME,host, 2, STRING) //+string
|
LOOKUP_SET(HOSTNAME,host, 2, STRING) //+string
|
||||||
LOOKUP_SET(MAC,MAC, 3, HEX) //+byte[6]
|
|
||||||
LOOKUP_SET(IP_ADDR,ip, 4, DEC) //+byte[4]
|
LOOKUP_SET(IP_ADDR,ip, 4, DEC) //+byte[4]
|
||||||
LOOKUP_SET(IP_MASK,mask, 5, DEC) //+byte[4]
|
LOOKUP_SET(IP_MASK,mask, 5, DEC) //+byte[4]
|
||||||
LOOKUP_SET(GATEWAY,gateway, 6, DEC) //+byte[4]
|
LOOKUP_SET(GATEWAY,gateway, 6, DEC) //+byte[4]
|
||||||
LOOKUP_SET(FIRMWARE_VERSION,FIRMWARE_VERSION, 7, STRING)
|
|
||||||
LOOKUP_SET(HARDWARE_VERSION,HARDWARE_VERSION, 8, STRING)
|
|
||||||
LOOKUP_SET(DHCP_ENABLED,dhcp, 9, BOOL) //+bool byte
|
LOOKUP_SET(DHCP_ENABLED,dhcp, 9, BOOL) //+bool byte
|
||||||
|
|
||||||
LOOKUP_SET(PORT_VLAN_FOOOOO, 2101,2101, HEX)
|
LOOKUP_SET(PORT_VLAN_FOOOOO, 2101,2101, HEX)
|
||||||
|
|
126
src/smrtlink.cpp
126
src/smrtlink.cpp
|
@ -1,14 +1,13 @@
|
||||||
//============================================================================
|
//============================================================================
|
||||||
// Name : smrtlink.cpp
|
// Name : smrtlink.cpp
|
||||||
// Author : jdi
|
// Author : jdi
|
||||||
// Version :
|
// Version : 1.2
|
||||||
// Copyright : GPL v2
|
// Copyright : GPL v2
|
||||||
// Description : SmrtLink in C++, Ansi-style
|
// Description : SmrtLink in C++, Ansi-style
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <regex>
|
|
||||||
|
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
@ -21,6 +20,7 @@
|
||||||
#include "Interactive.h"
|
#include "Interactive.h"
|
||||||
#include "Host.h"
|
#include "Host.h"
|
||||||
#include "Program.h"
|
#include "Program.h"
|
||||||
|
#include "Types.h"
|
||||||
#include "Switch.h"
|
#include "Switch.h"
|
||||||
#include "lookup.h"
|
#include "lookup.h"
|
||||||
|
|
||||||
|
@ -32,12 +32,8 @@ using namespace std;
|
||||||
|
|
||||||
Options options;
|
Options options;
|
||||||
|
|
||||||
constexpr unsigned int caseArg(const char* str, int h = 0) {
|
|
||||||
return !str[h] ? 5381 : (caseArg(str, h + 1) * 33) ^ str[h];
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
int index,opt;
|
int index, opt;
|
||||||
|
|
||||||
options.user = DEFAULT_USER;
|
options.user = DEFAULT_USER;
|
||||||
options.password = DEFAULT_PASS;
|
options.password = DEFAULT_PASS;
|
||||||
|
@ -54,8 +50,6 @@ int main(int argc, char *argv[]) {
|
||||||
0, 't' }, { "wait", required_argument, 0, 'w' }, { 0, 0, 0,
|
0, 't' }, { "wait", required_argument, 0, 'w' }, { 0, 0, 0,
|
||||||
0 }, };
|
0 }, };
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
while ((opt = getopt_long(argc, argv, "bhrvVXIswxP:U:i:f:t:d::", longopts,
|
while ((opt = getopt_long(argc, argv, "bhrvVXIswxP:U:i:f:t:d::", longopts,
|
||||||
&index)) != -1) {
|
&index)) != -1) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
|
@ -151,116 +145,20 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
if (options.flags.INTERACTIVE) {
|
if (options.flags.INTERACTIVE) {
|
||||||
if (optind < argc) {
|
if (optind < argc) {
|
||||||
cerr << "Command is ignored in interactive mode\n";
|
cerr << "Command is ignored in interactive mode\n";
|
||||||
}
|
}
|
||||||
Interactive p = Interactive();
|
Interactive p = Interactive();
|
||||||
if (!p.run())
|
if (!p.loop())
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
fprintf(stderr, "Not yet implemented.\n");
|
fprintf(stderr, "Not yet implemented.\n");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
} else if (optind < argc) {
|
||||||
else if (optind < argc) {
|
|
||||||
Program p = Program();
|
Program p = Program();
|
||||||
p.init();
|
p.init();
|
||||||
std::vector<std::string> vect;
|
vector<string> v;
|
||||||
std::map<std::string, std::string> list;
|
while (optind < argc)
|
||||||
std::cmatch sm;
|
v.push_back(argv[optind++]);
|
||||||
std::string cmd = std::string(argv[optind++]);
|
p.run(v);
|
||||||
switch (caseArg(cmd.c_str())) {
|
|
||||||
case caseArg("reboot"):
|
|
||||||
if (!p.reboot())
|
|
||||||
exit(EXIT_SUCCESS);
|
|
||||||
fprintf(stderr, "Not yet implemented.\n");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
break;
|
|
||||||
case caseArg("reset"):
|
|
||||||
if (!p.reset())
|
|
||||||
exit(EXIT_SUCCESS);
|
|
||||||
fprintf(stderr, "Not yet implemented.\n");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
break;
|
|
||||||
case caseArg("save"):
|
|
||||||
if (!p.save())
|
|
||||||
exit(EXIT_SUCCESS);
|
|
||||||
fprintf(stderr, "Not yet implemented.\n");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
break;
|
|
||||||
case caseArg("restore"):
|
|
||||||
if (!p.restore())
|
|
||||||
exit(EXIT_SUCCESS);
|
|
||||||
fprintf(stderr, "Not yet implemented.\n");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
break;
|
|
||||||
case caseArg("flash"):
|
|
||||||
if (!p.flash())
|
|
||||||
exit(EXIT_SUCCESS);
|
|
||||||
fprintf(stderr, "Not yet implemented.\n");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case caseArg("list"):
|
|
||||||
if (!p.list())
|
|
||||||
exit(EXIT_SUCCESS);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case caseArg("sniff"):
|
|
||||||
if (!p.sniff())
|
|
||||||
exit(EXIT_SUCCESS);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case caseArg("encode"):
|
|
||||||
if (optind < argc) {
|
|
||||||
std::string s(argv[optind]);
|
|
||||||
optind++;
|
|
||||||
if (p.encode(s))
|
|
||||||
exit(EXIT_SUCCESS);
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "Argument expected after encode\n");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case caseArg("set"):
|
|
||||||
while (optind < argc) {
|
|
||||||
if (regex_match(argv[optind], sm,
|
|
||||||
std::regex("^([a-z]+)=(.*)$"))) {
|
|
||||||
if (!snd_lookup.exists(sm[1])&&!rcv_lookup.exists(sm[1])) {
|
|
||||||
cerr << "Unknown argument " << argv[optind] << endl;
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
list.insert(
|
|
||||||
std::pair<std::string, std::string>(sm[1], sm[2]));
|
|
||||||
} else {
|
|
||||||
cerr << "Invalid Syntax " << argv[optind] << endl;
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
optind++;
|
|
||||||
}
|
|
||||||
if (!p.setProperty(list))
|
|
||||||
exit(EXIT_SUCCESS);
|
|
||||||
fprintf(stderr, "Not yet implemented.\n");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
break;
|
|
||||||
case caseArg("get"):
|
|
||||||
while (optind < argc) {
|
|
||||||
if (regex_match(argv[optind], sm, std::regex("^([a-z]+)$"))) {
|
|
||||||
if (!snd_lookup.exists(sm[1])&&!rcv_lookup.exists(sm[1])) {
|
|
||||||
cerr << "Unknown argument " << argv[optind] << endl;
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
vect.push_back(sm[1]);
|
|
||||||
} else {
|
|
||||||
cerr << "Invalid argument " << argv[optind] << endl;
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
optind++;
|
|
||||||
}
|
|
||||||
if (!p.getProperty(vect))
|
|
||||||
exit(EXIT_SUCCESS);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
printf("Unknown command: %s\n", cmd.c_str());
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue