{"id":34322078,"url":"https://github.com/softcoder/riprunner","last_synced_at":"2025-12-17T14:10:52.063Z","repository":{"id":49234048,"uuid":"23033876","full_name":"softcoder/riprunner","owner":"softcoder","description":"A Firehall dispatching communication suite","archived":false,"fork":false,"pushed_at":"2025-04-04T02:31:43.000Z","size":214349,"stargazers_count":3,"open_issues_count":0,"forks_count":2,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-04-04T03:23:41.804Z","etag":null,"topics":["911","angular","dispatch","firehall","php","plivo","sms-notifications","twig","twilio"],"latest_commit_sha":null,"homepage":null,"language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/softcoder.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2014-08-17T05:27:44.000Z","updated_at":"2025-04-04T02:31:46.000Z","dependencies_parsed_at":"2025-04-04T03:32:14.706Z","dependency_job_id":null,"html_url":"https://github.com/softcoder/riprunner","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/softcoder/riprunner","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/softcoder%2Friprunner","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/softcoder%2Friprunner/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/softcoder%2Friprunner/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/softcoder%2Friprunner/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/softcoder","download_url":"https://codeload.github.com/softcoder/riprunner/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/softcoder%2Friprunner/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":27783730,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-12-17T02:00:08.291Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["911","angular","dispatch","firehall","php","plivo","sms-notifications","twig","twilio"],"created_at":"2025-12-17T14:10:51.555Z","updated_at":"2025-12-17T14:10:52.049Z","avatar_url":"https://github.com/softcoder.png","language":"PHP","readme":"[![Build Status](https://github.com/softcoder/riprunner/actions/workflows/php.yml/badge.svg)](https://github.com/softcoder/riprunner/actions/workflows/php.yml)\n\nTo see detailed unit test and code coverage stats visit: https://github.com/softcoder/riprunner/actions/workflows/php.yml\n\nRip Runner\n=========\n\n\u003cimg src=\"https://github.com/softcoder/riprunner/raw/master/screenshots/iconXX.png\" align=\"left\" \u003e\n\nA Firehall dispatching communication suite. \nCurrent Version: 1.0.0\n\nDescription:\n\nThis application suite was designed by volunteer fire fighters to enhance the experience of First Responders during an emergency 911 callout. The main goal of this application is to provide a free suite of applications which can help firefighters receive timely information and communicate activities with one another as incidents progress. This software is currently in use by some fire halls in the Prince George, BC Canada, Regional District. For contact information see the contact section at the bottom of this page.\n\nKey Features:\n-------------\n- Real-time Email trigger (using Google App Engine) or email polling for 911 callouts received from your \nFire Operations Command Center. Easily adaptable to other callout trigger mechanisms (such as Web, Rest API, SMS, etc).\n- Pluggable support for SMS gateway providers to send SMS information to firefighters. \n  Current SMS providers implemented include:\n  - Twilio (twilio.com - paid account charges approx $0.0075 per SMS -\u003e https://www.twilio.com/sms/pricing)\n  - Plivo (plivo.com - paid account charges approx $0.0035 per SMS -\u003e https://www.plivo.com/pricing/CA/#!sms)\n  - Amazon AWS SNS (paid account charges approx $0.00581 per SMS -\u003e https://aws.amazon.com/sns/sms-pricing/)\n  - Sendhub (sendhub.com)\n  - EzTexting (eztexting.com)\n  - TextBelt (textbelt.com -\u003e a free service but not as reliable and not available everywhere)\n- Streaming audio broadcasting of radio traffic support (using any free icecast or shoutcast server like: https://github.com/AzuraCast/AzuraCast)\n- Ability for members to indicate a response to callouts allowing other members to know who is responding\n- 'SMS command mode' allows SMS users to respond to calls (useful if radios don't work or data is unreliable)\n- Google Maps showing Distance from Firehall to Incident\n- Self Installation available (see videos below)\n- User Account Management (LDAP support optional)\n- Callout history with responding members\n- Google charts show a statistical view of data and monthly and annual member participation.\n- Customizable user interface using twig templates (http://twig.sensiolabs.org/)\n- Experimental Android App which integrates with the web application.\n- Great backup system during power outages at your firehall (if installed offsite / cloud), but you still get callouts via cell phone when the radio backup battery system fails or has poor coverage.\n- Secure features such as optional two factor authentication (2FA) support, new device login detection and brute force attack detection help keep admin and users informed about suspcious activity.\n\nKey Android App Features:\n-------------------------\n- Integrates with the website user accounts for authentication.\n- Uses the free GCM API (Google Cloud Messaging) for notifications saving you SMS charges.\n- Plays a pager tone during a callout\n- Acquires your GPS co-ordinates to display a map from your location to the firehall which other members can view during a callout.\n- Displays a map from the Firehall to the Incident scene\n- Allows responders to indicate that they are responding to the call with the click of 1 button. (other responders are notified of each responder)\n- Allows responders to indicate that the call is coempleted or cancelled with the click of 1 button. (other responders are notified)\n- If you login during a live callout, you will receive the pager tones and live call information.\n\nReferral Codes:\n---------------\nIf you are planning to sign up with Twilio as your SMS provider, please consider using my referral code:\nwww.twilio.com/referral/G68JJs\n\nIf you are planning to purchase a Tesla product, please consider using my referral code:\nhttps://ts.la/mark25940\n\nThank you!\n\nOverview:\n-------------------------\n\n![Overview](/screenshots/riprunner-diagram.png?raw=true \"Overview\")\n\nThe diagram above shows all of the possible features enabled and the communication paths involved. This may be simplified depending on your needs and how you configure Rip Runner. You may or may not require the following:\n- An archaic FOCC that uses a CAD system that only notifies via email requires one of two methods to trigger the callout process. If your FOCC can directly call the rip runner website calling a rip runner URL containing callout details then the trigger system can be greatly simplified.\n- A Cron or polling mechaism to check for archaic email notifications from FOCC (we reccomend using the google app engine email gateway solution).\n- An SMS provider to integrate text messages via cell carriers (we recommend using twilio as the best service provider tested).\n- An LDAP server to manage user accounts.\n- Map services via google maps.\n- Android communication using google app engine.\n\nTechnology:\n-------------------------\nRip Runner was written using PHP for its backend server operations and html5 + javascript and angular 8+ for the frontend.\nThe design of this application allows for the use of any database backend supported by PHP's PDO layer but currently\nMySQL is preferred (sql is abstracted into a file for each DB type). Currently most of the user interface is rendered using a server side framework called 'twig' but work has started to replace that using angular 8. Communications options include email, SMS (via a provider such as Twilio) and Google Cloud Messaging / Web Push for the Android client. Numerous google services are used like google maps which require a free API Key. The selection of PHP and javascript were made to allow this application to run on most free (or more offordable) hosting providers. This project makes use of test automation and Continuous Intregration via Github actions.\n\nWhy is Rip Runner a good choice for me?:\n--------------------\n- It's written by firefighters for firefighters.\n- It's free!\n- It's Open Source meaning anyone with programming skills in PHP can easily make changes to suit your needs\n- It's very flexible. You are able to change many aspects of the behaviour and display of this application. You can select from various backend database engines (Mysql, MS SQL, Postgres, Oracle, etc). You can customize the user interface by making small overrides via the 'twig' framework or completely replace the user interface with your own. You can easily add on trigger mechanisms, support additional SMS providers all with relative ease.\n- It's secure. We have adopted industry 'best practises' to ensure the security of this application. Security experts have evaluated the software to look for weaknesses and this continual process is ongoing.\n- Its (mostly) clean code. The source code comes with many unit tests to ensure that ongoing changes to the source code do not break existing functionalty. (uses PHPUnit and dbUnit)\n- Lastly its fast. We cache information where it makes sense to produce a scalable user experience, and conform to PHP 'best practises' for optimimum performance.\n\nSystem Requirements:\n--------------------\n- An email account that recieves Callout information during a 911 page (other trigger mechanisms can be easily supported, please contact us using the details at the bottom of this page)\n- A Google App Engine account with one of our GAE apps published OR a service that periodically triggers the email polling (like cron) if your dispatch system is based off of emails. One free option (included in the source tree) is to use a google app engine (GAE) account to do the polling for you (see the googleae folder contents)\n- A webserver that can run PHP 8.x (such as Apache, IIS or NGinx)\n- A MySQL (or other PDO compatible) database to install the Rip Runner Schema and store the data (see the list supported here: http://php.net/manual/en/pdo.drivers.php)\n- A Registered Account on an SMS Gateway Provider (Twilio (recommended),Plivo,Sendhub,TextBelt)\n- A Google Maps API key: https://developers.google.com/maps/documentation/javascript/tutorial#api_key (one key for server applications and one for android apps)\n- Optional: If using the experimental Android app, you need a Google Apps Engine (GAE) Project Number (see http://developer.android.com/google/gcm/gs.html) and Browser API Key.\n\nDocker Image:\n-------------\nWe provide a docker image with the basic environment installed here:\n[https://hub.docker.com/repository/docker/softcoder/riprunner/](https://hub.docker.com/r/softcoder/riprunner)\n\nExample deployment to digitalocean.com (xxxxx is your API key):\n\n\tdocker-machine create --driver digitalocean --digitalocean-access-token xxxxx riprunner\n\tdocker-machine env riprunner\n\teval $(docker-machine env riprunner)\n\tdocker run -d -p \"80:80\" --name riprunner-demo softcoder/riprunner:latest\n\nDiscover the ip address of the droplet for example:\n\n        docker-machine ip riprunner\n        138.197.70.45\n\nGoto the web url where you installed the docker image and login:\n\n        http://138.197.70.45/\n\t\n\tweb login username: admin\n\tweb login password: riprunner\n\tdb name:            riprunner\n\tdb username:        riprunner\n\tdb password:        riprunner\n\nTest out the angular web url where you installed the docker image and login:\n\n        http://138.197.70.45/ngui/\n\nIn order to persist the changes that you make in this container run using volumes:\n\n        docker run -d -p \"80:80\" --name riprunner-demo -v ${PWD}/app:/app -v ${PWD}/mysql:/var/lib/mysql softcoder/riprunner:latest\n\nThis assumes that the host (outside of the docker container) has a folder named:\n\n        app/    \u003c-- containing all the php files for riprunner\n        mysql/  \u003c-- containing all the mysql files for riprunner\n\nIf you only need to save the changes to the database do not specify the /app volume mapping.\n\nThere is also a Dockerfile for deployment to Google Cloud Run full details:\nhttps://github.com/softcoder/riprunner/tree/master/docker\n\nScreenshots:\n------------\n\nCall out example (SMS sent to responders with a link to this page):\n\n![Callout Example](/screenshots/riprunner-call-details1.png?raw=true \"Callout Example\")\n![Callout Map](/screenshots/riprunner-call-details2.png?raw=true \"Callout Map\")\n\n![Callout History](/screenshots/riprunner-callout-history1.png?raw=true \"Callout History\")\n\nSystem administration:\n\n![Login](/screenshots/riprunner-admin1.png?raw=true \"Login\") ![Main Menu](/screenshots/riprunner-admin2.png?raw=true \"Main Menu\")\n\n![Charts Menu](/screenshots/riprunner-charts1.png?raw=true \"Charts Menu\")\n\nAndroid App:\n\n\u003ctable\u003e\n  \u003ctr\u003e\n\t\u003ctd\u003e\n\tLogin Screen:\n\t\u003ca href=\"/screenshots/flutter-login1.png?raw=true\"\u003e\u003cimg src=\"/screenshots/flutter-login1.png?raw=true\" align=\"left\" height=\"713\" width=\"401\" \u003e\u003c/a\u003e\n\t\u003c/td\u003e\n\t\u003ctd\u003e\n\tOptions:\n\t\u003ca href=\"/screenshots/flutter-settings1.png?raw=true\"\u003e\u003cimg src=\"/screenshots/flutter-settings1.png?raw=true\" align=\"left\" height=\"713\" width=\"401\" \u003e\u003c/a\u003e\n\t\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n\t\u003ctd\u003e\n\tMain Screen:\n\t\u003ca href=\"/screenshots/flutter-call-details1.png?raw=true\"\u003e\u003cimg src=\"/screenshots/flutter-call-details1.png?raw=true\" align=\"left\" height=\"713\" width=\"401\" \u003e\u003c/a\u003e\n\t\u003c/td\u003e\n\t\u003ctd\u003e\n\tLive Callout Screen:\n\t\u003ca href=\"/screenshots/flutter-call-details2.png?raw=true\"\u003e\u003cimg src=\"/screenshots/flutter-call-details2.png?raw=true\" align=\"left\" height=\"713\" width=\"401\" \u003e\u003c/a\u003e\n\t\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n\t\u003ctd\u003e\n\t\u003ctable border=\"1\"\u003e\n\t\t\u003ctr\u003e\u003ctd\u003e\n\tMessages:\n\t\u003ca href=\"/screenshots/flutter-call-details3.png?raw=true\"\u003e\u003cimg src=\"/screenshots/flutter-call-details3.png?raw=true\" align=\"left\" height=\"713\" width=\"401\"\u003e\u003c/a\u003e\n\t\t\u003c/td\u003e\u003c/tr\u003e\n\t\u003c/table\u003e\n\t\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\nInstallation:\n-------------\nGetting started video - basic installation on Windows (click image below):\n\n[![Getting Started install](http://img.youtube.com/vi/ZyUfvYsW39Q/0.jpg)](https://youtu.be/ZyUfvYsW39Q)\n\nGetting started video - basic installation on Linux (click image below):\n\n[![Ubuntu Host quick install](http://img.youtube.com/vi/PkREVKmyQzA/0.jpg)](https://youtu.be/PkREVKmyQzA)\n\n[![Linux Host install](http://img.youtube.com/vi/ZDhPJ7qIXDc/0.jpg)](https://youtu.be/ZDhPJ7qIXDc)\n\nGeneral installation steps:\n---------------------------\n- Download the application either using git commands (for those who know how to use git) or download the master archive here: https://github.com/softcoder/riprunner/archive/master.zip and extract to a folder on your local PC.\n- Edit the values in [config-default.php](php/config-default.php) to suit your environment. (see Configuration section below)\n- Rename the file config-default.php to config.php\n- Upload the files in the php folder to a location on your webserver (this will be the root folder for riprunner).\n- If using IIS (Apache users skip to 'Open the url') you should import the file [IIS_Import.htaccess](php/IIS_Import.htaccess) following these steps:\n-  1. Start IIS Manager. \n-  2. On the left, in the Connections pane, select 'Sites' then 'Default Web Site'.\n-  3. Create a new virtual folder pointing to the root php folder of rip runner (example alias svvfd)\n-  4. With the alias selected (example svvfd) click on the right, in Features View, IIS, click URL Rewrite.\n-  5. On the right, in the Actions pane, click 'Open Feature'.\n-  6. On the right, in the Actions pane, click 'Import Rules'.\n-  7. Select the file IIS_import.htaccess using the ... elipses and import, then click apply.\n- extract the contents of the appropriate third party archive into your rip runner root installation folder:\n   ie: vendor-php-5.6.zip or vendor-php-X.X.zip (check for other supported versions where filename exists in repo)\n- Open the url: http://www.yourwebserver.com/uploadlocation/install.php (substitute your root riprunner host://uploadpath/install.php)\n- If everything was done correctly you should see an install page offering to install one the firehall's \n  you configured in config.php (we support more than 1 firehall if desired). Select the firehall and click install.\n- If successful the installation will display the admin user's password. Click the link to login using it.\n- Add firehall members to the user accounts page. Users given admin access can modify user accounts. You may also choose to use an LDAP server to manage accounts in which case you should specify LDAP values in config.php.\n- You will need something that will trigger the email trigger checker. Please check the Readme in the googleae folder for details. If your server offers a 'cron' or scheduler process, configure it to visit http://www.yourwebserver.com/uploadlocation/email_trigger_check.php\n  every minute. If your server does not have cron or limits the frequency, you can use Google App Engine's \n  cron service to call your email trigger every minute. (see files in [php/googleae](php/googleae) folder as a reference)\n- Send a test email to the trigger email address in order to see if you get notified of a callout (if using a 'from' filter make sure you send the e from the 'from' address that you specified).\n- To allow use of the Android app, either copy the prebuilt apk located in \n  android/RipRunnerApp/bin/RipRunnerApp.apk to apk/ or compile the Android app in Eclipse and copy to apk/\n  This will allow users to select the Android app from the Mobile menu item for download and installation \n  on their mobile device.\n\nLinux installation notes:\n-------------------------\n1. Install LAMP (Linux, Apache, MySQL and PHP) apps\n2. Install these dependencies:\n- sudo a2enmod rewrite\n- sudo apt install php7.1-xml\n- sudo apt install php7.1-mysql \n- sudo apt install php7.1-imap\n- sudo apt install php7.1-mcrypt\n- sudo apt install php7.1-curl\n- sudo apt install php7.1-ldap\n- sudo apt install php7.1-sqlite3\n3. Restart Apache: sudo systemctl restart apache2\n4. Configure web virtual host (if desired)\n5. Create a MySql user for rip runner (with DBA access)\n6. Copy Rip Runner (PHP folder) to the appropriate folder on the target host\n\nConfiguration:\n--------------\n\nThe most important information that you require to configure is located in config.php. \nYou must create this file (or rename [config-default.php](php/config-default.php) to config.php) and supply configuration values.\nThe following explains the main sections in config.php. The structures used in coinfig.php are\ndefined in [config_interfaces.php](php/config_interfaces.php) if you are interested to see their definitions.\n\n Sample Config.php:\n ------------------\n\n\t// ----------------------------------------------------------------------\n\t// Email Settings\n\t\n\t// Below is the email address that we expect to receive callouts from.\n\t// This can be a full email address as shown below  or just the domain\n\t// example: focc.mycity.ca (this would allow all email addresses from this domain)\n  \tdefine( 'DEFAULT_EMAIL_FROM_TRIGGER', 'donotreply@focc.mycity.ca');\n\t\n\t// Below we create an email account structure for our firehall.\n\t// See the class FireHallEmailAccount in config_interfaces.php\n\t// for details\n\t$LOCAL_DEBUG_EMAIL = new FireHallEmailAccount(\n\t    true, \n\t    DEFAULT_EMAIL_FROM_TRIGGER,\n\t    '{pop.secureserver.net:995/pop3/ssl/novalidate-cert}INBOX',\n\t    'my-email-trigger@my-email-host.com',\n\t    'my-email-password',\n\t    true);\n\t\t\t\t\n\t// ----------------------------------------------------------------------\n\t// MySQL Database Settings\n\t\n\t// Below we create a MySQL structure for our firehall.\n\t// See the class FireHallMySQL in config_interfaces.php\n\t// for details\n\t$LOCAL_DEBUG_MYSQL = new FireHallMySQL(\n\t    'localhost',\n\t    'riprunner', \n\t    'riprunner', \n\t    'riprunner');\n\n\t// -----------------------------------------------------------------------\n\t// SMS Settings\n\t\n\t// Below is the URL if you are using SendHub to send SMS messages.\n\t// username=X - replace X with your sendhub Username\n\t// api_key=X  - replace X with your sendhub API Key\n\tdefine( 'DEFAULT_SMS_PROVIDER_SENDHUB_BASE_URL', \t'https://api.sendhub.com/v1/messages/?username=X\u0026api_key=X');\n\t\n\t// Below is the URL if you are using TextBelt to send SMS messages.\n\t// Ensure that you use the correct url for your country\n\tdefine( 'DEFAULT_SMS_PROVIDER_TEXTBELT_BASE_URL', \t'http://textbelt.com/canada');\n\t\n\t// Below is the URL if you are using EzTexting to send SMS messages.\n\tdefine( 'DEFAULT_SMS_PROVIDER_EZTEXTING_BASE_URL', \t'https://app.eztexting.com/sending/messages?format=xml');\n\t// Below is the EzTexting account username\n\tdefine( 'DEFAULT_SMS_PROVIDER_EZTEXTING_USERNAME', \t'X');\n\t// Below is the EzTexting account password\n\tdefine( 'DEFAULT_SMS_PROVIDER_EZTEXTING_PASSWORD', \t'X');\n\t\n\t// Below is the URL if you are using Twilio to send SMS messages.\n\t// https://api.twilio.com/2010-04-01/Accounts/X/Messages.xml - replace X with your Twilio account name\n\tdefine( 'DEFAULT_SMS_PROVIDER_TWILIO_BASE_URL', \t'https://api.twilio.com/2010-04-01/Accounts/X/Messages.xml');\n\t// Below is the Twilio account authentication token\n\tdefine( 'DEFAULT_SMS_PROVIDER_TWILIO_AUTH_TOKEN', \t'X:X');\n\t// Below is the Twilio account From mobile phone #\n\tdefine( 'DEFAULT_SMS_PROVIDER_TWILIO_FROM', \t\t'+12505551212');\n\n\t// Below we create an SMS structure for our firehall.\n\t// See the class FireHallSMS in config_interfaces.php\n\t// for details\n\t$LOCAL_DEBUG_SMS = new FireHallSMS(\n\t\ttrue,\n\t\tSMS_GATEWAY_TWILIO, \n\t\t'', \n\t\tfalse, \n\t\ttrue,\n\t\tDEFAULT_SMS_PROVIDER_SENDHUB_BASE_URL, \n\t\tDEFAULT_SMS_PROVIDER_TEXTBELT_BASE_URL,\n\t\tDEFAULT_SMS_PROVIDER_EZTEXTING_BASE_URL,\n\t\tDEFAULT_SMS_PROVIDER_EZTEXTING_USERNAME,\n\t\tDEFAULT_SMS_PROVIDER_EZTEXTING_PASSWORD, \n\t\tDEFAULT_SMS_PROVIDER_TWILIO_BASE_URL,\n\t\tDEFAULT_SMS_PROVIDER_TWILIO_AUTH_TOKEN,\n\t\tDEFAULT_SMS_PROVIDER_TWILIO_FROM);\n\n\t// ----------------------------------------------------------------------\n\t// Mobile App Settings\n\t\n\t// Below is the Google Cloud Messaging API Key\n\t// This is the Google 'Key for browser applications' API key from your google project:\n\t// https://console.developers.google.com/project/\u003cyour proj name\u003e/apiui/credential\n\tdefine( 'DEFAULT_GCM_API_KEY', \t'X');\n\t// Below is the Google Cloud Messaging Project Number (aka sender id)\n\tdefine( 'DEFAULT_GCM_PROJECTID','X');\n\t// The Google Project Id\n\tdefine( 'DEFAULT_GCM_APPLICATIONID','X');\n\t// The Google Email Project Id\n\tdefine( 'DEFAULT_GCM_EMAIL_APPLICATIONID', 'X');\n\t// The Google Service Account Name\n\tdefine( 'DEFAULT_GCM_SAM','applicationid@appspot.gserviceaccount.com');\n\t// The Firebase services account json file path to support firebase push notifications\n\tdefine( 'DEFAULT_FCM_SERVICES_JSON', __DIR__.'/fcm/google-service-account.json');\n\n\t// Below we create a Mobile structure for our firehall.\n\t// See the class FireHallMobile in config_interfaces.php\n\t// for details\n\t$LOCAL_DEBUG_MOBILE = new FireHallMobile(\n\t    true, \n\t    true,\n\t    true,\n\t    DEFAULT_GCM_SEND_URL,\n\t    DEFAULT_GCM_API_KEY,\n\t    DEFAULT_GCM_PROJECTID,\n\t    DEFAULT_GCM_APPLICATIONID,\n\t    DEFAULT_GCM_SAM,\n\t    DEFAULT_FCM_SERVICES_JSON,\n\t    DEFAULT_GCM_EMAIL_APPLICATIONID);\n\t\n\t// ----------------------------------------------------------------------\n\t// Website and Location Settings\n\t\n\t// Below is the Google Maps API Key\n\tdefine( 'DEFAULT_WEBSITE_GOOGLE_MAP_API_KEY', \t\t\t\t\t\t'X' );\n\t// A ; delimited list of original_city_name|new_city_name city names to swap for google maps \n\t// This list changes city names fro mthe item on the left to that on the right and is only\n\t// used when drawing google maps. In the example below all callouts with the city name\n\t// SALMON VALLEY, will be changed into PRINCE GEORGE, when google maps are used\n\tdefine( 'DEFAULT_WEBSITE_CALLOUT_DETAIL_CITY_NAME_SUBSTITUTION', \t'SALMON VALLEY,|PRINCE GEORGE,;' );\n\n\t// Below we create a Website structure for our firehall.\n\t// See the class FireHallWebsite in config_interfaces.php\n\t// for details\n\t$LOCAL_DEBUG_WEBSITE = new FireHallWebsite(\n\t    'Local Test Fire Department',\n\t    '5155 Salmon Valley Road, Prince George, BC',\n \t    54.0916667,\n\t    -122.6537361,\n\t    'http://yourwebsite.com/riprunner/',\n\t    DEFAULT_WEBSITE_GOOGLE_MAP_API_KEY, \n\t    $GOOGLE_MAP_CITY_LOOKUP);\n\t// If you have configured an audio streaming service (like the opensource https://www.azuracast.com/)\n\t// You may enabled streaming radio audio example:\n\t$LOCAL_DEBUG_WEBSITE-\u003esetStreamAudioEnabled(true);\n\t$LOCAL_DEBUG_WEBSITE-\u003esetStreamMobile(true);\n\t$LOCAL_DEBUG_WEBSITE-\u003esetStreamDesktop(true);\n\t$LOCAL_DEBUG_WEBSITE-\u003esetStreamUrl('https://radio.example.com/public/live/embed');\n\t$LOCAL_DEBUG_WEBSITE-\u003esetStreamUrlRaw('https://radio.example.com/radio/8000/radio.mp3');\n\t\n\t// ----------------------------------------------------------------------\n\t// LDAP Settings\n\t// These are the LDAP settings for sites that wish to have an LDAP server manage user accounts\n\t// See config_interfaces.php for more info about these fields\n\t$LOCAL_DEBUG_LDAP = new FireHall_LDAP(\n\t\t\tfalse,\n\t\t\t'ldap://myhost.example.com',\n\t\t\tnull, null,\n\t\t\t'dc=example,dc=com',\n\t\t\t'ou=users,dc=example,dc=com',\n\t\t\t'(|(uid=${login})(cn=${login})(mail=${login}@\\*))',\n\t\t\t'dn',\n\t\t\t'sn',\n\t\t\t'(\u0026(objectClass=posixGroup)(cn=riprunner-users))',\n\t\t\t'(\u0026(objectClass=posixGroup)(cn=riprunner-admin))',\n\t\t\t'(\u0026(objectClass=posixGroup)(cn=riprunner-sms))',\n\t\t\t'memberuid',\n\t\t\t'mobile',\n\t\t\t'uidnumber',\n\t\t\t'uid');\n\t\n\t// ----------------------------------------------------------------------\n\t// Main Firehall Configuration Container Settings\n\t\n\t// Below we create a Firehall config structure for our firehall.\n\t// See the class FireHallConfig in config_interfaces.php\n\t// for details\n\t$LOCAL_DEBUG_FIREHALL = new FireHallConfig(\t\n\t        true, \n\t\t0,\n\t\t$LOCAL_DEBUG_MYSQL,\n\t\t$LOCAL_DEBUG_EMAIL,\n\t\t$LOCAL_DEBUG_SMS,\n\t\t$LOCAL_DEBUG_WEBSITE,\n\t\t$LOCAL_DEBUG_MOBILE,\n\t\t$LOCAL_DEBUG_LDAP);\n\t\n\t// Add as many firehalls to the array as you desire to support\n\t// This array is used through Rip Runner and lookups are done using the firehall id\n\t// to find the firehall configuration to use for a given request\n\t$FIREHALLS = array($LOCAL_DEBUG_FIREHALL);\n\n\nSMS command mode:\n--------------\nCurrently users of the Twilio and Plivo providers are able to offer users the ability to communicate using SMS (no data connection needed). To configure this option you must edit the following in your provider:\n\nTwilio Account configuration:\n- Under Numbers -\u003e Twilio Numbers -\u003e SMS and MMS: Select Configure with URL as follows:\n       Request URL: http://www.yourwebserver.com/riprunner/plugins/sms-provider-hook/twilio-webhook.php\n       using HTTP Post.\n\nPlivo Application configuration:\n- Under Edit Application: Select Message URL as follows:\n       Request URL: http://www.yourwebserver.com/riprunner/plugins/sms-provider-hook/plivo-webhook.php\n       using Message Method: POST.\n\n\nTo test your provider, send the following text message to your provider configured account phone # to get a list of available commands: ?\n\nSpecial Notes:\n--------------\n\nA new mobile app is being developed using google's 'Flutter' framework (https://flutter.dev/) which can be found in the flutter folder.\nVisual Studio Code (https://code.visualstudio.com/) is the IDE being used to develop this mobile app but command line compiling using flutter works fine too.\n\nSee project files here: https://github.com/softcoder/riprunner/tree/master/flutter/riprunner\n\nOld information below regarding mobile app:\n-------------------------------------------\nCompiling the Android application in the Eclipse IDE requires you to install the ADT plugin (http://developer.android.com/tools/sdk/eclipse-adt.html) as well as setup the Google Play Services SDK (https://developer.android.com/google/play-services/setup.html#Setup) as this is a dependency in the riprunner android app.\n\nFAQ:\n----\n- For apache virtual host support you need to enable allow override:\nsudo gedit /etc/apache2/apache2.conf\n\nand enable .htaccess by changing\n\nAllowOverride None\nto\nAllowOverride All\n\nsudo systemctl restart apache2\n\n- If after apache restart if you get errord in error.log: \ncat /var/log/apache2/error.log\n\nShowing:\nInvalid command 'RewriteEngine', perhaps misspelled or defined by a module not included in the server configuration\n\nfix it by:\n\nsudo a2enmod rewrite \u0026\u0026 sudo systemctl restart apache2\n\n- When calling install.php if you get:\n\nFatal error: Uncaught Error: Call to undefined function simplexml_load_file() in ...\n\nthen you must install extensions in your php config:\n\nsudo apt install php7.1-xml\nsudo systemctl restart apache2\n\n- If after calling install.php you get: \n\nWarning: fopen(/home/softcoder/www/svvfd/public_html/rr/riprunner.log): failed to open stream: Permission denied in ...\n\nthen you must change access permission to riprunner.log to:\n\n-rw-rw-rw-  1 softcoder softcoder   120 Apr 13 10:15 riprunner.log\n\n- if after calling install.php you get:\n\nError detected, message : could not find driver, Code : 0\n\nthen you must check riprunner.log if you see:\n\n2017-04-13T10:15:38-07:00 ERROR DB Connect for: dsn [mysql:host=localhost;] user [myvfd] error [could not find driver] \n\nthen you must:\n\nsudo apt-get install php7.1-mysql \nsudo systemctl restart apache2\n\n- If after calling install.php you get:\n\nError detected, message : SQLSTATE[HY000] [1045] Access denied for user 'myvfd'@'localhost' (using password: YES), Code : 1045\n\nYou need to make sure the mysql user specified exists and has access to connect to the server.\n\n- If after calling install.php you get:\n\nFatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1044 Access denied for user 'myvfd'@'%' to database 'myvfd' in ...\n\nensure mysql user has dba access.\n\n- If after calling install.php you get:\n\nFatal error: Uncaught PDOException: SQLSTATE[HY000] [1049] Unknown database 'myvfd' in\n\ncreate the database first, or goto install page: install.php\n\n- Make sure your rip runner folder has grant execution access to scripts:\n\nsudo chmod 777 -R ~/www/svvfd/public_html/\n\n- If you get the error:\n\nHTTP Error 404.3 - Not Found\nThe page you are requesting cannot be served because of the extension configuration. If the page is a script, add a handler. If the file should be downloaded, add a MIME map.\n\n- Make sure you have installed php (7.1 x64) for iis using web platform installer\n\n- If you get the error:\n\nCall to undefined function finfo_open()\n\n- You need to add the following line your php.ini then to activate it: (C:\\Program Files\\IIS Express\\PHP\\v7.1\\php.ini)\n\nextension=php_fileinfo.dll\n\n- If you get the error:\n\nFatal error: Uncaught Error: Call to undefined function riprunner\\curl_init()\n\nthen you must:\n\nsudo apt-get install php7.1-curl\n\n- If you get the following error in the logs and no sms message is sent:\n\nCurl error: SSL certificate problem: self-signed certificate in certificate chain\n\n- you must download: http://curl.haxx.se/ca/cacert.pem\n\nedit php.ini\n\n[curl]\ncurl.cainfo=c:/cert/cacert.pem\n\n- If some of your users mobile devices do not show a clickable URL in the sms callout:\n\nthen your newer website domain name may not be recognized. For example some phones don't \nunderstand the following link because it uses a newer .solutions format:\n\nhttps://vsoft.solutions/\n\n- you must find a host that you have access to, which has a well known format example:\n\nhttps://vejvoda.com/\n\ncreate a folder on that host for example a folder named 'rr' and create a file name '.htaccess' \nin the 'rr' folder with the following content (notice rr matches the folder name you created, \nand the part to the right tells the webserver where to forward to, $1 copies url parameters):\n\nRedirectMatch 301 /rr(.*) https://svvfd.vsoft.solutions$1\n\nNext create a custom sms twig file in the root folder where config.php exists, inside a new folder \nyou will create named:\n\nviews-custom\n\nand name this file:\n\nsms-callout-msg-custom.twig.html\n\nwith the following contents:\n\n{% extends \"sms-callout-msg.twig.html\" %}\n\n{% block sms_url_webroot %}\nhttps://vejvoda.com/rr/\n{% endblock %}\n\nThis will use the website: https://vejvoda.com/rr/ as a proxy to forward requests to: https://svvfd.vsoft.solutions\nwhich all phones would recognize because it uses the well-known .com format\n\nDevelopment:\n--------------\nRip Runner uses composer for dependency management. Currently php 8.x is supported and our continuous integration system (Github actions) runs automated tests on those versions. If you want to contribute to rip runner as a developer checkout the repo from github and from the php folder of the repo on your local system run:\n\ncomposer install\n\nThis will download all runtime and automated tests dependencies. If composer completed successfully you should be able to run the automated tests by running this command from the php folder:\n\nphpunit\n\nThe Github actions CI automation results can be found here:\n\nhttps://github.com/softcoder/riprunner/actions/workflows/php.yml\n\nExperimental Work:\n------------------\n\nAngular client:\n---------------\nWe have begun porting the user interface to Angular (v8+). Currently, this UI is partially ported from the\nlegacy twig UI, in order to build and deploy to your server:\n\n- Install Node.js® and npm (https://nodejs.org/en/download/) if they are not already on your machine.\n- Install the Angular CLI globally, and open a console prompt: \n\nnpm install -g @angular/cli\n\n- Install project dependencies (the angular folder below is the folder you get from the git source tree):\n\ncd angular\nnpm install\n\n- Compile and Build the angular project:\n\nng build --base-href=/~softcoder/svvfd1/php/ngui/ --output-path=../php/ngui/ --aot\n\nNotice above the base-href which is the document root path on your webserver where rip runner is installed (same folder where config.php exists). Also notice the compiled javascript project will be placed into the rip runner php/ngui folder.\n\n- Copy the ngui folder to your web server's Root Rip Runner folder (same folder as config.php)\n- visit the SPA (single page application) login page and try it out:\n  \n  /~softcoder/svvfd1/php/ngui/index.html\n\nIf you installed rip runner in the root folder of a subdomain for example http://svvfd.yourhost.com, you would run the script as follows:\n\nng build --base-href=/ngui/ --output-path=../php/ngui/ --aot\n\nthen copy the ngui folder to the root folder on svvfd.yourhost.com  \n\nServerless support:\n-------------------\nWe have started work on the application architecture to prepare to support various vendors who offer serverless computing platforms. Documentation can be read regarding deploying to Google Cloud Run (GCR) using a docker container\nhttps://github.com/softcoder/riprunner/tree/master/docker  \n\n\nContributions:\n--------------\nSpecial thanks to all who have contributed to the success of this project. We accept patches and ideas from others and prioritize based on time constraints and compatibility with our future direction.\n\nContributors currently include:\n- The Salmon Valley Fire Hall for all the great testing and feedback\n- Dennis Lloyd (Officer at the Shell Glen Fire Hall) for peer review, and many contributions, without which\n  we would have many more defects and have a much less pleasing user interface.\n\nContact Info:\n--------------\n- Email: mark@vsoft.solutions\n\n----\nFree Firehall Software Volunteer SMS Android Google App Engine Communications\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsoftcoder%2Friprunner","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsoftcoder%2Friprunner","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsoftcoder%2Friprunner/lists"}