Tuesday, 28 February 2023

 A Simple MOTD script for linux server

In order to produce a “System Status” Message Of The Day (MOTD) file in Debian you should write this script (as in /usr/local/bin

# Server Status Script
# Version 0.1.3 m
# Updated: July 26th 2011 m

CPUTIME=$(ps -eo pcpu | awk ‘NR>1’ | awk ‘{tot=tot+$1} END {print tot}’)
CPUCORES=$(cat /proc/cpuinfo | grep -c processor)
UP=$(echo `uptime` | awk ‘{ print $3 ” ” $4 }’)
echo ”
System Status
Updated: `date`

– Server Name = `hostname`
– OS Version = `grep openSUSE /etc/SuSE-release`
– Load Averages = `cat /proc/loadavg | awk {‘print $1″ “$2” “$3’}`
– System Uptime = `uptime | awk {‘print $3” “$4’}`
– Platform Data = `uname -orpi| awk {‘print $1” “$4’}`
– CPU Usage (average) = `echo $CPUTIME / $CPUCORES | bc`%
– Memory free (real) = `free -m | head -n 2 | tail -n 1 | awk {‘print$4’}` Mb
– Memory free (cache) = `free -m | head -n 3 | tail -n 1 | awk {‘print$3’}` Mb
– Swap in use = `free -m | tail -n 1 | awk {‘print $3’}` Mb
– Disk Space Used = `df -h / | awk ‘{ a = $4 } END { print a }’`
” > /etc/motd

# End of Script

Remember to make it executable (as root or sudo)

chmod +x /usr/local/bin/

To make the script update the information automatically, you should edit /etc/crontab as root, and add this two lines at the end of the file

# Status Script
*/5 * * * * root /usr/local/bin/

After you update the /etc/motd file (by running as root /usr/local/bin/, it should look like something like this:

david@virtual:~> cat /etc/motd

System Status
Updated: Thu Oct 20 01:55:01 CEST 2011

– Server Name = virtual
– OS Version = openSUSE 11.4 (x86_64)
– Load Averages = 0.00 0.01 0.05
– System Uptime = 2:22, 1
– Platform Data = GNU/Linux
– CPU Usage (average) = 0%
– Memory free (real) = 3667 Mb
– Memory free (cache) = 138 Mb
– Swap in use = 0 Mb
– Disk Space Used = 9.5G


Monday, 18 May 2020

[Tutorial] "This App Is Incompatible With This iPhone" on iOS 6 and below: The problem + workaround

iOS 6 and below are affected by a problem where if the latest version of an app requires a hardware component that your device doesn't have, they will not serve up the last compatible version of that app as they normally would. In the majority of cases this is when the app you're trying to download now requires iOS 11.0+ (Netflix, YouTube, Twitter etc) and therefore demands a 64 bit CPU (arm64), a hardware component that no iOS 4/5/6 device has. As a result, iOS 6 and below won't offer the last compatible version of these apps and they can't be downloaded without carrying out additional steps.
The good news is this problem does not affect iOS 7 & above, which will offer an older version to download even if the latest version requires missing hardware, and will display the message "This version of [insert app name] is not compatible with this device. Would you like to download the last compatible version?"
Add arm64 as a hardware capability of your device so that it will once again serve up the last compatible version of iOS 11.0+ apps. Carry out the following steps:
  1. Open iFile on your iOS 4/5/6 device and navigate to /System/Library/CoreServices/
  2. Locate the file [xxx]AP.plist (filename varies depending on your device, see list below)
  3. Open the file with Property List Viewer and go to capabilities. Click the + icon in the bottom right corner, name it arm64 and set type to Boolean. Then click create, and toggle it on in the list.
  4. Respring or reboot your device and you should now be able to download the affected apps as normal from your purchased history.
Thanks to u/iPodee for this information and easier solution.
Filenames by device:
iPhone 3G - N82AP
iPhone 3GS - N88AP
iPhone 4 - N90AP, N90BAP, N92AP
iPhone 4s - N94AP
iPhone 5 - N41AP, N42AP
iPod Touch (2nd Gen) - N72AP
iPod Touch (3rd Gen) - N18AP
iPod Touch (4th Gen) - N81AP
iPad (1st Gen) - K48AP
iPad (2nd Gen) - K93AP, K94AP, K95AP, K93AAP
iPad (3rd Gen) - J1AP, J2AP, J2AAP
iPad (4th Gen) - P101AP, P102AP, P103AP
iPad Mini (1st Gen) - P105AP, P106AP, P107AP
*Please note this tutorial is specifically intended to fix "This App Is Incompatible With This iPhone/iPad/iPod". If you are getting a "This app requires iOS x.x" message, it's because;
a) The app is not in your purchased history (download on a newer device or with iTunes first)
b) The app vendor has removed older versions of the app from the App Store (e.g eBay, PayPal) - download and backup all the apps you need while you still can!
c) The app is fairly new and was never compatible with your firmware.
*Also note that these steps manually replicate most of what the "Checkmate, Store!" tweak does, which was released after I wrote this tutorial. However, the tweak has additional usage on iOS 3 as it enables the "download older version" functionality that exists in iOS 4 onwards.

