You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

293 lines
5.2 KiB

#include <fstream>
#include <sstream>
#include <iostream>
#include <string>
#include <map>
#include <ctime>
#include <iomanip> //setfill
#include <unistd.h>
#include <cstdlib>
#include <sys/stat.h>
using namespace std;
#define BASNAME "[emmrd] - "
static std::map<std::string, std::string> cam_conf;
static int num_reader;
class emmrd
{
private:
static void timestamp()
{
time_t t = time(0); // get time now
struct tm * now = localtime( & t );
cout << BASNAME
<< setfill('0') << setw (2) << now->tm_mday << '.'
<< setfill('0') << setw (2) << (now->tm_mon + 1) << '.'
<< (now->tm_year + 1900) << ' '
<< setfill('0') << setw (2) << now->tm_hour << ':'
<< setfill('0') << setw (2) << now->tm_min << ':'
<< setfill('0') << setw (2) << now->tm_sec;
}
static int read_conf(const string file)
{
fstream fh;
string s, key, value;
num_reader = -1;
bool reader = false;
// delete map
cam_conf.clear();
fh.open(file.c_str(), ios::in);
if(!fh.is_open())
{
cout << BASNAME << "Error reading configfile \"" << file << "\"" << endl;
return 1;
}
while (!fh.eof())
{
getline(fh, s);
string::size_type begin = s.find_first_not_of(" \f\t\v");
// skip blank lines
if (begin == string::npos)
continue;
// skip commentary
if (string("#;").find(s[begin]) != string::npos)
continue;
// extract the key value
string::size_type end = s.find('=', begin);
key = s.substr(begin, end - begin);
// get reader section
if (string("[").find(s[begin]) != string::npos)
{
if(key == "[reader]")
{
reader = true;
num_reader++;
continue;
}
else
{
reader = false;
continue;
}
}
// trim key
key.erase( key.find_last_not_of(" \f\t\v") + 1);
// skip blank keys
if (key.empty())
continue;
// extract and trim value
begin = s.find_first_not_of(" \f\n\r\t\v", end + 1);
end = s.find_last_not_of(" \f\n\r\t\v") + 1;
value = s.substr(begin, end - begin);
// create index for reader
ostringstream inx;
if(reader == true)
inx << num_reader << '.' << key;
else
inx << key;
//cout << inx.str() << " = " << value << endl;
cam_conf[inx.str()]=value;
}
fh.close();
return 0;
}
static string read_lastline(const string file, int pos = 0)
{
fstream fh;
string s, last, data;
fh.open(file.c_str(), ios::in);
if(fh.is_open())
{
while (getline (fh, s))
{
last.swap (s);
}
if (fh.good () || fh.eof ())
{
data = last.substr (pos);
//cout << '"' << data << '"' << endl;
} else
{
cout << BASNAME << "Error reading file \"" << file << "\"" << endl;
}
fh.close();
}
else
{
//cout << "Error opening file \"" << file << "\"" << endl;
}
return data;
}
static int write(const string file, const string &data)
{
fstream fh;
fh.open(file.c_str(), ios::out);
if(fh.is_open())
{
fh << data;
fh.close();
}
else
{
cout << BASNAME << "error opening file " << fh << endl;
}
return 0;
}
static bool file_exists(const char *filename)
{
struct stat stat_buf;
if(::stat(filename, &stat_buf) == 0)
{
return true;
}
return false;
}
public:
static int run(const char *iFile, const char *oFile)
{
string logpath;
emmrd::timestamp();
if(!file_exists(iFile))
{
cout << " - error find configfile " << iFile << endl;
exit(0);
}
read_conf(iFile);
// find parameter "emmlogdir" in config
if(cam_conf.find("emmlogdir") != cam_conf.end())
{
//cout << "find emmlogdir => " << cam_conf.find("emmlogdir")->second << endl;
logpath = cam_conf.find("emmlogdir")->second;
if (string("/").find(logpath[logpath.size()-1]) == string::npos)
{
logpath += "/";
}
}
else
{
cam_conf["emmlogdir"]="";
}
// check emmlogfile for each reader
cout << " - check emmlogfile for each reader" << endl;
for (int i = 0; i <= num_reader; ++i)
{
string emmdata, lastdata;
ostringstream label;
// index for each reader
label << i << '.' << "label";
if(cam_conf.find(label.str()) != cam_conf.end())
{
// label_emm.log
string filename = cam_conf.find(label.str())->second + "_emm.log";
// logpath/label.log
string t_emmfile = logpath + filename;
// .label_emm.log
string t_filename = "/var/etc/." + filename;
// last run data
lastdata = read_lastline(t_filename);
// last entry from logfile without date/time
emmdata = read_lastline(t_emmfile, 22);
// compare
if(!emmdata.empty())
{
if(emmdata == lastdata)
{
cout << BASNAME << "equal EMM data" << endl;
}
else
{
if(!lastdata.empty())
{
// write flagfile
write(oFile,"");
cout << BASNAME << "new EMM data detected" << endl;
}
else
{
// only print timestamp output
cout << BASNAME << "first run" << endl;
}
// save last result
write(t_filename,emmdata);
}
}
}
}
return 0;
}
}; //class
int main(int argc, char *argv[])
{
cout << BASNAME << "(c)FlatTV 2015 " << endl;
switch (argc)
{
case 3:
{
while(true)
{
emmrd::run(argv[1], argv[2]);
sleep(3600);
}
break;
exit(0);
}
default:
cout << "\tCheck and create a flagfile, if emm data has changed since last run" << endl;
cout << "\tUSAGE:\t" << BASNAME << "<(d)oscam configfile> <flagfile>" << std::endl;
return 1;
}
exit(1);
}