common

package
v0.0.0-...-d6bd6e3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 14, 2022 License: BSD-3-Clause Imports: 9 Imported by: 0

Documentation

Index

Constants

View Source
const (
	// ExampleConfigYaml используется в примерах использования
	ExampleConfigYaml = "/path/to/config/file.yaml"

	// InvalidInputString невалидная строка, введенная пользователем
	InvalidInputString = ""

	// InvalidInputInt невалидное число, введенное пользователем
	InvalidInputInt = 0
)
View Source
const (
	// Максимальное количество попыток подключения к почтовику за отправку письма
	MaxTryConnectionCount int    = 30
	AllDomains            string = "*"
	EmptyStr              string = ""
)

Variables

View Source
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)
	}
)
View Source
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

type EventService interface {
	Event(ev *SendEvent) bool
}

EventService сервис получающий событие отправки письма используется сервисами для передачи события друг другу

type GrepService

type GrepService interface {
	Service
	OnGrep(*ApplicationEvent)
}

GrepService сервис ищущий записи в логе по письму

type Iterator

type Iterator struct {
	// contains filtered or unexported fields
}

Iterator итератор, используется для слабой связи между сервисами приложения

func NewIterator

func NewIterator(items []interface{}) *Iterator

NewIterator создает итератор

func (Iterator) Current

func (i Iterator) Current() interface{}

Current отдает текущий элемент

func (Iterator) First

func (i Iterator) First() interface{}

First отдает первый элемент

func (Iterator) IsDone

func (i Iterator) IsDone() bool

IsDone сигнализирует об окончании итерации

func (*Iterator) Next

func (i *Iterator) Next() interface{}

Next отдает следующий элемент

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"`
}

письмо

func (*MailMessage) Init

func (this *MailMessage) Init()

инициализирует письмо

type PublishService

type PublishService interface {
	Service
	EventService
	OnPublish(*ApplicationEvent)
}

PublishService сервис перекладывающий письма из очереди в очередь

type Queue

type Queue struct {
	// contains filtered or unexported fields
}

Queue потоко-безопасная очередь

func NewQueue

func NewQueue() *Queue

NewQueue создает новую очередь

func (*Queue) Empty

func (q *Queue) Empty() bool

Empty сигнализирует, что очередь пуста

func (*Queue) Len

func (q *Queue) Len() int

Len возвращает длину очереди

func (*Queue) Pop

func (q *Queue) Pop() interface{}

Pop достает первый элемент из очереди

func (*Queue) Push

func (q *Queue) Push(item interface{})

Push добавляет элемент в конец очереди

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"`
}

таймауты приложения

func (*Timeout) Init

func (t *Timeout) Init()

инициализирует значения таймаутов по умолчанию

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL