Compare commits

...

10 Commits

Author SHA1 Message Date
iridiumR 874252642a
fix bugs 2023-08-08 00:35:38 +08:00
iridiumR 5d3886bb51
fix bugs 2023-08-07 23:58:01 +08:00
iridiumR f24a4d6982
fix bugs 2023-08-07 23:51:56 +08:00
iridiumR 8516fa921c
change format to json 2023-08-07 23:25:54 +08:00
iridiumR c22f0ce97c
fix socket permission 2023-08-07 21:51:35 +08:00
iridiumR 64ac9ad155
fix systemd runtime 2023-08-07 21:46:14 +08:00
iridiumR 98d4802871
fix systemd units an so on 2023-08-07 21:42:29 +08:00
iridiumR f094e57dba
fix service name 2023-08-07 21:27:22 +08:00
iridiumR 0d939165de
fix folder check 2023-08-07 21:26:39 +08:00
iridiumR b310d1391f
gitignore 2023-08-07 21:21:14 +08:00
5 changed files with 153 additions and 84 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
*.pkg.tar.zst

View File

@ -1,6 +1,6 @@
# Maintainer: 1ridic <i@8f.al>
pkgname=uptimes
pkgver=0.1.0
pkgver=0.1.11
pkgrel=1
pkgdesc="status of total uptime"
arch=('any')
@ -11,10 +11,10 @@ source=(
local://uptimes
local://uptimesd.service
)
md5sums=('b2bac26fc929e533923497311f4de415'
'f598fdb7ab331933d3495c0bb53358c2')
md5sums=('d2e8cfc73a64173a4d0749fc31193be6'
'7a90889f87792317e70ebdce9dae7023')
package() {
install -Dm755 uptimes "$pkgdir/usr/bin/uptimes"
install -Dm644 uptimesd.service "$pkgdir/usr/lib/systemd/system/uptimes.service"
install -Dm644 uptimesd.service "$pkgdir/usr/lib/systemd/system/uptimesd.service"
}

225
uptimes
View File

