10/29/2019

Line Bot : Line แบบ Push สามารถทำเขียน php แล้วเรียกใช้ผ่าน Crontab ก็ได้ Run จาก หน้า php

Line Bot : Line แบบ Push สามารถทำเขียน php แล้วเรียกใช้ผ่าน Crontab ก็ได้ Run จาก หน้า php
ไม่ต้องส่ง reply จาก Line
Test Run ผ่านหน้า Web
หรือ ผ่าน Terminal command php
  1. <?php
  2.  
  3. $ACCESS_TOKEN = "XXX";
  4.  
  5.    $content = file_get_contents('php://input');
  6.    $arrayJson = json_decode($content, true);
  7.    $arrayHeader = array();
  8.    $arrayHeader[] = "Content-Type: application/json";
  9.    $arrayHeader[] = "Authorization: Bearer {$ACCESS_TOKEN}";
  10.    //รับข้อความจากผู้ใช้
  11. //   $message = $arrayJson['events'][0]['message']['text'];
  12.    //รับ id ของผู้ใช้
  13. //   $id = $arrayJson['events'][0]['source']['userId'];
  14. //   #ตัวอย่าง Message Type "Text + Sticker"
  15. //   if($message == "สวัสดี"){
  16.  
  17.       $arrayPostData['to'] = 'UID XXXXX'; //Test Suwit
  18.  
  19.       $arrayPostData['messages'][0]['type'] = "text";
  20.       $arrayPostData['messages'][0]['text'] = "สวัสดีจ้าาา";
  21.  
  22.       $arrayPostData['messages'][1]['type'] = "sticker";
  23.       $arrayPostData['messages'][1]['packageId'] = "2";
  24.       $arrayPostData['messages'][1]['stickerId'] = "34";
  25.       pushMsg($arrayHeader, $arrayPostData);
  26. //   }
  27.  
  28.    function pushMsg($arrayHeader,$arrayPostData){
  29.       $strUrl = "https://api.line.me/v2/bot/message/push";
  30.       $ch = curl_init();
  31.       curl_setopt($ch, CURLOPT_URL,$strUrl);
  32.       curl_setopt($ch, CURLOPT_HEADER, false);
  33.       curl_setopt($ch, CURLOPT_POST, true);
  34.       curl_setopt($ch, CURLOPT_HTTPHEADER, $arrayHeader);
  35.       curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($arrayPostData));
  36.       curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
  37.       curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  38.       $result = curl_exec($ch);
  39.       curl_close ($ch);
  40.    }
  41. ?>

Line Bot : หา User ID ของ Line เพื่อระบุตัวตนว่า ID Line นี้เป็นของใคร

Line Bot : หา User ID ของ Line เพื่อระบุตัวตนว่า ID Line นี้เป็นของใคร
echo ดูในคำสั่ง bot line หรือ Save To logs แล้วค่อยไปบันทึกเอาก็ได้ จะได้รู้ว่า Line ที่พิมพ์มานี้เป็นของใคร หรือ Group นี้ ID อะไร เป็นต้น Add Bot เข้ากลุ่ม แล้วให้คนอื่นลองพิมพ์ ก็จะได้ ID ของ คนนั้นมาเก็บ
  1. $API_URL = 'https://api.line.me/v2/bot/message';
  2. //###### Token Line Bot Register ######//
  3. $accessToken = "XX";//copy Channel access token ตอนที่ตั้งค่ามาใส่
  4.  
  5. $request = file_get_contents('php://input');   // Get request content
  6. $request_array = json_decode($request, true);   // Decode JSON to Array
  7.  
  8. $arrayHeader = array();
  9. $arrayHeader[] = "Content-Type: application/json";
  10. $arrayHeader[] = "Authorization: Bearer {$accessToken}";
  11.  
  12. //########### Find IDUser IDGroup IDRoom From Source ###############//
  13. if ( sizeof($request_array['events']) > 0 ) {
  14.     foreach ($request_array['events'] as $event) {
  15.         $reply_message = '';
  16.         $reply_token = $event['replyToken'];
  17.  
  18.     if(isset($event['source']['userId'])){
  19.         $id = $event['source']['userId'];
  20.     } else if(isset($event['source']['groupId'])){
  21.         $id = $event['source']['groupId'];
  22.     } else if(isset($event['source']['room'])){
  23.         $id = $event['source']['room'];
  24.     }
  25.  
  26.     $text = $event['message']['text'];
  27.         list($flag, $cmd, $parm1) = explode(' ', $text);
  28.         //###Call Function Save Log ###//
  29.         //saveBotLog($text, $id);
  30.         if($flag == "bot:"){        
  31.             //saveBotLog($text, $id);
  32.             if($cmd == "id"){
  33.                 //$output = getFX();
  34.                 $arrayPostData['replyToken'] = $request_array['events'][0]['replyToken'];
  35.                 $arrayPostData['messages'][0]['type'] = "text";
  36.                 $arrayPostData['messages'][0]['text'] = $id;
  37.                 replyMsg($arrayHeader,$arrayPostData);
  38.            }
  39.            // ###### Not Word bot Not reply ######## //
  40.             if(!empty($output)){    
  41.                 $data = [
  42.                 'replyToken' => $reply_token,
  43.                 'messages' => [['type' => 'text', 'text' => $output ]]
  44.                     ];
  45.                     $post_body = json_encode($data, JSON_UNESCAPED_UNICODE);
  46.                     $send_result = send_reply_message($API_URL.'/reply', $POST_HEADER, $post_body);
  47.                         echo "Result: ".$send_result."\r\n";
  48.             }//Close If empty.
  49.         }//Close If bot.
  50.     }//Close For.
  51. }//Close If.

