common

package
v0.0.0-...-6618439 Latest Latest
Warning

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

Go to latest
Published: May 25, 2016 License: BSD-3-Clause Imports: 11 Imported by: 0

Documentation

Index

Constants

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

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

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

Variables

View Source
var (
	// объект текущего приложения, иногда необходим сервисам, для отправки событий приложению
	App Application

	// сервисы, используются для создания итератора
	Services []interface{}

	// количество goroutine, может измениться для инициализации приложения
	DefaultWorkersCount = runtime.NumCPU()

	// используется в нескольких пакетах, поэтому вынес сюда
	FilenameRegex = regexp.MustCompile(`[^\\/]+\.[^\\/]+`)

	// печает аргументы, используемые приложением
	PrintUsage = func(f *flag.Flag) {
		format := "  -%s %s\n"
		fmt.Printf(format, f.Name, f.Usage)
	}
)
View Source
var (
	// Регулярка для проверки адреса почты, сразу компилируем, чтобы при отправке не терять на этом время
	EmailRegexp   = regexp.MustCompile(`^[\w\d\.\_\%\+\-]+@([\w\d\.\-]+\.\w{2,5})$`)
	HostnameRegex = regexp.MustCompile(`^[\w\d\.\-]+\.\w{2,5}$`)
	EmptyStrSlice = []string{}
)

Functions

func ReturnMail

func ReturnMail(event *SendEvent, err error)

возвращает письмо обратно в очередь после ошибки во время отправки

Types

type Application

type Application interface {
	GetConfigFilename() string
	// устанавливает путь к файлу с настройками
	SetConfigFilename(string)

	// проверяет валидность пути к файлу с настройками
	IsValidConfigFilename(string) bool

	// устанавливает канал событий приложения
	SetEvents(chan *ApplicationEvent)

	// возвращает канал событий приложения
	Events() chan *ApplicationEvent

	// устанавливает канал завершения приложения
	SetDone(chan bool)

	// возвращает канал завершения приложения
	Done() chan bool

	// возвращает сервисы, используемые приложением
	Services() []interface{}

	// инициализирует сервисы
	FireInit(*ApplicationEvent, interface{})

	// запускает сервисы приложения
	FireRun(*ApplicationEvent, interface{})

	// останавливает сервисы приложения
	FireFinish(*ApplicationEvent, interface{})

	// инициализирует приложение
	Init(*ApplicationEvent)

	// запускает приложение
	Run()

	// запускает приложение с аргументами
	RunWithArgs(...interface{})

	// возвращает таймауты приложения
	Timeout() Timeout
}

проект содержит несколько приложений: pmq-grep, pmq-publish, pmq-report, postmanq и т.д. чтобы упростить и стандартизировать приложения, разработан этот интерфейс

type ApplicationEvent

type ApplicationEvent struct {
	// тип события
	Kind ApplicationEventKind

	// данные из файла настроек
	Data []byte

	// аргументы командной строки
	Args map[string]interface{}
}

событие приложения

func NewApplicationEvent

func NewApplicationEvent(kind ApplicationEventKind) *ApplicationEvent

создает событие с указанным типом

func (*ApplicationEvent) GetBoolArg

func (e *ApplicationEvent) GetBoolArg(key string) bool

возвращает аргумент, как булевый тип

func (*ApplicationEvent) GetIntArg

func (e *ApplicationEvent) GetIntArg(key string) int

возвращает аргумент, как число

func (*ApplicationEvent) GetStringArg

func (e *ApplicationEvent) GetStringArg(key string) string

возвращает аргумент, как строку

type ApplicationEventKind

type ApplicationEventKind int

тип события приложения

const (
	// инициализации сервисов
	InitApplicationEventKind ApplicationEventKind = iota

	// запуск сервисов
	RunApplicationEventKind

	// завершение сервисов
	FinishApplicationEventKind
)

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 {
	Events() chan *SendEvent
}

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

type GrepService

type GrepService interface {
	Service
	OnGrep(*ApplicationEvent)
}

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

type Iterator

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

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

func NewIterator

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

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

func (Iterator) Current

func (i Iterator) Current() interface{}

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

func (Iterator) First

func (i Iterator) First() interface{}

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

func (Iterator) IsDone

func (i Iterator) IsDone() bool

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

func (*Iterator) Next

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

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

type LimitedQueue

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

лимитированная очередь, в ней будут храниться клиенты к почтовым сервисам

func NewLimitQueue

