Nützliche selbstgestrickte Scripte für die Alltagsadministration

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Benutzeravatar
heisenberg
Beiträge: 3700
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von heisenberg » 30.10.2023 23:05:35

Merci!

Benutzeravatar
HelsAett
Beiträge: 749
Registriert: 18.03.2003 18:25:00

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von HelsAett » 27.11.2023 11:42:22

Ich habe eines zum Aufbau von SSH Tunneln, welches ich regelmässig nutze. Achtung "KnownHost" muss dazu unverschlüsselt seien.

Code: Alles auswählen

#!/bin/bash

# Function to display a list of known hosts
show_known_hosts() {
  cut -f 1 -d ' ' <~/.ssh/known_hosts | sed -e 's/,.*//g' | uniq | grep -v "\[" | tr ' ' '\n' | grep -v "=" | sort
}

# Function to prompt for yes/no answers
ask_yes_no() {
  local prompt="$1 (yes/no): "
  read -p "$prompt" response
  case "$response" in
    [YyJj]) return 0 ;; # Yes
    [Nn]) return 1 ;;   # No
    *) ask_yes_no "$prompt" ;; # Repeat prompt if the answer is not valid
  esac
}

# Display the list of known hosts if the user chooses to
if ask_yes_no "Do you want to display the list of known hosts?"; then
  show_known_hosts
fi

# Read connection details
read -p "Server hostname or IP address: " Server
read -p "Username: " User
read -p "Remote server source port: " sPort
read -p "Local port on your computer: " lPort

# Set up SSH tunnel and display message
if ssh -L ${lPort}:${Server}:${sPort} -D 1083 -p 1081 ${User}@localhost \
  "while true; do echo -e \"Tunnel to ${Server}, local port ${lPort}\"; sleep 15; done"
then
  echo "The SSH tunnel has been successfully established."
else
  echo "ERROR: The SSH tunnel could not be established."
fi


ein weiteres zum auslesen, der Gültigkeit von Zertifikaten die übers System verteilt sind.

Code: Alles auswählen

#!/bin/bash

# Check if the required arguments are provided
if [ "$#" -ne 1 ]; then
    script_name=$(basename "$0")
    echo "Invalid number of arguments. Please use the command as follows:"
    echo "Usage: $script_name <DIRECTORY>"
    exit 1
fi

# Directory to search for certificates
search_directory="$1"

# Function to extract certificate information and check validity
extract_certificate_info() {
    cert_file="$1"
    
    # Extract certificate issuer
    issuer=$(openssl x509 -noout -issuer -in "$cert_file" | cut -d '=' -f 2-)
    
    # Extract certificate subject (domain)
    subject=$(openssl x509 -noout -subject -in "$cert_file" | cut -d '=' -f 2-)
    
    # Extract certificate serial number
    serial=$(openssl x509 -noout -serial -in "$cert_file" | cut -d '=' -f 2)
    
    # Extract certificate validity
    validity=$(openssl x509 -noout -dates -in "$cert_file" | grep "notBefore\|notAfter")

    not_after_date=$(echo "$validity" | grep "notAfter" | cut -d '=' -f 2)
    
    unixtime=$(date +%s)
    
    # Calculate the number of days until the expiration date
    expired=$(date -d "${not_after_date}" +%s)
    difference=$((expired - unixtime))
    days=$((difference / 86400))

    if [ "$days" -lt 0 ]; then
        # The expiration date is in the past (Error)
        color_start="\e[0;31m"  # Red
        color_end="\e[m"
        color_status="Error"
    elif [ "$days" -le 300 ]; then
        # The expiration date is in less than or equal to 30 days (Warning)
        color_start="\e[0;33m"  # Yellow
        color_end="\e[m"
        color_status="Warning"
    else
        # The expiration date is in more than 30 days (Success)
        color_start="\e[0;32m"  # Green
        color_end="\e[m"
        color_status="Ok"
    fi

    echo "Certificate: $cert_file"
    echo "Issuer: $issuer"
    echo "Subject: $subject"
    echo "Serial Number: $serial"
    echo -e "Validity: ${color_start}$not_after_date${color_end} ($color_status, the expiration date is in more than 30 days)"
    echo
}

# Find and process certificates in the directory
find "$search_directory" -type f -iname "*.crt" | while read cert_file; do
    extract_certificate_info "$cert_file"
done