@ -8,21 +8,82 @@ import signal
import socket
startTime = 0
totalTime = 0
uptime = 0
s = 0
socket_file = '/var/tmp/uptimesd.sock'
socket_file = '/run/uptimesd.sock'
uptimes_db = '/etc/uptimes/uptimes.db'
def readTime():
global uptime,startTime
with open('/proc/uptime', 'r') as f:
uptime = f.readline()
uptime = uptime.split(' ')[0]
uptime = float(uptime)
return uptime
def timeInit():
global startTime, totalTime
with open(uptimes_db, 'r') as f:
totalTime = f.readline()
totalTime = float(totalTime)
print("totalTime: %f" % totalTime)
sys.stdout.flush()
startTime = readTime()
print("startTime: %f" % startTime)
sys.stdout.flush()
def updateTime():
global uptime, startTime, totalTime
now = readTime()
print("Now: %f" % now)
sys.stdout.flush()
print("Uptime: %f" % uptime)
sys.stdout.flush()
print("startTime: %f" % startTime)
sys.stdout.flush()
print("totalTime: %f" % totalTime)
sys.stdout.flush()
totalTime += now - startTime
startTime = now
print("totalTime: %f" % totalTime)
sys.stdout.flush()
with open(uptimes_db, 'w') as f:
f.write(str(totalTime))
def pathExists():
# if /etc/uptimes/uptimes.db exist
if os.path.exists(uptimes_db):
return True
else:
folder = uptimes_db.split('/')
folder.pop()
folder = '/'.join(folder)
if not os.path.exists(folder):
# create folder with 600
os.mkdir(folder, 0o600)
# create uptimes.db with 600
with open(uptimes_db, 'w') as f:
f.write('0')
os.chmod(uptimes_db, 0o600)
def main():
global uptime, s
parse = argparse.ArgumentParser(description='Uptimes')
parse.add_argument('-d', '--daemon', action='store_true', help='run as daemon')
parse.add_argument('-s', '--systemd', action='store_true', help='run as systemd service')
args = parse.parse_args()
if args.daemon:
daemon()
elif args.systemd:
daemon(fork=False)
else:
# check socket file
if not os.path.exists(socket_file):
@ -46,56 +107,68 @@ def main():
print('Total Uptime: %d years %d days %d hours %d minutes %d seconds' % (years, days, hours, minutes, seconds))
def readUpTime():
global uptime,startTime
with open('/proc/uptime', 'r') as f:
uptime = f.readline()
uptime = uptime.split(' ')[0]
uptime = float(uptime)
return uptime
def daemon():
def daemon(fork = True):
global uptime, now, s
# fork
pid = os.fork()
if pid > 0:
sys.exit(0)
os.chdir('/')
os.setsid()
os.umask(0)
# fork again
pid = os.fork()
if pid > 0:
sys.exit(0)
print('Uptimesd starting...')
sys.stdout.flush()
if os.path.exists(socket_file):
print('Uptimesd already running')
sys.stdout.flush()
sys.exit(1)
# fork
if fork:
pid = os.fork()
if pid > 0:
sys.exit(0)
os.chdir('/')
os.setsid()
os.umask(0)
# redirect
sys.stdout.flush()
sys.stderr.flush()
si = open('/dev/null', 'r')
so = open('/dev/null', 'a+')
se = open('/dev/null', 'a+')
os.dup2(si.fileno(), sys.stdin.fileno())
os.dup2(so.fileno(), sys.stdout.fileno())
os.dup2(se.fileno(), sys.stderr.fileno())
# fork again
pid = os.fork()
if pid > 0:
sys.exit(0)
# redirect
sys.stdout.flush()
sys.stderr.flush()
si = open('/dev/null', 'r')
so = open('/dev/null', 'a+')
se = open('/dev/null', 'a+')
os.dup2(si.fileno(), sys.stdin.fileno())
os.dup2(so.fileno(), sys.stdout.fileno())
os.dup2(se.fileno(), sys.stderr.fileno())
# change process name
import setproctitle
setproctitle.setproctitle('uptimesd')
# redirect
sys.stdout.flush()
sys.stderr.flush()
si = open('/dev/null', 'r')
so = open('/dev/null', 'a+')
se = open('/dev/null', 'a+')
os.dup2(si.fileno(), sys.stdin.fileno())
os.dup2(so.fileno(), sys.stdout.fileno())
os.dup2(se.fileno(), sys.stderr.fileno())
# create socket file
try:
os.unlink(socket_file)
except OSError:
if os.path.exists(socket_file):
raise
print('Creating socket...')
sys.stdout.flush()
if os.path.exists(socket_file):
os.unlink(socket_file)
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
s.bind(socket_file)
# socket file permission 777
os.chmod(socket_file, 0o777)
s.listen(1)
# handle signal
@ -104,27 +177,15 @@ def daemon():
signal.signal(signal.SIGQUIT, sigterm_handler)
signal.signal(signal.SIGPIPE, sigterm_handler)
# if /etc/uptimes/uptimes.db exist
if os.path.exists(uptimes_db):
with open(uptimes_db, 'r') as f:
uptime = f.readline()
if uptime == '':
uptime = 0
else:
uptime = float(uptime)
else:
folder = uptimes_db.split('/')
folder.pop()
folder = '/'.join(folder)
if not os.path.exists(folder):
# create folder with 600
os.mkdir(folder, 0o600)
# create db with 600
with open(uptimes_db, 'w') as f:
f.write(str(uptime))
pathExists()
# read uptime
startTime = uptime
print('Reading db...')
sys.stdout.flush()
timeInit()
print('Uptimesd started')
sys.stdout.flush()
while True:
conn, addr = s.accept()
@ -146,7 +207,7 @@ def daemon():
elif data == b'get':
updateTime()
conn.sendall(b'%f' % uptime)
conn.sendall(b'%f' % totalTime)
conn.close()
continue
@ -155,21 +216,24 @@ def daemon():
conn.close()
continue
def updateTime():
global uptime, startTime
now = readUpTime()
uptime += now - startTime
with open(uptimes_db, 'w') as f:
f.write(str(uptime))
def sigterm_handler(signo, frame):
print('Uptimesd stopping...')
sys.stdout.flush()
# update uptime
updateTime()
# close socket
s.close()
if os.path.exists(socket_file):
os.unlink(socket_file)
# exit
print('Uptimesd stopped. Goodbye.')
sys.stdout.flush()
with open(uptimes_db, 'r') as f:
uptime = f.readline()
print('Total Uptime: ' + uptime + ' seconds')
sys.stdout.flush()
sys.exit(0)
def comm(command):
@ -178,15 +242,18 @@ def comm(command):
if not os.path.exists(socket_file):
print('Uptimesd not running')
sys.exit(1)
# connect
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
s.connect(socket_file)
try:
# connect
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
s.connect(socket_file)
# send command
s.sendall(command.encode('utf-8'))
data = s.recv(1024)
return data.decode('utf-8')
# send command
s.sendall(command.encode('utf-8'))
data = s.recv(1024)
return data.decode('utf-8')
except:
print('Uptimesd not running')
sys.exit(1)
if __name__ == '__main__':
main()

1
uptimes.db Normal file
View File

@ -0,0 +1 @@
603.2700000000001

View File

@ -5,6 +5,6 @@ After=network.target network-online.target
[Service]
Type=simple
User=root
ExecStart=/usr/bin/uptimes --daemon
ExecStart=/usr/bin/uptimes --systemd
[Install]
WantedBy=multi-user.target