#!/usr/bin/python3 # Inkbunny Status Reporter 0.1.0 # Copyright 2025 JustLurking # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation, either version 3 of the License, or (at your # option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # About # This program will connect to Inkbunny using the session cookie in the # PHPSESSID environment variable and take an action based on the arguments # provided. # # With no arguments the status will be reported the user on stdout and # the program will exit with status 0. # # A single argument will be taken as a key to watch. The value of just # that key will be reported on stdout. The program will exit with status # 1 if the key is 0, "0" or "no"; any other value will cause it to exit # with status 0 # # Further arguments will be taken as a command to run in the case where # the key being inspected is not 0, "0" or "no". The program exits with # status 0 if the key is 0, "0" or "no" the opposite of the previous mode # otherwise the command given by the user replaces the process. # Changelog # 2025-01-03 JustLurking: Initial Release. import argparse import json import logging import os import requests import sys # Program identity. program_file = "ib-status" program_name = "Inkbunny Status Reporter" version = "0.1.0" bug_reports = "https://Inkbunny.net/JustLurking/" homepage = "https://inkbunny.net/submissionsviewall.php?mode=pool&pool_id=98446" # Main Program starts here. # Configure logging. log = logging.getLogger(__name__) log.addHandler(logging.StreamHandler()) log.setLevel(logging.INFO) # Handle arguments. arg_parser = argparse.ArgumentParser( prog = program_file, description = "".join(( "Fetches user and site status from the Inkbunny.net website and acts" " upon them in some way." )), epilog = "".join(( "The SESSION may be passed using the PHPSESSID environment variable." " this may be useful if you wish to pass the same value to multiple" " programs, or if you wish to set the value in your shell's profile.\n" "\n", "If you wish to run a command that uses arguments also recognised by", " "+program_file+" pass a single -- argument before the command to", " signal that any further arguments should not be processed.\n", "\n", "Report bugs to: "+bug_reports+"\n", program_name + " home page: <"+homepage+"\n" )), formatter_class = argparse.RawDescriptionHelpFormatter ) arg_parser.add_argument( "-s", "--session", nargs = 1, help = "the session id to send with requests" ) arg_parser.add_argument( "-V", "--version", action = "store_true" ) arg_parser.add_argument( "check", nargs = '?', help = "the key to check for a non-zero value" ) arg_parser.add_argument( "command", nargs = '*', help = "the command to run if the check passes" ) args = arg_parser.parse_args() if args.version: print( " ".join((program_name, version)), "Copyright (C) 2025 JustLurking", "License GPLv3+: GNU GPL version 3 or later "+ "", "", "This is free software: you are free to change and redistribute it.", "There is NO WARRANTY, to the extent permitted by law.", sep="\n" ) exit(0) # Set the Session Cookie from the environment. cookie = args.session if cookie is None: cookie = os.getenv('PHPSESSID') if cookie is None: log.error("Please use the -s argument or set the PHPSESSID environment variable to set the session id.") exit(1) cookies = requests.cookies.RequestsCookieJar() cookies.set('PHPSESSID', cookie, domain='inkbunny.net', path='/') # Get the site status for the signed in user. resp = requests.get("https://inkbunny.net/check_site_status_process.php", cookies=cookies) resp.raise_for_status() status = json.loads(resp.text.splitlines()[1]) # If the user provided no further arguments just report all the values we # parsed. if args.check is None: for (k, v) in status.items(): print(k+":", v); exit(0) # Otherwise the first argument is the specific key to check. if args.check not in status: log.error("Unknown key: %s", args.check) log.info("Known keys are: %s", ', '.join(status.keys())) exit(100); # The check passes if the key has a non-zero non-no value. check_successful = status[args.check] not in ('no', '0', 0) print(status[args.check]) # If that's the last argument just return 0 (success) or 1 (failure) to signal # the result of the check to our parent. if args.command != []: exit(0 if check_successful else 1) # If we have more than one argument either return 0 (success) if the check # didn't pass or exec the remaining arguments if the check passed. if not check_successful: exit(0) os.execlp(args.command[0], *args.command) # We can only get here if the exec failed. exit(101);