Ein weiteres für das automatische verschlüsselte Backups, beim Anschluss bestimmter USB Platten. Voraussetzung hier, Luks verschlüsselte USB Platten, die UDEV bekannt, sind so dass das Script beim Anschluss dieser automatisch Startet. Das Script Mountet dann die USB Platten, Entschlüsselt diese und Startet dann ein Backupscript. Das Backupscript wiederrum kann dann ein einzelnes Backup Starten oder wenn mehrere USB Platten angeschlossen wurden, die bekannt sind, diese dann automatisch synchronisieren.

Code: Alles auswählen

#!/bin/bash

# Export paths
export PATH=$PATH:/usr/bin:/usr/sbin:/bin:/sbin
# Set the DISPLAY variable for graphical applications
export DISPLAY=:0
# Set the keyfile path
keyfile=/mnt/usbstick/KeyFile.bin

# Check if USB auto-backup is already running
backup_is_running=/tmp/start_usb_auto_backup_is_running
if [ -f "$backup_is_running" ]; then
  # If the script is already running, exit
  exit 0
fi
su debian -c "touch $backup_is_running"

# Wait for 3 seconds for other devices
sleep 3

# Function to decrypt and mount a USB drive
decrypt_and_mount() {
  local device=$1
  local mapper_name="crypt_usb_$device"
  local mount_point="/mnt/crypt_usb_$device"

  # Check if the device is already decrypted and mounted
  if [ -e "/dev/mapper/$mapper_name" ] && [ -e "$mount_point/Linux" ]; then
    echo "Drive $device is already decrypted and mounted."
    return
  fi

  # Decrypt and mount the USB drive
  /usr/sbin/cryptsetup luksOpen "/dev/$device" "$mapper_name" --key-file "$keyfile" && \
  /bin/systemd-mount "/dev/mapper/$mapper_name" "$mount_point/"
}

# Check the number of USB devices
usb_devices_count=$(lsusb | grep -c "152d")

# Decide if USB devices were found
if [ "$usb_devices_count" -gt 0 ]; then
  # Find USB devices and call decrypt_and_mount for each
  usb_devices=($(ls -l /dev/disk/by-id/usb* | awk '{print $NF}' | cut -c7-))
  for device in "${usb_devices[@]}"; do
    decrypt_and_mount "$device"
  done
fi

# Call the user's backup script
su debian -c "/opt/autobackup/usb_auto_backup.sh &"

# Wait for the backup script
sleep 10

# Check if the backup script is still running; if not, unmount encrypted devices and exit the script
while true; do
  if [ -f "$backup_is_running" ]; then
    # If the backup is running, wait for 10 seconds and check again
    sleep 10
  else
    # If the backup is not running, unmount the encrypted devices and exit the script
    /opt/autobackup/umount_usb_auto_backup.sh
    exit 0
  fi
done

Benutzeravatar
heisenberg
Beiträge: 3700
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Script: Load- und temperaturabhängige CPU-Frequenzsteuerung

Beitrag von heisenberg » 13.03.2024 13:42:55

Load- und temperaturabhängige CPU-Frequenzsteuerung

Ich habe mir hier mal ein Script geschrieben, das die CPU-Frequenz herunterregelt, wenn die Temperatur zu hoch ist. Solche Programme gibt es Einige. Ich habe mir das geschrieben, weil ich die Drosselung gerne nur dann hätte, wenn die CPU-Load ausreichend niedrig ist. D. h. die Überschreitung der Maximaltemperatur ist bei hoher Load für mich akzeptabel. Ich nehme dabei auch immer den höchsten Load-Wert aus dem Tripel 1/5/15-Minuten Load, damit sowohl auf kurzfristige Laststeigerungen schnell reagiert wird, als auch bei nur kurzfristigen Lastabfällen nicht sofort die Frequenz wieder herunter gedreht wird. Ich möchte also eine möglichst geringe Beeinträchtigung der Performance des Servers.

Ansonsten wird bei großen Unter- oder Überschreitungen der Temperatur mit größeren Frequenzsprüngen reagiert, um eine schnellere Wirkung zu erzielen. Mir ist im Übrigen auch klar, dass die CPU-Auslastung nicht der einzige Auslöser für eine hohe Load ist. Auch die Entscheidung einfach von allen Temperatursensoren immer den höchsten Temperaturwert zu nehmen, trifft üblicherweise auf den Prozessor-Sensor zu, muss es aber nicht unbedingt. Das ist nicht perfekt, passt aber für den vorliegenden Anwendungsfall.

