Calling Policy Busy on Busy (Busy Options)

Saat kita tengah melakukan panggilan MSTeams atau sedang di tengah pertemuan daring dengan MSTeams, kadang masih bisa menerima panggilan masuk. Dan ternyata di beberapa negara/budaya, hal ini termasuk tidak sopan. Jika kebetulan sedang bekerja sama dengan orang lain yang memiliki kebudayaan tersebut, alangkah baiknya kita mengatur panggilan masuk ditengah sedang menerima panggilan atau sedang tengah konferensi daring.

Busy on Busy ini dapat diaktifkan melalui web GUI portal MSTeams, dan juga bisa dilakukan melalui perintah powershell Set-CSTeamsCallingPolicy dengan opsi:

  • Enabled – yang akan langsung menolak panggilan jika ada panggillan kedua masuk ditengah kita sedang menerima panggilan lain atau sedang dalam pertemuan daring.
  • Unanswered – yang dikombinasikan dengan pengaturan berikutnya dengan mengalikan panggilan ke voicemail, atau ke pengguna lain sebagai perwakilan kita,
  • Disabled – ini adalah setting default.

Untuk setting dari TAC (Teams Admin Console), dapat melalui menu Voice -> Calling policies -> Global (Org-wide default).

Tautan:

Routing Dua SBC untuk Microsoft Teams Direct Routing

Jadi ada kebutuhan untuk menyambungkan Microsoft Teams ke Cloud PBX kantor, tapi sekaligus masih bisa menjalankan Demo untuk IVR yang full menggunakan “PBX” Microsoft Teams.

Saat ini ada dua SBC yang sudah terdaftar di OnlinePstnGateway kantor, yang satu untuk integrasi ke Cloud PBX, dan yang satu bener-benef full MSTeams Direct Routing yaitu sbc01.ofon.co.id dan sbc02.ofon.co.id, yang bisa dilihat dengan perintah Get-CsOnlinePstnGateway. Semua panggilan ke ekstensi (format nomer ekstensi 4 digit) CloudPBX akan dilewatkan sbc02.ofon.co.id, dan panggilan ke offnet (landline dan mobile) akan dilewatkan melalui kedua sbc tersebut.

Langkah-langkahnya seperti berikut:

  • Buat container baru dengan nama DualSBC untuk mengelompokkan rute panggilan di atas yang nantinya dijadikan satu ke OnlineVoiceRoutingPolicy baru.
Set-CsOnlinePstnUsage -Identity Global -Usage @{Add="DualSBC"}
  • Lalu buat rule baru dengan nama, misal, SBC2CloudPBX panggilan ke ekstensi (4 digit) untuk diarahkan ke sbc02.ofon.co.id (perhatikan format regexnya):
New-CsOnlineVoiceRoute -Identity "SBC2CloudPBX" -NumberPattern "^\d{4}$" -OnlinePstnGatewayList sbc02.ofon.co.id -Priority 0 -OnlinePstnUsages DualSBC
  • Dan untuk panggilan ke offnet kita buatkan rule baru dengan nama, misal, SBC2PSTN melaui sbc01.ofon.co.id dan sbc02.ofon.co.id:
New-CsOnlineVoiceRoute -Identity "SBC2PSTN" -NumberPattern ".*" -OnlinePstnGatewayList sbc01.ofon.co.id, sbc02.ofon.co.id -Priority 10 -OnlinePstnUsages "DualSBC"
  • Setelah itu kumpulkan kedua OnlineVoiceRoute di atas menjadi satu OnlineVoiceRoutingPolicy:
New-CsOnlineVoiceRoutingPolicy -Identity "DualSBC" -OnlinePstnUsages "DualSBC"
  • Dan terakhir, sematkan policy baru tersebut ke pengguna MSTeams Phone System:
Grant-CsOnlineVoiceRoutingPolicy -Identity user@domain.tld -PolicyName DualSBC
  • Test panggilan.

Pranala Luar:

  • https://docs.microsoft.com/en-us/powershell/module/skype/set-csonlinepstnusage?view=skype-ps
  • https://docs.microsoft.com/en-us/powershell/module/skype/new-csonlinevoiceroute?view=skype-ps
  • https://docs.microsoft.com/en-us/powershell/module/skype/new-csonlinevoiceroutingpolicy?view=skype-ps
  • https://blogs.perficient.com/2018/06/28/direct-routing-for-microsoft-teams-deep-dive-part-4/

[tips] Problem Perintah Connect-MicrosoftTeams Tidak Dikenali

Sering beberapa kali pada saat pindah laptop/PC untuk mengakses Microsoft Teams cmdlet mengalami kendala perintah tidak dikenali seperti berikut ini:

PS C:\windows\system32> Install-Module MicrosoftTEams
PS C:\windows\system32> Connect-MicrosoftTeams
Connect-MicrosoftTeams : The term 'Connect-MicrosoftTeams' is not recognized as the name of a cmdlet, function, script
file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct
and try again.
At line:1 char:1
+ Connect-MicrosoftTeams
+ ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Connect-MicrosoftTeams:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Kalau dibaca-baca di beberapa mailing-list, ini karena environment PowerShell untuk keamanan terhadap script yang tidak dikenal dan berbahaya. Tapi ya belum paham-paham banget detailnya bagaimana. Cuma dapat saran untuk menjalankan perintah berikut ini:

PS C:\windows\system32> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

Lalu pilih All jika muncul pertanyaan berikut:

Execution Policy Change
The execution policy helps protect you from scripts that you do not trust. Changing the execution policy might expose
you to the security risks described in the about_Execution_Policies help topic at
https:/go.microsoft.com/fwlink/?LinkID=135170. Do you want to change the execution policy?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "N"): a

Setelah itu kita dapat menjalakan MSTeams CmdLet. Dari petunjuk tersebut juga diarahkan untuk membaca doc di https:/go.microsoft.com/fwlink/?LinkID=135170.

Bagaimana kalo di Ubuntu?

Jika menjalankan cmdlet Microsoft Teams dari powershell Ubuntu, tidak memerlukan setting policy seperti di atas. Setelah menginstall module, langsung bisa menjalankan Connect-MicrosoftTeams.

Tautan

Akses Microsoft Teams dari Powershell Ubuntu

Akhirnya module MicrosoftTeams yang untuk menggantikan SkypeOnlineConnector dapat juga digunakan di Linux, terutama distro Ubuntu. Setupnya cukup mudah seperti yang ada di postingan https://www.otakudang.org/?p=1097. Berikut tangkapan layar ketika menjalankan perintah Install-Module MicrosoftTeams:

Dan untuk login ke Microsoft Teams admin console dengan perintah Connect-MicrosoftTeams (akan muncul login tab di browser yang menanyakan informasi login admin):

Muncul beberapa warning tapi bisa diabaikan. Berikutnya test perintah , misal, untuk Direct Routing:

PS /home/godril> Get-CsOnlinePSTNGateway | Select-Object -Property Identity

Identity
--------
sbc01.ofon.biz
sbc02.ofon.biz
sbc03.ofon.biz

Siplah! Jadi ndak harus buka laptop Windows lagi jika sedang di station Ubuntu.

Module MicrosoftTeams sebagai pengganti SkypeOnlineConnector

Mungkin sehubungan dengan akan pensiunnya Skype for Business Online, module administrasi powershell untuk MSTeams juga akan diganti. Jika pernah membaca postingan persiapan setup Direct Routing di postingan Microsoft Teams Phone System (Tulisan 2) – otakudang.org (v2.0) , masih menggunkana modul SkypeOnlineConnector. Yang baru menurut postingan di Download and install the Skype for Business Online Connector module – Skype for Business Online | Microsoft Docs.

Cara installnya begini:

PS C:\WINDOWS\system32> Install-module microsoftteams                                                                                                                                                                                           NuGet provider is required to continue
PowerShellGet requires NuGet provider version '2.8.5.201' or newer to interact with NuGet-based repositories. The NuGet
 provider must be available in 'C:\Program Files\PackageManagement\ProviderAssemblies' or
'C:\Users\tunju\AppData\Local\PackageManagement\ProviderAssemblies'. You can also install the NuGet provider by running
 'Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force'. Do you want PowerShellGet to install and
import the NuGet provider now?
[Y] Yes  [N] No  [S] Suspend  [?] Help (default is "Y"): yes

Untrusted repository
You are installing the modules from an untrusted repository. If you trust this repository, change its
InstallationPolicy value by running the Set-PSRepository cmdlet. Are you sure you want to install the modules from
'PSGallery'?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "N"): yes

Tautan:

Microsoft Teams Call Transfer

Karena pada dasarnya Microsoft Teams ini semacam PBX bermerk Microsoft, salah satu fiturnya tentu ada yang namanya call transfer, walaupun istilahnya agak berbeda sedikit dengan PBX pada umumnya. Di Microsoft Teams (selanjutnya saya sebut sebagai MSTeams saja biar ndak ribet ngetiknya), menyebutnya sebagai Transfer now untuk blind (call) transfer, dan Consult then transfer untuk attended (call) transfer. Kurang ribet gimana coba?

Transfer now

Blind (call) transfer adalah meneruskan panggilan ke nomor telepon atau ekstensi tujuan tanpa menanyakan terlebih dahulu apakah orang yang tertuju bersedia mengangkat telepon atau tidak. Jadi jika orang tertuju tidak ada di tempat, maka panggilan akan berdering terus sampai dengan ring timeout atau penelpon memutuskan untuk menutup telepon. Blind transfer biasanya terjadi jika:

  • panggilan terjadi di dalam satu organisasi saja, dan biasanya dengan peer.
  • Anda tipe BOFH.

Transfer now di Desktop app

Untuk melakukan Tranfer now di Desktop app cukup mudah. Ketika menerima panggilan masuk dan hendak mentransfer panggilan tersebut, klik ikon elipsis () di kiri atas, lalu pilih Transfer.

Lalu di bagian isian Invite someone or dial a number, isikan nama kontak yang hendak dituju. Jika nama kontak berada di tenant yang sama, menuliskan beberapa huruf depan saja akan memunculkan kemungkinan nama yang hendak dituju:

Jika nama sudah muncul dari kemungkinan yang ditampilkan, klik kontak tersebut. Jika belum, teruskan mengetik nama kontak. Jika sudah klik nama tersebut.

Selain dapat melakukan transfer, panggilan masuk juga dapat ditransfer ke voicemail nomer tertuju apabila orang yang tertuju sedang tidak di tempat (sedang cuti, atau tugas ke luar kota), sehingga pemanggil dapat meninggalkan pesan penting yang dapat didengarkan kembali oleh orang yang dituju melalui MSTeams atau surel.

Jika kita mengaktifkan Ring back if there’s no answer, maka panggilan tersebut akan kembali ke kita jika transfer tidak dijawab oleh orang tertuju dengan pesan seperti berikut:

Jika mengaktifkan Ring back if there’s no answer, maka kita tidak dapat transfer panggilan ke voicemail nomer tertuju.

Selain dapat melakukan transfer panggilan ke akun MSTeams di tenant yang sama, kita juga dapat melakukan transfer panggilan ke akun MSTeams tenant yang berbeda (beda organisasi), dengan catatan, MSTeams sudah dilakukan federation, yaitu memperbolehkan satu domain tenant berbicara dengan domain tenant lain di luar organisasi tersebut. Ijin akses ini harus dua arah. Misal, jika tenant MSTeams ofon.co.id memperbolehkan semua penggunanya menghubungi langsung ke pengguna di domain tenant microsoft.com, maka sebaliknya di MSTeams tenant microsoft.com juga harus memperbolehkan komunikasi dari MSTeams ofon.co.id.

Transfer panggilan lain yang diperbolehkan adalah ke nomer PSTN eksternal atau ke nomor mobile jika trunk operator memperbolehkan.

Apa maksudnya “jika trunk operator memperbolehkan?”

Salah satu implementasi yang pernah saya lakukan adalah menghubungkan MSTeams dengan nomer PSTN onpremise yang turun ke lokasi kantor pelanggan berupa satu line analog. Satu line analog ini berarti 1 conccurent call baik masuk ataupun keluar tapi tidak dua-duanya.

Jadi jika ada panggilan masuk ke nomer tersebut, maka line analog sudah terpakai, sehingga tidak memungkinkan melakukan transfer panggilan ke nomer PSTN atau nomor mobile di luar organisasi tersebut.

Untuk melakukan transfer panggilan ke nomor telepon lain di luar organisasi, cukup masukkan nomer telepon lengkap seperti berikut:

lalu klik Transfer.

Transfer now di mobile app

Ketika panggilan masuk ke mobile app, untuk melakukan transfer panggilan, pilih menu elpisis () di layar bagian bawah, lalu pilih Transfer.

Di bagian “Search for people” isikan nama kontak tertuju. Jika kontak tersebut ada di dalam MSTeams tenant, maka akan muncul secara otomatis:

Ketuk di daftar nama tersebut untuk mentrasnfer panggilan.

Atau, kita bisa memasukkan nomor telepon eksternal seperti berikut:

ketuk nomor telepon eksternal untuk mentransfer panggilan ke nomor tersebut. Jika tranfer berasil akan muncul status seperti berikut:

Consult then transfer

Attended (call) transfer adalah transfer panggilan yang agak sopan karena penerima telepon akan menanyakan terlebih dahulu ke orang tujuan apakah bersedia atau available untuk menerima panggilan atau tidak. Di MSTeams, kita dapat menanyakan dengan dua cara ketika melalui desktop app, yaitu dengan melakukan panggilan terlebih dahulu, atau mengirimkan pesan chat. Sedangkan untuk mobile app per tanggal tulisan ini, hanya dapat melakukan attended transfer dengan bertanya melalui chat saja, karena tidak ada menu panggilan suara. Mungkin nanti-nanti akan ada rilis untuk kemampuan tersebut.

Consult then transfer di Desktop App

Di dalam dekstop app kita dapat menanyakan telepon tertuju untuk transfer panggilan melalui panggilan suara atau pesan chat. Di menu elipsis () kanan atas, pilih Consult then transfer.

ketika memilih kontak tertuju, kita akan diberikan dua pilihan untuk memberitahukan melalui panggilan telepon atau via chat seperti berikut:

Di contoh ini kita pilihh Teams audio call. Jika nomer tertuju bersedia menerima panggilan telepon, maka untuk mentransfer panggilan cukup tekan Transfer :

Jika nomer tertuju tidak bersedia menerima telepon atau sedang tidak berada di tempat, maka pilih Leave, lalu di halaman penerimaan panggilan tekan Resume untuk kembali berbicara ke nomer pemanggil yang sebelumnya masuk hold.

Sedangkan pemberitahuan melalui Chat akan mengirimkan pesan otomatis seperti berikut:

jika nomer tertuju bersedia menerima panggilan, maka cukup tekan tombol Transfer di atas. Apabila tidak, kembali ke layar utama panggilan dan tekan Resume untuk berbicara kembali ke nomor pemanggil.

This image has an empty alt attribute; its file name is image-20.png

Consult then transfer dengan Mobile app

Untuk mobile app, pilih elipsis lalu pilih menu Transfer -> Consult first.

Karena pilihannya hanya pemberitahuan via Chat, maka otomatis akan digenerate pesan seperti berikut:

Perhatikan dua icon di kanan atas:

Icon handle telepon di sebelah kanan untuk melakukan transfer jika tertuju bersedia menerima telepon, dan gambar icon panah untuk melakukan Resume panggilan jika tidak tersambung dan kembali berbicara ke nomor pemanggil.

Mengaktifkan A2billing di Issabel

Saya tau ini ide buruk, bahkan developernya pun sudah mengingatkan bahwa A2billing ini memiliki flaw dan sudah dari 6 tahun yang lalu (saat tulisan ini dibuat) versi terakhihrnya keluar. Tapi karena suatu hal, situasi mengharuskan saya mengaktifkannya.

Karena alasan di atas, A2billing tidak akan ditemukan di laman Addons. Jadi kudu diinstall langsung dari yum:

yum install issabel-a2billing.noarch issabel-a2billing-callback_daemon.noarch -y

Setelah itu buat database baru di MariaDB dengan patokan credential di /etc/a2billing.conf. Ada baiknya diubah dulu agar tidak menggunakan nama db bawaan, username dan password. Tapi agar bisa jalan saja, kira-kira default cuplikan credential dari file di atas adalah sebagai berikut:

[database]
hostname = localhost
port = 3306
user = a2billinguser
password = a2billing
dbname = mya2billing
; dbtype setting can either be mysql or postgres
dbtype = mysql