10/28/2019

PI : Pi Camera Last version with python 3

Old version Use Python2
https://intranet.sci.com/blog.php?u=281&b=1667

PI : Pi Camera Last version with python 3
ที่แตกต่างจาก python2 คือคำสั่ง python จะไม่เหมือนกัน ต้องเขียน Code ใหม่
https://pypi.org/project/slackclient/
เช่น
print
เดิม print ตัวแปร
ใหม่ print (ตัวแปร, " ")

with open ใช้ไม่ได้ Error python io

from slackclient import SlackClient
ต้องเปลี่ยนเป็น
from slack import WebClient

code ส่งข้อความ
เดิม
  1. from slackclient import SlackClient
  2. sc = SlackClient("XXXXXXXXX")
  3. sc.api_call(
  4.    "chat.postMessage",
  5.     channel="CF6GEHBDF",
  6.     text="Hello from Python! camera :tada:"
  7. )

ใหม่
  1. from slack import WebClient
  2. client = WebClient("XXXXXXX")
  3. response = client.chat_postMessage(
  4.    channel='#wifi',
  5.    text="Test")

ใช้เป็น client.chat_postMessage และ client.file_upload เป็นต้น ตามนี้

https://pypi.org/project/slackclient/

วิธีลง ที่เพิ่มขึ้นมาคือ
1. ลง slackclient ด้วยคำสั่ง
  1. pip install slackclient

ไม่ได้จะ Error
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting slackclient
Using cached https://www.piwheels.org/simple/slackcl ... ne-any.whl
slackclient requires Python '>=3.6.0' but the running Python is 2.7.16


ต้อง ลง pip3 สำหรับ python3
1.1. ลง pip3
  1. apt-get install python3-pip

1.2. ลง slackclient
  1. pip3 install slackclient


2. ดู python version ต้องเป็นตัวเดียวกัน
root@raspberrypi:/home/pi/Monitor# python --version
Python 3.7.3
root@raspberrypi:/home/pi/Monitor# python3 --version
Python 3.7.3

ถ้าเป็นแบบนี้จะ run ไม่ได้ หา Module ไม่พบ
root@raspberrypi:/home/pi# python --version
Python 2.7.2
root@raspberrypi:/home/pi# python3 --version
Python 3.7.3


ติดตั้ง python 3.7.0 ตาม Link เพื่อให้เหมือนกัน
https://installvirtual.com/install-python-3-7-on-raspberry-pi/

ทำต่างขั้นสุดท้าย
2.1. แก้ให้โปรแกรม เป็น Default
  1. nano ~/.bashrc

เพิ่ม
alias python='python3'

2.2. run
  1. source ~/.bashrc


ทดลองสร้าง python แล้ว Run คำสั่ง จะสามารถส่ง Slack ได้
(ถ้าไม่ได้ทำข้อ 2 ลองใช้คำสั่ง )
python3 ตามด้วยไฟล์.py ก็ได้เช่นกัน

3. คำสั่งเพิ่มเติม
ดู slackclient version
  1. pip3 list

Update slackclient version
  1. pip3 install slackclient --upgrade


4. เพิ่มเติมใน Motion ไม่ทำงาน ไม่ run คำสั่ง python ที่ไฟล์ motion.conf ถึงจะทำงาน
เดิม ใช้
  1. on_movie_start python /home/pi/slack_post.py

ใหม่ต้องใส่ path ของโปรแกรมด้วย
  1. on_movie_start /usr/bin/python3 /home/pi/slack_post.py

นอกนั้น Set ตามของเดิม
https://intranet.sci.com/blog.php?u=281&b=1667

