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)
 | 
			
		||||
	$(CC) $^ -o $(BUILDDIR)/$@ -lboost_filesystem -lboost_system
 | 
			
		||||
#-lboost_program_options
 | 
			
		||||
	$(CC) $^ -o $(BUILDDIR)/$@ -lboost_filesystem -lboost_system -lreadline -lboost_program_options
 | 
			
		||||
 | 
			
		||||
$(OBJECTS): $(BUILDDIR)/%.o : $(SOURCEDIR)/%.cpp
 | 
			
		||||
	$(CC) $(CFLAGS) $< -o $@
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,7 +7,14 @@
 | 
			
		|||
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#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"
 | 
			
		||||
 | 
			
		||||
using namespace std;
 | 
			
		||||
| 
						 | 
				
			
			@ -21,12 +28,28 @@ Interactive::~Interactive() {
 | 
			
		|||
    // TODO Auto-generated destructor stub
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int Interactive::run() {
 | 
			
		||||
int Interactive::loop() {
 | 
			
		||||
    string cmd;
 | 
			
		||||
    while(cmd.compare("quit")){
 | 
			
		||||
        cout<< "smrtlink>" << flush;
 | 
			
		||||
        cin >> cmd;
 | 
			
		||||
        cout << cmd <<endl;;
 | 
			
		||||
    vector<string> v;
 | 
			
		||||
    //vector<char const*> vc;
 | 
			
		||||
    //const char** argv;
 | 
			
		||||
    //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;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,7 +12,7 @@ class Interactive {
 | 
			
		|||
public:
 | 
			
		||||
    Interactive();
 | 
			
		||||
    virtual ~Interactive();
 | 
			
		||||
    int run();
 | 
			
		||||
    int loop();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif /* INTERACTIVE_H_ */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -158,8 +158,8 @@ std::string Packet::opCodeToString() {
 | 
			
		|||
        return "SET";
 | 
			
		||||
    case CONFIRM:
 | 
			
		||||
        return "CONFIRM";
 | 
			
		||||
    case RETURN:
 | 
			
		||||
        return "RETURN";
 | 
			
		||||
    case REPLY:
 | 
			
		||||
        return "REPLY";
 | 
			
		||||
    default:
 | 
			
		||||
        return "NONE";
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,7 +18,7 @@ static short sequenceId=0;
 | 
			
		|||
class Packet
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    enum OpCode {DISCOVERY, GET, RETURN, SET, CONFIRM, NONE};
 | 
			
		||||
    enum OpCode {DISCOVERY, GET, REPLY, SET, CONFIRM, NONE};
 | 
			
		||||
    Packet(OpCode);
 | 
			
		||||
    static void encode(bytes&);
 | 
			
		||||
    bytes getBytes();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										150
									
								
								src/Program.cpp
									
										
									
									
									
								
							
							
						
						
									
										150
									
								
								src/Program.cpp
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -6,6 +6,9 @@
 | 
			
		|||
 */
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
#include <regex>
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <cstring>
 | 
			
		||||
 | 
			
		||||
#include "Constant.h"
 | 
			
		||||
#include "Program.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -14,11 +17,117 @@
 | 
			
		|||
#include "Socket.h"
 | 
			
		||||
#include "Switch.h"
 | 
			
		||||
#include "Packet.h"
 | 
			
		||||
#include "Types.h"
 | 
			
		||||
#include "lookup.h"
 | 
			
		||||
#include "table.h"
 | 
			
		||||
 | 
			
		||||
using namespace smrtlink;
 | 
			
		||||
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) {
 | 
			
		||||
    if (options.flags.HEADER) {
 | 
			
		||||
        if (options.flags.HEX) {
 | 
			
		||||
| 
						 | 
				
			
			@ -240,26 +349,27 @@ int Program::flash() {
 | 
			
		|||
 | 
			
		||||
int Program::reboot() {
 | 
			
		||||
    try {
 | 
			
		||||
        discover([this](Packet a) {
 | 
			
		||||
            datasets d =a.getPayload();
 | 
			
		||||
            Switch sw = Switch();
 | 
			
		||||
            sw.parse(d);
 | 
			
		||||
            cout <<sw.settings.hostname<<"\t";
 | 
			
		||||
            datasets t = { {SND_PING, 0, {}}};
 | 
			
		||||
            get(a, t, [this](Packet a) {
 | 
			
		||||
                        datasets d =a.getPayload();
 | 
			
		||||
                        Switch sw = Switch();
 | 
			
		||||
                        sw.parse(d);
 | 
			
		||||
                        datasets t = { {REBOOT, 1, {options.flags.PERMANENT?(byte)1:(byte)0}}};
 | 
			
		||||
                        set(a,t,[this](Packet a) {
 | 
			
		||||
                                    if( a.getOpCode()==Packet::CONFIRM)
 | 
			
		||||
                                    cout<< "rebooting now.\n";
 | 
			
		||||
                                    return 0;
 | 
			
		||||
                                });
 | 
			
		||||
                        return 0;
 | 
			
		||||
                    });
 | 
			
		||||
            return 0;
 | 
			
		||||
        });
 | 
			
		||||
        discover(
 | 
			
		||||
                [this](Packet a) {
 | 
			
		||||
                    datasets d =a.getPayload();
 | 
			
		||||
                    Switch sw = Switch();
 | 
			
		||||
                    sw.parse(d);
 | 
			
		||||
                    cout <<sw.settings.hostname<<"\t";
 | 
			
		||||
                    datasets t = { {SND_PING, 0, {}}};
 | 
			
		||||
                    get(a, t, [this](Packet a) {
 | 
			
		||||
                                datasets d =a.getPayload();
 | 
			
		||||
                                Switch sw = Switch();
 | 
			
		||||
                                sw.parse(d);
 | 
			
		||||
                                datasets t = { {REBOOT, 1, {options.flags.PERMANENT?(byte)1:(byte)0}}};
 | 
			
		||||
                                set(a,t,[this](Packet a) {
 | 
			
		||||
                                            if( a.getOpCode()==Packet::CONFIRM)
 | 
			
		||||
                                            cout<< "rebooting now.\n";
 | 
			
		||||
                                            return 0;
 | 
			
		||||
                                        });
 | 
			
		||||
                                return 0;
 | 
			
		||||
                            });
 | 
			
		||||
                    return 0;
 | 
			
		||||
                });
 | 
			
		||||
        io_service->run();
 | 
			
		||||
    } catch (exception& e) {
 | 
			
		||||
        cerr << "Exception: " << e.what() << "\n";
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,6 +28,8 @@ public:
 | 
			
		|||
		sock = std::make_shared<Socket>(*io_service);
 | 
			
		||||
	}
 | 
			
		||||
	void init();
 | 
			
		||||
    int run(std::vector<std::string>);
 | 
			
		||||
 | 
			
		||||
	int list();
 | 
			
		||||
	int sniff();
 | 
			
		||||
	int encode(std::string);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,12 +13,15 @@
 | 
			
		|||
#include "Host.h"
 | 
			
		||||
#include "Types.h"
 | 
			
		||||
 | 
			
		||||
#define SEND_F 1
 | 
			
		||||
#define RECEIVE_F 2
 | 
			
		||||
 | 
			
		||||
Socket::Socket(boost::asio::io_service& io_service) :
 | 
			
		||||
        send_socket_(io_service), receive_socket_(io_service), timer(io_service) {
 | 
			
		||||
}
 | 
			
		||||
//, resolver(				io_service)
 | 
			
		||||
void Socket::init(short dst_port, short src_port) {
 | 
			
		||||
    if (initialized)
 | 
			
		||||
    if (initialized == 3)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    if (options.flags.REVERSE) {
 | 
			
		||||
| 
						 | 
				
			
			@ -27,7 +30,7 @@ void Socket::init(short dst_port, short src_port) {
 | 
			
		|||
        src_port = p;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (options.debug_level>=1)
 | 
			
		||||
    if (options.debug_level >= 1)
 | 
			
		||||
        std::cout << "Local IP:\t" << local_ip << "\n";
 | 
			
		||||
 | 
			
		||||
    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"),
 | 
			
		||||
            dst_port);
 | 
			
		||||
 | 
			
		||||
    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_);
 | 
			
		||||
 | 
			
		||||
    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;
 | 
			
		||||
    initialized = 3;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Socket::setHostIp(ipAddr ip) {
 | 
			
		||||
| 
						 | 
				
			
			@ -68,6 +49,12 @@ void Socket::setHostIp(ipAddr ip) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
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();
 | 
			
		||||
    p.encode(data);
 | 
			
		||||
    unsigned char * a = &data[0];
 | 
			
		||||
| 
						 | 
				
			
			@ -80,6 +67,25 @@ void Socket::send(Packet p) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
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);
 | 
			
		||||
    receive_socket_.async_receive_from(boost::asio::buffer(data, MAX_LENGTH),
 | 
			
		||||
            remote_endpoint_,
 | 
			
		||||
| 
						 | 
				
			
			@ -92,7 +98,7 @@ void Socket::listen() {
 | 
			
		|||
                    data.resize(bytes_recvd);
 | 
			
		||||
                    Packet p = Packet(Packet::NONE);
 | 
			
		||||
                    p.encode(data);
 | 
			
		||||
                   // std::cout << "err" << p.getErrorCode() <<std::endl;
 | 
			
		||||
                    // std::cout << "err" << p.getErrorCode() <<std::endl;
 | 
			
		||||
                    p.parse(data);
 | 
			
		||||
                    //std::cout << "err" << p.getErrorCode() <<std::endl;
 | 
			
		||||
                    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(dataset);
 | 
			
		||||
	int parse(std::string);
 | 
			
		||||
	int print();
 | 
			
		||||
	int set(std::pair<std::string,std::string>);
 | 
			
		||||
 | 
			
		||||
	std::string get(std::string);
 | 
			
		||||
	std::string toString();
 | 
			
		||||
 | 
			
		||||
	int print();
 | 
			
		||||
 | 
			
		||||
	struct {
 | 
			
		||||
		std::string type;
 | 
			
		||||
		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>
 | 
			
		||||
std::vector<T> operator+(const std::vector<T> &A, const std::vector<T> &B) {
 | 
			
		||||
    std::vector<T> AB;
 | 
			
		||||
| 
						 | 
				
			
			@ -117,6 +125,7 @@ struct Options {
 | 
			
		|||
        bool JSON;
 | 
			
		||||
        bool PLAIN;
 | 
			
		||||
        bool REVERSE;
 | 
			
		||||
 | 
			
		||||
        bool HEADER;
 | 
			
		||||
        bool PERMANENT;
 | 
			
		||||
        bool WAIT;
 | 
			
		||||
| 
						 | 
				
			
			@ -128,7 +137,7 @@ struct Options {
 | 
			
		|||
    std::string file;
 | 
			
		||||
    int debug_level = 0;
 | 
			
		||||
    int verbosity = 0;
 | 
			
		||||
    long timeout = 180U;
 | 
			
		||||
    long timeout = 250U;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#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(MAC,MAC,                 3,      HEX)    //+byte[6]
 | 
			
		||||
LOOKUP_SET(IP_ADDR,ip,              4,      DEC)    //+byte[4]
 | 
			
		||||
LOOKUP_SET(IP_MASK,mask,                5,      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(PORT_VLAN_FOOOOO,    2101,2101,  HEX)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										126
									
								
								src/smrtlink.cpp
									
										
									
									
									
								
							
							
						
						
									
										126
									
								
								src/smrtlink.cpp
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1,14 +1,13 @@
 | 
			
		|||
//============================================================================
 | 
			
		||||
// Name        : smrtlink.cpp
 | 
			
		||||
// Author      : jdi
 | 
			
		||||
// Version     :
 | 
			
		||||
// Version     : 1.2
 | 
			
		||||
// Copyright   : GPL v2
 | 
			
		||||
// Description : SmrtLink in C++, Ansi-style
 | 
			
		||||
//============================================================================
 | 
			
		||||
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <regex>
 | 
			
		||||
 | 
			
		||||
#include <cstring>
 | 
			
		||||
#include <sstream>
 | 
			
		||||
| 
						 | 
				
			
			@ -21,6 +20,7 @@
 | 
			
		|||
#include "Interactive.h"
 | 
			
		||||
#include "Host.h"
 | 
			
		||||
#include "Program.h"
 | 
			
		||||
#include "Types.h"
 | 
			
		||||
#include "Switch.h"
 | 
			
		||||
#include "lookup.h"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -32,12 +32,8 @@ using namespace std;
 | 
			
		|||
 | 
			
		||||
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 index,opt;
 | 
			
		||||
    int index, opt;
 | 
			
		||||
 | 
			
		||||
    options.user = DEFAULT_USER;
 | 
			
		||||
    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 }, };
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    while ((opt = getopt_long(argc, argv, "bhrvVXIswxP:U:i:f:t:d::", longopts,
 | 
			
		||||
            &index)) != -1) {
 | 
			
		||||
        switch (opt) {
 | 
			
		||||
| 
						 | 
				
			
			@ -151,116 +145,20 @@ int main(int argc, char *argv[]) {
 | 
			
		|||
 | 
			
		||||
    if (options.flags.INTERACTIVE) {
 | 
			
		||||
        if (optind < argc) {
 | 
			
		||||
        cerr << "Command is ignored in interactive mode\n";
 | 
			
		||||
    }
 | 
			
		||||
            cerr << "Command is ignored in interactive mode\n";
 | 
			
		||||
        }
 | 
			
		||||
        Interactive p = Interactive();
 | 
			
		||||
        if (!p.run())
 | 
			
		||||
        if (!p.loop())
 | 
			
		||||
            exit(EXIT_SUCCESS);
 | 
			
		||||
        fprintf(stderr, "Not yet implemented.\n");
 | 
			
		||||
        exit(EXIT_FAILURE);
 | 
			
		||||
    }
 | 
			
		||||
    else if (optind < argc) {
 | 
			
		||||
    } else if (optind < argc) {
 | 
			
		||||
        Program p = Program();
 | 
			
		||||
    p.init();
 | 
			
		||||
    std::vector<std::string> vect;
 | 
			
		||||
    std::map<std::string, std::string> list;
 | 
			
		||||
    std::cmatch sm;
 | 
			
		||||
        std::string cmd = std::string(argv[optind++]);
 | 
			
		||||
        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);
 | 
			
		||||
        }
 | 
			
		||||
        p.init();
 | 
			
		||||
        vector<string> v;
 | 
			
		||||
        while (optind < argc)
 | 
			
		||||
            v.push_back(argv[optind++]);
 | 
			
		||||
        p.run(v);
 | 
			
		||||
    }
 | 
			
		||||
    exit(EXIT_FAILURE);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue