omidshj
4 years ago
25 changed files with 3818 additions and 168 deletions
-
6.env.example
-
115app/Channels/Messages/SmsMessage.php
-
132app/Channels/SmsChannel.php
-
12app/Enums/sms.php
-
5app/Enums/tables.php
-
456app/Http/Controllers/AuthController.php
-
301app/Http/Controllers/OldAuthController.php
-
10app/Listeners/NotifHandler.php
-
4app/Models/Business.php
-
12app/Models/User.php
-
2app/Notifications/DBNotification.php
-
2app/Notifications/MailNotification.php
-
42app/Notifications/SmsNotification.php
-
4app/Notifications/SocketNotification.php
-
13app/Providers/AppServiceProvider.php
-
15app/Utilities/HelperClass/NotificationHelper.php
-
16config/smsirlaravel.php
-
1database/migrations/2020_08_18_085016_create_users_table.php
-
1database/migrations/2021_03_08_114700_create_notifications_table.php
-
19docker-compose.yml
-
2521filebeat.reference.yml
-
232filebeat.yml
-
19my.cnf
-
22resources/lang/fa/notification.php
-
10routes/api.php
@ -0,0 +1,115 @@ |
|||||
|
<?php |
||||
|
|
||||
|
|
||||
|
namespace App\Channels\Messages; |
||||
|
|
||||
|
|
||||
|
class SmsMessage |
||||
|
{ |
||||
|
|
||||
|
/** |
||||
|
* The devices token to send the message from. |
||||
|
* |
||||
|
* @var array|string |
||||
|
*/ |
||||
|
public $to; |
||||
|
|
||||
|
/** |
||||
|
* The data of the Sms message. |
||||
|
* |
||||
|
* @var array |
||||
|
*/ |
||||
|
public $data; |
||||
|
|
||||
|
/** |
||||
|
* The params that we define in sms.ir template |
||||
|
* when we use ultraFastSend method |
||||
|
* |
||||
|
* @var array |
||||
|
*/ |
||||
|
public $params; |
||||
|
|
||||
|
/** |
||||
|
* The id of template we define in sms.ir |
||||
|
* when we use ultraFastSend method |
||||
|
* |
||||
|
* @var string |
||||
|
*/ |
||||
|
public $template_id; |
||||
|
|
||||
|
/** |
||||
|
* The generated verification code. |
||||
|
* when we use sendVerification method. |
||||
|
* |
||||
|
* @var string |
||||
|
*/ |
||||
|
public $verification_code; |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* Set the devices token to send the message from. |
||||
|
* |
||||
|
* @param array|string $to |
||||
|
* @return $this |
||||
|
*/ |
||||
|
public function to($to) |
||||
|
{ |
||||
|
$this->to = $to; |
||||
|
|
||||
|
return $this; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Set the data of the sms message. |
||||
|
* |
||||
|
* @param array $data |
||||
|
* @return $this |
||||
|
*/ |
||||
|
public function data(array $data) |
||||
|
{ |
||||
|
$this->data = $data; |
||||
|
|
||||
|
return $this; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Set the params of the sms message when we use ultraFastSend method |
||||
|
* |
||||
|
* @param array|mixed $params |
||||
|
* @return $this |
||||
|
*/ |
||||
|
public function params($params) |
||||
|
{ |
||||
|
foreach ($params as $key => $value) { |
||||
|
$this->params[] = ['Parameter' => $key, 'ParameterValue' => $value]; |
||||
|
} |
||||
|
return $this; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Set the template_id of the sms message when we use ultraFastSend method |
||||
|
* |
||||
|
* @param string $template_id |
||||
|
* @return $this |
||||
|
*/ |
||||
|
public function templateId($template_id) |
||||
|
{ |
||||
|
$this->template_id = $template_id; |
||||
|
|
||||
|
return $this; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Set verification_code of sms message when we use sendVerification method |
||||
|
* |
||||
|
* @param string $verification_code |
||||
|
* @return $this |
||||
|
*/ |
||||
|
public function verificationCode(string $verification_code) |
||||
|
{ |
||||
|
$this->verification_code = $verification_code; |
||||
|
|
||||
|
return $this; |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,132 @@ |
|||||
|
<?php |
||||
|
|
||||
|
|
||||
|
namespace App\Channels; |
||||
|
|
||||
|
use App\Channels\Messages\SmsMessage; |
||||
|
use Illuminate\Notifications\Notification; |
||||
|
use GuzzleHttp\Client as HttpClient; |
||||
|
|
||||
|
class SmsChannel |
||||
|
{ |
||||
|
/** |
||||
|
* The API URL for sms. |
||||
|
* |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $sms_url; |
||||
|
|
||||
|
/** |
||||
|
* The api key for sms inside sms.ir panel. |
||||
|
* |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $api_key; |
||||
|
|
||||
|
/** |
||||
|
* The secret key for sms inside sms.ir panel. |
||||
|
* |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $secret_key; |
||||
|
|
||||
|
/** |
||||
|
* The HTTP client instance. |
||||
|
* |
||||
|
* @var \GuzzleHttp\Client |
||||
|
*/ |
||||
|
protected $http; |
||||
|
|
||||
|
/** |
||||
|
* Create a new Socket channel instance. |
||||
|
* |
||||
|
* @param \GuzzleHttp\Client $http |
||||
|
* @return void |
||||
|
*/ |
||||
|
public function __construct(HttpClient $http, string $sms_url, string $api_key, string $secret_key) |
||||
|
{ |
||||
|
$this->http = $http; |
||||
|
$this->sms_url = $sms_url; |
||||
|
$this->api_key = $api_key; |
||||
|
$this->secret_key = $secret_key; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Send the given notification. |
||||
|
* |
||||
|
* @param mixed $notifiable |
||||
|
* @param \Illuminate\Notifications\Notification $notification |
||||
|
* @return void |
||||
|
*/ |
||||
|
public function send($notifiable, Notification $notification) |
||||
|
{ |
||||
|
$message = $notification->toSms($notifiable); |
||||
|
$type = $notification->getType(); |
||||
|
|
||||
|
$message->to($notifiable->routeNotificationFor('sms', $notification)); |
||||
|
|
||||
|
if (! $message->to || (! ($message->params && $message->template_id) && ! $message->verification_code)) { |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
try { |
||||
|
$this->http->post($this->sms_url . 'api/' . $type , [ |
||||
|
'headers' => [ |
||||
|
'x-sms-ir-secure-token'=> $this->getToken() |
||||
|
], |
||||
|
'connect_timeout' => 30, |
||||
|
'json' => $this->buildJsonPayload($message, $type), |
||||
|
]); |
||||
|
} catch (\GuzzleHttp\Exception\ConnectException $e) { |
||||
|
report($e); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* This method used in every request to get the token at first. |
||||
|
* |
||||
|
* @return mixed - the Token for use api |
||||
|
*/ |
||||
|
protected function getToken() |
||||
|
{ |
||||
|
$body = [ |
||||
|
'UserApiKey' => $this->api_key, |
||||
|
'SecretKey' => $this->secret_key, |
||||
|
'System' => 'laravel_v_1_4' |
||||
|
]; |
||||
|
|
||||
|
try { |
||||
|
$result = $this->http->post( $this->sms_url . 'api/Token',['json'=>$body,'connect_timeout'=>30]); |
||||
|
} catch (\GuzzleHttp\Exception\ConnectException $e) { |
||||
|
report($e); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
return json_decode($result->getBody(),true)['TokenKey']; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Create sms json payload based on type |
||||
|
* |
||||
|
* @param SmsMessage $message |
||||
|
* @param $type |
||||
|
* @return array |
||||
|
*/ |
||||
|
protected function buildJsonPayload(SmsMessage $message, $type) { |
||||
|
if ($type === 'UltraFastSend') { |
||||
|
return[ |
||||
|
'ParameterArray' => $message->params, |
||||
|
'TemplateId' => $message->template_id, |
||||
|
'Mobile' => $message->to |
||||
|
]; |
||||
|
} |
||||
|
|
||||
|
if ($type === 'VerificationCode') { |
||||
|
return[ |
||||
|
'Code' => $message->data, |
||||
|
'MobileNumber' => $message->to |
||||
|
]; |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,12 @@ |
|||||
|
<?php |
||||
|
|
||||
|
return [ |
||||
|
'types' => [ |
||||
|
'verification_code' => [ |
||||
|
'name' => 'VerificationCode' |
||||
|
], |
||||
|
'ultra_fast_send' => [ |
||||
|
'name' => 'ultraFastSend' |
||||
|
] |
||||
|
], |
||||
|
]; |
@ -0,0 +1,301 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Http\Controllers; |
||||
|
|
||||
|
use App\Models\User; |
||||
|
use App\Models\Business; |
||||
|
use App\Models\Fingerprint; |
||||
|
use App\Notifications\MailNotification; |
||||
|
use Illuminate\Support\Facades\Notification; |
||||
|
use Illuminate\Support\Str; |
||||
|
use Illuminate\Http\Request; |
||||
|
use Illuminate\Validation\Rule; |
||||
|
use Illuminate\Http\JsonResponse; |
||||
|
use App\Http\Resources\UserResource; |
||||
|
use Illuminate\Support\Facades\Auth; |
||||
|
use Illuminate\Support\Facades\Hash; |
||||
|
use Illuminate\Support\Facades\Cache; |
||||
|
use Laravel\Socialite\Facades\Socialite; |
||||
|
use Illuminate\Session\TokenMismatchException; |
||||
|
use phpDocumentor\Reflection\Type; |
||||
|
use Symfony\Component\HttpFoundation\Response; |
||||
|
|
||||
|
class OldAuthController extends Controller |
||||
|
{ |
||||
|
public function redirectToGoogle() |
||||
|
{ |
||||
|
return Socialite::driver('google')->stateless()->redirect(); |
||||
|
} |
||||
|
|
||||
|
public function handleGoogleCallback(Request $request) |
||||
|
{ |
||||
|
try { |
||||
|
|
||||
|
$user = Socialite::driver('google')->stateless()->user(); |
||||
|
$find_user = User::where('email', $user->email)->first(); |
||||
|
|
||||
|
if ($find_user) { |
||||
|
|
||||
|
$find_user->update([ |
||||
|
'active' => true |
||||
|
]); |
||||
|
|
||||
|
Auth::setUser($find_user); |
||||
|
|
||||
|
} else { |
||||
|
|
||||
|
$user = User::create($user->user + [ |
||||
|
'password' => Hash::make('google-login-user'), |
||||
|
'username' => $user->email, |
||||
|
'active' => true |
||||
|
]); |
||||
|
|
||||
|
Auth::setUser($user); |
||||
|
|
||||
|
} |
||||
|
$finger_print = $this->createFingerPrint(); |
||||
|
return redirect('http://localhost:3000/login?token='.$finger_print->token); |
||||
|
|
||||
|
} catch (Exception $e) { |
||||
|
dd($e->getMessage()); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function login(Request $request) |
||||
|
{ |
||||
|
// todo: Logging in from a new device will result in sending a notification
|
||||
|
$this->validate($request, [ |
||||
|
'email' => 'required|email|exists:users,email', |
||||
|
'password' => 'required|string|min:6' |
||||
|
]); |
||||
|
|
||||
|
$user = User::where('email', $request->email)->first(); |
||||
|
if ($user && Hash::check($request->password, $user->password)) { |
||||
|
Auth::setUser($user); |
||||
|
|
||||
|
return [ |
||||
|
'auth' => $this->createFingerPrint(), |
||||
|
'businesses' => Auth::user()->businesses->keyBy('id')->map(fn($b, $bid) => Business::info($bid)) |
||||
|
]; |
||||
|
} |
||||
|
|
||||
|
return new JsonResponse([ |
||||
|
'message' => trans('auth.failed'), |
||||
|
'status' => Response::HTTP_NOT_FOUND, |
||||
|
], Response::HTTP_NOT_FOUND); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public function register(Request $request) |
||||
|
{ |
||||
|
$this->validate($request, [ |
||||
|
'name' => 'required|string|max:225|min:2', |
||||
|
'username' => ['required', Rule::unique('users', 'username')], |
||||
|
'email' => ['required', 'email', Rule::unique('users', 'email')], |
||||
|
'password' => 'required|string|min:8' |
||||
|
]); |
||||
|
|
||||
|
$request->merge(['password' => Hash::make($request->password)]); |
||||
|
|
||||
|
$code_data = ['verification_code' => $this->sendVerificationCode(\request('email'), 'register')]; |
||||
|
$method_data = ['method' => 'registerMain']; |
||||
|
|
||||
|
Cache::put($request->email, $request->all() + $code_data + $method_data, 3600); // remain one hour
|
||||
|
|
||||
|
return \response()->json([ |
||||
|
'message' => 'Code send for user and user must be verified.'], |
||||
|
Response::HTTP_OK); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
public function registerMain($user_info) |
||||
|
{ |
||||
|
$user = User::create($user_info); |
||||
|
|
||||
|
Auth::setUser($user); |
||||
|
|
||||
|
return $this->createFingerPrint(); |
||||
|
} |
||||
|
|
||||
|
public function sendVerificationCode($contact_way, $type) |
||||
|
{ |
||||
|
$verification_code = rand(10001, 99999); |
||||
|
|
||||
|
Notification::route('mail', $contact_way)->notify( new MailNotification([ |
||||
|
'greeting' => __('notification.auth.verification.greeting'), |
||||
|
'subject' => __('notification.auth.verification.subject'), |
||||
|
'body' => __('notification.auth.verification.body', ['code' => $verification_code]), |
||||
|
'link' => __('notification.auth.verification.link', ['email' => $contact_way, 'type' => $type]), |
||||
|
])); |
||||
|
|
||||
|
return $verification_code; |
||||
|
} |
||||
|
|
||||
|
public function verification(Request $request) |
||||
|
{ |
||||
|
if (!Cache::has($request->email)) { |
||||
|
return \response()->json(['message' => 'Code expired.'], Response::HTTP_BAD_REQUEST); |
||||
|
} |
||||
|
|
||||
|
$user_info = Cache::get($request->email); |
||||
|
|
||||
|
$this->validate($request, [ |
||||
|
'email' => 'required|email', |
||||
|
'verification_code' => 'required|string|min:4|max:4|in:'.$user_info['verification_code'] |
||||
|
]); |
||||
|
|
||||
|
// Cache::forget($request->email);
|
||||
|
|
||||
|
if (isset($user_info['method'])) { |
||||
|
Cache::forget($request->email); |
||||
|
return call_user_func('self::'.$user_info['method'], $user_info); |
||||
|
} |
||||
|
|
||||
|
return \response()->json(['message' => 'Code verified successfully.'], Response::HTTP_OK,); |
||||
|
|
||||
|
// return isset($user_info['method']) ?
|
||||
|
// call_user_func('self::'.$user_info['method'], $user_info) :
|
||||
|
// \response()->json(['message' => 'Code verified successfully.'], Response::HTTP_OK,);
|
||||
|
} |
||||
|
|
||||
|
public function forgetPassword(Request $request) |
||||
|
{ |
||||
|
$this->validate($request, [ |
||||
|
'email' => 'required|email|exists:users,email' |
||||
|
]); |
||||
|
|
||||
|
$code_data = ['verification_code' => $this->sendVerificationCode(\request('email', 'forget'))]; |
||||
|
|
||||
|
Cache::put($request->email, $request->all() + $code_data, 3600); // remain one hour
|
||||
|
|
||||
|
return \response()->json([ |
||||
|
'message' => 'Code send for user and user must be verified.'], |
||||
|
Response::HTTP_OK); |
||||
|
} |
||||
|
|
||||
|
public function updatePassword(Request $request) |
||||
|
{ |
||||
|
if (!Cache::has($request->email)) { |
||||
|
return \response()->json(['message' => 'Code expired.'], Response::HTTP_BAD_REQUEST); |
||||
|
} |
||||
|
|
||||
|
$this->validate($request, [ |
||||
|
'email' => 'required|email', |
||||
|
'password' => 'required|string|min:8|confirmed', |
||||
|
'verification_code' => 'required|string|min:4|max:4|in:'.Cache::get($request->email)['verification_code'] |
||||
|
]); |
||||
|
|
||||
|
$user = User::where('email', $request->email)->first(); |
||||
|
|
||||
|
$user->update([ |
||||
|
'password' => Hash::make($request->password) |
||||
|
]); |
||||
|
|
||||
|
Auth::setUser($user); |
||||
|
|
||||
|
Cache::forget($request->email); |
||||
|
|
||||
|
return $this->createFingerPrint(); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @param Request $request |
||||
|
* @return mixed |
||||
|
* @throws TokenMismatchException |
||||
|
*/ |
||||
|
public function logout(Request $request) |
||||
|
{ |
||||
|
$token = $request->bearerToken(); |
||||
|
|
||||
|
if (blank($token)) { |
||||
|
return new JsonResponse([ |
||||
|
'message' => 'Not authorized request.', |
||||
|
'status' => Response::HTTP_UNAUTHORIZED |
||||
|
]); |
||||
|
} |
||||
|
|
||||
|
/** @var Fingerprint $token */ |
||||
|
$token = Auth::user()->fingerprints()->firstWhere([ |
||||
|
'token' => $token, |
||||
|
]); |
||||
|
|
||||
|
if ($token) { |
||||
|
return $token->delete(); |
||||
|
} |
||||
|
|
||||
|
throw new TokenMismatchException('Invalid token!'); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @param string $token |
||||
|
* @throws TokenMismatchException |
||||
|
*/ |
||||
|
public function revoke(string $token) |
||||
|
{ |
||||
|
/** @var Fingerprint $token */ |
||||
|
$token = Fingerprint::firstWhere([ |
||||
|
'token' => $token, |
||||
|
]); |
||||
|
|
||||
|
if ($token) { |
||||
|
return $token->delete(); |
||||
|
} |
||||
|
|
||||
|
throw new TokenMismatchException(); |
||||
|
} |
||||
|
|
||||
|
public function auth() |
||||
|
{ |
||||
|
return new UserResource(Auth::user()); |
||||
|
} |
||||
|
|
||||
|
public function authWithInfo() |
||||
|
{ |
||||
|
return [ |
||||
|
'auth' => new UserResource(Auth::user()), |
||||
|
'businesses' => Auth::user()->businesses->keyBy('id') ->map(fn($b, $bid) => Business::info($bid)) |
||||
|
]; |
||||
|
} |
||||
|
|
||||
|
public function delete(Request $request) |
||||
|
{ |
||||
|
Auth::user()->fingerprints()->delete(); |
||||
|
unset(Auth::user()->token); |
||||
|
Auth::user()->delete(); |
||||
|
|
||||
|
return 'success'; |
||||
|
} |
||||
|
|
||||
|
public function updateFcmToken(Request $request) |
||||
|
{ |
||||
|
Auth::user()->fingerprints()->where( |
||||
|
[ |
||||
|
['agent', request()->getAgent()], |
||||
|
['ip', request()->getClientIp()], |
||||
|
['os', request()->getOS()], |
||||
|
['latitude', \request()->getLocation()->getAttribute('lat')], |
||||
|
['longitude', \request()->getLocation()->getAttribute('lon')], |
||||
|
] |
||||
|
)->firstOrFail()->update([ |
||||
|
'fcm_token' => $request->fcm_token |
||||
|
]); |
||||
|
return $this->authWithInfo(); |
||||
|
} |
||||
|
|
||||
|
public function createFingerPrint() |
||||
|
{ |
||||
|
$attributes = [ |
||||
|
'agent' => request()->getAgent(), |
||||
|
'ip' => request()->getClientIp(), |
||||
|
'os' => request()->getOS(), |
||||
|
'latitude' => \request()->getLocation()->getAttribute('lat'), |
||||
|
'longitude' => \request()->getLocation()->getAttribute('lon'), |
||||
|
]; |
||||
|
|
||||
|
$values = [ |
||||
|
'token' => Str::random(60) |
||||
|
]; |
||||
|
|
||||
|
return Auth::user()->fingerprints()->firstOrCreate($attributes, $attributes + $values); |
||||
|
} |
||||
|
} |
@ -0,0 +1,16 @@ |
|||||
|
<?php |
||||
|
|
||||
|
return [ |
||||
|
|
||||
|
/* Important Settings */ |
||||
|
|
||||
|
// ======================================================================
|
||||
|
'webservice-url' => env('SMSIR_WEBSERVICE_URL','https://ws.sms.ir/'), |
||||
|
// SMS.ir Api Key
|
||||
|
'api-key' => env('SMSIR_API_KEY',null), |
||||
|
// SMS.ir Secret Key
|
||||
|
'secret-key' => env('SMSIR_SECRET_KEY',null), |
||||
|
// Your sms.ir line number
|
||||
|
'line-number' => env('SMSIR_LINE_NUMBER',null), |
||||
|
// ======================================================================
|
||||
|
]; |
2521
filebeat.reference.yml
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,232 @@ |
|||||
|
filebeat.config: |
||||
|
modules: |
||||
|
path: ${path.config}/modules.d/*.yml |
||||
|
reload.enabled: false |
||||
|
|
||||
|
processors: |
||||
|
- add_cloud_metadata: ~ |
||||
|
- add_docker_metadata: ~ |
||||
|
|
||||
|
filebeat.inputs: |
||||
|
#------------------------------ Log input -------------------------------- |
||||
|
- type: log |
||||
|
|
||||
|
# Change to true to enable this input configuration. |
||||
|
enabled: true |
||||
|
|
||||
|
# Paths that should be crawled and fetched. Glob based paths. |
||||
|
# To fetch all ".log" files from a specific level of subdirectories |
||||
|
# /var/log/*/*.log can be used. |
||||
|
# For each file found under this path, a harvester is started. |
||||
|
# Make sure not file is defined twice as this can lead to unexpected behaviour. |
||||
|
paths: |
||||
|
- /var/log/mysql/*.log |
||||
|
#- c:\programdata\elasticsearch\logs\* |
||||
|
|
||||
|
# Configure the file encoding for reading files with international characters |
||||
|
# following the W3C recommendation for HTML5 (http://www.w3.org/TR/encoding). |
||||
|
# Some sample encodings: |
||||
|
# plain, utf-8, utf-16be-bom, utf-16be, utf-16le, big5, gb18030, gbk, |
||||
|
# hz-gb-2312, euc-kr, euc-jp, iso-2022-jp, shift-jis, ... |
||||
|
#encoding: plain |
||||
|
|
||||
|
|
||||
|
# Exclude lines. A list of regular expressions to match. It drops the lines that are |
||||
|
# matching any regular expression from the list. The include_lines is called before |
||||
|
# exclude_lines. By default, no lines are dropped. |
||||
|
#exclude_lines: ['^DBG'] |
||||
|
|
||||
|
# Include lines. A list of regular expressions to match. It exports the lines that are |
||||
|
# matching any regular expression from the list. The include_lines is called before |
||||
|
# exclude_lines. By default, all the lines are exported. |
||||
|
#include_lines: ['^ERR', '^WARN'] |
||||
|
|
||||
|
# Exclude files. A list of regular expressions to match. Filebeat drops the files that |
||||
|
# are matching any regular expression from the list. By default, no files are dropped. |
||||
|
#exclude_files: ['.gz$'] |
||||
|
|
||||
|
# Method to determine if two files are the same or not. By default |
||||
|
# the Beat considers two files the same if their inode and device id are the same. |
||||
|
#file_identity.native: ~ |
||||
|
|
||||
|
# Optional additional fields. These fields can be freely picked |
||||
|
# to add additional information to the crawled log files for filtering |
||||
|
#fields: |
||||
|
# level: debug |
||||
|
# review: 1 |
||||
|
|
||||
|
# Set to true to store the additional fields as top level fields instead |
||||
|
# of under the "fields" sub-dictionary. In case of name conflicts with the |
||||
|
# fields added by Filebeat itself, the custom fields overwrite the default |
||||
|
# fields. |
||||
|
#fields_under_root: false |
||||
|
|
||||
|
# Set to true to publish fields with null values in events. |
||||
|
#keep_null: false |
||||
|
|
||||
|
# By default, all events contain `host.name`. This option can be set to true |
||||
|
# to disable the addition of this field to all events. The default value is |
||||
|
# false. |
||||
|
#publisher_pipeline.disable_host: false |
||||
|
|
||||
|
# Ignore files which were modified more then the defined timespan in the past. |
||||
|
# ignore_older is disabled by default, so no files are ignored by setting it to 0. |
||||
|
# Time strings like 2h (2 hours), 5m (5 minutes) can be used. |
||||
|
#ignore_older: 0 |
||||
|
|
||||
|
# How often the input checks for new files in the paths that are specified |
||||
|
# for harvesting. Specify 1s to scan the directory as frequently as possible |
||||
|
# without causing Filebeat to scan too frequently. Default: 10s. |
||||
|
#scan_frequency: 10s |
||||
|
|
||||
|
# Defines the buffer size every harvester uses when fetching the file |
||||
|
#harvester_buffer_size: 16384 |
||||
|
|
||||
|
# Maximum number of bytes a single log event can have |
||||
|
# All bytes after max_bytes are discarded and not sent. The default is 10MB. |
||||
|
# This is especially useful for multiline log messages which can get large. |
||||
|
#max_bytes: 10485760 |
||||
|
|
||||
|
# Characters which separate the lines. Valid values: auto, line_feed, vertical_tab, form_feed, |
||||
|
# carriage_return, carriage_return_line_feed, next_line, line_separator, paragraph_separator. |
||||
|
#line_terminator: auto |
||||
|
|
||||
|
### Recursive glob configuration |
||||
|
|
||||
|
# Expand "**" patterns into regular glob patterns. |
||||
|
#recursive_glob.enabled: true |
||||
|
|
||||
|
### JSON configuration |
||||
|
|
||||
|
# Decode JSON options. Enable this if your logs are structured in JSON. |
||||
|
# JSON key on which to apply the line filtering and multiline settings. This key |
||||
|
# must be top level and its value must be string, otherwise it is ignored. If |
||||
|
# no text key is defined, the line filtering and multiline features cannot be used. |
||||
|
#json.message_key: |
||||
|
|
||||
|
# By default, the decoded JSON is placed under a "json" key in the output document. |
||||
|
# If you enable this setting, the keys are copied top level in the output document. |
||||
|
#json.keys_under_root: false |
||||
|
|
||||
|
# If keys_under_root and this setting are enabled, then the values from the decoded |
||||
|
# JSON object overwrite the fields that Filebeat normally adds (type, source, offset, etc.) |
||||
|
# in case of conflicts. |
||||
|
#json.overwrite_keys: false |
||||
|
|
||||
|
# If this setting is enabled, then keys in the decoded JSON object will be recursively |
||||
|
# de-dotted, and expanded into a hierarchical object structure. |
||||
|
# For example, `{"a.b.c": 123}` would be expanded into `{"a":{"b":{"c":123}}}`. |
||||
|
#json.expand_keys: false |
||||
|
|
||||
|
# If this setting is enabled, Filebeat adds a "error.message" and "error.key: json" key in case of JSON |
||||
|
# unmarshaling errors or when a text key is defined in the configuration but cannot |
||||
|
# be used. |
||||
|
#json.add_error_key: false |
||||
|
|
||||
|
### Multiline options |
||||
|
|
||||
|
# Multiline can be used for log messages spanning multiple lines. This is common |
||||
|
# for Java Stack Traces or C-Line Continuation |
||||
|
|
||||
|
# The regexp Pattern that has to be matched. The example pattern matches all lines starting with [ |
||||
|
# multiline.pattern: ^\[ |
||||
|
|
||||
|
# Defines if the pattern set under pattern should be negated or not. Default is false. |
||||
|
#multiline.negate: false |
||||
|
|
||||
|
# Match can be set to "after" or "before". It is used to define if lines should be append to a pattern |
||||
|
# that was (not) matched before or after or as long as a pattern is not matched based on negate. |
||||
|
# Note: After is the equivalent to previous and before is the equivalent to to next in Logstash |
||||
|
#multiline.match: after |
||||
|
|
||||
|
# The maximum number of lines that are combined to one event. |
||||
|
# In case there are more the max_lines the additional lines are discarded. |
||||
|
# Default is 500 |
||||
|
#multiline.max_lines: 500 |
||||
|
|
||||
|
# After the defined timeout, an multiline event is sent even if no new pattern was found to start a new event |
||||
|
# Default is 5s. |
||||
|
#multiline.timeout: 5s |
||||
|
|
||||
|
# To aggregate constant number of lines into a single event use the count mode of multiline. |
||||
|
#multiline.type: count |
||||
|
|
||||
|
# The number of lines to aggregate into a single event. |
||||
|
#multiline.count_lines: 3 |
||||
|
|
||||
|
# Do not add new line character when concatenating lines. |
||||
|
#multiline.skip_newline: false |
||||
|
|
||||
|
# Setting tail_files to true means filebeat starts reading new files at the end |
||||
|
# instead of the beginning. If this is used in combination with log rotation |
||||
|
# this can mean that the first entries of a new file are skipped. |
||||
|
#tail_files: false |
||||
|
|
||||
|
# The Ingest Node pipeline ID associated with this input. If this is set, it |
||||
|
# overwrites the pipeline option from the Elasticsearch output. |
||||
|
#pipeline: |
||||
|
|
||||
|
# If symlinks is enabled, symlinks are opened and harvested. The harvester is opening the |
||||
|
# original for harvesting but will report the symlink name as source. |
||||
|
#symlinks: false |
||||
|
|
||||
|
# Backoff values define how aggressively filebeat crawls new files for updates |
||||
|
# The default values can be used in most cases. Backoff defines how long it is waited |
||||
|
# to check a file again after EOF is reached. Default is 1s which means the file |
||||
|
# is checked every second if new lines were added. This leads to a near real time crawling. |
||||
|
# Every time a new line appears, backoff is reset to the initial value. |
||||
|
#backoff: 1s |
||||
|
|
||||
|
# Max backoff defines what the maximum backoff time is. After having backed off multiple times |
||||
|
# from checking the files, the waiting time will never exceed max_backoff independent of the |
||||
|
# backoff factor. Having it set to 10s means in the worst case a new line can be added to a log |
||||
|
# file after having backed off multiple times, it takes a maximum of 10s to read the new line |
||||
|
#max_backoff: 10s |
||||
|
|
||||
|
# The backoff factor defines how fast the algorithm backs off. The bigger the backoff factor, |
||||
|
# the faster the max_backoff value is reached. If this value is set to 1, no backoff will happen. |
||||
|
# The backoff value will be multiplied each time with the backoff_factor until max_backoff is reached |
||||
|
#backoff_factor: 2 |
||||
|
|
||||
|
# Max number of harvesters that are started in parallel. |
||||
|
# Default is 0 which means unlimited |
||||
|
#harvester_limit: 0 |
||||
|
|
||||
|
### Harvester closing options |
||||
|
|
||||
|
# Close inactive closes the file handler after the predefined period. |
||||
|
# The period starts when the last line of the file was, not the file ModTime. |
||||
|
# Time strings like 2h (2 hours), 5m (5 minutes) can be used. |
||||
|
#close_inactive: 5m |
||||
|
|
||||
|
# Close renamed closes a file handler when the file is renamed or rotated. |
||||
|
# Note: Potential data loss. Make sure to read and understand the docs for this option. |
||||
|
#close_renamed: false |
||||
|
|
||||
|
# When enabling this option, a file handler is closed immediately in case a file can't be found |
||||
|
# any more. In case the file shows up again later, harvesting will continue at the last known position |
||||
|
# after scan_frequency. |
||||
|
#close_removed: true |
||||
|
|
||||
|
# Closes the file handler as soon as the harvesters reaches the end of the file. |
||||
|
# By default this option is disabled. |
||||
|
# Note: Potential data loss. Make sure to read and understand the docs for this option. |
||||
|
#close_eof: false |
||||
|
|
||||
|
### State options |
||||
|
|
||||
|
# Files for the modification data is older then clean_inactive the state from the registry is removed |
||||
|
# By default this is disabled. |
||||
|
#clean_inactive: 0 |
||||
|
|
||||
|
# Removes the state for file which cannot be found on disk anymore immediately |
||||
|
#clean_removed: true |
||||
|
|
||||
|
# Close timeout closes the harvester after the predefined time. |
||||
|
# This is independent if the harvester did finish reading the file or not. |
||||
|
# By default this option is disabled. |
||||
|
# Note: Potential data loss. Make sure to read and understand the docs for this option. |
||||
|
#close_timeout: 0 |
||||
|
|
||||
|
output.logstash: |
||||
|
hosts: ["graylog:5044"] |
@ -0,0 +1,19 @@ |
|||||
|
[mysqld] |
||||
|
sync_binlog = 1 |
||||
|
innodb_buffer_pool_size = 1G |
||||
|
innodb_log_file_size = 2047M |
||||
|
innodb_flush_log_at_trx_commit = 0 |
||||
|
innodb_flush_method = O_DIRECT |
||||
|
innodb_buffer_pool_instances = 8 |
||||
|
innodb_thread_concurrency = 8 |
||||
|
innodb_io_capacity = 1000 |
||||
|
innodb_io_capacity_max = 3000 |
||||
|
innodb_buffer_pool_dump_pct = 75 |
||||
|
innodb_adaptive_hash_index_parts = 16 |
||||
|
innodb_read_io_threads = 16 |
||||
|
innodb_write_io_threads = 16 |
||||
|
innodb_flush_neighbors = 0 |
||||
|
innodb_flushing_avg_loops = 100 |
||||
|
innodb_page_cleaners = 8 |
||||
|
long_query_time = 0.2 |
||||
|
slow_query_log = ON |
Write
Preview
Loading…
Cancel
Save
Reference in new issue