4 changed files with 4 additions and 318 deletions
@ -1,21 +0,0 @@ |
|||||
#!/bin/sh |
|
||||
|
|
||||
. /etc/init.d/globals |
|
||||
|
|
||||
case $1 in |
|
||||
start) |
|
||||
if [ -e /var/etc/.emmrd ]; then |
|
||||
SHOWINFO "starting ..." |
|
||||
/bin/emmrd /var/tuxbox/config/doscam.cfg /var/etc/.card & |
|
||||
fi |
|
||||
;; |
|
||||
stop) |
|
||||
if [ -e /var/etc/.emmrd ]; then |
|
||||
SHOWINFO "stopping ..." |
|
||||
killall emmrd |
|
||||
fi |
|
||||
;; |
|
||||
*) |
|
||||
echo "[${BASENAME}] Usage: $0 {start|stop}" |
|
||||
;; |
|
||||
esac |
|
@ -1,293 +0,0 @@ |
|||||
#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 \"" << file << "\"" << 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); |
|
||||
} |
|
Before Width: | Height: | Size: 222 B |
Loading…
Reference in new issue