Other

Cisco Switch commands

Assign IP

enable
configure terminal
interface vlan <No>
ip address <IP> <Mask>
no shutdown
exit

Remove IP

enable
configure terminal
interface vlan <No>
no ip address <IP> <Mask>
exit

Assign a Gateway

enable
configure terminal
ip default-gateway <ip>
exit

Show interface IPs

show ip interface brief

Backup Config

copy startup-config tftp:

For restore put tftp: first.

To reboot the switch

enable
reload now

Remove a trunk

enable
configure terminal
interface GigabitEthernet1/0/13
switchport trunk allowed vlan remove 20,30,50,100
switchport mode access
no switchport nonegotiate
no switchport trunk allowed vlan none
no switchport trunk native vlan 100

Changing VLAN on port

enable
configure terminal
interface GigabitEthernet1/0/port
switchport access vlan vlanNo
switchport mode access
end

Check config and save to start-up config

show running-config interface GigabitEthernet1/0/port

write memory

PowerTools Renamer

Select all text

 

.*

Replace with "Main-number"

Main-${padding=0;increment=1;start=1}

 

Testing Multicasting

Multicast Address Basics

Multicast Group Address Range:

Valid range: 224.0.0.0 to 239.255.255.255 (Reserved for multicast traffic, not assigned to individual devices.)

Common Multicast Addresses:

How It Relates to Your Subnets

Multicast traffic is sent to the multicast group address (e.g., 239.255.255.250) and not directly to the subnet IP range (e.g., 192.168.10.0/24 or 192.168.20.0/24).

Devices that "subscribe" to the multicast group on either subnet will receive traffic sent to the multicast group address if multicast routing is configured properly (like IGMP Proxy in pfSense).

To verify multicast routing between your subnets:

On Subnet 192.168.10.0:

Run a multicast listener for 239.255.255.250 on one device:

iperf -s -u -B 239.255.255.250 -i 1

On Subnet 192.168.20.0:

Send multicast traffic from another device:

iperf -c 239.255.255.250 -u -b 1M -t 10

If multicast routing is configured correctly, the listener on 192.168.10.0 should receive the traffic.

 

Updating Ghost Server

Change to site directory.

call ghost update (not sudo)

Replacing a XCP-NG Raid1 disk and growing the array

Check RAID status

cat /proc/mdstat

Identify RAID devices and members

mdadm --detail /dev/md0

If /dev/md0 doesn’t exist, check which md device is being used:

lsblk | grep md

Check physical disks and partitions

lsblk -o NAME,SIZE,TYPE,UUID,MOUNTPOINT

Check volume groups and logical volumes (if LVM is used)

vgs
lvs

Check mount points and filesystems

df -h

For Lenovo m720q host: 

cat /proc/mdstat # check everything is synced

mdadm /dev/md127 --fail /dev/nvme0n1 # fail drive
mdadm /dev/md127 --remove /dev/nvme0n1 # remove drive

mdadm --detail /dev/md127 # double check

shutdown -h now # power off host

Swap disk out.

sgdisk -R=/dev/nvme0n1 /dev/sda #  clone partiion layout of /dev/sda
sgdisk -G /dev/nvme0n1   # Give it a new unique GPT GUID

This will mirror the partitions and metadata exactly. The commands assume that the new drive is still /dev/nvme0n1.

mdadm /dev/md127 --add /dev/nvme0n1 # add new disk to the RAID
watch cat /proc/mdstat # check rebuild progress

Wait until [UU] is shown again and rebuild completes (could take 15–60+ minutes depending on system load and speed).

mdadm --grow /dev/md127 --size=max # grow the raid array to use the full disk
mdadm --detail /dev/md127 # verify that its has been successful

 Resize the Partition Table on /dev/md127

gdisk /dev/md127

Double-check the start sector of md127p3 beforehand using lsblk -o NAME,START,SIZE or gdisk

pvresize /dev/md127p3 # resize the LVM PV

 Expand Your Volume Group or Logical Volumes

vgs # verify free space
lvextend -l +100%FREE /dev/VG_XenStorage-xxx/VHD-xxxxx #example of estending the volume
resize2fs /dev/VG_XenStorage-xxx/VHD-xxxxx # grow filesystem if needed (EXT4)
xfs_growfs /mount/point # (if XFS)

You can leave the free space in the VG for XenServer to manage VM disks.

Final checks

mdadm --detail --scan >> /etc/mdadm.conf # update mdadm config

Double-check everything work;

cat /proc/mdstat
vgs
lvs
df -h

Other notes

vgs
lvs # can add VG name

Crafted with the assistance of https://chatgpt.com/share/68328b0c-5094-8001-b27a-d7a27a61cdfc

Cloudflare Dynamic DNS IP Updater

Installation

git clone https://github.com/K0p1-Git/cloudflare-ddns-updater.git

Usage
This script is used with crontab. Specify the frequency of execution through crontab.

# ┌───────────── minute (0 - 59)
# │ ┌───────────── hour (0 - 23)
# │ │ ┌───────────── day of the month (1 - 31)
# │ │ │ ┌───────────── month (1 - 12)
# │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday 7 is also Sunday on some systems)
# │ │ │ │ │ ┌───────────── command to issue
# │ │ │ │ │ │
# │ │ │ │ │ │
# * * * * * /bin/bash {Location of the script}

Contributing
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.