Ein Gedanke, den ich am Anfang hatte, war noch der, ob das so gut ist, ständig an den Frequenzlimits rum zu drehen. Nachdem sich die aktuellen Taktfrequenzen der CPU-Cores aber sowieso ständig ändern (governor powersave), scheint mir dieses Bedenken unbegründet.

Auch scheint das Anliegen insgesamt widersprüchlich: Die Temperatur geht hoch, wenn die CPU-Last hoch geht und wenn die CPU Last hat, dann wird sie auch gebraucht. Da ergibt es ja keinen Sinn, gleichzeitig die Geschwindigkeit runter zu drehen. Faktisch bringt es aber doch etwas.

Code: Alles auswählen

#!/usr/bin/env ruby

#       CPU Temperature/Load-dependent CPU-Frequency control
#
#       Throttle CPU when temperature is too high, but only when cpu load is low.
#
#       INSTALLATION
#
#         install the following ruby gems
# 
#           gem install sys-cpu
#           gem install awesome_print
#           gem install find
#
#         needs the following debian-packages
#
#           cpufrequtils
#
#       RULES (prio from high to low)
# 
#       if load_avg    >=MAX_LOAD   frequency to maximum
#       if load_avg    >=HOLD_LOAD  no frequency reduction
#       if temperature >= CRIT+10   frequenz minus 1500 (delta-2)
#       if temperature >= CRIT+5    frequenz minus  500 (delta-1)
#       if temperature >= CRIT      frequenz minus  100 (delta-0)
#       if temperature <  CRIT-15   frequenz plus  1500 (delta-2)
#       if temperature <  CRIT-10   frequenz plus   500 (delta-1)
#       if temperature <  CRIT-5    frequenz plus   100 (delta-0)
#

require 'sys-cpu'
require 'awesome_print' # optional - maybe commented out
require 'find'

# global variables

$cpu_step_unit=1000                     # units for changing the cpu frequency
$hysteresis_delay=5                     # delay in seconds to wait for temperature change to happen
$max_load_allowed=10                    # cpu load at which frequency will be set to max
$load_hold=8                            # cpu load at which frequency will no longer be reduced
$temp_limit_upper=75                    # temperature at which cpu will be throttled
$temp_limit_lower=$temp_limit_upper-5   # temperature at which cpu will be raised
$temp_limit_delta1=5                    # temperature difference at which frequency change delta1 will be used
$temp_limit_delta2=10                   # temperature difference at which frequency change delta2 will be used
$freq_change_delta0=100                 
$freq_change_delta1=500               
$freq_change_delta2=1500

$temp_sensor_files=[]                   # temperature sensor files for this system (autodetect)
$core_count                             # number of available cpu cores (autodetect)
$cpu_freq_max                           # highest possible cpu frequency (autodetect)
$cpu_freq_min                           # lowest possible cpu frequency (autodetect)


$log_levels = { 
  7 => "DBG2",
  6 => "DBG1",
  5 => "INFO",
  4 => "NOTE",
  3 => "WARN",
  2 => "ERRO", 
  1 => "CRIT", 
  0 => "NONE" }

$lrev = {
  :DBG2 => 7,
  :DBG1 => 6,
  :INFO => 5,
  :NOTE => 4,
  :WARN => 3,
  :ERRO => 2, 
  :CRIT => 1, 
  :NONE => 0 }

$log_level = $lrev[:INFO]

def log(level,text)
 if level <= $log_level then
   puts $log_levels[level] + " " + text
 end
end

def lg_dbg2(text)  log($lrev[:DBG2],text) end
def lg_dbg(text)   log($lrev[:DBG1],text) end
def lg_info(text)  log($lrev[:INFO],text) end
def lg_note(text)  log($lrev[:NOTE],text) end
def lg_warn(text)  log($lrev[:WARN],text) end
def lg_error(text) log($lrev[:ERRO],text) end
def lg_crit(text)  log($lrev[:CRIT],text) end

def get_temp_sensors() 

  # find temperature sensor files of this system

  Find.find("/sys") do |path|
    if File.basename(path) == "temp" then
      $temp_sensor_files.push(path)
    end
  end

end

def get_temperature() 

  # get maximum temperature of all found sensors

  max_temp=0
  $temp_sensor_files.each do |file|
    temp = File.open(file).read.to_i/1000
    if temp > max_temp then
      max_temp = temp
    end
  end
  return max_temp

end

def get_system_data() 

  $cpu_freq_max=File.open("/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_max_freq").read.to_i/1000
  $cpu_freq_min=File.open("/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_min_freq").read.to_i/1000
  $core_count=`nproc`.to_i
  lg_info("")
  lg_info("CPU Max Frequency          : #{$cpu_freq_max} MHz")
  lg_info("CPU Min Frequency          : #{$cpu_freq_min} MHz")
  lg_info("CPU Core Count             : #{$core_count}")
  lg_info("High Temperature Threshold : #{$temp_limit_upper} °C")
  lg_info("Low Temperature Threshold  : #{$temp_limit_lower} °C")
  get_temp_sensors
  lg_info("Temperature Sensors found  : #{$temp_sensor_files.count}")
  lg_info("Max load Threshold         : #{$max_load_allowed}")
  lg_info("Hold load Threshold        : #{$load_hold}")
  lg_info("Frequency Set Delay        : #{$hysteresis_delay}")
  lg_info("")

end

def get_load() 
  # get highest value of cpu load (1/5/15 min average)
  return Sys::CPU.load_avg.max
end

def check_high_temp(current_temperature)
  freq_change=false
  if current_temperature > ($temp_limit_upper + $temp_limit_delta2) then
    freq_change = 0 - $freq_change_delta2
  else
    if current_temperature > ($temp_limit_upper + $temp_limit_delta1) then
      freq_change = 0 - $freq_change_delta1
    else
      if current_temperature > $temp_limit_upper then
        freq_change = 0 - $freq_change_delta0
      end
    end
  end
  lg_dbg("evaluated freq_change: #{freq_change}")
  return freq_change
end

def check_low_temp(current_temperature)
  freq_change=false
  if current_temperature < $temp_limit_lower then
    freq_change = $freq_change_delta0
    if current_temperature < ($temp_limit_lower - $temp_limit_delta1) then
      freq_change = $freq_change_delta1
      if current_temperature < ($temp_limit_lower - $temp_limit_delta2) then
        freq_change = $freq_change_delta2
      end
    end
  end
  lg_dbg("evaluated freq_change: #{freq_change}")
  return freq_change
end

def freq_change(freq_diff)
  current_freq=cpu_freq_get
  cpu_freq_set_all_cores current_freq + freq_diff
end

def cpu_freq_set_all_cores(freq)

  lg_dbg("Evaluating to set frequency #{freq.to_s} MHz on all cores")

  if freq < $cpu_freq_min then
    lg_dbg("Trying to set frequency #{freq.to_s} MHz which is below minimum. setting to minimum")
    freq = $cpu_freq_min
  end

  if freq > $cpu_freq_max then
    lg_dbg("Trying to set frequency #{freq.to_s} MHz which is above maximum. setting to maximum")
    freq = $cpu_freq_max
  end

  current_freq=cpu_freq_get
  if current_freq == freq then
    lg_dbg("Trying to set frequency #{freq.to_s} MHz which is already set, doing nothing")
    return
  end

  lg_dbg2("Setting frequency #{freq.to_s} MHz on all cores")
  for core_nr in 0 .. ($core_count - 1) do 
    res = system("cpufreq-set","-c", core_nr.to_s, "--max", (freq * 1000).to_s );
  end
end

def cpu_freq_get()
  return File.open("/sys/devices/system/cpu/cpufreq/policy0/scaling_max_freq").read.to_i/1000
end

def eval_freq_change(current_load, current_temperature)

    if current_load > $max_load_allowed then
      lg_info("High load detected.")
      cpu_freq_set_all_cores $cpu_freq_max
    else
      if current_load > $load_hold then
        lg_info("Above normal load detected.")
        # high load: don't reduce speed
        if freq_change_amount=check_low_temp(current_temperature) then
          lg_dbg("Temperature is cool, trying to increase by #{freq_change_amount} MHz")
          freq_change freq_change_amount
        end
      else
        # normal load: check temperature
        lg_dbg("Load is normal. Checking Temperature")

        # check for too high tempratures
        if freq_change_amount=check_high_temp(current_temperature) then
          # decrease frequency
          lg_dbg("Temperature is high, trying to decrease by #{freq_change_amount*-1} MHz")
          freq_change freq_change_amount
        else
          # check for cool enough temperatures
          if freq_change_amount=check_low_temp(current_temperature) then
            lg_dbg("Temperature is cool, trying to increase by #{freq_change_amount} MHz")
            # increase frequency
            freq_change freq_change_amount
          else
            lg_dbg("Temperature is at an acceptable level")
          end
        end

      end
    end
