Documentation
¶
Index ¶
- Constants
- Variables
- type Application
- type ApplicationEvent
- type ApplicationEventKind
- type DelayedBindingType
- type EventService
- type GrepService
- type Iterator
- type LimitedQueue
- type MailError
- type MailMessage
- type PublishService
- type Queue
- type ReportService
- type SendEvent
- type SendEventResult
- type SendingService
- type Service
- type SmtpClient
- type SmtpClientStatus
- type Timeout
Constants ¶
const ( // ExampleConfigYaml используется в примерах использования ExampleConfigYaml = "/path/to/config/file.yaml" // InvalidInputString невалидная строка, введенная пользователем InvalidInputString = "" // InvalidInputInt невалидное число, введенное пользователем InvalidInputInt = 0 )
const ( // Максимальное количество попыток подключения к почтовику за отправку письма MaxTryConnectionCount int = 30 AllDomains string = "*" EmptyStr string = "" )
Variables ¶
var ( // App объект текущего приложения, иногда необходим сервисам, для отправки событий приложению App Application // Services сервисы, используются для создания итератора Services []interface{} // DefaultWorkersCount количество goroutine, может измениться для инициализации приложения DefaultWorkersCount = runtime.NumCPU() // FilenameRegex используется в нескольких пакетах, поэтому вынес сюда FilenameRegex = regexp.MustCompile(`[^\\/]+\.[^\\/]+`) // PrintUsage печает аргументы, используемые приложением PrintUsage = func(f *flag.Flag) { format := " -%s %s\n" fmt.Printf(format, f.Name, f.Usage) } )
var ( // EmailRegexp Регулярка для проверки адреса почты, сразу компилируем, чтобы при отправке не терять на этом время //nolint:lll EmailRegexp = regexp.MustCompile("^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@((?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\]))$") EmptyStrSlice = []string{} )
Functions ¶
This section is empty.
Types ¶
type Application ¶
type Application interface {
// GetConfigData get config data
GetConfigData() ([]byte, error, error)
// SetConfigMeta set config meta data
SetConfigMeta(configFilename, configRemoteAddr, configUpdateDuration string)
// InitConfig initialize config data
InitConfig()
// IsValidConfigFilename проверяет валидность пути к файлу с настройками
IsValidConfigFilename(string) bool
// InitChannels init channels
InitChannels(cBufSize int)
// OnEvent runs event callback
OnEvent(f func(ev *ApplicationEvent))
// CloseEvents close events channel
CloseEvents()
// SendEvents send event to the channel
SendEvents(ev *ApplicationEvent) bool
// Done возвращает канал завершения приложения
Done() <-chan bool
// Close main app
Close()
// Services возвращает сервисы, используемые приложением
Services() []interface{}
// FireInit инициализирует сервисы
FireInit(*ApplicationEvent, interface{})
// FireRun запускает сервисы приложения
FireRun(*ApplicationEvent, interface{})
// FireFinish останавливает сервисы приложения
FireFinish(*ApplicationEvent, interface{})
// Init инициализирует приложение
Init(*ApplicationEvent, bool)
// Run запускает приложение
Run()
// RunWithArgs запускает приложение с аргументами
RunWithArgs(...interface{})
// Timeout возвращает таймауты приложения
Timeout() Timeout
}
Application проект содержит несколько приложений: pmq-grep, pmq-publish, pmq-report, postmanq и т.д. чтобы упростить и стандартизировать приложения, разработан этот интерфейс
type ApplicationEvent ¶
type ApplicationEvent struct {
// Kind тип события
Kind ApplicationEventKind
// Data данные из файла настроек
Data []byte
// Args аргументы командной строки
Args map[string]interface{}
}
ApplicationEvent событие приложения
func NewApplicationEvent ¶
func NewApplicationEvent(kind ApplicationEventKind) *ApplicationEvent
NewApplicationEvent создает событие с указанным типом
func (*ApplicationEvent) GetBoolArg ¶
func (e *ApplicationEvent) GetBoolArg(key string) bool
GetBoolArg возвращает аргумент, как булевый тип
func (*ApplicationEvent) GetIntArg ¶
func (e *ApplicationEvent) GetIntArg(key string) int
GetIntArg возвращает аргумент, как число
func (*ApplicationEvent) GetStringArg ¶
func (e *ApplicationEvent) GetStringArg(key string) string
GetStringArg возвращает аргумент, как строку
type ApplicationEventKind ¶
type ApplicationEventKind int
ApplicationEventKind тип события приложения
const ( // InitApplicationEventKind инициализации сервисов InitApplicationEventKind ApplicationEventKind = iota // RunApplicationEventKind запуск сервисов RunApplicationEventKind // FinishApplicationEventKind завершение сервисов FinishApplicationEventKind // ReconfigureApplicationEventKind reconfigure all services ReconfigureApplicationEventKind )
type DelayedBindingType ¶
type DelayedBindingType int
тип отложенной очереди
const ( UnknownDelayedBinding DelayedBindingType = iota SecondDelayedBinding ThirtySecondDelayedBinding MinuteDelayedBinding FiveMinutesDelayedBinding TenMinutesDelayedBinding TwentyMinutesDelayedBinding ThirtyMinutesDelayedBinding FortyMinutesDelayedBinding FiftyMinutesDelayedBinding HourDelayedBinding SixHoursDelayedBinding DayDelayedBinding NotSendDelayedBinding )
type EventService ¶
EventService сервис получающий событие отправки письма используется сервисами для передачи события друг другу
type GrepService ¶
type GrepService interface {
Service
OnGrep(*ApplicationEvent)
}
GrepService сервис ищущий записи в логе по письму
type Iterator ¶
type Iterator struct {
// contains filtered or unexported fields
}
Iterator итератор, используется для слабой связи между сервисами приложения
type LimitedQueue ¶
type LimitedQueue struct {
*Queue
// contains filtered or unexported fields
}
LimitedQueue лимитированная очередь, в ней будут храниться клиенты к почтовым сервисам
func NewLimitQueue ¶
func NewLimitQueue() *LimitedQueue
NewLimitQueue создает новую лимитированную очередь
func (*LimitedQueue) AddMaxLen ¶
func (l *LimitedQueue) AddMaxLen()
AddMaxLen увеличивает максимальную длину очереди
func (*LimitedQueue) HasLimit ¶
func (l *LimitedQueue) HasLimit() bool
HasLimit сигнализирует, что очередь имеет лимит
func (*LimitedQueue) HasLimitOff ¶
func (l *LimitedQueue) HasLimitOff()
HasLimitOff снимает лимит очереди
func (*LimitedQueue) HasLimitOn ¶
func (l *LimitedQueue) HasLimitOn()
HasLimitOn устанавливает лимит очереди
func (*LimitedQueue) MaxLen ¶
func (l *LimitedQueue) MaxLen() int
MaxLen максимальная длина очереди до того момента, как был установлен лимит
type MailError ¶
type MailError struct {
// сообщение
Message string `json:"message"`
// код ошибки
Code int `json:"code"`
}
ошибка во время отпрвки письма
type MailMessage ¶
type MailMessage struct {
// идентификатор для логов
Id int64 `json:"-"`
// отправитель
Envelope string `json:"envelope"`
// получатель
Recipient string `json:"recipient"`
// тело письма
Body []byte `json:"body"`
// домен отправителя, удобно сразу получить и использовать далее
HostnameFrom string `json:"-"`
// Домен получателя, удобно сразу получить и использовать далее
HostnameTo string `json:"-"`
// дата создания, используется в основном сервисом ограничений
CreatedDate time.Time `json:"-"`
// тип очереди, в которою письмо уже было отправлено после неудачной отправки, ипользуется для цепочки очередей
BindingType DelayedBindingType `json:"bindingType"`
// ошибка отправки
Error *MailError `json:"error"`
}
письмо
type PublishService ¶
type PublishService interface {
Service
EventService
OnPublish(*ApplicationEvent)
}
PublishService сервис перекладывающий письма из очереди в очередь
type Queue ¶
type Queue struct {
// contains filtered or unexported fields
}
Queue потоко-безопасная очередь
type ReportService ¶
type ReportService interface {
Service
EventService
OnShowReport()
}
ReportService сервис принимающий участие в агрегации и выводе в консоль писем с ошибками
type SendEvent ¶
type SendEvent struct {
// Client клиент для отправки писем
Client *SmtpClient
// Message письмо, полученное из очереди
Message *MailMessage
// CreateDate дата создания необходима при получении подключения к почтовому сервису
CreateDate time.Time
// Result результат
Result chan SendEventResult
// TryCount количество попыток отправок письма
TryCount int
// Iterator итератор сервисов, участвующих в отправке письма
Iterator *Iterator
// Queue очередь, в которую необходимо будет положить клиента после отправки письма
Queue *LimitedQueue
}
SendEvent событие отправки письма
func NewSendEvent ¶
func NewSendEvent(message *MailMessage) *SendEvent
NewSendEvent создает событие отправки сообщения
type SendEventResult ¶
type SendEventResult int
SendEventResult результат отправки письма
const ( // SuccessSendEventResult успех SuccessSendEventResult SendEventResult = iota // OverlimitSendEventResult превышение лимита OverlimitSendEventResult // ErrorSendEventResult ошибка ErrorSendEventResult // DelaySendEventResult повторная отправка через некоторое время DelaySendEventResult // RevokeSendEventResult отмена отправки RevokeSendEventResult )
type SendingService ¶
type SendingService interface {
Service
EventService
OnRun()
}
SendingService сервис принимающий участие в отправке письма
type Service ¶
type Service interface {
OnInit(*ApplicationEvent)
OnFinish()
}
Service сервис требующий инициализации данные для инициализации берутся из файла настроек
type SmtpClient ¶
type SmtpClient struct {
// идертификатор клиента для удобства в логах
Id int
// Conn соединение к почтовому серверу
Conn net.Conn
// Worker реальный smtp клиент
Worker *smtp.Client
// ModifyDate дата создания или изменения статуса клиента
ModifyDate time.Time
// Status статус
Status SmtpClientStatus
// contains filtered or unexported fields
}
SmtpClient клиент почтового сервера
func (*SmtpClient) SetTimeout ¶
func (s *SmtpClient) SetTimeout(timeout time.Duration) error
SetTimeout останавливает таймаут на чтение и запись соединения
func (*SmtpClient) Wait ¶
func (s *SmtpClient) Wait()
Wait переводит клиента в ожидание после окончания ожидания соединение разрывается, а статус меняется на отсоединенный
func (*SmtpClient) Wakeup ¶
func (s *SmtpClient) Wakeup()
Wakeup переводит клиента в рабочее состояние если клиент был в ожидании, ожидание прерывается
type SmtpClientStatus ¶
type SmtpClientStatus int
SmtpClientStatus статус клиента почтового сервера
const ( // WorkingSmtpClientStatus отсылает письмо WorkingSmtpClientStatus SmtpClientStatus = iota // WaitingSmtpClientStatus ожидает письма WaitingSmtpClientStatus // DisconnectedSmtpClientStatus отсоединен DisconnectedSmtpClientStatus )
type Timeout ¶
type Timeout struct {
Sleep time.Duration `yaml:"sleep"`
Waiting time.Duration `yaml:"waiting"`
Connection time.Duration `yaml:"connection"`
Hello time.Duration `yaml:"hello"`
Mail time.Duration `yaml:"mail"`
Rcpt time.Duration `yaml:"rcpt"`
Data time.Duration `yaml:"data"`
}
таймауты приложения