py-kms/docs/Getting Started.md
Simonmicro 27aa94a6e4
Move docs to Readthedocs (#87)
* Modified rtd template

* Added current wiki files

* Superseeded by index.rst

* Removed dead links

* Minor formatting

* Moved usage to own topic

* Reformatting...

* Reformatting...

* Formulations

* New topic structure

* Split into subsections

* Heading changes

* Ooops, missed a file

* Reformatting

* Changed file name

* Link fixes

* Topic level change

* Minor title change

* Formulations

* Again more heading changes

* Added todos

* Removed old manual wiki copy

* Table fix

* Table fix chars

* Reformulated

* Formatting and reformulations

* Heading change

* Merged key files

* Fixed heading problems

* Added TODO

* Added TODOs

* Moinor formatting

* Removed empty lines

* Switched to local copies of images

* Changed in-doc ref

* Done Ref replacement

* Key table reformat

* Hidden TODOs

* Moved manual section

* Started moving into docs

* Minimized

* Moved readme file
Merged docker section
Pending still other readme sections at manual execution

* Added one sentence regarding ipv4/ipv6 to docker

* Merged manual execution information

* Added some badges

* Reworked fast run doc

* Added note to the rest of options

* Added changelog to docs

* Added tables?

* Added table support

* removed test table

* Finished TODO

* Moved subtopic to top (old parent was not "logically connected")

* Typo

* Changed readme url to new docs

* Fixed wrong docs badge uri

* Changed doc title to link, so it is impossible to miss
2020-09-01 23:29:46 +02:00

9.4 KiB

Getting Started

What follows are some guides how to start the pykms_Server.py script, which provides the server.

Running as a service


You can simply manage a daemon that runs as a background process. This can be achieved by using any of the guides below or by writing your own solution.

Docker

docker-auto docker-status docker-pulls docker-size

If you wish to get py-kms just up and running without installing any dependencies or writing own scripts: Just use Docker! Docker also solves problems regarding the explicit IPv4 and IPv6 usage: It just supports both. The following command will download, "install" and start py-kms and also keep it alive after any service disruption.

docker run -d --name py-kms --restart always -p 1688:1688 pykmsorg/py-kms

There are currently three tags of the image available (select one just by appending :<tag> to the image from above):

  • latest, currently the same like minimal...
  • minimal, wich is based on the python3 minimal configuration of py-kms. This tag does NOT include sqlite support!
  • python3, which is fully configurable and equipped with sqlite support and a web interface for management.

If you just want to use the image and don't want to build them yourself, you can always use the official image at the Docker Hub (pykmsorg/py-kms). To ensure that you are using always the latest version you should check something like watchtower out!

Systemd

If you are running a Linux distro using systemd, create the file: sudo nano /etc/systemd/system/py3-kms.service, then add the following (change it where needed) and save:

[Unit]
Description=py3-kms
After=network.target
StartLimitIntervalSec=0

[Service]
Type=simple
Restart=always
RestartSec=1
KillMode=process
User=root
ExecStart=/usr/bin/python3 </path/to/your/pykms/files/folder>/py-kms/pykms_Server.py 0.0.0.0 1688 -V DEBUG -F </path/to/your/log/files/folder>/pykms_logserver.log

[Install]
WantedBy=multi-user.target

Check syntax with sudo systemd-analyze verify py3-kms.service, correct file permission (if needed) sudo chmod 644 /etc/systemd/system/py3-kms.service, then reload systemd manager configuration sudo systemctl daemon-reload, start the daemon sudo systemctl start py3-kms.service and view its status sudo systemctl status py3-kms.service. Check if daemon is correctly running with cat </path/to/your/log/files/folder>/pykms_logserver.log. Finally a few generic commands useful for interact with your daemon here.

Etrigan

You can run py-kms daemonized (via Etrigan) using a command like python3 pykms_Server.py etrigan start and stop it with python3 pykms_Server.py etrigan stop. With Etrigan you have another way to launch py-kms GUI (specially suitable if you're using a virtualenv), so python3 pykms_Server.py etrigan start -g and stop the GUI with python3 pykms_Server.py etrigan stop (or interact with the EXIT button).

Upstart (deprecated)

If you are running a Linux distro using upstart (deprecated), create the file: sudo nano /etc/init/py3-kms.conf, then add the following (change it where needed) and save:

description "py3-kms"
author "SystemRage"
env PYTHONPATH=/usr/bin
env PYKMSPATH=</path/to/your/pykms/files/folder>/py-kms
env LOGPATH=</path/to/your/log/files/folder>/pykms_logserver.log
start on runlevel [2345]
stop on runlevel [016]
exec $PYTHONPATH/python3 $PYKMSPATH/pykms_Server.py 0.0.0.0 1688 -V DEBUG -F $LOGPATH
respawn

Check syntax with sudo init-checkconf -d /etc/init/py3-kms.conf, then reload upstart to recognise this process sudo initctl reload-configuration. Now start the service sudo start py3-kms, and you can see the logfile stating that your daemon is running: cat </path/to/your/log/files/folder>/pykms_logserver.log. Finally a few generic commands useful for interact with your daemon here.

Windows

If you are using Windows, to run pykms_Server.py as service you need to install pywin32, then you can create a file for example named kms-winservice.py and put into it this code:

import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
import subprocess

class AppServerSvc (win32serviceutil.ServiceFramework):
    _svc_name_ = "py-kms"
    _svc_display_name_ = "py-kms"
    _proc = None
    _cmd = ["C:\Windows\Python27\python.exe", "C:\Windows\Python27\py-kms\pykms_Server.py"]

    def __init__(self,args):
        win32serviceutil.ServiceFramework.__init__(self,args)
        self.hWaitStop = win32event.CreateEvent(None,0,0,None)
        socket.setdefaulttimeout(60)

    def SvcStop(self):
        self.killproc()
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)

    def SvcDoRun(self):
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                              servicemanager.PYS_SERVICE_STARTED,
                              (self._svc_name_,''))
        self.main()

    def main(self):
        self._proc = subprocess.Popen(self._cmd)
        self._proc.wait()

    def killproc(self):
        self._proc.kill()