end

def main()
    $stdout.sync = true
    get_system_data()
    while(1) do
      current_temperature=get_temperature
      current_load=get_load
      lg_info("Temperature: #{current_temperature} °C Load: #{"%.2f" % current_load} CPU-Frequency: #{cpu_freq_get()} MHz")
      eval_freq_change(current_load,current_temperature)
      sleep $hysteresis_delay
    end
end

main
Beispiel der Logausgabe

Code: Alles auswählen

Mar 13 13:57:55 icarus02 systemd[1]: Started CPU Freqency Control to keep maximum temperature.
Mar 13 13:57:55 icarus02 cpu-freq-throttle.rb[4044249]: INFO
Mar 13 13:57:55 icarus02 cpu-freq-throttle.rb[4044249]: INFO CPU Max Frequency          : 5000 MHz
Mar 13 13:57:55 icarus02 cpu-freq-throttle.rb[4044249]: INFO CPU Min Frequency          : 800 MHz
Mar 13 13:57:55 icarus02 cpu-freq-throttle.rb[4044249]: INFO CPU Core Count             : 16
Mar 13 13:57:55 icarus02 cpu-freq-throttle.rb[4044249]: INFO High Temperature Threshold : 65 °C
Mar 13 13:57:55 icarus02 cpu-freq-throttle.rb[4044249]: INFO Low Temperature Threshold  : 60 °C
Mar 13 13:57:56 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature Sensors found  : 4
Mar 13 13:57:56 icarus02 cpu-freq-throttle.rb[4044249]: INFO Max load Threshold         : 10
Mar 13 13:57:56 icarus02 cpu-freq-throttle.rb[4044249]: INFO Hold load Threshold        : 8
Mar 13 13:57:56 icarus02 cpu-freq-throttle.rb[4044249]: INFO Frequency Set Delay        : 5
Mar 13 13:57:56 icarus02 cpu-freq-throttle.rb[4044249]: INFO
Mar 13 13:57:56 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 82 °C Load: 69.45 CPU-Frequency: 5000 MHz
Mar 13 13:57:56 icarus02 cpu-freq-throttle.rb[4044249]: INFO High load detected.
Mar 13 13:58:01 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 83 °C Load: 68.96 CPU-Frequency: 5000 MHz
Mar 13 13:58:01 icarus02 cpu-freq-throttle.rb[4044249]: INFO High load detected.
Mar 13 13:58:06 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 82 °C Load: 68.44 CPU-Frequency: 5000 MHz
Mar 13 13:58:06 icarus02 cpu-freq-throttle.rb[4044249]: INFO High load detected.
Mar 13 13:58:11 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 83 °C Load: 67.95 CPU-Frequency: 5000 MHz
Mar 13 13:58:11 icarus02 cpu-freq-throttle.rb[4044249]: INFO High load detected.
...
Mar 13 14:37:19 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 49 °C Load: 8.16 CPU-Frequency: 5000 MHz
Mar 13 14:37:19 icarus02 cpu-freq-throttle.rb[4044249]: INFO Above normal load detected.
Mar 13 14:37:24 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 50 °C Load: 8.12 CPU-Frequency: 5000 MHz
Mar 13 14:37:24 icarus02 cpu-freq-throttle.rb[4044249]: INFO Above normal load detected.
Mar 13 14:37:29 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 50 °C Load: 8.08 CPU-Frequency: 5000 MHz
Mar 13 14:37:29 icarus02 cpu-freq-throttle.rb[4044249]: INFO Above normal load detected.
Mar 13 14:37:34 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 49 °C Load: 8.05 CPU-Frequency: 5000 MHz
Mar 13 14:37:34 icarus02 cpu-freq-throttle.rb[4044249]: INFO Above normal load detected.
Mar 13 14:37:39 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 68 °C Load: 8.01 CPU-Frequency: 5000 MHz
Mar 13 14:37:39 icarus02 cpu-freq-throttle.rb[4044249]: INFO Above normal load detected.
Mar 13 14:37:44 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 71 °C Load: 7.97 CPU-Frequency: 5000 MHz
Mar 13 14:37:49 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 64 °C Load: 7.95 CPU-Frequency: 4500 MHz
Mar 13 14:37:54 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 49 °C Load: 7.91 CPU-Frequency: 4500 MHz
Mar 13 14:37:59 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 73 °C Load: 7.90 CPU-Frequency: 5000 MHz
Mar 13 14:38:04 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 68 °C Load: 7.88 CPU-Frequency: 4500 MHz
Mar 13 14:38:09 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 62 °C Load: 7.86 CPU-Frequency: 4400 MHz
Mar 13 14:38:14 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 64 °C Load: 7.83 CPU-Frequency: 4400 MHz
Mar 13 14:38:19 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 64 °C Load: 7.79 CPU-Frequency: 4400 MHz
Mar 13 14:38:24 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 65 °C Load: 7.75 CPU-Frequency: 4400 MHz
Mar 13 14:38:29 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 51 °C Load: 7.72 CPU-Frequency: 4400 MHz
Mar 13 14:38:34 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 64 °C Load: 7.69 CPU-Frequency: 4900 MHz
Mar 13 14:38:39 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 50 °C Load: 7.65 CPU-Frequency: 4900 MHz
Mar 13 14:38:44 icarus02 cpu-freq-throttle.rb[4044249]: INFO Temperature: 58 °C Load: 7.61 CPU-Frequency: 5000 MHz
So wirkt sich dass dann im Betrieb aus:

4733

Benutzeravatar
speefak
Beiträge: 516
Registriert: 27.04.2008 13:54:20

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von speefak » 03.04.2024 11:48:53

Ich bekomme da eine Fehlermeldung bei dem CPU Script

Code: Alles auswählen

./test
<internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require': cannot load such file -- sys-cpu (LoadError)
	from <internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require'
	from ./test:31:in `<main>'
Bash Scripte die ich fast täglich nutze :

https://github.com/speefak/ipspec
https://github.com/speefak/df_mod
https://github.com/speefak/rear-backup
https://github.com/speefak/backup_system_user_config

Benutzeravatar
heisenberg
Beiträge: 3700
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von heisenberg » 03.04.2024 11:51:27

speefak hat geschrieben: ↑ zum Beitrag ↑
03.04.2024 11:48:53
Ich bekomme da eine Fehlermeldung bei dem CPU Script

Code: Alles auswählen

./test
<internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require': cannot load such file -- sys-cpu (LoadError)
	from <internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require'
	from ./test:31:in `<main>'
Im Head des Scriptes stehen ein paar Installationsanweisungen. Es müssen Ruby-Module installiert werden:

Code: Alles auswählen

# gem install sys-cpu awesome_print find
Debiancpufrequtils müssen auch installiert sein.

Benutzeravatar
speefak
Beiträge: 516
Registriert: 27.04.2008 13:54:20

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von speefak » 03.04.2024 11:54:56

whisper hat geschrieben: ↑ zum Beitrag ↑
25.03.2021 20:13:35
1+ für den Thread!

Ich hatte mal vor Jahren einen Rechte Gau. Das damals verwendete Backup hatte beim Restore die Rechte der Dateien versaut.
Ich war selber schuld, weil ich halt direkt zurück gesichert hatte.
Deshalb läuft auf dem Server nun das hier:

Code: Alles auswählen

#!/bin/bash
#dateirechte.sh
DATUM=$(date +%d-%m-%Y)

nice getfacl -R -n / >/home/backup/dateirechte-$DATUM.txt
 
# wieder herstellen mit
#setfacl --restore=dateirechte.txt
Die Datei dateirechte.txt wird täglich mitgesichert und hilft versehentliche Änderungen zu reparieren
Ausserdem bei evtl. forensichen Vorfällen

Das ist gar nicht so verkehrt - mir ist auch schon mal aus versehen ein chown -R root:root / durchgelaufen - war nicht so der dolle :oops: :cry: :evil: . Zum Glück hatte ich noch ein REAR image. Schön wäre die Möglichkeit Pfade auszulassen. Mein 20 TB Archiv hat nur eine Rechte/Zugriffs Konfiguration.

Benutzeravatar
whisper
Beiträge: 3222
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von whisper » 03.04.2024 16:30:05

speefak hat geschrieben: ↑ zum Beitrag ↑
03.04.2024 11:54:56
Das ist gar nicht so verkehrt - mir ist auch schon mal aus versehen ein chown -R root:root / durchgelaufen - war nicht so der dolle :oops: :cry: :evil: . Zum Glück hatte ich noch ein REAR image. Schön wäre die Möglichkeit Pfade auszulassen. Mein 20 TB Archiv hat nur eine Rechte/Zugriffs Konfiguration.
Danke, läuft immer noch und hat mit der Zeit schon ein paar mal geholfen.