Reference
This script was made with reference from [Keld Norman](https://www.youtube.com/watch?v=vSIBkH7sxos) video.

License
[MIT](https://github.com/K0p1-Git/cloudflare-ddns-updater/blob/main/LICENSE)

Actual Script

#!/bin/bash
## change to "bin/sh" when necessary

## Add below to see logs
##set -x  # Echo each command before execution
##exec > /tmp/cloudflare-debug.log 2>&1  # Redirect all output to a temp log
##echo "=== Script Started: $(date) ==="

auth_email="cloudflare@login.com"               # The email used to login 'https://dash.cloudflare.com'
auth_method="global"                                # Set to "global" for Global API Key or "token" for Scoped API Token
auth_key="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"    # Your API Token or Global API Key
zone_identifier="yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"  # Can be found in the "Overview" tab of your domain
record_name="sub.domain.com"                                      # Which record you want to be synced
ttl="3600"                                          # Set the DNS TTL (seconds)
proxy="false"                                       # Set the proxy to true or false
sitename=""                                         # Title of site "Example Site"
slackchannel=""                                     # Slack Channel #example
slackuri=""                                         # URI for Slack WebHook "https://hooks.slack.com/services/xxxxx"
discorduri=""                                       # URI for Discord WebHook "https://discordapp.com/api/webhooks/xxxxx"


###########################################
## Check if we have a public IP
###########################################
ipv4_regex='([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])'
ip=$(curl -s -4 https://cloudflare.com/cdn-cgi/trace | grep -E '^ip'); ret=$?
if [[ ! $ret == 0 ]]; then # In the case that cloudflare failed to return an ip.
    # Attempt to get the ip from other websites.
    ip=$(curl -s https://api.ipify.org || curl -s https://ipv4.icanhazip.com)
else
    # Extract just the ip from the ip line from cloudflare.
    ip=$(echo $ip | sed -E "s/^ip=($ipv4_regex)$/\1/")
fi

# Use regex to check for proper IPv4 format.
if [[ ! $ip =~ ^$ipv4_regex$ ]]; then
    logger -s "DDNS Updater: Failed to find a valid IP."
    exit 2
fi

###########################################
## Check and set the proper auth header
###########################################
if [[ "${auth_method}" == "global" ]]; then
  auth_header="X-Auth-Key:"
else
  auth_header="Authorization: Bearer"
fi

###########################################
## Seek for the A record
###########################################

logger "DDNS Updater: Check Initiated"
record=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$zone_identifier/dns_records?type=A&name=$record_name" \
                      -H "X-Auth-Email: $auth_email" \
                      -H "$auth_header $auth_key" \
                      -H "Content-Type: application/json")

###########################################
## Check if the domain has an A record
###########################################
if [[ $record == *"\"count\":0"* ]]; then
  logger -s "DDNS Updater: Record does not exist, perhaps create one first? (${ip} for ${record_name})"
  exit 1
fi

###########################################
## Get existing IP
###########################################
old_ip=$(echo "$record" | sed -E 's/.*"content":"(([0-9]{1,3}\.){3}[0-9]{1,3})".*/\1/')
# Compare if they're the same
if [[ $ip == $old_ip ]]; then
  logger "DDNS Updater: IP ($ip) for ${record_name} has not changed."
  exit 0
fi

###########################################
## Set the record identifier from result
###########################################
record_identifier=$(echo "$record" | sed -E 's/.*"id":"([A-Za-z0-9_]+)".*/\1/')

###########################################
## Change the IP@Cloudflare using the API
###########################################
update=$(curl -s -X PATCH "https://api.cloudflare.com/client/v4/zones/$zone_identifier/dns_records/$record_identifier" \
                     -H "X-Auth-Email: $auth_email" \
                     -H "$auth_header $auth_key" \
                     -H "Content-Type: application/json" \
                     --data "{\"type\":\"A\",\"name\":\"$record_name\",\"content\":\"$ip\",\"ttl\":\"$ttl\",\"proxied\":${proxy}}")

###########################################
## Report the status
###########################################
case "$update" in
*"\"success\":false"*)
  echo -e "DDNS Updater: $ip $record_name DDNS failed for $record_identifier ($ip). DUMPING RESULTS:\n$update" | logger -s
  if [[ $slackuri != "" ]]; then
    curl -L -X POST $slackuri \
    --data-raw '{
      "channel": "'$slackchannel'",
      "text" : "'"$sitename"' DDNS Update Failed: '$record_name': '$record_identifier' ('$ip')."
    }'
  fi
  if [[ $discorduri != "" ]]; then
    curl -i -H "Accept: application/json" -H "Content-Type:application/json" -X POST \
    --data-raw '{
      "content" : "'"$sitename"' DDNS Update Failed: '$record_name': '$record_identifier' ('$ip')."
    }' $discorduri
  fi
  exit 1;;
*)
  logger "DDNS Updater: $ip $record_name DDNS updated."
  if [[ $slackuri != "" ]]; then
    curl -L -X POST $slackuri \
    --data-raw '{
      "channel": "'$slackchannel'",
      "text" : "'"$sitename"' Updated: '$record_name''"'"'s'""' new IP Address is '$ip'"
    }'
  fi
  if [[ $discorduri != "" ]]; then
    curl -i -H "Accept: application/json" -H "Content-Type:application/json" -X POST \
    --data-raw '{
      "content" : "'"$sitename"' Updated: '$record_name''"'"'s'""' new IP Address is '$ip'"
    }' $discorduri
  fi
  exit 0;;
esac

 

OpenDNS Linux IP Updater

Install ddclient

/etc/ddclient.conf

##
## OpenDNS.com account-configuration
##
protocol=dyndns2
use=web, web=myip.dnsomatic.com
ssl=yes
server=updates.opendns.com
login=opendns_username
password='opendns_password' # If there are any single-quotes in your password, put backslash ( \ ) before the single-quote to escape the character.
opendns_network_label #can find the network label in the Settings Tab of the OpenDNS Dashboard

 

https://support.opendns.com/hc/en-us/articles/227987727-Linux-IP-Updater-for-Dynamic-Networks