Updated April, 9th, 2023
Now that we have the macOS interface set up, it's time to install some applications!
Apple MacBook Air M1 for Network Engineers Part 1
Apple MacBook Air M1 for Network Engineers Part 3
Apple MacBook Air M1 for Network Engineers Part 4
Apple MacBook Air M1 for Network Engineers Part 5
Cisco Devnet
Cisco has jumped into network automation in a big way. Several of the tools in our list come from Cisco's Developer Workstation and Environment Setup webpage. This page has setup guides for Windows, Mac, and Linux. It does require a login. I used my CCO but it looks like you can use GitHub or Google also.
The exam requirements are listed here. This page also has some good tutorials on it, well worth a look. They have moved the Developer Workstation links to this page.
If you can't log in, here is a similar site on GitHub that doesn't require a login:
Developer Workstation and Environment Setup on GitHub
I am working on the DevNet certification. I have documented most of the journey here
A terminal for Intel specific apps
Since this is a tutorial for the new M1 Apple silicon, we will set up a terminal using Rosetta2 so that any terminal apps that fail to run because of the ARM architecture can be used in an emulated Intel terminal.
I got this one from the Mac Geek Gab podcast.
- Open Finder, expand the Utilities folder, right-click on "Terminal" and select duplicate.
- Rename the new shortcut to "Terminal-Intel" or something you like.
- Right-click, select Get Info, check Open Using Rosetta.
Now all Intel-based terminal apps should work.
Adding your SSH keys to GitHub
Here is the github.com documentation for creating and adding your SSH keys to github.com.
I used this YouTube tutorial to learn how to set up git to push my local repositories up to GitHub.com
Git and GitHub for Beginners - Crash Course
Here is a list of the apps that we will be installing:
- Simplenote - Note-taking app
- Termius - SSH Client
- Xcode - The Apple Developer Tools
- Git and diff-so-fancy
- Serial - A serial tool
- Homebrew - Similar to apt for Linux
- Oh My ZSH - a great add on for the zsh shell
- The open command in terminal
- VS Code - Microsoft's Open Source IDE
- Powershell - Microsoft Open Sourced it
- Autojump - A faster way to navigate the file system
- NodeJS - Required for Cisco's DevNet program
- Postman - A tool for working with RESTful APIs
- Ngrok - Required for Cisco's DevNet program
- Google Chrome - A Universal App now
- Open Connect - Open Source VPN client used to connect to Cisco DevNet labs
- Minicom - A terminal app that allows you to connect to USB to Serial cables
Simplenote
This is a free (for now anyway) note-taking app from Automatic. It's available for Mac, IOS, Linux, Windows, and Android so it fits my work life perfectly since I use all of those operating systems. It syncs to the cloud using the Automatic servers. Automatic is the company behind WordPress so they know cloud!
Simplenote supports MarkDown so if you are going down the developer path you can sharpen your MD skills in Simplenote. It supports "Tags" which allows you to categorize notes. Not as good as Evernote notebooks but it's free and works for me.
Open the Mac App Store, search for Simplenote and install.
Termius - SSH Client
Termius isn't a mere SSH client, it's a complete command-line solution. Securely access Linux or IoT devices from your Android or iOS mobile device, as well as any Windows, macOS, or Linux computer. It is Mosh-compatible, providing excellent reliability on high-latency constantly changing connections.
Again, a tool that works on every platform! I got in on Termius during the beta and it was only $5.99 a year which was well worth it. The devices you create sync across all platforms so no matter what device you grab, it has all your hosts on it.
But the cost has gone up to $8.99 per month. You can do a trial to see if you like it.
Open the Mac App Store, search for Termius and install.
Xcode
This is a huge application, 11.6GB! But if you want to use iPerf3 and many other terminal apps you need it. It is the tool used to write MacOS and IOS apps if you want to try your hand at that.
Installation
Open the Mac App store, search for xcode and install.
Git and diff-so-fancy
Xcode includes git. After Xcode is installed you can run:
git --version
to check what version of git is installed
xcode also installs python 3.x.
Installation
Configure git to use diff-so-fancy for all diff output: git config --global core.pager "diff-so-fancy | less --tabs=4 -RFX" git config --global interactive.diffFilter "diff-so-fancy --patch"
git config --global color.ui true git config --global color.diff-highlight.oldNormal "red bold" git config --global color.diff-highlight.oldHighlight "red bold 52" git config --global color.diff-highlight.newNormal "green bold" git config --global color.diff-highlight.newHighlight "green bold 22" git config --global color.diff.meta "11" git config --global color.diff.frag "magenta bold" git config --global color.diff.func "146 bold" git config --global color.diff.commit "yellow bold" git config --global color.diff.old "red bold" git config --global color.diff.new "green bold" git config --global color.diff.whitespace "red reverse"
Reference
Serial
Published by Decisive Tactics.
Connect to routers, servers, firewalls, industrial control and IoT devices with ease. Serial includes built-in, reliable support for almost every serial device on the market, sparing you the hassle of finding, installing, and updating drivers.
This app is $39.99 on the Mac App Store. I was reluctant to spend that much on a serial app but a co-worker highly recommended it. Now that I have used it I agree! The built-in driver support is great. I haven't connected any USB to Serial cable that didn't just work. And, the app pops a connect dialog up as soon as you connect the USB. Very nice.
Version 2 has SSH support also. I haven't used it yet because I have so many devices in Termius and it runs on all my platforms. But if you don't want to pay the subscription to Terminus, Serial might be a good alternative.
Open the Mac App store, search for serial and install.
Homebrew
Homebrew provides access to many standard applications and packages but isn't optimized for large binary-based applications. As an extension to brew, cask is available for installing GUI applications. To list any available casks, you would use the --cask or --casks option with the brew list command. Use the --help option on brew commands to learn more:
brew list --help
Installation
Start the Terminal-Intel and paste the following:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
- brew help to get started
- brew -v to check the version
Show installed packages
┌─[mhubbard@HP8600-4] - [/private/tftpboot] - [2885] └─[$] brew list [18:33:19] ==> Formulae arp-scan cdpr iproute2mac libuv nghttp2 socat watch arping cheat jemalloc lldpd node speedtest-cli xz asciinema duf lft lsusb openssl@1.1 sqlite yadm autojump exa libev minicom pcre2 tcl-tk bat gdbm libevent mpdecimal python@3.9 tcptraceroute brotli icu4c libnet mtr readline ticker c-ares iperf3 libpcap ncurses sipcalc ugrep ==> Casks font-inconsolata-nerd-font ngrok unofficial-wineskin google-chrome openconnect-gui mark-text powershell
Further documentation:
Oh My ZSH
macOS Big Sur uses zsh as the shell. Oh my zsh is an add-on that provides many additional features. You can read up on OMZ on their website. From the GitHub readme
A delightful community-driven (with 1800+ contributors) framework for managing your zsh configuration. Includes nearly 300 optional plugins (rails, git, OSX, hub, docker, homebrew, node, php, python, etc), over 140 themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.
This is a free, open-source project. If you find OMZ useful, please make a donation to the project.
I found this guy's blog and it has some useful tips for OMZ
https://github.com/AidanGlickman/Dotfiles-Mac/blob/master/terminal/.zshrc
The link is to his .zshrc file. I took quite a bit out of his config to help me get started.
Installation
By default, macOS doesn't create a configuration file for zsh. Before installing Oh My ZSH create one using
nano ~/.zshrc
Add
ZSH_DISABLE_COMPFIX=true
as the first line of ~/.zshrc file. This prevents a security notice on Mac. There isn't a Security issue, it's a false alert, but you can't continue the install until you do this. I had a little "Chicken and egg" issue. I added the line but Oh My ZSH overwrote the .zshrc file. I added it back in, reran the curl command and then it worked.
I'm coming from Ubuntu and BASH. I didn't think I would like zsh but with Oh My ZSH I am sold. I plan to install zsh with Oh My ZSH on my Unbuntu box I like it so much.
Now run the following shell script. NOTE: Normally it's not smart to run a shell script with curl from the Internet but you can review the script on the Oh My ZSH GitHub before running it.
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
Now OMZ should be installed and working.
Now we need to modify the .zshrc again.
Edit the .zshrc file
nano ~/.zshrc
Press ctrl+w to search in nano and search for plugins
set plugins to:
plugins=(git zsh-completions zsh-autosuggestions zsh-syntax-highlighting)
Download the plugins
Look at the git clone, notice that it clones into your .oh-my-zsh/custom directory.
git clone https://github.com/zsh-users/zsh-completions ${ZSH_CUSTOM:=~/.oh-my-zsh/custom}/plugins/zsh-completions git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
Some Additional Plugins that I find useful
Colored-man-pages
This plugin is very simple, all it does is colorize your man pages. It doesn't require a separate download, just add it to the plugins section in .zshrc
Here is what it looks like in action:
Aliases
Once you start creating aliases it's hard to remember all of them. Also, I didn't realize that the plugins create their own aliases.
This plugin simply lists all your aliases when you type acs. This one doesn't require a download either, just add it to the plugins section of .zshrc.
Here are a few lines output by aliases
┌─[mhubbard@HP8600-4] - [/private/tftpboot] - [3233] └─[$] acs [20:14:27] [\gitk] gk = \gitk --all --branches gke = \gitk --all $(git log -g --pretty=%h) [_default] - = cd - ... = ../.. .... = ../../.. ..... = ../../../.. ...... = ../../../../.. _ = sudo afind = ack -il cat = bat ec = subl /Users/mhubbard/.zshrc egrep = egrep --color=auto --exclude-dir={.bzr,CVS,.git,.hg,.svn,.idea,.tox} exa1 = exa -lFT --group-directories-first extip = dig +short myip.opendns.com @resolver1.opendns.com fgrep = fgrep --color=auto --exclude-dir={.bzr,CVS,.git,.hg,.svn,.idea,.tox} ggpur = ggu
Git
This plugin provides a lot of aliases for git. If you aren't using git then there is no need to add it in. This plugin doesn't require a separate download either. Just add "git" to the plugins section.
ZSH Docker Aliases
An amazing collection of Docker aliases. The project GitHub has a complete listing of the aliases.
Installation
git clone https://github.com/akarzim/zsh-docker-aliases.git ~/.oh-my-zsh/custom/plugins/zsh-docker-aliases # then add `zsh-docker-aliases` to `plugins` in your .zshrc
Here is what my plugins section looks like:
plugins=(git zsh-completions zsh-autosuggestions zsh-syntax-highlighting history-substring-search colored-man-pages aliases zsh-docker-aliases )
There are many more plugins for zsh. They can be found here: ZSH Plugins webpage
Set the editors to use
Set nano as the editor when using ssh and VSCode when not.
Find the line below, uncomment the if statement. Change the EDITOR variable to nano and code. NOTE: We will install VScode next so don't run the zsh edit command until we finish installing VSCode.
Preferred editor for local and remote sessions
if [[ -n $SSH_CONNECTION ]]; then export EDITOR='nano' else export EDITOR='code' fi
Add some aliases to the .zshrc file
Obviously, aliases are very personal. You may not want the ones I have added, but they are good examples of how to create aliases if you want to create your own. Once you get used to aliases you will wonder how you got by without them.
Update - I found a blog on aliases and it suggested put a 2 charcter prefix on your aliases. That way you can type the 2 characters, hit tab twice, and all of your personal aliases will be listed.
At the time of this writing, macOS includes Python 2.7. Since most of my tools are Python 3 I created these two aliases:
alias python=python3 alias pip=pip3
Show IP Address, Default GW, and name servers for wifi
alias ipen0='ifconfig en0 | grep "ether\|broadcast";netstat -nr | grep default | grep en0;cat /etc/resolv.conf | grep -v \#'
NOTE - On the M1 I had to add the \ character in front of the # symbol. Do not include it if you are on an Intel Mac.
└─[$] ipen0
ether 50:ed:3c:22:be:32
inet 192.168.10.143 netmask 0xffffff00 broadcast 192.168.10.255
default 192.168.10.254 UGScg en0
nameserver 1.1.1.1
nameserver 208.67.222.222
Show IP Address, Default GW, and name servers for en6
alias ipen6='ifconfig en6 | grep "ether\|broadcast";netstat -nr | grep default | grep en0;cat /etc/resolv.conf | grep -v \#'
NOTE - On the M1 I had to add the \ character in front of the # symbol. Do not include it if you are on an Intel Mac.
If you use a lot of different USB adapters you can use an alias with command line parameters. That way you just enter ipen<interface #> instead of having to create an alias for each interface.
alias ipenx='(){ifconfig en$1 | grep "ether\|broadcast";netstat -nr | grep default | grep en$1;cat /etc/resolv.conf | grep -v \# ;}'
NOTE - On the M1 I had to add the \ character in front of the # symbol. Do not include it if you are on an Intel Mac.
Example
options=6467<RXCSUM,TXCSUM,VLAN_MTU,TSO4,TSO6,CHANNEL_IO,PARTIAL_CSUM,ZEROINVERT_CSUM>
ether 00:e0:4c:68:00:c2
inet6 fe80::18c6:afde:6f:b92f%en10 prefixlen 64 secured scopeid 0x17
inet 192.168.10.149 netmask 0xffffff00 broadcast 192.168.10.255
nd6 options=201<PERFORMNUD,DAD>
media: autoselect (1000baseT <full-duplex>)
status: active
ipenx 10
inet 192.168.10.149 netmask 0xffffff00 broadcast 192.168.10.255
default 192.168.10.254 UGSc en10
nameserver 1.1.1.1
nameserver 208.67.222.222
I found this on stackexchange.com - zsh alias with parameter
IPv6
I have started to work with IPv6 a lot lately. I added some code to the IP alias to show the IPv6 address along with the IPv4 address information.
alias ipen0='ifconfig en0 | grep "ether\|broadcast";netstat -nr | grep default | grep en0;cat /etc/resolv.conf | grep -v \#;ifconfig en0 | grep inet6'
└─[$] ipen0
ether 50:ed:3c:22:be:32
inet 192.168.10.143 netmask 0xffffff00 broadcast 192.168.10.255
default 192.168.10.254 UGScg en0
nameserver 1.1.1.1
nameserver 208.67.222.222
inet6 fe80::1c73:952b:1fdf:6cda%en0 prefixlen 64 secured scopeid 0xc
alias ipen0='ifconfig en0 | grep "ether\|broadcast";netstat -nr | grep default | grep en0;cat /etc/resolv.conf | grep -v \#;ifconfig en0 | grep inet6 | awk -F " " '\''{print $2}'\'' | sed 's/%en0//''
┌─[mhubbard@HP8600-4] - [~/.ssh] - [3155]
└─[$] ipen0
ether 50:ed:3c:22:be:32
inet 192.168.10.143 netmask 0xffffff00 broadcast 192.168.10.255
default 192.168.10.254 UGScg en0
nameserver 1.1.1.1
nameserver 208.67.222.222
fe80::1c73:952b:1fdf:6cda
# Return the public IP address you are using
alias extip="dig +short myip.opendns.com @resolver1.opendns.com"
# open ~/.zshrc in using the default editor specified in $EDITOR
alias ec="$EDITOR $HOME/.zshrc"
# reload ~/.zshrc after making changes to active the changes
alias sc="exec zsh"
Search History
Themes
ZSH_THEME="duellj"
Fixing Path issues in ZSH
References for Oh My ZSH
The open command in terminal
Open finder in the current directory
Open an application
#allow opening multiple Wireshark windows wireshark='open -n /Applications/Wireshark.app'
Open an application with a file
open edge_template.txt
will open edge_template.txt in whatever application you have associated with a .txt file.
Again, not earth-shattering, also, you can open every associated file in a folder:
open *.txt
If you have projects organized in a way where you only have a handful of files of type in a folder this is useful.
Open a file in finder
I don't use this often but you can have "open" reveal a file in finderopen -R ~/networkRefresh/templates/edge_template.txt
VS Code
Installation
Browse to code.visualstudio.com
Download the universal app and run the installer.
Customize
Open VS Code to display the main interface
Add VSCode to the MacOS path
This is required to use code as the zsh editor and be opened from the terminal by typing code
Open the Command Palette (F1) and type "shell command" to find the "Shell Command: Install 'code' command in PATH" command:
This works as expected, but I have found that when I close code it removes the path. There must be a way to make it permanent but I haven't found it.
Add the Python extension
On the left, click the extensions view icon
search for "python" and install:
IntelliSense (Pylance)
Microsoft."
The latest version as of this writing is the December 2021 release. It includes "Pylance" which MS says provides robust and performant language features to Python users in Visual Studio Code. There is a link to the release page for Pylance in the reference section below.
There are hundreds of more extensions for Code. You can go to VSCode Marketplace to find more.
This blog has some advice on what to add - vscode extensions to become a more productive developer
Themes
How to disable telemetry reporting
Sync Settings to multiple laptops
Syncing a second laptop
Reference
Powershell
1..1024 | % {$test= new-object system.Net.Sockets.TcpClient; $wait = $test.beginConnect("allports.exposed",$_,$null,$null); ($wait.asyncwaithandle.waitone(250,$false)); if($test.Connected){echo "$_ open"}else{echo "$_ closed"}} | select-string " "
param([string]$server = "server", [string]$scope = "scope") $a = Import-Csv DHCP.csv foreach ($item in $a) { $ip=$($item.IP) $mac=$($item.MAC) #remove colons since MS DHCP can't deal with a real mac address $mac=$mac-replace'[:]' $name = $($item."AP-Name") write-host "netsh dhcp server $server scope $scope add reservedip $ip $mac $name" }
PS /Users/mhubbard/GoogleDrive/Test/configs> ./dhcp-csv.ps1 -server 192.168.10.221 -scope 10.112.105.0 netsh dhcp server 192.168.10.221 scope 10.112.105.0 add reservedip 10.112.105.100 a44c1138fa5b AP1 netsh dhcp server 192.168.10.221 scope 10.112.105.0 add reservedip 10.112.105.101 04d5900e779b AP2 netsh dhcp server 192.168.10.221 scope 10.112.105.0 add reservedip 10.112.105.102 b0faebdde8a6 AP3 netsh dhcp server 192.168.10.221 scope 10.112.105.0 add reservedip 10.112.105.103 a44c1138fa59 AP4 netsh dhcp server 192.168.10.221 scope 10.112.105.0 add reservedip 10.112.105.104 5057a86e4b49 AP5
Install-Module -Name VMware.PowerCLI
Connect-VIServer -Server 10.23.112.235 -Protocol https -Username 'Adminis!ra!or' -Password 'pa$$word'
PowerShell path on macOS
For some reason the PowerShell install didn't add the path. PowerShell is installed at:From inside the PowerShell terminal, you can use:
$Env:PATH
nano $PROFILE
To open the profile, then:
$Env:PATH += ":$HOME/.local/share/powershell/Scripts"
PowerShell Gallery
MS provides quite a bit of documentation for the Gallery. This link is a good place to start
PowerShell Gallery
DSC - Desirable State Configuration
You an also search from the terminal:
There is a lot more to PowerShell and now that it works on Linux/Mac, it is well worth the time to learn some. I am working on some PowerShell tools that will aid in deploying Dynamic Arp Inspection on switches. I created this GitHub repo if you are interested in looking at them.
Autojump
https://github.com/wting/autojump
autojump is a faster way to navigate your filesystem. It works by maintaining a database of the directories you use the most from the command line. Directories must be visited first before they can be jumped to.
Installation
brew install autojump
Add
[ -f /usr/local/etc/profile.d/autojump.sh ] && . /usr/local/etc/profile.d/autojump.sh
To the .zshrc file
Remember, you can type ec [enter] to open the .zshrc file in VScode.
/Users/mhubbard/GoogleDrive/Python/Scripts/prod
➜ prod git:(master) ✗
NodeJS
If you are planning to get Cisco's DevNet cert you need NodeJS.
brew install node
A lot of information scrolls past during the install. I didn't do any of the suggested modifications to my path. I saved the messages so if I run into issues I can follow the suggestions.
Postman
Postman is a tool for working with RESTful APIs. You will need it if you are working on the Cisco DevNet cert or just using a REST API on a switch.
Install the package as normal.
Open Postman and follow the instructions to create an account
Ngrok
From the ngrok website
Spend more time programming. One command for an instant, secure URL to your localhost server through any NAT or firewall.
You will need ngrok if you are working on the Cisco DevNet cert
brew install --cask ngrok
Verify
ngrok http 8000
ngrok by @inconshreveable (Ctrl+C to quit)
Session Status online
Session Expires 1 hour, 59 minutes
Version 2.3.35
Region United States (us)
Web Interface http://127.0.0.1:4040
Forwarding http://441c7dc90556.ngrok.io -> http://localhost:8000
Forwarding https://441c7dc90556.ngrok.io -> http://localhost:8000
Connections ttl opn rt1 rt5 p50 p90
0 0 0.00 0.00 0.00 0.00
Now start a python http server on port 8000 in a new iTerm tab
python http.server 8000
Open a browser and enter
http://441c7dc90556.ngrok.io
You will need to allow Python to accept incoming connections in System Preferences, Security & Privacy. The easiest way to do that is to stop/start the firewall after you start the Python web server. It will ask if you want to allow incoming connections to the python server.
This blog has some demos on ngrok. It's a little dated but still useful.
Google Chrome
brew install --cask google-chrome
Chrome is a universal app now.
Open Connect
An open source VPN client that can be used to connect to Cisco DevNet labs.
You will need Open Connect if you are working on the Cisco DevNet cert
Brew install --cask openconnect-gui
Minicom
minicom is an terminal app that allows you to connect to USB to Serial cables and console into devices.
brew install minicom
To set the "Meta" key to be the Mac Option key
Terminal > Preferences... (or type ⌘+,). Then, Profiles > Keyboard and check the box Use Option as Meta key.
https://www.shell-tips.com/mac/meta-key/
Before starting minicom you need to know the name of the com port that macOS assigned to your USB adapter. Open a terminal and enter:
ls -l /dev/tty.usb*
You should see something like this:
ls -l /dev/tty.usb*
crw-rw-rw- 1 root wheel 9, 6 Mar 15 15:54 /dev/tty.usbserial-1140
The first time you run minicom use
minicom -s
to enter setup mode. Scroll down to "Serial port setup" and press enter.
Use /dev/tty.usbserial-1140 for option A - Serial Device.
If you use a different USB cable you can start with:
minicom -D /dev/tty.usbserial-(name of new cable)
Logging
You can use -C (path/filename) to save a log.
That's enough for one blog! In the next installment, I will cover more networking tools like iPerf3, Wireshark, arp-scan, etc. Be sure to check back soon.
Thanks for sharing great information.
ReplyDeleteRead More
Read More
Read More
Read More
Read More
Read More
Wah terima kasih atas informasi website sehingga kami memahami mengenai tips mac
ReplyDeleteKami juga membahas ini di website kami, Monggo juga mampir sebagai info untuk beberapa informasi tentang mitos tentang mac
https://bangamingadget.com/mitos-mitos-tentang-mac-part-1/
terima kasih
Thanks for sharing this information. I really like your blog post very much. You have really shared a informative and interesting blog post . antimalware service executable high memory
ReplyDeleteJB Holmes The golf world is currently in the middle of the PGA Tour’s West Coast swing, but with almost half a year left until the next major championship, JB Holmes has some time to settle into his standard narrative with relative comfort. Net Worth Picker
ReplyDeleteAn air purifier is a machine that cleans the air in your home, offices, and most other living spaces. It removes harmful pollutants from the indoor air and odors, dust, mold spores, smoke particles, and other impurities.purifier space
ReplyDeleteBoots Elearning is the online portal for Boots employees, Boots eLearning allows employees to find training courses, book, sit and pay for their training online.
ReplyDeleteMycfavisit is a Visit Survey service by Chick fil A to improve their services. In return they give you free food. For now they are giving free sandwich to fill out their survey. This is how you can fill our Chick fil A survey.
ReplyDeleteJCPenney kiosk is an online website made by the JCPenney associate kiosk company also known as Jcp Kiosk. This website is basically designed for the employees of this JCPenney. It works to make it easy for the employees to know about their duties, work schedule, and the exact time when they have to work. Employees can find out the dates when they can get offs.
ReplyDeleteAs Chick-fil-A grows its worldwide presence, it stretches out the MyCFAVisit study to its worldwide areas. This permits clients from various nations to give their criticism and feelings, MyCFAVisit
ReplyDeleteThe TellCulvers survey is designed to gather comprehensive feedback, so it covers several areas of your experience. TellCulvers
ReplyDeleteThe survey is simple and can be completed within a few minutes. With an easy-to-use online platform, providing feedback has never been more convenient. Talktostopandshop
ReplyDelete