Benutzeravatar
speefak
Beiträge: 516
Registriert: 27.04.2008 13:54:20

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von speefak » 05.04.2024 10:42:48

heisenberg hat geschrieben: ↑ zum Beitrag ↑
03.04.2024 11:51:27
speefak hat geschrieben: ↑ zum Beitrag ↑
03.04.2024 11:48:53
Ich bekomme da eine Fehlermeldung bei dem CPU Script

Code: Alles auswählen

./test
<internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require': cannot load such file -- sys-cpu (LoadError)
	from <internal:/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb>:85:in `require'
	from ./test:31:in `<main>'
Im Head des Scriptes stehen ein paar Installationsanweisungen. Es müssen Ruby-Module installiert werden:

Code: Alles auswählen

# gem install sys-cpu awesome_print find
Debiancpufrequtils müssen auch installiert sein.
Pakete sind installiert, Ruby Pakete zu cpufrequtils :roll:

Benutzeravatar
heisenberg
Beiträge: 3700
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von heisenberg » 05.04.2024 11:40:51

speefak hat geschrieben: ↑ zum Beitrag ↑
05.04.2024 10:42:48
Pakete sind installiert, Ruby Pakete zu cpufrequtils :roll:
Ich wiederhole das nochmal: Die folgende Zeile, die im Skript steht und die ich in meinem letzten Beitrag schrieb, muss als root ausgeführt werden:

Code: Alles auswählen

gem install sys-cpu awesome_print find
Das sind drei Module, die ich im Skript einbinde. Die müssen da sein.

Benutzeravatar
speefak
Beiträge: 516
Registriert: 27.04.2008 13:54:20

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von speefak » 11.04.2024 16:29:46

Dokus in Scripten lese ich als erstes 8) hab's als root und User probiert. Werd's die Tage nochmal inner frischen D12 VM probieren.

Benutzeravatar
heisenberg
Beiträge: 3700
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von heisenberg » 11.04.2024 16:39:23

Was ist bei Dir die Ausgabe von:

Code: Alles auswählen

gem install sys-cpu awesome_print find
Die Fehlermeldung von Dir bedeutet, dass das Modul nicht geladen werden könnte, weil nicht gefunden.

Benutzeravatar
speefak
Beiträge: 516
Registriert: 27.04.2008 13:54:20

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von speefak » 13.04.2024 20:57:33

Code: Alles auswählen

sudo gem install sys-cpu awesome_print find
[sudo] Passwort für speefak: 
Building native extensions. This could take a while...
ERROR:  Error installing sys-cpu:
	ERROR: Failed to build gem native extension.

    current directory: /var/lib/gems/3.1.0/gems/ffi-1.16.3/ext/ffi_c
/usr/bin/ruby3.1 -I /usr/lib/ruby/vendor_ruby -r ./siteconf20240413-2613428-vfkp0d.rb extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h

You might have to install separate package for the ruby development
environment, ruby-dev or ruby-devel for example.

extconf failed, exit code 1

Gem files will remain installed in /var/lib/gems/3.1.0/gems/ffi-1.16.3 for inspection.
Results logged to /var/lib/gems/3.1.0/extensions/x86_64-linux/3.1.0/ffi-1.16.3/gem_make.out
Successfully installed awesome_print-1.9.2
Parsing documentation for awesome_print-1.9.2
Done installing documentation for awesome_print after 0 seconds
Successfully installed find-0.2.0
Parsing documentation for find-0.2.0
Done installing documentation for find after 0 seconds
2 gems installed
ruby devel fehlte

Benutzeravatar
heisenberg
Beiträge: 3700
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von heisenberg » 27.05.2024 19:19:59

Das Temperaturskript habe ich jetzt dauerhaft auf einem Kundenserver aktiv. Die Minimalfrequenz habe ich mal auf 2 GHz (max. 5 GHz) eingestellt. 800 MHz (HW-Minimum) habe ich micht nicht getraut. Funktioniert super. Im letzten Monat ist der nur einmal auf die Maximalfrequenz gegangen. Ansonsten ist das System unter sehr wenig Last und seit anschalten des Scriptes um ca. 40 °C kühler in der Durchschnittstemperatur. Hetzner freut sich bestimmt. ;-) Der Programmierer hat seine DB-Zugriffe auch nochmal ordentlich optimiert.

Benutzeravatar
whisper
Beiträge: 3222
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: Nützliche selbstgestrickte Scripte für die Alltagsadministration