Code สำเหร็จ
Code สำเร็จ slack_post.py
  1. import glob
  2. import os
  3. import time
  4. import glob
  5.  
  6. from slack import WebClient
  7. client = WebClient("XXXXXXXXX")
  8.  
  9. time.sleep(2)   # Delays for 5 seconds. You can also use a float value.
  10.  
  11. list_of_files = glob.glob('/home/pi/Monitor/*.jpg') # * means all if need specific format then *.csv
  12. latest_file = max(list_of_files, key=os.path.getctime)
  13. #print (latest_file, " ")
  14.  
  15. head, tail = os.path.split(latest_file)
  16. pathName = head+'/'+tail
  17. #with open(latest_file) as file_content:
  18. response = client.files_upload(
  19.    channels="test",
  20.    file=pathName,
  21.    title="Find movement in room IF."
  22.    )
  23.  

Home Assistant : ติดตั้ง Tracking Wifi แจ้งเตือนผ่าน Slack+Mail

Home Assistant : ติดตั้ง Tracking Wifi แจ้งเตือนผ่าน Slack+Mail
IP: 192.168.0.50:8123
1. ติดตั้ง Home Assistant + Mqtt
https://intranet.sci.com/blog.php?u=281&b=1603

** ใช้วง 0 เพราะ Access point TP-Ling TL-WR841ND ไม่รองรับการ Ping ข้าม Subnet คนละวง ทำให้ Track Ping ไม่ติด**

2. สร้าง Device สร้างไฟล์ known_devices.yaml เพื่อให้นำมา Track ได้หลาย Devices เช่น
  1. 19LIB:
  2.   hide_if_away: false
  3.   icon:
  4.   mac:
  5.   name: 19LIB
  6.   picture:
  7.   track: true
  8.   vendor:
  9.   gravatar: suwit@scivalve.com
  10. 20WH:
  11.   hide_if_away: false
  12.   icon:
  13.   mac:
  14.   name: 20WH
  15.   picture:
  16.   track: true
  17.   vendor:
  18.   gravatar: suwit@scivalve.com
  19. 226MN:
  20.   hide_if_away: false
  21.   icon:
  22.   mac:
  23.   name: 226MN
  24.   picture:
  25.   track: true
  26.   vendor:
  27.   gravatar: suwit@scivalve.com


3. แก้ไฟล์ configuration.yaml
  1. #//////////// SCI ADD //////////////////#
  2. # interval_seconds ping every 30 seconds.
  3. # consider_home if ping not reply 300 seconds change status to away. Mark Not Use.
  4. device_tracker:
  5.   - platform: ping
  6.     interval_seconds: 30
  7.     #consider_home: 300
  8.     hosts:
  9.       19LIB: 192.168.0.19
  10.       20WH: 192.168.0.20
  11.       226MN: 192.168.0.226
  12.       223S2: 192.168.0.223
  13.       221PD1: 192.168.0.221
  14.       227PD2: 192.168.0.227
  15.       37QA: 192.168.0.37
  16.       173Test: 192.168.0.173
  17.  
  18. mqtt:
  19.   broker: 127.0.0.1
  20. notify:
  21.   - name: ha_slack
  22.     platform: slack
  23.     api_key: XXXXXXXXXXXXXXXXXXXXXXX Token ID
  24.     default_channel: '#wifi'
  25.  
  26.   - name: "SendMail"
  27.     platform: smtp
  28.     server: smtp.gmail.com
  29.     port: 587
  30.     timeout: 15
  31.     sender: scivalve.suwit@gmail.com
  32.     encryption: starttls
  33.     username: scivalve.suwit@gmail.com
  34.     password: xxxxxxxx
  35.     recipient:
  36.       - suwit.jph@gmail.com
  37.       - komkid@gmail.com
  38.       - seksan.kamt56@gmail.com
  39.     sender_name: Home Assistant Check WIFI


4. สร้าง Automation ส่งเมล์ และ ส่ง Slack เมื่อ Status Wifi ไม่ใช่ Home เช่น
  1. - id: '1569644672332'
  2.   alias: Check_173Test
  3.   trigger:
  4.   - entity_id: device_tracker.173test
  5.     platform: state
  6.   condition:
  7.   - after: '8:00'
  8.     before: '18:00'
  9.     condition: time
  10.   - condition: state
  11.     entity_id: device_tracker.173test
  12.     state: not_home
  13.   action:
  14.   - data:
  15.       message: 'Can''t connect WIFI 192.168.0.173 Test.! : {{ now ().year }}-{{ now
  16.         ().month }}-{{ now ().day }}_{{ now ().hour }}-{{ now ().minute }}-{{ now
  17.         ().second }}'
  18.     service: notify.sendmail
  19.   - data:
  20.       message: 'Can''t connect WIFI 192.168.0.173 Test.! : {{ now ().year }}-{{ now
  21.         ().month }}-{{ now ().day }}_{{ now ().hour }}-{{ now ().minute }}-{{ now
  22.         ().second }}'
  23.       target:
  24.       - '#wifi'
  25.       title: Wifi Loss
  26.     service: notify.ha_slack


5. สร้าง Channel ชื่อ wifi ที่ slack เพิ่ม User และต้อง add app sci-bot ด้วยไม่อย่างนั้นจะส่ง slack มาไม่ผ่าน
https://app.slack.com/client/T03LZ3H08/CNN6QLQ9F/user_profile/UG00D2V5F

Track Multi Device Example:
https://joshmccarty.com/track-homeaway-status-household-using-smart-phones-home-assistant/

https://www.home-assistant.io/components/device_tracker/


Ubuntu : Ubuntu 18.04 Extranet Mount Disk On Qnap Show

****** Not Work ไม่สำเร็จ CIFS VFS ยังขึ้นอยู่ ******

Ubuntu : Ubuntu 18.04 Extranet Mount Disk On Qnap Show CIFS VFS: Free previous auth ในหน้าจอ

Install cifs-utils
  1. sudo apt install cifs-utils


Create credentials file
  1. cat > ~/.smbcredentials

username=myusername
password=mypassword
ctrl+c

  1. sudo chown root ~/.smbcredentials
  2. sudo chmod 600 ~/.smbcredentials


Get UID for plex user account
id -u sa

I'll be using 1000 as the UID for this example
edit fstab file
  1. nano /etc/fstab


Note ip, sharename and username have been changed for privacy. Also vers=3.0 was set because that is the version of samba I have set on my nas.

Old Code
  1. #//192.168.0.218/backup  /BACKUP/BackupToQnap  cifs username=myusername,password=mypassword  0  0
  2. New Cose
  3. //192.168.0.218/backup /BACKUP/BackupToQnap cifs vers=3.0,iocharset=utf8,credentials=/home/sa/.smbcredentials,uid=1000 0 0


Load the new mount point
  1. mount -a


Test reboot จะไม่มีข้อความขึ้นอีก
https://askubuntu.com/questions/1048395/ubuntu-server-18-04-lts-getting-cifs-vfs-free-previous-auth-key-response

Axapta Code recalcInventSum

Axapta Code recalcInventSum
static void recalcInventSum(Args _args)
{

    ItemId                  myItemId = "024020326229";
    InventSumRecalcItem     inventSumRecalcItem;
    ;

    inventSumRecalcItem = new InventSumRecalcItem(myItemId, true, CheckFix::Fix);
    inventSumRecalcItem.updatenow();
}

Axapta : Axapta End คำสั่งผลิตไม่ได้ เนื่องจากมี Reports ติดลบ

Axapta : Axapta End คำสั่งผลิตไม่ได้ เนื่องจากมี Reports ติดลบ
****** สำคัญต่อไปไม่ควร Reports ติดลบเพราะจะทำให้คำสั่งผลิตมีปัญหา ต้องใช้ MAA01 ปรับยอดออกเอา ************

PD19-013628 : 024020326229 ทำ Reports ติดลบในเดือน 9 จะ End คำสั่งผลิตในเดือน 10 ทำไม่ได้
Error
Production cannot be post-adjusted.

*** แก้ PD แก้ Transaction แล้ว Update มีปัญหา Stockcard Onhand ไม่ตรง ***

จึงต้องแก้โดย ลบ Transaction ทิ้ง เหมือนไม่ได้ทำการ Reports ให้เหลือ Reports เดือนปัจจุบันที่จะเอาไว้ตามจริง
ที่ต้องทำ
1. ลบ Transaction ที่ InventTrans ที่ PD นั้น + และ - ขึ้นมา ออก 2 รายการ

2. ลบ Reports ทั้งใน Line และ เล่มที่ Reports ขึ้นมา ใน Table ProdJournalProd และ ProdJournalTable

3. ลบจำนวน Costing ที่ Table ProdTableJour ถ้าไม่ลบจำนวน Costing จะเกิน
4. Run Job : recalcInventSum Update


5. Update คำสั่งผลิต และติ๊ก End คำสั่งผลิต ที่มีปัญหา จะ End ได้ (ใส่ Remark ไว้ใน PD ด้วยก่อน End ว่าเกิดอะไรขึ้น)
6. ดู Onhand เรียกรายงาน Inventory และ Stockcard มีอะไรผิดปกติหรือไม่ ดูว่ายอดตรงกับที่ควรจะเป็นหรือไม่
ยอด Onhand , Stockcard , Inventory คงเหลือต้องเท่ากัน

Line Bot Auto reply message

Line Bot Auto reply message
https://developers.line.me/en/
1. Login Account Line
2. ใช้ Massaging API ตั้งชื่อ App และข้อมูลอื่น ๆ ที่มีให้กรอก
3. เปิดใช้ Bot , Channel access token, Use webhooks
4. Webhook URL SSL เช่น extranet.scivalve.com/file.php
5. Add Line เป็นเพื่อน ใช้ Basic ID หรือ QR Code
6. นำ QR Code ไปใส่ในไฟล์ PHP

$accessToken = "";


สามารถเขียน Code ส่งค่าให้ ตอบ Auto ได้ หรือดึงค่าจาก Web เช่น Rate หรือค่าทอง ส่งรูป ส่งข้อความ และอื่น ๆ ได้

https://medium.com/@nattaponsirikamonnet/%E0%B8%AA%E0%B8%A3%E0%B9%89%E0%B8%B2%E0%B8%87-bot-%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2-line-messaging-api-d7de644ac892


PHP Code Test
  1. <?php
  2.     $accessToken = "";//copy Channel access token ตอนที่ตั้งค่ามาใส่
  3.    
  4.     $content = file_get_contents('php://input');
  5.     $arrayJson = json_decode($content, true);
  6.    
  7.     $arrayHeader = array();
  8.     $arrayHeader[] = "Content-Type: application/json";
  9.     $arrayHeader[] = "Authorization: Bearer {$accessToken}";
  10.    
  11.     //รับข้อความจากผู้ใช้
  12.     $message = $arrayJson['events'][0]['message']['text'];#ตัวอย่าง Message Type "Text"
  13.     if($message == "สวัสดี"){
  14.         $arrayPostData['replyToken'] = $arrayJson['events'][0]['replyToken'];
  15.         $arrayPostData['messages'][0]['type'] = "text";
  16.         $arrayPostData['messages'][0]['text'] = "สวัสดีจ้าาา";
  17.         replyMsg($arrayHeader,$arrayPostData);
  18.     }
  19.     #ตัวอย่าง Message Type "Sticker"
  20.     else if($message == "ฝันดี"){
  21.         $arrayPostData['replyToken'] = $arrayJson['events'][0]['replyToken'];
  22.         $arrayPostData['messages'][0]['type'] = "sticker";
  23.         $arrayPostData['messages'][0]['packageId'] = "2";
  24.         $arrayPostData['messages'][0]['stickerId'] = "46";
  25.         replyMsg($arrayHeader,$arrayPostData);
  26.     }
  27.     #ตัวอย่าง Message Type "Image"
  28.     else if($message == "รูปน้องแมว"){
  29.         $image_url = "https://i.pinimg.com/originals/cc/22/d1/cc22d10d9096e70fe3dbe3be2630182b.jpg";
  30.         $arrayPostData['replyToken'] = $arrayJson['events'][0]['replyToken'];
  31.         $arrayPostData['messages'][0]['type'] = "image";
  32.         $arrayPostData['messages'][0]['originalContentUrl'] = $image_url;
  33.         $arrayPostData['messages'][0]['previewImageUrl'] = $image_url;
  34.         replyMsg($arrayHeader,$arrayPostData);
  35.     }
  36.     #ตัวอย่าง Message Type "Location"
  37.     else if($message == "พิกัดสยามพารากอน"){
  38.         $arrayPostData['replyToken'] = $arrayJson['events'][0]['replyToken'];
  39.         $arrayPostData['messages'][0]['type'] = "location";
  40.         $arrayPostData['messages'][0]['title'] = "สยามพารากอน";
  41.         $arrayPostData['messages'][0]['address'] =   "13.7465354,100.532752";
  42.         $arrayPostData['messages'][0]['latitude'] = "13.7465354";
  43.         $arrayPostData['messages'][0]['longitude'] = "100.532752";
  44.         replyMsg($arrayHeader,$arrayPostData);
  45.     }
  46.     #ตัวอย่าง Message Type "Text + Sticker ใน 1 ครั้ง"
  47.     else if($message == "ลาก่อน"){
  48.         $arrayPostData['replyToken'] = $arrayJson['events'][0]['replyToken'];
  49.         $arrayPostData['messages'][0]['type'] = "text";
  50.         $arrayPostData['messages'][0]['text'] = "อย่าทิ้งกันไป";
  51.         $arrayPostData['messages'][1]['type'] = "sticker";
  52.         $arrayPostData['messages'][1]['packageId'] = "1";
  53.         $arrayPostData['messages'][1]['stickerId'] = "131";
  54.         replyMsg($arrayHeader,$arrayPostData);
  55.     }function replyMsg($arrayHeader,$arrayPostData){
  56.         $strUrl = "https://api.line.me/v2/bot/message/reply";
  57.         $ch = curl_init();
  58.         curl_setopt($ch, CURLOPT_URL,$strUrl);
  59.         curl_setopt($ch, CURLOPT_HEADER, false);
  60.         curl_setopt($ch, CURLOPT_POST, true);
  61.         curl_setopt($ch, CURLOPT_HTTPHEADER, $arrayHeader);    
  62.         curl_setopt($ch, CURLOPT_POSTFIELDS,json_encode($arrayPostData));
  63.         curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
  64.         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  65.         $result = curl_exec($ch);
  66.         curl_close ($ch);
  67.     }   exit;
  68. ?>

VMware SD-WAN By VeloCloud อบรบ FYI Center 20191024 ครั้งที่ 12 (ProeN+SIS)

VMware SD-WAN By VeloCloud อบรบ FYI Center 20191024 ครั้งที่ 12 (ProeN+SIS)
เป็นตัวเชื่อมโยงระหว่าง สาขา ที่ต้องการเข้าถึงข้อมูลเดียวกัน คล้าย VPN แต่จะดีกว่ามีเส้น Backup และ Run APP มี Reports ให้ดู
เหมาะกับลูกค้าที่มีมากกว่า 2 สาขาขึ้นไปหรือเป็นพันสาขา ที่ต้องการเข้าถึงข้อมูลร่วมกัน และ รองรับ APP ที่ Run บน Cloud ได้มากกว่า 3300+

ข้อมูล Spec และคุณสมบัติ ต่าง ๆ
Router VeloCloud Box
- Edge software+hardware เป็น Box

- Controllers หน้าจอ MANAGEMENT Multi-tenalt On Cloud เห็นเฉพาะของเราของคนอื่น ไม่เห็น
- Gateways ติดตั้งใกล้ Saas Service Edge เข้า Gateways ออก Internet ทำให้ ออกใช้งาน App ได้ไวขึ้น
ง่ายไม่มี Command Line ใช้ผ่าน GUI หมด เห็น Link เชื่อมโยงกัน ระหว่าง Router ข้ามจังหวัด ข้ามประเทศ

DATA ที่ใช้ส่วนมากจะมีแค่ 3 ส่วน คือ
วิดีโอ เสียง ข้อมูล ข้อดีของ VeloCloud Box
1. ติดตั้งง่าย เปลี่ยนจากติดตั้งเอง เป็น เช่า Server Config ต่าง ๆ เพื่อลด Cost
2. DNPO packed loss ช่วยให้ไป AWS และ Saas Service ได้ไวขึ้น วิ่งไป มีเน็ต 5 เส้น มันจะรู้ได้ว่าตัวไหนวิ่งไปได้เท่าไหร่ ทำรวม Banwith เพื่อให้รวมแล้วิ่งได้เร็วขึ้น
ส่ง packed ถ้าขาดจะส่งเฉพาะที่ขาด ไม่ส่งใหม่ทั้งหมด
3. Manage On Cloud

Config Router VeloCloud
เหมือน Firewall Config Rute กำหนดด้วยหน้าจอ GUI ไม่ต้อง Run ผ่าน Command
Firewall กำหนดทีเดียว มีผลทุก Edge
Config แล้วล่ม สามารถ Restore Config เก่า กลับมาคืนใช้งานได้ตามปกติ

Deep Dive Technical
Components :
Orchestrator - Management ดู Overview Bandwidth Or App use View All
รองรับ API phyton หรือ java เข้าดูตัวอย่างได้ที่
https://code.vmware.com/home
gateway - Optimization
Edge - มีหลาย model รุ่น ในรูป อุปกรณ์ Dell เป็นคนทำให้ สามารถ นำ Virtual Edge ลงได้ใน VM Esxi ซื้อ License ไม่มีให้ทดลอง ได้ไฟล์ VCO มา Add ใส่ VM Esxi แล้ว Config
ซื้อ Bandwidth เท่าที่ใช้ ตามขนาดที่ใช้แล้ว SD-WAN Box ถ้าเกินจะมีแจ้งเตือน จ่ายเพิ่มปีหน้า ต่อ MA
คู่มือ Run VCO บน VMware Esxi


เข้าดูได้แต่ไม่มีสิทธ์ Download ต้องติดต่อทาง ProeN เพื่อใส่สิทธิ์ และ เสนอ License
https://my.vmware.com/web/vmware/info/slug/networking_security/vmware_sd_wan/3_3_1l

Link Steering Option

- Mandatory หลักตายเปลี่ยนไปอีกเส้น
- Preferred พวก Time packed Loss 2% พวกเสียง VoIP
- Available ขาดและหาย Web ตัดพวกเว็บออกเพื่อให้เหลือพวกที่สำคัญกว่า

Security
- TLS1.2 และ PCI DSX Banking ใช้ ไม่สามารถดักจับ ได้
- VPN
- Firewall Support เป็น Stateless Full Firewall
- End To End

CDE แบบ PCI dls 3.2 ปิดไว้จะมองไม่เห็น Log ทั้งหมดเช่นพวก App ธนาคาร Transation ต่าง ๆ จะไม่แสดงใน Log


Lab Internet คนใช้เยอะ Run VMware ไม่ขึ้น

1. เข้าไปที่ สมัครสมาชิก เมล์ ทดลองได้ 8-9 วันก็จะหมดเวลา
https://labs.hol.vmware.com/
https://labs.hol.vmware.com/HOL/catalogs/catalog/1212
2. register
3. ค้นหา sd-wan 2040 Start labs ติดตั้ง slide 37
4. vnc ตัวที่เป็น chicaco
5. ie กด vco เข้า เพื่อ Register ขึ้นนี้ทำไม่ผ่านเพราะเน็ตแรงไม่พอ
6. เข้า Edge send mail อีกครั้ง กด Link ignore Activate slide 47 ผ่านทำตาม Slide activate ผ่าน
7. กลับไปที่ Google Chrome ตัว Edge หลัก slide49
วิธี config :
ราคายังไม่ทราบ สอนทาง Tech มากกว่า
เบื้องต้น
เป็นการขายแบบเช่าไม่ได้ซื้อขาด เหมือนการเช่าสัญญาณ Internet จ่ายรายเดือนหรือรายปี
อยู่ที่ ใช้กี่สาขา ใช้ Bandwidth ระหว่างสาขาเท่าไหร่ เท่าไหร่
หรือใช้งาน Service อื่น ๆ Oncloud ด้วยหรือไม่ เช่น Run App Oncloud Database เป็นต้น
ต้องใน Sales เข้ามาสำรวจความต้องการใช้ของ User แล้วเสนอราคา

Slide : https://drive.google.com/open?id=18-QVatcfz9ZM2rHd0qu59WrvdUtQLvdD

Directadmin API Command

Directadmin API Command Directadmin สามารถใช้ Command ที่เป็น API เข้าไปเรียกข้อมูลมาใช้งานได้
https://www.directadmin.com/search_versions.php?help=no&versions=yes&query=CMD_API_

เช่น อ่านค่าเมล์ ของ User ว่าเต็มหรือไม่แล้วแจ้งเตือนในเมล์
ใช้ httpsocket.php ร่วมกับ CMD_API_POP

ไฟล์อยู่ที่
http://www.scivalve.com/checkuse/checkmail.php