Monday, 11 May 2020

How to set a random mapcycle with nQuakesv

This article assumes you are running the nquakesv server package on a linux flavour.

I don't know about you but I seem to still be playing Quake multiplayer 25 years after this game was released - Not the entire time,  but I'm kind of revisiting it right now after a decade or so of not playing.

So my biggest issue with nquake is having random levels every time i start a multiplayer match.   They say most modern servers work on a map voting system where the players vote for a map but I just can't deal with that and would rather have my server just randomly pumping out a new level after every match.

nquake does ship with a built in random function you can add to your server.cfg and that parameter is called k_random_maplist 1  however the biggest problem with this function is that it repeats levels pretty easily since random is well random...   I thought there could be a better way.

KTX currently loads maps in a way that is numbered like set k_ml_0 "dm2" and set k_ml_1 "dm6" etc..   so I thought i would create an array of the level names and then have a script shuffle them.

  1. run the following command in the /nquakesv/qw/maps/ folder:
  2. ls > level_names.txt
  3. open this file and find and replace all .bsp and .ent and .txt endings after each filename - you should now have a long list of just the map names alone.
  4. copy the contents of the file and paste it into this script I got from one of the nquake discord members
#generate ffa map rotation using specified list in the following format:
# mapname minplayers maxplayers

#shuffle map cycle?

#this is our fallback map

#paste your map names into the array below

if [ "$shuffle" -eq 1 ];then
shuffled=$(echo "$maps"|sort -u|grep --color=never -v '^#'|$shuffle_com)

#newmaps=$(echo -e "${firstmap}\n${shuffled}")
newmaps=$(echo -e "${shuffled}")


while read -r line; do
if [ -z "$line" ];then
for part in $line;do
if [ -z $map ];then
if [ -z $min ];then
if [ -z $max ];then
echo 'set k_ml_'$count' "'$map'"'
if [ -z $min ];then
echo 'set k_ml_minp_'$count' "'$min'"'
if [ -z $max ];then
echo 'set k_ml_maxp_'$count' "'$max'"'
let count=count+1
done <<< "$newmaps"

  1. Save the script above as something like and give it a chmod +x
  2. The Script on its own simply outputs everything in a way that KTX can use and also sets the min and max player counts per level.  If you want to use the min and max settings of this script then where you paste your map names in the array you can put two numbers after each entry like aerowalk 2 4 this would set the aerowalk map to have a minimum of 2 players and a max of 4
  3. What i did next was create a second shell script called which also has a chmod +x and save it in the root of nquakesv.  The contents of the script are:

./ > ./ktx/configs/usermodes/ffa/mapcycle.cfg

  1. This will now write the maps into a text file that KTX understands and in a shuffled way.
  2. All you need to do now is have whatever usermode cfg you are running exec your new file in my case i'm using configs/usermodes/ffa/default.cfg
  3. inside default.cfg at the map rotation section simply have it read
exec configs/usermodes/ffa/mapcycle.cfg

You'll need to run before every start of your server if you want a freshly rotated list of maps - but its still an awesome way to do it.   All credit to @ciscon at nquake #helpdesk

How to enable bots on nquake

This article is my experience with nQuakesv server package running on Ubuntu 18.04

  1. Make sure your server is not running.
  2. With your new server setup and installed you want to navigate to the nquakesv/ktx folder
  3. You will see 3 files named qwprogs,  you want to backup your existing by renaming it or something like that.
  4. now you will rename the file called to be named
  5. Start your server again and when connected bring up your player console and type /botcmd enable - this will enable the bot system.
  6. You can now add bots to only the levels that are in your ktx/bots/ folder - these maps have waypoints - if you are using custom maps you have to train the bots via waypoints.
  7. To add a bot to a level simply type /botcmd addbot   and then set its skill level with /botcmd skill 1 through 10

Friday, 5 January 2018

find and delete files based off grep search

at some point it could be useful to search for the text within a group of file names and delete those,  here's an example terminal command to find and execute a deletion of files which meet a certain criteria

find . -name "*2017-11*" -exec /bin/rm {} \;

Sunday, 10 December 2017

Make Bootable OSX drive from install app

From a terminal:

sudo /Applications/Install\ OS\ X\ Yosemite/Contents/Resources/createinstallmedia --volume /Volumes/DRIVENAME --applicationpath /Applications/Install\ OS\ X\ Yosemite\  --nointeraction

Friday, 20 October 2017

create a playlist file from the linux command line

Here's a quick way to make a .m3u file from the linux command line for a bunch of folders of videos.

navigate to the top folder that contains all your sub-folders of videos and type the following command.

find -type f -iname "*.avi" > playlist.m3u

I'll usually open the .m3u after and add any global path names that happen at the beginning of the entries.