Beitrag von whisper » 08.06.2024 11:02:28

Ich habe mit dem module Debianratelimit für Apache experimentiert.
Damit kann man die Ausliefergeschwindigkeit von Webseiten und auch kompletter Domains kontrollieren, also verlangsamen.
-doch wie testet man das komfortabel?
Da Debianwget im Prinzip die Downloadgeschwindigkeit anzeigt, habe ich damit ein einfaches Script gebastelt.

Damit gibt es z.B. folgende Ausgabe:
./speedtester.sh viewtopic.php?t=185440

Downloadgeschwindigkeit von viewtopic.php?t=185440
Messe 5 von 5 ...
Gemessene Downloadgeschwindigkeiten : 1,30 MB/s 1,23 MB/s 1,73 MB/s 1,16 MB/s 1,14 MB/s
Mittelwert der Downloadgeschwindigkeit : 1.31 MB/s
Wenn man dann einmal mit und ohne ratelimit misst, kann man den Erfolg, oder Misserfolg deutlich sehen

Code: Alles auswählen

#!/bin/bash
# bed 6.6.2024
# speedtester.sh
# $Revision: 1.5 $
# Überprüft, ob die Anzahl der Argumente korrekt ist

bold=$(tput bold)
reset=$(tput sgr0)

if [ $# -ne 1 ]; then
    echo "Fehler: Bitte geben Sie eine URL als Parameter an."
    echo "Beispiel: $0 https://example.com"
    exit 1
fi

# URL aus dem ersten Argument extrahieren
url=$1

# Überprüfen, ob die URL mit "http://" oder "https://" beginnt
if [[ $url != http://* && $url != https://* ]]; then
    echo "Fehler: Die URL muss mit 'http://' oder 'https://' beginnen."
    exit 1
fi

# Überprüfen, ob die URL mindestens einen Punkt enthält
if ! [[ $url =~ \. ]]; then
    echo "Fehler: Die URL muss mindestens einen Punkt enthalten."
    exit 1
fi
echo ""
# Array zum Speichern der Downloadgeschwindigkeiten
speeds=()

# Download-Datei
output="/dev/null"

# Temporäre Datei für wget
tempfile=$(mktemp)

# Anzahl der Messungen
num_measurements=5
echo -e "Downloadgeschwindigkeit von ${url}"
echo -e "Führe ${num_measurements} Messungen durch."
# Führe die Messungen durch
for i in $(seq 1 $num_measurements); do
    echo -n "Messe $i von $num_measurements ..."
    echo -ne "\r"

    # Verwende wget, um die Downloadgeschwindigkeit zu messen und das Ergebnis in eine Datei zu speichern
    wget $url -O $output 2> $tempfile

    # Extrahiere die Geschwindigkeit aus der Ausgabe
    speed=$(tail -2 $tempfile | grep /dev/null | cut -d\( -f2 | cut -d\) -f1)

    # Speichere die gemessene Geschwindigkeit im Array
    speeds+=("$speed")

    # Warte eine Sekunde vor der nächsten Messung
    sleep 1
done

# Berechne den Mittelwert der gemessenen Geschwindigkeiten
sum=0
total_units="KB/s"

for speed in "${speeds[@]}"; do
    # Entferne das MB/s oder KB/s für die Berechnung und ersetze das Komma durch einen Punkt
    value=$(echo $speed | sed 's/[A-Za-z\/]//g' | sed 's/,/./g')

    # Wenn die Geschwindigkeit in MB/s angegeben ist, in KB/s umrechnen und die Einheit ändern
    if [[ $speed == *MB/s ]]; then
        value=$(echo "$value * 1024" | bc -l)
        total_units="MB/s"
    fi

    sum=$(echo "$sum + $value" | bc -l)
done
rm $tempfile

mean=$(echo "scale=2; $sum / $num_measurements" | bc -l)

# Ausgabe der Messergebnisse
echo
echo -e "Gemessene Downloadgeschwindigkeiten    : ${speeds[@]}"

# Konvertiere den Mittelwert entsprechend zurück
if [ "$total_units" == "MB/s" ]; then
    mean=$(echo "scale=2; $mean / 1024" | bc -l)
fi

echo -e "Mittelwert der Downloadgeschwindigkeit : ${bold}${mean} ${total_units}${reset}"
Das Gerüst und die meisten Kommentare sind mit Hilfe von GPT 4o entstanden. Das spart viel Zeit.

Antworten