Compare commits

...

3 Commits

Author SHA1 Message Date
JoYo 42c7364589 minor formatting 2019-02-19 23:04:45 +00:00
JoYo 6a1b056ed9 session add the wrong db entry object fix 2019-02-19 22:56:11 +00:00
JoYo ce4e8b57c5 initial orm for sqlite state 2019-02-19 04:40:35 +00:00
5 changed files with 79 additions and 19 deletions

5
.gitignore vendored
View File

@ -1,2 +1,7 @@
__pycache__/
seed
out/
build/
dist/
*.egg-info/
.vscode

View File

@ -7,5 +7,5 @@ services:
volumes:
- ${PWD}:/app
working_dir: /app
command: python3 -m sins
command: python3 -m sins -o out/
# command: yasm seed.asm -o seed

View File

@ -1,3 +1,4 @@
#!/usr/bin/env python3
from .run import sins, generation
# from .orm import SeedNode
from .run import sins
from .mutation import generation, flip, seed_shell
from .orm import db_config, ScrapNode

View File

@ -1,11 +1,12 @@
#!/usr/bin/env python3
from datetime import datetime
from sqlalchemy import Blob, Column, ForeignKey, Integer, String, DateTime, create_engine, exists, desc
from hashlib import sha1
from pathlib import Path
from sqlalchemy import LargeBinary, Column, ForeignKey, Integer, String, DateTime, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import Session, relationship, backref
from sqlalchemy.orm.collections import attribute_mapped_collection
import logging
from hashlib import sha1
logger = logging.getLogger('sins')
now = '{0:%Y%m%dT%H%M%S}'.format(datetime.utcnow())
@ -13,7 +14,15 @@ now = '{0:%Y%m%dT%H%M%S}'.format(datetime.utcnow())
Base = declarative_base()
class SeedNode(Base):
def db_config(path: Path) -> Session:
engine = create_engine(f'sqlite:///{path.resolve()}', native_datetime=True)
Base.metadata.create_all(engine)
session = Session(engine)
return session
class ScrapNode(Base):
__tablename__ = 'scrap_node'
ctime = Column(DateTime, default=datetime.utcnow)
id = Column(Integer, primary_key=True)
length = Column(Integer, default=0)
@ -21,20 +30,29 @@ class SeedNode(Base):
parent_id = Column(Integer, ForeignKey(id))
checksum = Column(String)
stdout = Column(String)
image = Column(Blob)
image = Column(LargeBinary)
children = relationship(
"SeedNode",
"ScrapNode",
cascade="all, delete-orphan",
backref=backref("parent", remote_side=id),
collection_class=attribute_mapped_collection('name'))
def __init__(self, *, child: bytes, parent: SeedNode = None):
if parent:
self.parent_id = parent.id
def __init__(self, *, child: bytes, parent_id: int = None):
self.parent_id = parent_id
self.image = child
self.length = len(child)
self.sha1sum
def __repr__(self):
values = {
'checksum': self.checksum,
'length': self.length,
'parent_id': self.parent_id,
'id': self.id,
}
return str(values)
@property
def sha1sum(self):

View File

@ -4,9 +4,12 @@ from datetime import datetime
from multiprocessing import Process, Queue
from pathlib import Path
from queue import Empty
from sqlalchemy import exists, desc
from tempfile import TemporaryDirectory
import logging
from .mutation import generation, flip, seed_shell
from .orm import db_config, ScrapNode
def sins():
@ -53,19 +56,49 @@ def sins():
with seed.open('rb') as seed_file:
seed_data = seed_file.read()
logger.info(f'seed:\n{seed_data}')
seed = ScrapNode(child=seed_data)
logger.debug(f'seed:\n{seed}')
if args.output:
db_path = Path(f'{args.output}/sins.sqlite')
else:
temp_dir = TemporaryDirectory()
db_path = Path(f'{temp_dir.name}/sins.sqlite')
session = db_config(db_path)
logger.info(f'db_path: {db_path}')
if args.seed:
exists = session.query(ScrapNode).filter(
ScrapNode.checksum == seed.checksum)
if exists:
seed = exists[0]
else:
session.add(seed)
session.commit()
else:
recent = session.query(ScrapNode).order_by(desc('ctime')).first()
if recent:
logger.debug(f'recent:\n{recent}')
seed = recent
parent = seed
queue = Queue()
while True:
lineage = 0
seed_flipped = flip(seed_data)
scrap = flip(parent.image)
while lineage < args.lineage:
logger.info(f'lineage: {lineage}')
logger.debug(f'lineage: {lineage}')
result = None
proc = Process(target=generation, args=(queue, seed_flipped))
proc = Process(target=generation, args=(queue, scrap))
proc.start()
try:
result = queue.get(timeout=1)
@ -77,7 +110,10 @@ def sins():
lineage += 1
continue
logger.info(f'scrap:\n{seed_flipped}')
logger.info(f'result: {result}')
parent = ScrapNode(child=scrap, parent_id=parent.id)
parent.length = result
session.add(parent)
session.commit()
logger.info(f'scrap:\n{parent}')
lineage = 0
seed_flipped = flip(seed_flipped)
scrap = flip(parent.image)