if __name__ == '__main__':
    win32serviceutil.HandleCommandLine(AppServerSvc)

Now in a command prompt type C:\Windows\Python27\python.exe kms-winservice.py install to install the service. Display all the services with services.msc and find the service associated with py-kms, change the startup type from manual to auto. Finally Start the service. If this approach fails, you can try to use Non-Sucking Service Manager or Task Scheduler as described here.

Manual execution


Dependencies

  • Python 3.x.
  • Tkinter module (for the GUI).
  • If the tzlocal module is installed, the "Request Time" in the verbose output will be converted into local time. Otherwise, it will be in UTC.
  • It can use the sqlite3 module so you can use the database function, storing activation data so it can be recalled again.
  • Installation example on Ubuntu / Mint:
    • sudo apt-get update
    • sudo apt-get install python3-tk python3-pip
    • sudo pip3 install tzlocal pysqlite3

Startup

A Linux user with ip addr command can get his KMS IP (Windows users can try ipconfig /all).

user@host ~ $ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp6s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether **:**:**:**:**:** brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.102/24 brd 192.168.1.255 scope global dynamic noprefixroute enp6s0
       valid_lft 860084sec preferred_lft 860084sec
    inet6 ****:****:****:****:****:****:****:****/64 scope global dynamic noprefixroute 
       valid_lft 6653sec preferred_lft 3052sec
    inet6 ****::****:****:****:****/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

In the example above is 192.168.1.102 the ip we want to listen on, so it is this command (note you can omit the ip AND port specification if you just wish to listen on all interfaces):

user@host ~/path/to/folder/py-kms $ python3 pykms_Server.py 192.168.1.102 1688

To stop pykms_Server.py, in the same bash window where code running, simply press CTRL+C. Alternatively, in a new bash window, use kill <pid> command (you can type ps aux first and have the process ) or killall <name_of_server>.

Notes

The following are just some quick notes - for a more detailed list of parameters see here.

  • To generate a random HWID use -w option: python3 pykms_Server.py -w RANDOM.
  • To get the HWID from any server use the client, for example type: python3 pykms_Client.py :: 1688 -m Windows8.1 -V INFO.
  • To change your logfile path use -F option, for example: python3 pykms_Server.py -F /path/to/your/logfile.log -V DEBUG.
  • To view a minimal set of logging information use -V MINI option, for example: python3 pykms_Server.py -F /path/to/your/logfile.log -V MINI.
  • To redirect logging on stdout use -F STDOUT option, for example: python3 pykms_Server.py -F STDOUT -V DEBUG.
  • You can create logfile and view logging information on stdout at the same time with -F FILESTDOUT option, for example: python3 pykms_Server.py -F FILESTDOUT /path/to/your/logfile.log -V DEBUG.
  • With -F STDOUTOFF you disable all stdout messages (but a logfile will be created), for example: python3 pykms_Server.py -F STDOUTOFF /path/to/your/logfile.log -V DEBUG.
  • With -F FILEOFF you disable logfile creation.
  • Select timeout (seconds) for py-kms with -t0 option, for example python3 pykms_Server.py -t0 10.
  • Option -y enables printing asynchronously of messages (pretty / logging).