first posts
This commit is contained in:
parent
0686e02b75
commit
88b2cf4212
26
dist/log.js
vendored
26
dist/log.js
vendored
@ -1,8 +1,6 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const moment = require("moment");
|
||||
const config = require("./config");
|
||||
const nodemailer = require("nodemailer");
|
||||
var Level;
|
||||
(function (Level) {
|
||||
Level[Level["All"] = 0] = "All";
|
||||
@ -29,30 +27,6 @@ function setLevel(value) {
|
||||
}
|
||||
}
|
||||
exports.setLevel = setLevel;
|
||||
function sendAlarmMail(subject, message) {
|
||||
let transport = nodemailer.createTransport({
|
||||
host: config.dict.smtpHost,
|
||||
port: config.dict.smtpPort,
|
||||
secure: false,
|
||||
tls: {
|
||||
rejectUnauthorized: false
|
||||
}
|
||||
});
|
||||
let mail = {
|
||||
from: config.dict.smtpSender,
|
||||
to: config.dict.smtpReceiver,
|
||||
subject: subject,
|
||||
text: message
|
||||
};
|
||||
transport.sendMail(mail)
|
||||
.then((v) => {
|
||||
info(`Mail sent, ${subject}, ${message}, ${v.response}`);
|
||||
})
|
||||
.catch((reason) => {
|
||||
error(`Failure when sending alarm mail: ${message}, ${reason}`);
|
||||
});
|
||||
}
|
||||
exports.sendAlarmMail = sendAlarmMail;
|
||||
function info(message) {
|
||||
if (level < Level.NoDebugNoInfo) {
|
||||
console.log(`${timestamp()} [ II ] ${message}`);
|
||||
|
2
dist/log.js.map
vendored
2
dist/log.js.map
vendored
@ -1 +1 @@
|
||||
{"version":3,"file":"log.js","sourceRoot":"","sources":["../src/log.ts"],"names":[],"mappings":";;AAAA,iCAAgC;AAChC,mCAAkC;AAClC,yCAAwC;AAGxC,IAAK,KAKJ;AALD,WAAK,KAAK;IACN,+BAAG,CAAA;IACH,uCAAO,CAAA;IACP,mDAAa,CAAA;IACb,qEAAsB,CAAA;AAC1B,CAAC,EALI,KAAK,KAAL,KAAK,QAKT;AAED,IAAI,KAAK,GAAG,KAAK,CAAC,OAAO,CAAA;AAEzB;IACI,OAAO,MAAM,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;AAC1C,CAAC;AAED,kBAAyB,KAAa;IAClC,QAAQ,KAAK,EAAE;QACX,KAAK,MAAM;YAAG,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;YAAC,MAAK;QAC1C,KAAK,MAAM;YAAG,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC;YAAC,MAAK;QAChD,KAAK,OAAO;YAAE,KAAK,GAAG,KAAK,CAAC,sBAAsB,CAAC;YAAC,MAAK;QACzD,OAAO,CAAC,CAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAA;KAClC;AACL,CAAC;AAPD,4BAOC;AAED,uBAA8B,OAAgB,EAAE,OAAgB;IAC5D,IAAI,SAAS,GAAG,UAAU,CAAC,eAAe,CAAC;QACvC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ;QAC1B,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ;QAC1B,MAAM,EAAE,KAAK;QACb,GAAG,EAAE;YACD,kBAAkB,EAAE,KAAK;SAC5B;KACJ,CAAC,CAAC;IAEH,IAAI,IAAI,GAAgC;QACpC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU;QAC5B,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY;QAC5B,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,OAAO;KAChB,CAAC;IAEF,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;SACnB,IAAI,CAAC,CAAC,CAA8B,EAAE,EAAE;QACrC,IAAI,CAAC,cAAc,OAAO,KAAK,OAAO,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC5D,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,MAAY,EAAE,EAAE;QACpB,KAAK,CAAC,oCAAoC,OAAO,KAAK,MAAM,EAAE,CAAC,CAAA;IACnE,CAAC,CAAC,CAAA;AAEV,CAAC;AAzBD,sCAyBC;AAED,cAAqB,OAAe;IAChC,IAAI,KAAK,GAAG,KAAK,CAAC,aAAa,EAAE;QAC7B,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,WAAW,OAAO,EAAE,CAAC,CAAA;KAClD;AACL,CAAC;AAJD,oBAIC;AAED,cAAqB,OAAe;IAChC,IAAI,KAAK,GAAG,KAAK,CAAC,sBAAsB,EAAE;QACtC,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,WAAW,OAAO,EAAE,CAAC,CAAA;KAClD;AACL,CAAC;AAJD,oBAIC;AAED,eAAsB,OAAe;IACjC,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,WAAW,OAAO,EAAE,CAAC,CAAA;AACnD,CAAC;AAFD,sBAEC;AAED,iBAAwB,OAAe;IACnC,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,WAAW,OAAO,EAAE,CAAC,CAAA;AACnD,CAAC;AAFD,0BAEC;AAED,eAAsB,OAAe;IACjC,IAAI,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE;QACvB,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,WAAW,OAAO,EAAE,CAAC,CAAA;KAClD;AACL,CAAC;AAJD,sBAIC"}
|
||||
{"version":3,"file":"log.js","sourceRoot":"","sources":["../src/log.ts"],"names":[],"mappings":";;AAAA,iCAAgC;AAIhC,IAAK,KAKJ;AALD,WAAK,KAAK;IACN,+BAAG,CAAA;IACH,uCAAO,CAAA;IACP,mDAAa,CAAA;IACb,qEAAsB,CAAA;AAC1B,CAAC,EALI,KAAK,KAAL,KAAK,QAKT;AAED,IAAI,KAAK,GAAG,KAAK,CAAC,OAAO,CAAA;AAEzB;IACI,OAAO,MAAM,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;AAC1C,CAAC;AAED,kBAAyB,KAAa;IAClC,QAAQ,KAAK,EAAE;QACX,KAAK,MAAM;YAAG,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;YAAC,MAAK;QAC1C,KAAK,MAAM;YAAG,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC;YAAC,MAAK;QAChD,KAAK,OAAO;YAAE,KAAK,GAAG,KAAK,CAAC,sBAAsB,CAAC;YAAC,MAAK;QACzD,OAAO,CAAC,CAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAA;KAClC;AACL,CAAC;AAPD,4BAOC;AAGD,cAAqB,OAAe;IAChC,IAAI,KAAK,GAAG,KAAK,CAAC,aAAa,EAAE;QAC7B,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,WAAW,OAAO,EAAE,CAAC,CAAA;KAClD;AACL,CAAC;AAJD,oBAIC;AAED,cAAqB,OAAe;IAChC,IAAI,KAAK,GAAG,KAAK,CAAC,sBAAsB,EAAE;QACtC,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,WAAW,OAAO,EAAE,CAAC,CAAA;KAClD;AACL,CAAC;AAJD,oBAIC;AAED,eAAsB,OAAe;IACjC,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,WAAW,OAAO,EAAE,CAAC,CAAA;AACnD,CAAC;AAFD,sBAEC;AAED,iBAAwB,OAAe;IACnC,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,WAAW,OAAO,EAAE,CAAC,CAAA;AACnD,CAAC;AAFD,0BAEC;AAED,eAAsB,OAAe;IACjC,IAAI,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE;QACvB,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,WAAW,OAAO,EAAE,CAAC,CAAA;KAClD;AACL,CAAC;AAJD,sBAIC"}
|
12
dist/main.js
vendored
12
dist/main.js
vendored
@ -12,11 +12,16 @@ app.engine('pag', (filePath, options, callback) => {
|
||||
if (err) {
|
||||
return callback(new Error(err.message));
|
||||
}
|
||||
let renderedPhase1 = content.toString()
|
||||
let contentStr = content.toString();
|
||||
let pageOptionsStr = contentStr.replace(/^\s+<!-- (\{.*\}) -->.*$/, "\$1");
|
||||
logger.info(`contentStr: ${contentStr}`);
|
||||
logger.info(`pageOptionsStr: ${pageOptionsStr}`);
|
||||
let pageOptions = JSON.parse(pageOptionsStr);
|
||||
let renderedPhase1 = contentStr
|
||||
.replace('#bla#', 'blu');
|
||||
let renderedPhase2 = masterTmpl
|
||||
.replace('#maincontent#', renderedPhase1)
|
||||
.replace('#title#', options.title);
|
||||
.replace('#title#', pageOptions.title);
|
||||
return callback(null, renderedPhase2);
|
||||
});
|
||||
});
|
||||
@ -25,6 +30,9 @@ app.set('view engine', 'pag');
|
||||
app.get('/index', (req, res) => {
|
||||
res.render('index', { 'title': 'Projects - just for fun' });
|
||||
});
|
||||
app.get('/posts/:date', (req, res) => {
|
||||
res.render(`posts/${req.params.date}/article`, {});
|
||||
});
|
||||
app.get('/', (req, res) => {
|
||||
res.send('Hello world!');
|
||||
});
|
||||
|
2
dist/main.js.map
vendored
2
dist/main.js.map
vendored
@ -1 +1 @@
|
||||
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";;AAAA,yBAAwB;AAExB,mCAAkC;AAClC,gCAA+B;AAE/B,mCAAkC;AAIlC,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;AAEhC,IAAI,GAAG,GAAG,OAAO,EAAE,CAAA;AAEnB,IAAI,UAAkB,CAAA;AAEtB,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,QAAgB,EAAE,OAAY,EAAE,QAAa,EAAE,EAAE;IAChE,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE;QACnC,IAAI,GAAG,EAAE;YACL,OAAO,QAAQ,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAA;SAC1C;QACD,IAAI,cAAc,GAAG,OAAO,CAAC,QAAQ,EAAE;aACtC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QAExB,IAAI,cAAc,GAAG,UAAU;aAC9B,OAAO,CAAC,eAAe,EAAE,cAAc,CAAC;aACxC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAA;QAClC,OAAO,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA;AAEF,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;AAC7B,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,CAAC,CAAA;AAE7B,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IAC3B,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,EAAC,OAAO,EAAE,yBAAyB,EAAC,CAAC,CAAA;AAC7D,CAAC,CAAC,CAAA;AAEF,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IACtB,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;AAC5B,CAAC,CAAC,CAAA;AAEF,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAA;AAE/D,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;IAClC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;AACxC,CAAC,CAAC,CAAA;AACF,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA"}
|
||||
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";;AAAA,yBAAwB;AAExB,mCAAkC;AAClC,gCAA+B;AAE/B,mCAAkC;AAIlC,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;AAEhC,IAAI,GAAG,GAAG,OAAO,EAAE,CAAA;AAEnB,IAAI,UAAkB,CAAA;AAEtB,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,QAAgB,EAAE,OAAY,EAAE,QAAa,EAAE,EAAE;IAChE,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE;QACnC,IAAI,GAAG,EAAE;YACL,OAAO,QAAQ,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAA;SAC1C;QAED,IAAI,UAAU,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAA;QACnC,IAAI,cAAc,GAAG,UAAU,CAAC,OAAO,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAA;QAC1E,MAAM,CAAC,IAAI,CAAC,eAAe,UAAU,EAAE,CAAC,CAAA;QACxC,MAAM,CAAC,IAAI,CAAC,mBAAmB,cAAc,EAAE,CAAC,CAAA;QAChD,IAAI,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA;QAC5C,IAAI,cAAc,GAAG,UAAU;aAC9B,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QAExB,IAAI,cAAc,GAAG,UAAU;aAC9B,OAAO,CAAC,eAAe,EAAE,cAAc,CAAC;aACxC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,KAAK,CAAC,CAAA;QAEtC,OAAO,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA;AAEF,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;AAC7B,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,CAAC,CAAA;AAE7B,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IAC3B,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,EAAC,OAAO,EAAE,yBAAyB,EAAC,CAAC,CAAA;AAC7D,CAAC,CAAC,CAAA;AAEF,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IACjC,GAAG,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,MAAM,CAAC,IAAI,UAAU,EAAE,EAAE,CAAC,CAAA;AACtD,CAAC,CAAC,CAAA;AAEF,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IACtB,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;AAC5B,CAAC,CAAC,CAAA;AAEF,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAA;AAE/D,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;IAClC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;AACxC,CAAC,CAAC,CAAA;AACF,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA"}
|
142
docroot/posts/2018-04-30.01/article.pag
Normal file
142
docroot/posts/2018-04-30.01/article.pag
Normal file
@ -0,0 +1,142 @@
|
||||
<!-- { "title": "Yet Another Debouncing Method" } -->
|
||||
|
||||
You can find several approaches for debouncing mechanical switches on the Internet, some work better, some not so good.
|
||||
|
||||
One common approach is to ignore events in an ISR when they come too fast:
|
||||
|
||||
[code language="C"]
|
||||
void count() {
|
||||
static uint32_t lastEvent = 0;
|
||||
uint32_t currentEvent = micros();
|
||||
if (currentEvent > (lastEvent + configBlock.debounce)) {
|
||||
lastEvent = currentEvent;
|
||||
cnt++;
|
||||
}
|
||||
}
|
||||
|
||||
void setup() {
|
||||
pinMode(REED_PIN, INPUT_PULLUP);
|
||||
attachInterrupt(REED_PIN, count, FALLING);
|
||||
}
|
||||
[/code]
|
||||
|
||||
This works very good when only the tipping of a switch is relevant.
|
||||
|
||||
When also the time the button was pressed is relevant and when it is especially necessary to distinguish between a short and a long press this approach doesn't work anymore.
|
||||
|
||||
Since I couldn't remember the approaches I read about earlier I've sketched this state machine:
|
||||
|
||||
|
||||
<!--more-->
|
||||
|
||||
|
||||
|
||||
<img src="https://a385e5.files.wordpress.com/2018/04/20180430110848869_0001.jpg" alt="20180430110848869_0001.jpg" width="2332" height="3307" class="alignnone size-full wp-image-901" />
|
||||
|
||||
(The double-lined states are action-states which send out the related information.)
|
||||
|
||||
At least for me, this approach is working very reliable so far, I'm quite happy with it.
|
||||
|
||||
[code language="C"]
|
||||
enum tPressedState { psHIGH, psLOW, psACCEPTED_LOW, psLONG_START, psLONG_CONT, psLONG_CONT_SEND, psLONG_END, psSHORT, psINVALID };
|
||||
|
||||
typedef struct {
|
||||
uint8_t index;
|
||||
uint8_t buttonPin;
|
||||
tPressedState pressedState;
|
||||
tPressedState oldPressedState;
|
||||
uint32_t lastStateChange;
|
||||
} tButton;
|
||||
|
||||
tButton buttons[] = {
|
||||
{ 1, SWITCH_1, psHIGH, psINVALID, 0 },
|
||||
{ 2, SWITCH_2, psHIGH, psINVALID, 0 },
|
||||
{ 3, SWITCH_3, psHIGH, psINVALID, 0 },
|
||||
{ 0, 0, psINVALID, psINVALID, 0 } // END MARKER
|
||||
};
|
||||
|
||||
static void buttonHandler(tButton *button) {
|
||||
uint32_t currentMicros = micros();
|
||||
uint8_t buttonState = digitalRead(button->buttonPin);
|
||||
|
||||
#ifdef DEBUG
|
||||
if (button->oldPressedState != button->pressedState) {
|
||||
Serial.print("Index ");
|
||||
Serial.print(button->index);
|
||||
Serial.print(", state changed from ");
|
||||
Serial.print(button->oldPressedState);
|
||||
Serial.print(" to ");
|
||||
Serial.print(button->pressedState);
|
||||
Serial.println();
|
||||
button->oldPressedState = button->pressedState;
|
||||
}
|
||||
#endif
|
||||
|
||||
switch (button->pressedState) {
|
||||
case psHIGH:
|
||||
if (buttonState == LOW) {
|
||||
button->pressedState = psLOW;
|
||||
button->lastStateChange = currentMicros;
|
||||
}
|
||||
break;
|
||||
case psLOW:
|
||||
if (buttonState == HIGH) {
|
||||
button->pressedState = psHIGH;
|
||||
button->lastStateChange = currentMicros;
|
||||
} else {
|
||||
if (currentMicros > (button->lastStateChange + configBlock.debounce)) {
|
||||
button->pressedState = psACCEPTED_LOW;
|
||||
button->lastStateChange = currentMicros;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case psACCEPTED_LOW:
|
||||
if (buttonState == HIGH) {
|
||||
button->pressedState = psSHORT;
|
||||
button->lastStateChange = currentMicros;
|
||||
}
|
||||
if (currentMicros > (button->lastStateChange + (configBlock.longPress * 1000))) {
|
||||
button->pressedState = psLONG_START;
|
||||
button->lastStateChange = currentMicros;
|
||||
}
|
||||
break;
|
||||
case psSHORT:
|
||||
sendMsg(button->index, "PRESS_SHORT");
|
||||
button->pressedState = psHIGH;
|
||||
button->lastStateChange = currentMicros;
|
||||
break;
|
||||
case psLONG_START:
|
||||
sendMsg(button->index, "PRESS_LONG_START");
|
||||
button->pressedState = psLONG_CONT;
|
||||
button->lastStateChange = currentMicros;
|
||||
break;
|
||||
case psLONG_CONT:
|
||||
if (buttonState == HIGH) {
|
||||
button->pressedState = psLONG_END;
|
||||
button->lastStateChange = currentMicros;
|
||||
}
|
||||
if (currentMicros > (button->lastStateChange + (configBlock.longPressRepeat * 1000))) {
|
||||
button->pressedState = psLONG_CONT_SEND;
|
||||
button->lastStateChange = currentMicros;
|
||||
}
|
||||
break;
|
||||
case psLONG_CONT_SEND:
|
||||
sendMsg(button->index, "PRESS_LONG_CONT");
|
||||
button->pressedState = psLONG_CONT;
|
||||
button->lastStateChange = currentMicros;
|
||||
break;
|
||||
case psLONG_END:
|
||||
sendMsg(button->index, "PRESS_LONG_END");
|
||||
button->pressedState = psHIGH;
|
||||
button->lastStateChange = currentMicros;
|
||||
break;
|
||||
default:
|
||||
button->pressedState = psHIGH;
|
||||
button->lastStateChange = currentMicros;
|
||||
}
|
||||
}
|
||||
[/code]
|
||||
|
||||
Find it embedded in the code of a small ESP8266-based switch thing I'm using in my home automation setup (home grown control code (https://gitlab.com/wolutator/dispatcher_ng), homegear (https://homegear.eu/) for device integration and openHAB (https://www.openhab.org/) as user interface) here: https://gitlab.com/wolutator/MySwitch.
|
||||
|
||||
')
|
16
node_modules/.bin/mime
generated
vendored
16
node_modules/.bin/mime
generated
vendored
@ -1 +1,15 @@
|
||||
../mime/cli.js
|
||||
#!/bin/sh
|
||||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
||||
|
||||
case `uname` in
|
||||
*CYGWIN*) basedir=`cygpath -w "$basedir"`;;
|
||||
esac
|
||||
|
||||
if [ -x "$basedir/node" ]; then
|
||||
"$basedir/node" "$basedir/../mime/cli.js" "$@"
|
||||
ret=$?
|
||||
else
|
||||
node "$basedir/../mime/cli.js" "$@"
|
||||
ret=$?
|
||||
fi
|
||||
exit $ret
|
||||
|
7
node_modules/.bin/mime.cmd
generated
vendored
Normal file
7
node_modules/.bin/mime.cmd
generated
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
@IF EXIST "%~dp0\node.exe" (
|
||||
"%~dp0\node.exe" "%~dp0\..\mime\cli.js" %*
|
||||
) ELSE (
|
||||
@SETLOCAL
|
||||
@SET PATHEXT=%PATHEXT:;.JS;=;%
|
||||
node "%~dp0\..\mime\cli.js" %*
|
||||
)
|
45
npm-debug.log
Normal file
45
npm-debug.log
Normal file
@ -0,0 +1,45 @@
|
||||
0 info it worked if it ends with ok
|
||||
1 verbose cli [ 'C:\\Program Files\\nodejs\\node.exe',
|
||||
1 verbose cli 'C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js',
|
||||
1 verbose cli 'start',
|
||||
1 verbose cli '--',
|
||||
1 verbose cli '-c',
|
||||
1 verbose cli './homepage.conf' ]
|
||||
2 info using npm@2.15.9
|
||||
3 info using node@v4.5.0
|
||||
4 verbose run-script [ 'prestart', 'start', 'poststart' ]
|
||||
5 info prestart homepage@1.0.0
|
||||
6 info start homepage@1.0.0
|
||||
7 verbose unsafe-perm in lifecycle true
|
||||
8 info homepage@1.0.0 Failed to exec start script
|
||||
9 verbose stack Error: homepage@1.0.0 start: `node dist/main.js "-c" "./homepage.conf"`
|
||||
9 verbose stack Exit status 1
|
||||
9 verbose stack at EventEmitter.<anonymous> (C:\Program Files\nodejs\node_modules\npm\lib\utils\lifecycle.js:217:16)
|
||||
9 verbose stack at emitTwo (events.js:87:13)
|
||||
9 verbose stack at EventEmitter.emit (events.js:172:7)
|
||||
9 verbose stack at ChildProcess.<anonymous> (C:\Program Files\nodejs\node_modules\npm\lib\utils\spawn.js:24:14)
|
||||
9 verbose stack at emitTwo (events.js:87:13)
|
||||
9 verbose stack at ChildProcess.emit (events.js:172:7)
|
||||
9 verbose stack at maybeClose (internal/child_process.js:829:16)
|
||||
9 verbose stack at Process.ChildProcess._handle.onexit (internal/child_process.js:211:5)
|
||||
10 verbose pkgid homepage@1.0.0
|
||||
11 verbose cwd C:\Users\dehottgw\workspaces\workspace-private\homepage
|
||||
12 error Windows_NT 6.1.7601
|
||||
13 error argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "start" "--" "-c" "./homepage.conf"
|
||||
14 error node v4.5.0
|
||||
15 error npm v2.15.9
|
||||
16 error code ELIFECYCLE
|
||||
17 error homepage@1.0.0 start: `node dist/main.js "-c" "./homepage.conf"`
|
||||
17 error Exit status 1
|
||||
18 error Failed at the homepage@1.0.0 start script 'node dist/main.js "-c" "./homepage.conf"'.
|
||||
18 error This is most likely a problem with the homepage package,
|
||||
18 error not with npm itself.
|
||||
18 error Tell the author that this fails on your system:
|
||||
18 error node dist/main.js "-c" "./homepage.conf"
|
||||
18 error You can get information on how to open an issue for this project with:
|
||||
18 error npm bugs homepage
|
||||
18 error Or if that isn't available, you can get their info via:
|
||||
18 error
|
||||
18 error npm owner ls homepage
|
||||
18 error There is likely additional logging output above.
|
||||
19 verbose exit [ 1, true ]
|
@ -22,7 +22,6 @@
|
||||
"chalk": "^2.3.0",
|
||||
"command-line-args": "^4.0.7",
|
||||
"express": "^4.16.3",
|
||||
"nodemailer": "^4.6.4",
|
||||
"simple-node-logger": "^0.93.33"
|
||||
},
|
||||
"devDependencies": {
|
||||
@ -30,7 +29,6 @@
|
||||
"@types/command-line-args": "^4.0.2",
|
||||
"@types/express": "^4.11.1",
|
||||
"@types/node": "^8.5.8",
|
||||
"@types/nodemailer": "^4.6.0",
|
||||
"typescript": "^2.6.2"
|
||||
}
|
||||
}
|
||||
|
27
src/log.ts
27
src/log.ts
@ -1,6 +1,5 @@
|
||||
import * as moment from 'moment'
|
||||
import * as config from './config'
|
||||
import * as nodemailer from 'nodemailer'
|
||||
|
||||
|
||||
enum Level {
|
||||
@ -25,32 +24,6 @@ export function setLevel(value: string): void {
|
||||
}
|
||||
}
|
||||
|
||||
export function sendAlarmMail(subject : string, message : string): void {
|
||||
let transport = nodemailer.createTransport({
|
||||
host: config.dict.smtpHost,
|
||||
port: config.dict.smtpPort,
|
||||
secure: false,
|
||||
tls: {
|
||||
rejectUnauthorized: false
|
||||
}
|
||||
});
|
||||
|
||||
let mail : nodemailer.SendMailOptions = {
|
||||
from: config.dict.smtpSender,
|
||||
to: config.dict.smtpReceiver,
|
||||
subject: subject,
|
||||
text: message
|
||||
};
|
||||
|
||||
transport.sendMail(mail)
|
||||
.then((v : nodemailer.SentMessageInfo) => {
|
||||
info(`Mail sent, ${subject}, ${message}, ${v.response}`)
|
||||
})
|
||||
.catch((reason : any) => {
|
||||
error(`Failure when sending alarm mail: ${message}, ${reason}`)
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
export function info(message: string): void {
|
||||
if (level < Level.NoDebugNoInfo) {
|
||||
|
15
src/main.ts
15
src/main.ts
@ -18,12 +18,19 @@ app.engine('pag', (filePath: string, options: any, callback: any) => {
|
||||
if (err) {
|
||||
return callback(new Error(err.message))
|
||||
}
|
||||
let renderedPhase1 = content.toString()
|
||||
|
||||
let contentStr = content.toString()
|
||||
let pageOptionsStr = contentStr.replace(/^\s+<!-- (\{.*\}) -->.*$/, "\$1")
|
||||
logger.info(`contentStr: ${contentStr}`)
|
||||
logger.info(`pageOptionsStr: ${pageOptionsStr}`)
|
||||
let pageOptions = JSON.parse(pageOptionsStr)
|
||||
let renderedPhase1 = contentStr
|
||||
.replace('#bla#', 'blu')
|
||||
|
||||
let renderedPhase2 = masterTmpl
|
||||
.replace('#maincontent#', renderedPhase1)
|
||||
.replace('#title#', options.title)
|
||||
.replace('#title#', pageOptions.title)
|
||||
|
||||
return callback(null, renderedPhase2)
|
||||
})
|
||||
})
|
||||
@ -35,6 +42,10 @@ app.get('/index', (req, res) => {
|
||||
res.render('index', {'title': 'Projects - just for fun'})
|
||||
})
|
||||
|
||||
app.get('/posts/:date', (req, res) => {
|
||||
res.render(`posts/${req.params.date}/article`, {})
|
||||
})
|
||||
|
||||
app.get('/', (req, res) => {
|
||||
res.send('Hello world!')
|
||||
})
|
||||
|
Loading…
x
Reference in New Issue
Block a user