func NewLimitQueue() *LimitedQueue

создает новую лимитированную очередь

func (*LimitedQueue) AddMaxLen

func (l *LimitedQueue) AddMaxLen()

увеличивает максимальную длину очереди

func (*LimitedQueue) HasLimit

func (l *LimitedQueue) HasLimit() bool

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

func (*LimitedQueue) HasLimitOff

func (l *LimitedQueue) HasLimitOff()

снимает лимит очереди

func (*LimitedQueue) HasLimitOn

func (l *LimitedQueue) HasLimitOn()

устанавливает лимит очереди

func (*LimitedQueue) MaxLen

func (l *LimitedQueue) MaxLen() int

максимальная длина очереди до того момента, как был установлен лимит

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 string `json:"body"`

	// домен отправителя, удобно сразу получить и использовать далее
	HostnameFrom string `json:"-"`

	// Домен получателя, удобно сразу получить и использовать далее
	HostnameTo string `json:"-"`

	// дата создания, используется в основном сервисом ограничений
	CreatedDate time.Time `json:"-"`

	// тип очереди, в которою письмо уже было отправлено после неудачной отправки, ипользуется для цепочки очередей
	BindingType DelayedBindingType `json:"bindingType"`

	// ошибка отправки
	Error *MailError `json:"error"`
}

письмо

func (*MailMessage) Init

func (m *MailMessage) Init()

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

type PublishService

type PublishService interface {
	Service
	OnPublish(*ApplicationEvent)
}

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

type Queue

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

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

func NewQueue

func NewQueue() *Queue

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

func (*Queue) Empty

func (q *Queue) Empty() bool

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

func (*Queue) Len

func (q *Queue) Len() int

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

func (*Queue) Pop

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

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

func (*Queue) Push

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

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

type ReportService

type ReportService interface {
	Service
	EventService
	OnShowReport()
}

сервис принимающий участие в агрегации и выводе в консоль писем с ошибками

type SendEvent

type SendEvent struct {
	// елиент для отправки писем
	Client *SmtpClient

	// письмо, полученное из очереди
	Message *MailMessage

	// дата создания необходима при получении подключения к почтовому сервису
	CreateDate time.Time

	// результат
	Result chan SendEventResult

	// количество попыток отправок письма
	TryCount int

	// итератор сервисов, участвующих в отправке письма
	Iterator *Iterator

	// очередь, в которую необходимо будет положить клиента после отправки письма
	Queue *LimitedQueue
}

событие отправки письма

func NewSendEvent

func NewSendEvent(message *MailMessage) *SendEvent

создает событие отправки сообщения

type SendEventResult

type SendEventResult int

результат отправки письма

const (
	// успех
	SuccessSendEventResult SendEventResult = iota

	// превышение лимита
	OverlimitSendEventResult

	// ошибка
	ErrorSendEventResult

	// повторная отправка через некоторое время
	DelaySendEventResult

	// отмена отправки
	RevokeSendEventResult
)

type SendingService

type SendingService interface {
	Service
	EventService
	OnRun()
	OnFinish()
}

сервис принимающий участие в отправке письма

type Service

type Service interface {
	OnInit(*ApplicationEvent)
}

сервис требующий инициализиции данные для инициализиции берутся из файла настроек

type SmtpClient

type SmtpClient struct {
	// идертификатор клиента для удобства в логах
	Id int

	// соединение к почтовому серверу
	Conn net.Conn

	// реальный smtp клиент
	Worker *smtp.Client

	// дата создания или изменения статуса клиента
	ModifyDate time.Time

	// статус
	Status SmtpClientStatus
	// contains filtered or unexported fields
}

клиент почтового сервера

func (*SmtpClient) SetTimeout

func (s *SmtpClient) SetTimeout(timeout time.Duration)

сстанавливайт таймаут на чтение и запись соединения

func (*SmtpClient) Wait

func (s *SmtpClient) Wait()

переводит клиента в ожидание после окончания ожидания соединение разрывается, а статус меняется на отсоединенный

func (*SmtpClient) Wakeup

func (s *SmtpClient) Wakeup()

переводит клиента в рабочее состояние если клиент был в ожидании, ожидание прерывается

type SmtpClientStatus

type SmtpClientStatus int

статус клиента почтового сервера

const (
	// отсылает письмо
	WorkingSmtpClientStatus SmtpClientStatus = iota

	// ожидает письма
	WaitingSmtpClientStatus

	// отсоединен
	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