openvpn-mgt/logs.go

150 lines
2.6 KiB
Go

package main
import (
"bytes"
"encoding/json"
"io/ioutil"
"log"
"net/http"
"net/smtp"
"text/template"
"time"
)
func (c *vpnSession) LogPrintln(v ...interface{}) {
log.Println(c.Login, c.IP, v)
}
func (s *OpenVpnMgt) Log(c *vpnSession) error {
if s.vpnlogUrl != "" {
if err := c.getASInfos(s.vpnlogUrl); err != nil {
log.Println(err)
}
}
jsonStr, err := json.Marshal(c)
if err != nil {
return err
}
log.Println(string(jsonStr))
if err := s.SendMail(c); err != nil {
log.Println(err)
}
return nil
}
func (c *vpnSession) getASInfos(vpnlogUrl string) error {
jsonStr, err := json.Marshal(c)
if err != nil {
return err
}
req, err := http.NewRequest("POST", vpnlogUrl, bytes.NewBuffer(jsonStr))
req.Header.Set("Content-Type", "application/json")
timeout := time.Duration(3 * time.Second)
client := http.Client{
Timeout: timeout,
}
resp, err := client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
err = json.Unmarshal(body, c)
if err != nil {
return err
}
return nil
}
func (s *OpenVpnMgt) MailTemplate(c *vpnSession) error {
var buf1 bytes.Buffer
var buf2 bytes.Buffer
tmpl, err := template.New("pwnTemplate").Parse(s.pwnTemplate)
if err != nil {
return err
}
if err := tmpl.Execute(&buf1, c); err != nil {
return err
}
c.pwnMail = buf1.String()
tmpl, err = template.New("newAsTemplate").Parse(s.newAsTemplate)
if err != nil {
return err
}
if err := tmpl.Execute(&buf2, c); err != nil {
return err
}
c.newAsMail = buf2.String()
return nil
}
func (s *OpenVpnMgt) SendMail(c *vpnSession) error {
if c.Mail == "" {
return nil
}
if (s.newAsTemplate == "" || !c.NewAS) &&
(s.pwnTemplate == "" || !c.PwnedPasswd) {
// can not send mail without template or cause
return nil
}
// needed for the templating
c.MailFrom = s.MailFrom
c.CcPwnPassword = s.CcPwnPassword
// complete the templates
if err := s.MailTemplate(c); err != nil {
return err
}
mail, err := smtp.Dial(s.mailRelay)
if err != nil {
return err
}
defer mail.Close()
if c.PwnedPasswd {
mail.Mail(s.MailFrom)
mail.Rcpt(c.Mail)
if c.TooMuchPwn && s.CcPwnPassword != "" {
mail.Rcpt(s.CcPwnPassword)
}
wc, err := mail.Data()
if err != nil {
return nil
}
defer wc.Close()
buf := bytes.NewBufferString(c.pwnMail)
if _, err = buf.WriteTo(wc); err != nil {
return err
}
wc.Close()
}
if c.NewAS {
mail.Mail(s.MailFrom)
mail.Rcpt(c.Mail)
wc, err := mail.Data()
if err != nil {
return nil
}
defer wc.Close()
buf := bytes.NewBufferString(c.newAsMail)
if _, err = buf.WriteTo(wc); err != nil {
return err
}
wc.Close()
}
return nil
}