Code:
  1.  
  2.  
  3. include("httpsocket.php");
  4. //nou de socket is geinclude kunnen we hem starten
  5. $sock = new HTTPSocket;
  6.  
  7. //nu gaan we inloggen in Direct Admin (verander wel de gegevens)
  8. $sock->connect('127.0.0.1',2222);
  9. $sock->set_login('XXXXX','XXXXXXXX');
  10.  
  11. $domain='scivalve.com' ;
  12.  
  13. function formatSizeUnits($bytes)
  14. {
  15.    if($bytes >= 1099511627776){
  16.     $bytes = number_format($bytes / 1099511627776, 2) . ' TB';
  17.    } elseif($bytes >= 1073741824){
  18.     $bytes = number_format($bytes / 1073741824, 2) . ' GB';
  19.    } elseif($bytes >= 1048576){
  20.       $bytes = number_format($bytes / 1048576, 2) . ' MB';
  21.    } elseif ($bytes >= 1024){
  22.       $bytes = number_format($bytes / 1024, 2) . ' KB';
  23.    } elseif ($bytes > 1){
  24.       $bytes = $bytes . ' bytes';
  25.    } elseif ($bytes == 1){
  26.       $bytes = $bytes . ' byte';
  27.    } else {
  28.       $bytes = '-';
  29.    }
  30. return $bytes;
  31. }//Close Functions.
  32.  
  33. //User Susspende เช็คไม่ได้ต้องเขียนไว้เทียบเอา
  34. $UserSuspended="chanakan
  35. jirasak
  36. julalak
  37. kongsit
  38. mathuros
  39. monthon
  40. nattapol
  41. nontiwa
  42. pattanan
  43. porramate
  44. sarawut
  45. sarawut_e
  46. sudjai
  47. tanupat
  48. thanyalak";
  49.  
  50. $sock->query('/CMD_API_POP', array(
  51.    'action'     => 'full_list',
  52.    'type'       => 'quota',
  53.    //'suspended'    => 'yes',
  54.    'domain'     => $domain
  55. ));
  56. $user_quota = $sock->fetch_parsed_body();
  57. //print_r($user_quota);
  58. $i = 0;
  59. foreach ($user_quota as $key => $value) {
  60.     //echo $key.":".$value."<br>";
  61.     //ใช้ List Run บน Crontab แล้ว Error
  62.     //list($quota, $sent, $usage, $Use, $usage_bytes) = explode('&', $value);  
  63.     $pieces = explode("&", $value);
  64.     $quota = $pieces[0];
  65.     //$sent = $pieces[1];
  66.     $usage = $pieces[2];
  67.     //$Use = $pieces[3];
  68.     //$usage_bytes = $pieces[4];
  69.     //echo $key.":".$quota.":".$usage;
  70.     $quotaValue = explode('=', $quota);
  71.     $usageValue = explode('=', $usage);
  72.  
  73.     if (strpos($UserSuspended, "'".$key."'") !== false) {
  74.         if((($quotaValue[1] - $usageValue[1]) <= 0) && ($quotaValue[1] != 0)){
  75.             //echo $key." : ส่งเมล์ <br>";
  76.             $i = $i+1;
  77.             if($i == 1){
  78.                 $EmailUser = $i." : ".$key."@scivalve.com  ".formatSizeUnits($quotaValue[1])."/".formatSizeUnits($usageValue[1])."<br>";   
  79.             } else {   
  80.                 $EmailUser = $EmailUser.$i." : ".$key."@scivalve.com  ".formatSizeUnits($quotaValue[1])."/".formatSizeUnits($usageValue[1])."<br>"
  81.             }     
  82.         }//Close if.
  83.     }//Close if.
  84. }//Close for.
  85. //echo $EmailUser;
  86.  
  87. if($i > 0){
  88.     //ส่งเมล์ 
  89.     //อ้าง Path Run บนเว็บผ่าน แต่ Run ผ่าน Crontab Error 
  90.     require("/home/scivalve/public_html/mailer/class.phpmailer.php");
  91.     $mail = new PHPMailer();
  92.     $body = " พบเมล์ scivalve ของ User ใกล้เต็ม กรุณาตรวจสอบ ดังนี้ Quota/Used<br> $EmailUser "
  93.    
  94.     $mail->CharSet = "utf-8";
  95.     $mail->IsSMTP();
  96.     $mail->SMTPDebug = 0;
  97.     $mail->SMTPAuth = true;
  98.     $mail->Host = "ssl://smtp.gmail.com"; // SMTP server
  99.     $mail->Port = 465; // พอร์ท
  100.     $mail->Username = "XXXXXX@gmail.com"; // account SMTP
  101.     $mail->Password = "XXXXXX"; // รหัสผ่าน SMTP   
  102.    
  103.     $mail->SetFrom("scivalvethailand@gmail.com", "scivalve.com");
  104.     $mail->AddReplyTo("scivalvethailand@gmail.com", "scivalve.com");
  105.     $mail->Subject = "Check Mail Full @scivalve.com";
  106.    
  107.     $mail->MsgHTML($body);
  108.    
  109.     //if($fileRename0 != ""){   
  110.     //  $file = "message/".$fileRename0;   
  111.     //  $mail->addAttachment($file, $fileRename0);
  112.     //}
  113.     $mail->AddAddress("suwit@scivalve.com", "SCI"); // ผู้รับคนที่ 1
  114.     $mail->AddAddress("nikom@scivalve.com", "SCI"); // ผู้รับคนที่ 2
  115.     $mail->AddAddress("seksan@scivalve.com", "SCI"); // ผู้รับคนที่ 3
  116.     $mail->Send();
  117.  
  118.     //if(!$mail->Send()) {
  119.     //  $report= "Mailer Error: " . $mail->ErrorInfo;
  120.     //} else {
  121.     //  $report=    " <center><br><font =class='txt1'><b>Send message complete<br>Please wait for back to home page<b></font>";
  122.     //} 
  123. }


Test Run command
  1. /usr/local/bin/php /home/scivalve/public_html/checkuse/checkmail.php


ssh ไปที่ Server VPS สร้าง Crontab ใช้ Vi ยาก ใช้ nana ไฟล์อยู่ที่
  1. nano /var/spool/cron/root

ตั้งไว้ เช็คทุกวัน หกโมงเช้า จันทร์ - เสาร์
0 6 * * 1-6 /usr/local/bin/php /home/scivalve/public_html/checkuse/checkmail.php

เมล์ที่แจ้งเตือน ตัวอย่าง