Lalu login ke MariaDB dengan akun administrator (dalam contoh di sini saya menggunakan root, untuk membuat database mya2billing dan user a2billinguser dengan password a2billing.

CREATE DATABASE mya2billing;
GRANT ALL PRIVILEGES ON mya2billing.* TO 'a2billinguser '@'localhost' IDENTIFIED BY 'a2billing';
flush privileges;

Setelah itu masuk ke direktori /usr/share/a2billing/DataBase/mysql-5.x dan jalankan script install-db.sh:

cd /usr/share/a2billing/DataBase/mysql-5.x
./install-db.sh

isikan informasi database, user dan password sesuai dengan di atas.

Terakhir, reset semua password admin Issabel dan DB dengan perintah:

/usr/bin/change-passwords

Lalu login ke portal A2billing yang berlokasi di laman https://<url_issabel>/a2billing/admin/index.php dengan username/password admin Issabel.

Done.

2020

Sudah di pehujung tahun lagi. 2020 merupakan tahun yang benar-benar menguji. Bahkan sejak tanggal 1 Januari 2020 sebelum matahari terbit, langsung dihajar dengan banjir.

Tahun ini kami lebih siap, dan semoga tidak lengah.

SELAMAT TAHUN BARU 2021!

[self reminder] SSH di WSL

Akhir-akhir ini nginstall WSL untuk keperluan pekerjaan. Awal-awal ketemu masalah gimana caranya SSH ke instance WSL yang sama untuk melakukan pekerjaan paralel (iya.. iya.. saya n00b).

Waktu itu sudah kepikiran menggunakan ssh, tapi bolak balik ssh server tidak dapat dinyalakan. Ternyata ada caranya buat ngakalin. Begini:

  • Uninstall ssh yang sudah ada lalu install ulang. Ngehe kan?
apt remove openssh-server
apt install openssh-server
  • Lalu edit sshd_config dengan setting PasswordAuthentication ke yes. Karena defaultnya diset ke no.
  • Restart ssh dengan: service ssh restart
  • Dah gitu aja.

Complete Issabel Configs for MSTeams Direct Routing

Related to previous post about how to setup Issabel as Direct Routing SBC to MSTeams,I got requests from acquintances about the complete configurations from Issabel side.

So here they are:

sip_custom.conf (modify this from Asterisk File Editor webGUI)

[MSTeams-Inbound]
disallow=all
host=sip.pstnhub.microsoft.com
type=friend
transport=tls
port=5061
allow=all
allow=ulaw
qualify=yes
dtmfmode=rfc2833
context=from-internal
insecure=port,invite
nat=force_rport,comedia
fromdomain=ast.ofon.biz

[MSTeams02-Inbound]
disallow=all
host=sip2.pstnhub.microsoft.com
type=friend
transport=tls
port=5061
allow=all
allow=ulaw
qualify=yes
dtmfmode=rfc2833
context=from-internal
insecure=port,invite
nat=force_rport,comedia
fromdomain=ast.ofon.biz

[MSTeams03-Inbound]
disallow=all
host=sip3.pstnhub.microsoft.com
type=friend
transport=tls
port=5061
allow=all
allow=ulaw
qualify=yes
dtmfmode=rfc2833
context=from-internal
insecure=port,invite
nat=force_rport,comedia
fromdomain=ast.ofon.biz

[Carrier-Inbound]
disallow=all
host=xxx.xxx.xxx.xxx
type=friend
port=xxxx
allow=all
allow=ulaw
qualify=yes
dtmfmode=rfc2833
context=from-internal
insecure=port,invite
nat=force_rport,comedia

replace xxx are Carrier ip address, and port. replace fromdomain with your own FQDN Issabel server.

sip_additional.conf (modify this from Trunk webGUI menu)

[MSTeams-Outbound]
disallow=all
host=sip.pstnhub.microsoft.com
type=peer
transport=tls
port=5061
allow=all
allow=ulaw
qualify=yes
dtmfmode=rfc2833
context=from-trunk
insecure=port,invite
nat=force_rport,comedia
fromdomain=ast.ofon.biz
encryption=yes

[MSTeams02-Outbound]
disallow=all
host=sip.pstnhub.microsoft.com
type=peer
transport=tls
port=5061
allow=all
allow=ulaw
qualify=yes
dtmfmode=rfc2833
context=from-trunk
insecure=port,invite
nat=force_rport,comedia
fromdomain=ast.ofon.biz
encryption=yes

[MSTeams03-Outbound]
disallow=all
host=sip3.pstnhub.microsoft.com
type=peer
transport=tls
port=5061
allow=all
allow=ulaw
qualify=yes
dtmfmode=rfc2833
context=from-trunk
insecure=port,invite
nat=force_rport,comedia
fromdomain=ast.ofon.biz
encryption=yes

[Carrier-Outbound]
host=xxx.xxx.xxx.xxx
port=xxxx
canreinvite=yes
type=peer
insecure=port,invite
nat=force_rport,comedia
context=from-trunk
qualify=yes
dtmfmode=rfc2833

replace xxx are Carrier ip address, and port. replace fromdomain with your own FQDN Issabel server.

Outbound to MSTeams DID

I created 3 outbounds route with this order:

  • Outbound to MSTeams
  • Outbound to Carrier for REFER
  • Outbound to Carrier for each DID

The order should as such. And you dont need to setup any Inbound Routes.

Outbound route to MSTeams should contain your assigned DIDs toward MSTeams account. Should look like this:

Outbound Route to Accomodate REFER

Since I dont know how to replace user part of the URI with RPID, I just pick one DID to accomodate REFER. This is less desireable but the REFER outbound route can act as Global CallerID for the direct routing. Notice that the route contains disposable prefix 9 to avoid overriding from 3rd route (i.e Route for each DID).

This image has an empty alt attribute; its file name is image-2.png

Outbound Route to Carrier for Each DID

(extra) Asterisk SIP Settings from Unembedded IssabelPBX menu

Point the tlsprivatekey, tlscertfile, and tlscafile to your approriate files. And realm should be the Issabel server’s FQDN. The tlsbindaddr can by any ip address and port you wish to use.

That should do it. If I miss anything, please clue me at the comment.