1
0
mirror of synced 2024-11-24 06:20:12 +01:00

Minor adjustments to the readme formatting, add some todos.

This commit is contained in:
Jennifer Taylor 2019-12-08 21:52:00 +00:00
parent 74c0407173
commit 90fd8ad5d8
2 changed files with 86 additions and 76 deletions

157
README.md
View File

@ -1,5 +1,5 @@
Introduction # Introduction
------------
A collection of programs for working with various games in the BEMANI series. This A collection of programs for working with various games in the BEMANI series. This
could be untangled quite a bit into various modules that provide simpler pieces. could be untangled quite a bit into various modules that provide simpler pieces.
However, this is how it ended up evolving over time. This repository includes However, this is how it ended up evolving over time. This repository includes
@ -20,15 +20,15 @@ for being good RE partners for several games, and sharing good finds. Thanks to
helvetica for helping with game RE and retweeting cute anime ladies onto my feed helvetica for helping with game RE and retweeting cute anime ladies onto my feed
every goddamn night. every goddamn night.
2dxutils ## 2dxutils
========
A utility for unpacking and repacking `.2dx` files. This isn't the best utility and A utility for unpacking and repacking `.2dx` files. This isn't the best utility and
I think there are more complete and more accurate programs out there. However, I think there are more complete and more accurate programs out there. However,
they all lack source as far as I could tell, so I developed this. Run it like they all lack source as far as I could tell, so I developed this. Run it like
`./2dxutils --help` to see help output and determine how to use this. `./2dxutils --help` to see help output and determine how to use this.
api ## api
===
Development version of this repository's BEMAPI implementation. Run it like Development version of this repository's BEMAPI implementation. Run it like
`./api --help` to see help output and determine how to use this. Much like `./api --help` to see help output and determine how to use this. Much like
"services" and "frontend", this should be pointed at the development version of "services" and "frontend", this should be pointed at the development version of
@ -40,14 +40,14 @@ Do not use this utility to serve production traffic. Instead, see
`bemani/wsgi/api.wsgi` for a ready-to-go WSGI file that can be used with uWSGI `bemani/wsgi/api.wsgi` for a ready-to-go WSGI file that can be used with uWSGI
and nginx. and nginx.
arcutils ## arcutils
========
A utility for unpacking `.arc` files. This does not currently repack files. However, A utility for unpacking `.arc` files. This does not currently repack files. However,
the format is so trivial that adding such a feature would be fairly easy. Run it the format is so trivial that adding such a feature would be fairly easy. Run it
like `./arcutils --help` to see help output and determine how to use this. like `./arcutils --help` to see help output and determine how to use this.
bemanishark ## bemanishark
===========
A wire sniffer that can decode eAmuse packets and print them. Run it on a computer A wire sniffer that can decode eAmuse packets and print them. Run it on a computer
that can sniff traffic between an eAmusement server and a supported game and it will that can sniff traffic between an eAmusement server and a supported game and it will
spit out the requests and responses XML-formatted identically to the legacy easerver spit out the requests and responses XML-formatted identically to the legacy easerver
@ -66,23 +66,29 @@ TCP stream.
This utility might be better if rewritten to be a plugin for Wireshark instead of This utility might be better if rewritten to be a plugin for Wireshark instead of
a standalone sniffing utility, but I don't have the time. a standalone sniffing utility, but I don't have the time.
binutils ## binutils
========
A utility for unpacking raw binxml files (files that use the same encoding scheme A utility for unpacking raw binxml files (files that use the same encoding scheme
as the binary network protocol) to their XML representation. This is useful for as the binary network protocol) to their XML representation. This is useful for
examining raw binary blobs or digging into unknown file formats that contain binxml. examining raw binary blobs or digging into unknown file formats that contain binxml.
Run it like `./binutils --help` to see help and learn how to use this. Run it like `./binutils --help` to see help and learn how to use this.
cardconvert ## bootstrap
===========
A utility for quickly bootstrapping a local setup's music database from an already
running BEMAPI-compatible server. This is more documented in the below "Database
Initialization" section.
## cardconvert
A command-line utility for converting between card numbers written on the back of a A command-line utility for converting between card numbers written on the back of a
card and the card ID stored in the RFID of the card. Run it like `./cardconvert --help` card and the card ID stored in the RFID of the card. Run it like `./cardconvert --help`
to see how to use this. This will sanitize input, so you can feed it card numbers to see how to use this. This will sanitize input, so you can feed it card numbers
with or without spaces, and you can mix up 1 and I as well as 0 and O, and it will with or without spaces, and you can mix up 1 and I as well as 0 and O, and it will
properly handle decoding. This supports both new and old style cards. properly handle decoding. This supports both new and old style cards.
dbutils ## dbutils
=======
A command-line utility for working with the DB used by "api", "services" and "frontend". A command-line utility for working with the DB used by "api", "services" and "frontend".
This utility includes options for creating tables in a newly-created DB, granting and This utility includes options for creating tables in a newly-created DB, granting and
revoking admin rights to the frontend, generating migration scripts for live DBs, and revoking admin rights to the frontend, generating migration scripts for live DBs, and
@ -95,8 +101,8 @@ bring your production DB up to sync with the code you are deploying. Run it like
`./dbutils --help` to see all options. The config file that this works on is the same `./dbutils --help` to see all options. The config file that this works on is the same
that is given to "api", "services" and "frontend". that is given to "api", "services" and "frontend".
frontend ## frontend
========
Development version of a frontend server allowing for account and server administration Development version of a frontend server allowing for account and server administration
as well as score viewing and profile editing. Run it like `./frontend --help` to see as well as score viewing and profile editing. Run it like `./frontend --help` to see
help output and determine how to use this. Much like "services" and "api", this should help output and determine how to use this. Much like "services" and "api", this should
@ -108,22 +114,22 @@ Do not use this utility to serve production traffic. Instead, see
`bemani/wsgi/frontend.wsgi` for a ready-to-go WSGI file that can be used with uWSGI `bemani/wsgi/frontend.wsgi` for a ready-to-go WSGI file that can be used with uWSGI
and nginx. and nginx.
ifsutils ## ifsutils
========
A mediocre utility that can extract `.ifs` files. This has a lot of baked in A mediocre utility that can extract `.ifs` files. This has a lot of baked in
assumptions and is not nearly as good as other open-source utilities for extracting assumptions and is not nearly as good as other open-source utilities for extracting
files. It also cannot repack files. This is included for posterity, and because some files. It also cannot repack files. This is included for posterity, and because some
bootstrapping code requires it in order to fully start a production server. bootstrapping code requires it in order to fully start a production server.
Run it like `./ifsutils --help` to see help output and learn how to use it. Run it like `./ifsutils --help` to see help output and learn how to use it.
iidxutils ## iidxutils
=========
A utility for patching IIDX music database files. Note that this currently can only A utility for patching IIDX music database files. Note that this currently can only
apply a "hide leggendarias from normal folders" patch, although its probable that it apply a "hide leggendarias from normal folders" patch, although its probable that it
can be extended for other uses. can be extended for other uses.
proxy ## proxy
=====
A utility to MITM an eAmuse session. Point a game at the port this listens on, and A utility to MITM an eAmuse session. Point a game at the port this listens on, and
point it at another network to see the packets flowing between the two. Takes care point it at another network to see the packets flowing between the two. Takes care
of rewriting the facility message to MITM all messages. Has the ability to rewrite of rewriting the facility message to MITM all messages. Has the ability to rewrite
@ -144,8 +150,8 @@ of this utility located at `bemani/wsgi/proxy.wsgi` along with uWSGI and nginx.
Run it like `./proxy --help` to see how to use this utility. Run it like `./proxy --help` to see how to use this utility.
psmap ## psmap
=====
A utility to take an offset from a DLL file and produce python code that would generate A utility to take an offset from a DLL file and produce python code that would generate
a suitable response that said DLL will properly parse. Essentially, if you are a suitable response that said DLL will properly parse. Essentially, if you are
reversing a new game and they use the `psmap` utility to decode all or part of a reversing a new game and they use the `psmap` utility to decode all or part of a
@ -155,8 +161,8 @@ Note that this doesn't currently work on 64bit games, but it should be trivial t
figure out the differences in the 64-bit psmap implementation. Run it like figure out the differences in the 64-bit psmap implementation. Run it like
`./psmap --help` to see how to use this utility. `./psmap --help` to see how to use this utility.
read ## read
====
A utility to read music DB information out of game files and populate a database. A utility to read music DB information out of game files and populate a database.
This should be given the same config file as "api", "services" or "frontend" and This should be given the same config file as "api", "services" or "frontend" and
assumes that "dbutils" has already been used to instantiate a valid MySQL DB. It assumes that "dbutils" has already been used to instantiate a valid MySQL DB. It
@ -164,16 +170,16 @@ also assumes you have the correct game files to read out of. Run it like
`./read --help` to see how to use it. This utility's uses are extensively documented `./read --help` to see how to use it. This utility's uses are extensively documented
below in the "Installation" section. below in the "Installation" section.
replay ## replay
======
A utility to take a packet as logged by proxy, services, trafficgen or bemanishark, A utility to take a packet as logged by proxy, services, trafficgen or bemanishark,
and replay that packet against a particular server. Useful for quickly grabbing and replay that packet against a particular server. Useful for quickly grabbing
packets that caused a crash and debugging the crash (and verifying the fix). It also packets that caused a crash and debugging the crash (and verifying the fix). It also
lets you replay that packet against your production instance once you fixed the issue lets you replay that packet against your production instance once you fixed the issue
in case that packet was a score or profile update that you care about. in case that packet was a score or profile update that you care about.
responsegen ## responsegen
===========
A utility to take a packet as logged by proxy, services, trafficgen or bemanishark, A utility to take a packet as logged by proxy, services, trafficgen or bemanishark,
and generate python code that would have generated that exact packet. Useful for and generate python code that would have generated that exact packet. Useful for
quickly grabbing packets sniffed from another network and prototyping new game support. quickly grabbing packets sniffed from another network and prototyping new game support.
@ -181,8 +187,8 @@ Think of this as a combination of "replay" and "psmap". This is also extremely u
when building new integration test clients. Run it like `./responsegen --help` to when building new integration test clients. Run it like `./responsegen --help` to
see all information and usage. see all information and usage.
scheduler ## scheduler
=========
A command-line utility for kicking off scheduled work that must be performed against a A command-line utility for kicking off scheduled work that must be performed against a
DB. This includes picking new dailies/weeklies, new courses, etc... depending on the DB. This includes picking new dailies/weeklies, new courses, etc... depending on the
game and any requirements that the server perform some actual calculation based on game and any requirements that the server perform some actual calculation based on
@ -192,8 +198,8 @@ should be seen as a utility-specific cron handler. You can safely run this repea
and as frequently as desired. Run like `./scheduler --help` to see how to ues this. and as frequently as desired. Run like `./scheduler --help` to see how to ues this.
This should be given the same config file as "api", "frontend" and "services". This should be given the same config file as "api", "frontend" and "services".
services ## services
========
Development version of an eAmusement protocol server using flask and the protocol Development version of an eAmusement protocol server using flask and the protocol
libraries also used in "bemanishark" and "trafficgen". Currently it lets most modern libraries also used in "bemanishark" and "trafficgen". Currently it lets most modern
BEMANI games boot and supports full profile and events for Beatmania IIDX 20-24, BEMANI games boot and supports full profile and events for Beatmania IIDX 20-24,
@ -206,14 +212,14 @@ Do not use this utility to serve production traffic. Instead, see
`bemani/wsgi/services.wsgi` for a ready-to-go WSGI file that can be used with uWSGI `bemani/wsgi/services.wsgi` for a ready-to-go WSGI file that can be used with uWSGI
and nginx. and nginx.
shell ## shell
=====
A convenience wrapper to invoke a Python 3 shell that has paths set up to import the A convenience wrapper to invoke a Python 3 shell that has paths set up to import the
modules in this repository. If you want to tinker or write a quick one-off, this is modules in this repository. If you want to tinker or write a quick one-off, this is
probably the easiest way to do so. probably the easiest way to do so.
struct ## struct
======
A convenience utility for helping reverse-engineer structures out of game DLLs. You A convenience utility for helping reverse-engineer structures out of game DLLs. You
can give this a physical DLL offset or a virtual memory address for the start and can give this a physical DLL offset or a virtual memory address for the start and
end of the data as well as a python struct format (documentation at end of the data as well as a python struct format (documentation at
@ -221,8 +227,8 @@ https://docs.python.org/3.6/library/struct.html) and this will print the decoded
data to the screen as a series of tuples. Run it like `./struct --help` to see how data to the screen as a series of tuples. Run it like `./struct --help` to see how
to use this. to use this.
trafficgen ## trafficgen
==========
A utility for simulating traffic to an eAmusement service. Given a particular game, A utility for simulating traffic to an eAmusement service. Given a particular game,
this will run through and attempt to verify simple operation of that service. No this will run through and attempt to verify simple operation of that service. No
guarantees are made on the accuracy of the emulation though I've strived to be guarantees are made on the accuracy of the emulation though I've strived to be
@ -234,21 +240,21 @@ Dance Revolution X2, X3, 2013, 2014 and Ace, The\*BishiBashi, MÚSECA 1 and MÚS
Reflec Beat, Reflec Beat Limelight, Reflec Beat Colette, groovin'!! Upper, Volzza 1 and Reflec Beat, Reflec Beat Limelight, Reflec Beat Colette, groovin'!! Upper, Volzza 1 and
Volzza 2 and can verify card events and score events, as well as PASELI transactions. Volzza 2 and can verify card events and score events, as well as PASELI transactions.
verifylibs ## verifylibs
==========
Unit test frontend utility. This will invoke nosetests on the embarrasingly small Unit test frontend utility. This will invoke nosetests on the embarrasingly small
collection of unit tests for this repository. If you are making modifications, it can collection of unit tests for this repository. If you are making modifications, it can
be useful to write a test first (placed in the `bemani/tests/` directory) and code be useful to write a test first (placed in the `bemani/tests/` directory) and code
from there. It is also useful when optimizing or profiling, and also to verify that from there. It is also useful when optimizing or profiling, and also to verify that
you haven't regressed anything. you haven't regressed anything.
verifylint ## verifylint
==========
Lint invocation utility. This simply invokes flake8 with various options so that you Lint invocation utility. This simply invokes flake8 with various options so that you
can see you haven't introduced any lint errors. can see you haven't introduced any lint errors.
verifytraffic ## verifytraffic
=============
A utility which attempts to call "trafficgen" for each supported game on the network. A utility which attempts to call "trafficgen" for each supported game on the network.
Think of this as a full integration test suite, as it will sweep through each supported Think of this as a full integration test suite, as it will sweep through each supported
game and verify that network services are actually working. This assumes that you are game and verify that network services are actually working. This assumes that you are
@ -257,17 +263,16 @@ submit bogus cards, scores, names and the like and mess up your network. This ta
a config file which sets up how the client should behave. See `config/trafficgen.yaml` a config file which sets up how the client should behave. See `config/trafficgen.yaml`
for a sample file that can be used. for a sample file that can be used.
verifytyping ## verifytyping
============
Typing invocation utility. Since this repository is fully typed, this verifies that you Typing invocation utility. Since this repository is fully typed, this verifies that you
haven't introduced any type errors and often catches bugs far faster than attemping to haven't introduced any type errors and often catches bugs far faster than attemping to
play a round only to see that you misused a class or misspelled a variable. play a round only to see that you misused a class or misspelled a variable.
Installation # Installation
------------
## Dependency Setup
Dependency Setup
================
The code contained here assumes Python 3.6 as the base. If you don't have or don't The code contained here assumes Python 3.6 as the base. If you don't have or don't
want to install Python 3.6 as your system python, it is recommended to use want to install Python 3.6 as your system python, it is recommended to use
virtualenv to create a virtual environment. The rest of the installation will assume virtualenv to create a virtual environment. The rest of the installation will assume
@ -319,8 +324,8 @@ This is due to the way `/tmp` on Linux restricts file access to the creator only
if you share your cache with multiple utilities running under different users, it will if you share your cache with multiple utilities running under different users, it will
fail to reuse the cache and drastically slow down the frontend. fail to reuse the cache and drastically slow down the frontend.
Database Initialization ## Database Initialization
=======================
At this point, games will boot when pointed at the network, but you won't be able At this point, games will boot when pointed at the network, but you won't be able
to save scores. This is due to the missing song/chart -> score mapping. You will find to save scores. This is due to the missing song/chart -> score mapping. You will find
default configuration files for the traffic generator and the services backend in default configuration files for the traffic generator and the services backend in
@ -355,16 +360,16 @@ If you do not have a BEMAPI-compatible server, you can initialize the server fro
game files of the games you wish to run. See the following sections for how exactly to game files of the games you wish to run. See the following sections for how exactly to
do that. do that.
Pop'n Music ### Pop'n Music
~~~~~~~~~~~
For Pop'n Music, get the game DLL from the version of the game you want to import and For Pop'n Music, get the game DLL from the version of the game you want to import and
run a command like so. This network supports versions 19-24 so you will want to run this run a command like so. This network supports versions 19-24 so you will want to run this
command once for every version, giving the correct DLL file: command once for every version, giving the correct DLL file:
./read --config config/server.yaml --series pnm --version 22 --bin popn22.dll ./read --config config/server.yaml --series pnm --version 22 --bin popn22.dll
Jubeat ### Jubeat
~~~~~~
For Jubeat, get the music XML out of the data directory of the mix you are importing, For Jubeat, get the music XML out of the data directory of the mix you are importing,
and then use "read" with `--series jubeat` and `--version` corresponding to the following and then use "read" with `--series jubeat` and `--version` corresponding to the following
table: table:
@ -386,8 +391,8 @@ after importing all mixes:
./read --config config/server.yaml --series jubeat --version all --tsv \ ./read --config config/server.yaml --series jubeat --version all --tsv \
data/jubeat.tsv data/jubeat.tsv
IIDX ### IIDX
~~~~
For IIDX, you will need the data directory of the mix you wish to support. The import For IIDX, you will need the data directory of the mix you wish to support. The import
script automatically scrapes the music DB as well as the song charts to determine script automatically scrapes the music DB as well as the song charts to determine
difficulty, notecounts and BPM. For a normal mix, you will want to run the command like difficulty, notecounts and BPM. For a normal mix, you will want to run the command like
@ -410,8 +415,8 @@ after importing all mixes (this fixes some inconsistencies in names):
./read --config config/server.yaml --series iidx --version all --tsv \ ./read --config config/server.yaml --series iidx --version all --tsv \
data/iidx.tsv data/iidx.tsv
DDR ### DDR
~~~
For DDR, you will need the game DLL and `musicdb.xml` from the game you wish to import, For DDR, you will need the game DLL and `musicdb.xml` from the game you wish to import,
and then run a command similar to the following. You will want to use the version and then run a command similar to the following. You will want to use the version
corresponding to version in the following table: corresponding to version in the following table:
@ -431,8 +436,8 @@ For DDR Ace, there is no `musicdb.xml` or game DLL needed. Instead, you will nee
./read --config config/server.yaml --series ddr --version 16 \ ./read --config config/server.yaml --series ddr --version 16 \
--bin data/arc/startup.arc --bin data/arc/startup.arc
SDVX ### SDVX
~~~~
For SDVX, you will need the game DLL and `music_db.xml` from the game you wish to import, For SDVX, you will need the game DLL and `music_db.xml` from the game you wish to import,
and then run the following command, modifying the version parameter as required. and then run the following command, modifying the version parameter as required.
Note that for SDVX 1, you want the `music_db.xml` file in `data/others/music_db/` directory, Note that for SDVX 1, you want the `music_db.xml` file in `data/others/music_db/` directory,
@ -460,24 +465,24 @@ work properly. To do so, run the following command.
./read --config config/server.yaml --series sdvx --version 4 \ ./read --config config/server.yaml --series sdvx --version 4 \
--xml data/others/appeal_card.xml --xml data/others/appeal_card.xml
MÚSECA ### MÚSECA
~~~~~~
For MÚSECA, you will need the `music-info.xml` file from the game you wish to import. For MÚSECA, you will need the `music-info.xml` file from the game you wish to import.
Then, run the following command, modifying the version parameter as required. Then, run the following command, modifying the version parameter as required.
./read --config config/server.yaml --series museca --version 1 \ ./read --config config/server.yaml --series museca --version 1 \
--xml data/museca/xml/music-info.xml --xml data/museca/xml/music-info.xml
Reflec Beat ### Reflec Beat
~~~~~~~~~~~
For Reflec Beat, get the game DLL from the version of the game you want to import and For Reflec Beat, get the game DLL from the version of the game you want to import and
run a command like so. This network supports Reflec Beat up through Volzza 2, so you run a command like so. This network supports Reflec Beat up through Volzza 2, so you
will want to run this with versions 1-6 to completely initialize: will want to run this with versions 1-6 to completely initialize:
./read --config config/server.yaml --series reflec --version 1 --bin reflecbeat.dll ./read --config config/server.yaml --series reflec --version 1 --bin reflecbeat.dll
Running Locally ## Running Locally
===============
Once you've set all of this up, you can start the network in debug mode using a command Once you've set all of this up, you can start the network in debug mode using a command
similar to: similar to:
@ -537,8 +542,8 @@ script to promote yourself to admin, similar to this command:
./dbutils --config config/server.yaml add-admin --username <your-name-here> ./dbutils --config config/server.yaml add-admin --username <your-name-here>
Production Setup ## Production Setup
================
As alluded to several times in this README, the recommended way to run a production As alluded to several times in this README, the recommended way to run a production
instance of this code is to set up uWSGI fronted by nginx. You should SSL-encrypt instance of this code is to set up uWSGI fronted by nginx. You should SSL-encrypt
the frontend and the API services, and its recommended to use LetsEncrypt for a the frontend and the API services, and its recommended to use LetsEncrypt for a
@ -555,8 +560,8 @@ set up a nginx directory to serve the static resources directly.
For example configurations, an example install script, and an example script to back For example configurations, an example install script, and an example script to back
up your MySQL instance, see the `examples/` directory. up your MySQL instance, see the `examples/` directory.
Contributing # Contributing
------------
Contributions are welcome! Before submitting a pull request, ensure that your code Contributions are welcome! Before submitting a pull request, ensure that your code
is type-hint clean by running `./verifytyping` and ensure that it hasn't broken basic is type-hint clean by running `./verifytyping` and ensure that it hasn't broken basic
libraries with `./verifylibs`. Make sure that it is also lint-clean with `./verifylint`. libraries with `./verifylibs`. Make sure that it is also lint-clean with `./verifylint`.

View File

@ -8,3 +8,8 @@ Things that I have not gotten around to doing.
- Make the frontend work better on mobile. It works well enough, but it could be a much better experience. - Make the frontend work better on mobile. It works well enough, but it could be a much better experience.
- Support for DanEvo. I meant to do this but my DanEvo ended up in storage before I could tackle it, so the only thing that exists at the moment is a rudimentary music DB parser. - Support for DanEvo. I meant to do this but my DanEvo ended up in storage before I could tackle it, so the only thing that exists at the moment is a rudimentary music DB parser.
- Figure out phase/unlock/etc bits for some older IIDX and Pop'n Music versions and hook them up to the Arcade panel to allow switching events. - Figure out phase/unlock/etc bits for some older IIDX and Pop'n Music versions and hook them up to the Arcade panel to allow switching events.
General maintenance that I have not yet performed.
- Unpin flake8 and address new lint errors from newer version of flake8.
- Upgrade legacy uses of .format() to use f-strings instead.